Contract Overview
Balance:
296.8852382878 Ether
Token:
More Info
My Name Tag:
Not Available
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
WithdrawalDelayer
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.6.12; import "../interfaces/IWithdrawalDelayer.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/utils/ReentrancyGuard.sol"; contract WithdrawalDelayer is ReentrancyGuard, IWithdrawalDelayer { struct DepositState { uint192 amount; uint64 depositTimestamp; } // bytes4(keccak256(bytes("transfer(address,uint256)"))); bytes4 constant _TRANSFER_SIGNATURE = 0xa9059cbb; // bytes4(keccak256(bytes("transferFrom(address,address,uint256)"))); bytes4 constant _TRANSFERFROM_SIGNATURE = 0x23b872dd; // bytes4(keccak256(bytes("deposit(address,address,uint192)"))); bytes4 constant _DEPOSIT_SIGNATURE = 0xcfc0b641; uint64 public constant MAX_WITHDRAWAL_DELAY = 2 weeks; // Maximum time that the return of funds can be delayed uint64 public constant MAX_EMERGENCY_MODE_TIME = 26 weeks; // Maximum time in a state of emergency before a // resolution and after which the emergency council can redeem the funds uint64 private _withdrawalDelay; // Current delay uint64 private _emergencyModeStartingTime; // When emergency mode has started address private _hermezGovernance; // Governance who control the system parameters address public pendingGovernance; address payable public pendingEmergencyCouncil; address payable private _emergencyCouncil; // emergency council address who can redeem the funds after MAX_EMERGENCY_MODE_TIME bool private _emergencyMode; // bool to set the emergency mode address public hermezRollupAddress; // hermez Rollup Address who can send funds to this smart contract mapping(bytes32 => DepositState) public deposits; // Mapping to keep track of deposits event Deposit( address indexed owner, address indexed token, uint192 amount, uint64 depositTimestamp ); event Withdraw( address indexed token, address indexed owner, uint192 amount ); event EmergencyModeEnabled(); event NewWithdrawalDelay(uint64 withdrawalDelay); event EscapeHatchWithdrawal( address indexed who, address indexed to, address indexed token, uint256 amount ); event NewEmergencyCouncil(address newEmergencyCouncil); event NewHermezGovernanceAddress(address newHermezGovernanceAddress); // Event emitted when the contract is initialized event InitializeWithdrawalDelayerEvent( uint64 initialWithdrawalDelay, address initialHermezGovernanceAddress, address initialEmergencyCouncil ); /** * @notice withdrawalDelayerInitializer (Constructor) * @param _initialWithdrawalDelay Initial withdrawal delay time in seconds to be able to withdraw the funds * @param _initialHermezRollup Smart contract responsible of making deposits and it's able to change the delay * @param _initialHermezGovernanceAddress can claim the funds in an emergency mode * @param _initialEmergencyCouncil can claim the funds in an emergency and MAX_EMERGENCY_MODE_TIME exceeded */ constructor( uint64 _initialWithdrawalDelay, address _initialHermezRollup, address _initialHermezGovernanceAddress, address payable _initialEmergencyCouncil ) public { require( _initialHermezRollup != address(0), "WithdrawalDelayer::withdrawalDelayerInitializer ADDRESS_0_NOT_VALID" ); _withdrawalDelay = _initialWithdrawalDelay; hermezRollupAddress = _initialHermezRollup; _hermezGovernance = _initialHermezGovernanceAddress; _emergencyCouncil = _initialEmergencyCouncil; _emergencyMode = false; emit InitializeWithdrawalDelayerEvent( _initialWithdrawalDelay, _initialHermezGovernanceAddress, _initialEmergencyCouncil ); } /** * @notice Getter of the current `_hermezGovernance` * @return The `_hermezGovernance` value */ function getHermezGovernanceAddress() external override view returns (address) { return _hermezGovernance; } /** * @dev Allows the current governance to set the pendingGovernance address. * @param newGovernance The address to transfer governance to. */ function transferGovernance(address newGovernance) public override { require( msg.sender == _hermezGovernance, "WithdrawalDelayer::transferGovernance: ONLY_GOVERNANCE" ); pendingGovernance = newGovernance; } /** * @dev Allows the pendingGovernance address to finalize the transfer. */ function claimGovernance() public override { require( msg.sender == pendingGovernance, "WithdrawalDelayer::claimGovernance: ONLY_PENDING_GOVERNANCE" ); _hermezGovernance = pendingGovernance; pendingGovernance = address(0); emit NewHermezGovernanceAddress(_hermezGovernance); } /** * @notice Getter of the current `_emergencyCouncil` * @return The `_emergencyCouncil` value */ function getEmergencyCouncil() external override view returns (address) { return _emergencyCouncil; } /** * @dev Allows the current governance to set the pendingGovernance address. * @param newEmergencyCouncil The address to transfer governance to. */ function transferEmergencyCouncil(address payable newEmergencyCouncil) public override { require( msg.sender == _emergencyCouncil, "WithdrawalDelayer::transferEmergencyCouncil: ONLY_EMERGENCY_COUNCIL" ); pendingEmergencyCouncil = newEmergencyCouncil; } /** * @dev Allows the pendingGovernance address to finalize the transfer. */ function claimEmergencyCouncil() public override { require( msg.sender == pendingEmergencyCouncil, "WithdrawalDelayer::claimEmergencyCouncil: ONLY_PENDING_GOVERNANCE" ); _emergencyCouncil = pendingEmergencyCouncil; pendingEmergencyCouncil = address(0); emit NewEmergencyCouncil(_emergencyCouncil); } /** * @notice Getter of the current `_emergencyMode` status to know if the emergency mode is enable or disable * @return The `_emergencyMode` value */ function isEmergencyMode() external override view returns (bool) { return _emergencyMode; } /** * @notice Getter to obtain the current withdrawal delay * @return the current withdrawal delay time in seconds: `_withdrawalDelay` */ function getWithdrawalDelay() external override view returns (uint64) { return _withdrawalDelay; } /** * @notice Getter to obtain when emergency mode started * @return the emergency mode starting time in seconds: `_emergencyModeStartingTime` */ function getEmergencyModeStartingTime() external override view returns (uint64) { return _emergencyModeStartingTime; } /** * @notice This function enables the emergency mode. Only the governance of the system can enable this mode. This cannot * be deactivated in any case so it will be irreversible. * @dev The activation time is saved in `_emergencyModeStartingTime` and this function can only be called * once if it has not been previously activated. * Events: `EmergencyModeEnabled` event. */ function enableEmergencyMode() external override { require( msg.sender == _hermezGovernance, "WithdrawalDelayer::enableEmergencyMode: ONLY_GOVERNANCE" ); require( !_emergencyMode, "WithdrawalDelayer::enableEmergencyMode: ALREADY_ENABLED" ); _emergencyMode = true; /* solhint-disable not-rely-on-time */ _emergencyModeStartingTime = uint64(now); emit EmergencyModeEnabled(); } /** * @notice This function allows the governance to change the withdrawal delay time, this is the time that * anyone needs to wait until a withdrawal of the funds is allowed. Since this time is calculated at the time of * withdrawal, this change affects existing deposits. Can never exceed `MAX_WITHDRAWAL_DELAY` * @dev It changes `_withdrawalDelay` if `_newWithdrawalDelay` it is less than or equal to MAX_WITHDRAWAL_DELAY * @param _newWithdrawalDelay new delay time in seconds * Events: `NewWithdrawalDelay` event. */ function changeWithdrawalDelay(uint64 _newWithdrawalDelay) external override { require( (msg.sender == _hermezGovernance) || (msg.sender == hermezRollupAddress), "WithdrawalDelayer::changeWithdrawalDelay: ONLY_ROLLUP_OR_GOVERNANCE" ); require( _newWithdrawalDelay <= MAX_WITHDRAWAL_DELAY, "WithdrawalDelayer::changeWithdrawalDelay: EXCEEDS_MAX_WITHDRAWAL_DELAY" ); _withdrawalDelay = _newWithdrawalDelay; emit NewWithdrawalDelay(_withdrawalDelay); } /** * Returns the balance and the timestamp for a specific owner and token * @param _owner who can claim the deposit once the delay time has expired (if not in emergency mode) * @param _token address of the token to withdrawal (0x0 in case of Ether) * @return `amount` Total amount withdrawable (if not in emergency mode) * @return `depositTimestamp` Moment at which funds were deposited */ function depositInfo(address payable _owner, address _token) external override view returns (uint192, uint64) { DepositState memory ds = deposits[keccak256( abi.encodePacked(_owner, _token) )]; return (ds.amount, ds.depositTimestamp); } /** * Function to make a deposit in the WithdrawalDelayer smartcontract, only the Hermez rollup smartcontract can do it * @dev In case of an Ether deposit, the address `0x0` will be used and the corresponding amount must be sent in the * `msg.value`. In case of an ERC20 this smartcontract must have the approval to expend the token to * deposit to be able to make a transferFrom to itself. * @param _owner is who can claim the deposit once the withdrawal delay time has been exceeded * @param _token address of the token deposited (`0x0` in case of Ether) * @param _amount deposit amount * Events: `Deposit` */ function deposit( address _owner, address _token, uint192 _amount ) external override payable nonReentrant { require( msg.sender == hermezRollupAddress, "WithdrawalDelayer::deposit: ONLY_ROLLUP" ); if (msg.value != 0) { require( _token == address(0x0), "WithdrawalDelayer::deposit: WRONG_TOKEN_ADDRESS" ); require( _amount == msg.value, "WithdrawalDelayer::deposit: WRONG_AMOUNT" ); } else { require( IERC20(_token).allowance(hermezRollupAddress, address(this)) >= _amount, "WithdrawalDelayer::deposit: NOT_ENOUGH_ALLOWANCE" ); /* solhint-disable avoid-low-level-calls */ (bool success, bytes memory data) = address(_token).call( abi.encodeWithSelector( _TRANSFERFROM_SIGNATURE, hermezRollupAddress, address(this), _amount ) ); // `transferFrom` method may return (bool) or nothing. require( success && (data.length == 0 || abi.decode(data, (bool))), "WithdrawalDelayer::deposit: TOKEN_TRANSFER_FAILED" ); } _processDeposit(_owner, _token, _amount); } /** * @notice Internal call to make a deposit * @param _owner is who can claim the deposit once the withdrawal delay time has been exceeded * @param _token address of the token deposited (`0x0` in case of Ether) * @param _amount deposit amount * Events: `Deposit` */ function _processDeposit( address _owner, address _token, uint192 _amount ) internal { // We identify a deposit with the keccak of its owner and the token bytes32 depositId = keccak256(abi.encodePacked(_owner, _token)); uint192 newAmount = deposits[depositId].amount + _amount; require( newAmount >= deposits[depositId].amount, "WithdrawalDelayer::_processDeposit: DEPOSIT_OVERFLOW" ); deposits[depositId].amount = newAmount; deposits[depositId].depositTimestamp = uint64(now); emit Deposit( _owner, _token, _amount, deposits[depositId].depositTimestamp ); } /** * This function allows the owner to withdawal the funds. Emergency mode cannot be enabled and it must have exceeded * the withdrawal delay time * @dev `NonReentrant` modifier is used as a protection despite the state is being previously updated * @param _owner can claim the deposit once the delay time has expired * @param _token address of the token to withdrawal (0x0 in case of Ether) * Events: `Withdraw` */ function withdrawal(address payable _owner, address _token) external override nonReentrant { require(!_emergencyMode, "WithdrawalDelayer::deposit: EMERGENCY_MODE"); // We identify a deposit with the keccak of its owner and the token bytes32 depositId = keccak256(abi.encodePacked(_owner, _token)); uint192 amount = deposits[depositId].amount; require(amount > 0, "WithdrawalDelayer::withdrawal: NO_FUNDS"); require( uint64(now) >= deposits[depositId].depositTimestamp + _withdrawalDelay, "WithdrawalDelayer::withdrawal: WITHDRAWAL_NOT_ALLOWED" ); // Update the state deposits[depositId].amount = 0; deposits[depositId].depositTimestamp = 0; // Make the transfer if (_token == address(0x0)) { _ethWithdrawal(_owner, uint256(amount)); } else { _tokenWithdrawal(_token, _owner, uint256(amount)); } emit Withdraw(_token, _owner, amount); } /** * Allows the Hermez Governance to withdawal the funds in the event that emergency mode was enable. * @dev `NonReentrant` modifier is used as a protection despite the state is being previously updated and this is * a security mechanism * @param _to where the funds will be sent * @param _token address of the token withdraw (0x0 in case of Ether) * @param _amount the amount to send * Events: `EscapeHatchWithdrawal` */ function escapeHatchWithdrawal( address _to, address _token, uint256 _amount ) external override nonReentrant { require( _emergencyMode, "WithdrawalDelayer::escapeHatchWithdrawal: ONLY_EMODE" ); require( msg.sender == _emergencyCouncil || msg.sender == _hermezGovernance, "WithdrawalDelayer::escapeHatchWithdrawal: ONLY_GOVERNANCE" ); if ( msg.sender == _emergencyCouncil && _emergencyCouncil != _hermezGovernance ) { require( uint64(now) >= _emergencyModeStartingTime + MAX_EMERGENCY_MODE_TIME, "WithdrawalDelayer::escapeHatchWithdrawal: NO_MAX_EMERGENCY_MODE_TIME" ); } if (_token == address(0x0)) { _ethWithdrawal(_to, _amount); } else { _tokenWithdrawal(_token, _to, _amount); } emit EscapeHatchWithdrawal(msg.sender, _to, _token, _amount); } /** * Internal function to perform a ETH Withdrawal * @param to where the funds will be sent * @param amount address of the token withdraw (0x0 in case of Ether) */ function _ethWithdrawal(address to, uint256 amount) internal { /* solhint-disable avoid-low-level-calls */ (bool success, ) = to.call{value: amount}(""); require(success, "WithdrawalDelayer::_ethWithdrawal: TRANSFER_FAILED"); } /** * Internal function to perform a Token Withdrawal * @param tokenAddress address of the token to transfer * @param to where the funds will be sent * @param amount address of the token withdraw (0x0 in case of Ether) */ function _tokenWithdrawal( address tokenAddress, address to, uint256 amount ) internal { /* solhint-disable avoid-low-level-calls */ (bool success, bytes memory data) = tokenAddress.call( abi.encodeWithSelector(_TRANSFER_SIGNATURE, to, amount) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "WithdrawalDelayer::_tokenWithdrawal: TOKEN_TRANSFER_FAILED" ); } }
// SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.6.12; interface IWithdrawalDelayer { /** * @notice Getter of the current `_hermezGovernanceAddress` * @return The `_hermezGovernanceAddress` value */ function getHermezGovernanceAddress() external view returns (address); /** * @dev Allows the current governance to set the pendingGovernance address. * @param newGovernance The address to transfer governance to. */ function transferGovernance(address newGovernance) external; /** * @dev Allows the pendingGovernance address to finalize the transfer. */ function claimGovernance() external; /** * @notice Getter of the current `_emergencyCouncil` * @return The `_emergencyCouncil` value */ function getEmergencyCouncil() external view returns (address); /** * @dev Allows the current governance to set the pendingGovernance address. * @param newEmergencyCouncil The address to transfer governance to. */ function transferEmergencyCouncil(address payable newEmergencyCouncil) external; /** * @dev Allows the pendingGovernance address to finalize the transfer. */ function claimEmergencyCouncil() external; /** * @notice Getter of the current `_emergencyMode` status to know if the emergency mode is enable or disable * @return The `_emergencyMode` value */ function isEmergencyMode() external view returns (bool); /** * @notice Getter to obtain the current withdrawal delay * @return the current withdrawal delay time in seconds: `_withdrawalDelay` */ function getWithdrawalDelay() external view returns (uint64); /** * @notice Getter to obtain when emergency mode started * @return the emergency mode starting time in seconds: `_emergencyModeStartingTime` */ function getEmergencyModeStartingTime() external view returns (uint64); /** * @notice This function enables the emergency mode. Only the keeper of the system can enable this mode. This cannot * be deactivated in any case so it will be irreversible. * @dev The activation time is saved in `_emergencyModeStartingTime` and this function can only be called * once if it has not been previously activated. * Events: `EmergencyModeEnabled` event. */ function enableEmergencyMode() external; /** * @notice This function allows the HermezKeeperAddress to change the withdrawal delay time, this is the time that * anyone needs to wait until a withdrawal of the funds is allowed. Since this time is calculated at the time of * withdrawal, this change affects existing deposits. Can never exceed `MAX_WITHDRAWAL_DELAY` * @dev It changes `_withdrawalDelay` if `_newWithdrawalDelay` it is less than or equal to MAX_WITHDRAWAL_DELAY * @param _newWithdrawalDelay new delay time in seconds * Events: `NewWithdrawalDelay` event. */ function changeWithdrawalDelay(uint64 _newWithdrawalDelay) external; /** * Returns the balance and the timestamp for a specific owner and token * @param _owner who can claim the deposit once the delay time has expired (if not in emergency mode) * @param _token address of the token to withdrawal (0x0 in case of Ether) * @return `amount` Total amount withdrawable (if not in emergency mode) * @return `depositTimestamp` Moment at which funds were deposited */ function depositInfo(address payable _owner, address _token) external view returns (uint192, uint64); /** * Function to make a deposit in the WithdrawalDelayer smartcontract, only the Hermez rollup smartcontract can do it * @dev In case of an Ether deposit, the address `0x0` will be used and the corresponding amount must be sent in the * `msg.value`. In case of an ERC20 this smartcontract must have the approval to expend the token to * deposit to be able to make a transferFrom to itself. * @param _owner is who can claim the deposit once the withdrawal delay time has been exceeded * @param _token address of the token deposited (`0x0` in case of Ether) * @param _amount deposit amount * Events: `Deposit` */ function deposit( address _owner, address _token, uint192 _amount ) external payable; /** * This function allows the owner to withdawal the funds. Emergency mode cannot be enabled and it must have exceeded * the withdrawal delay time * @dev `NonReentrant` modifier is used as a protection despite the state is being previously updated * @param _owner can claim the deposit once the delay time has expired * @param _token address of the token to withdrawal (0x0 in case of Ether) * Events: `Withdraw` */ function withdrawal(address payable _owner, address _token) external; /** * Allows the Hermez Governance to withdawal the funds in the event that emergency mode was enable. * Note: An Aragon Court will have the right to veto over the call to this method * @dev `NonReentrant` modifier is used as a protection despite the state is being previously updated and this is * a security mechanism * @param _to where the funds will be sent * @param _token address of the token withdraw (0x0 in case of Ether) * @param _amount the amount to send * Events: `EscapeHatchWithdrawal` */ function escapeHatchWithdrawal( address _to, address _token, uint256 _amount ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
[{"inputs":[{"internalType":"uint64","name":"_initialWithdrawalDelay","type":"uint64"},{"internalType":"address","name":"_initialHermezRollup","type":"address"},{"internalType":"address","name":"_initialHermezGovernanceAddress","type":"address"},{"internalType":"address payable","name":"_initialEmergencyCouncil","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint192","name":"amount","type":"uint192"},{"indexed":false,"internalType":"uint64","name":"depositTimestamp","type":"uint64"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[],"name":"EmergencyModeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EscapeHatchWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"initialWithdrawalDelay","type":"uint64"},{"indexed":false,"internalType":"address","name":"initialHermezGovernanceAddress","type":"address"},{"indexed":false,"internalType":"address","name":"initialEmergencyCouncil","type":"address"}],"name":"InitializeWithdrawalDelayerEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newEmergencyCouncil","type":"address"}],"name":"NewEmergencyCouncil","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newHermezGovernanceAddress","type":"address"}],"name":"NewHermezGovernanceAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"withdrawalDelay","type":"uint64"}],"name":"NewWithdrawalDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint192","name":"amount","type":"uint192"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAX_EMERGENCY_MODE_TIME","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WITHDRAWAL_DELAY","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"_newWithdrawalDelay","type":"uint64"}],"name":"changeWithdrawalDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEmergencyCouncil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint192","name":"_amount","type":"uint192"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"depositInfo","outputs":[{"internalType":"uint192","name":"","type":"uint192"},{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"deposits","outputs":[{"internalType":"uint192","name":"amount","type":"uint192"},{"internalType":"uint64","name":"depositTimestamp","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableEmergencyMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"escapeHatchWithdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getEmergencyCouncil","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEmergencyModeStartingTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHermezGovernanceAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawalDelay","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hermezRollupAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isEmergencyMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingEmergencyCouncil","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingGovernance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"newEmergencyCouncil","type":"address"}],"name":"transferEmergencyCouncil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newGovernance","type":"address"}],"name":"transferGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_owner","type":"address"},{"internalType":"address","name":"_token","type":"address"}],"name":"withdrawal","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051611b70380380611b708339818101604052608081101561003357600080fd5b508051602082015160408301516060909301516001600055919290916001600160a01b0383166100945760405162461bcd60e51b8152600401808060200182810382526043815260200180611b2d6043913960600191505060405180910390fd5b600180546001600160401b0386166001600160401b03199091168117909155600680546001600160a01b038087166001600160a01b0319928316179092556002805486841690831681179091556005805460ff60a01b19948716931683179390931690925560408051938452602084019290925282820152517f8b81dca4c96ae06989fa8aa1baa4ccc05dfb42e0948c7d5b7505b68ccde41eec9181900360600190a1505050506119e38061014a6000396000f3fe60806040526004361061012a5760003560e01c80637fd6b102116100ab578063ca79033f1161006f578063ca79033f1461036a578063cfc0b6411461037f578063d38bfff4146103bf578063db2a1a81146103f2578063de35f28214610425578063f39c38a0146104605761012a565b80637fd6b102146102d357806399ef11c514610316578063a238f9df1461032b578063b4b8e39d14610340578063c5b1c7d0146103555761012a565b80633d4dff7b116100f25780633d4dff7b14610204578063493b0170146102595780635d36b19014610294578063668cdd67146102a957806367fa2403146102be5761012a565b8063031609401461012f5780630b21d430146101605780630e670af5146101915780630fd266d7146101c657806320a194b8146101db575b600080fd5b34801561013b57600080fd5b50610144610475565b604080516001600160401b039092168252519081900360200190f35b34801561016c57600080fd5b50610175610484565b604080516001600160a01b039092168252519081900360200190f35b34801561019d57600080fd5b506101c4600480360360208110156101b457600080fd5b50356001600160401b0316610493565b005b3480156101d257600080fd5b50610175610597565b3480156101e757600080fd5b506101f06105a6565b604080519115158252519081900360200190f35b34801561021057600080fd5b5061022e6004803603602081101561022757600080fd5b50356105b6565b604080516001600160c01b0390931683526001600160401b0390911660208301528051918290030190f35b34801561026557600080fd5b5061022e6004803603604081101561027c57600080fd5b506001600160a01b03813581169160200135166105e3565b3480156102a057600080fd5b506101c4610674565b3480156102b557600080fd5b5061014461071e565b3480156102ca57600080fd5b50610175610734565b3480156102df57600080fd5b506101c4600480360360608110156102f657600080fd5b506001600160a01b03813581169160208101359091169060400135610743565b34801561032257600080fd5b5061017561095a565b34801561033757600080fd5b50610144610969565b34801561034c57600080fd5b50610144610970565b34801561036157600080fd5b506101c4610977565b34801561037657600080fd5b506101c4610a73565b6101c46004803603606081101561039557600080fd5b5080356001600160a01b0390811691602081013590911690604001356001600160c01b0316610b1d565b3480156103cb57600080fd5b506101c4600480360360208110156103e257600080fd5b50356001600160a01b0316610e99565b3480156103fe57600080fd5b506101c46004803603602081101561041557600080fd5b50356001600160a01b0316610f04565b34801561043157600080fd5b506101c46004803603604081101561044857600080fd5b506001600160a01b0381358116916020013516610f6f565b34801561046c57600080fd5b506101756111bd565b6001546001600160401b031690565b6002546001600160a01b031690565b6002546001600160a01b03163314806104b657506006546001600160a01b031633145b6104f15760405162461bcd60e51b81526004018080602001828103825260438152602001806117306043913960600191505060405180910390fd5b621275006001600160401b038216111561053c5760405162461bcd60e51b81526004018080602001828103825260468152602001806118a56046913960600191505060405180910390fd5b6001805467ffffffffffffffff19166001600160401b03838116919091179182905560408051929091168252517f6b3670ab51e04a9da086741e5fd1eb36ffaf1d661a15330c528e1f3e0c8722d7916020908290030190a150565b6006546001600160a01b031681565b600554600160a01b900460ff1690565b6007602052600090815260409020546001600160c01b03811690600160c01b90046001600160401b031682565b6000806105ee6114f4565b505060408051606094851b6001600160601b03199081166020808401919091529490951b90941660348501528051808503602801815260488501808352815191850191909120600090815260079094529281902060888501909152546001600160c01b03811692839052600160c01b90046001600160401b031660689093018390525091565b6003546001600160a01b031633146106bd5760405162461bcd60e51b815260040180806020018281038252603b8152602001806116bf603b913960400191505060405180910390fd5b60038054600280546001600160a01b038084166001600160a01b03199283161792839055921690925560408051929091168252517f3bf02437d5cd40067085d9dac2c3cdcbef0a449d98a259a40d9c24380aca81bf916020908290030190a1565b600154600160401b90046001600160401b031690565b6004546001600160a01b031681565b6002600054141561079b576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055600554600160a01b900460ff166107e85760405162461bcd60e51b81526004018080602001828103825260348152602001806115e66034913960400191505060405180910390fd5b6005546001600160a01b031633148061080b57506002546001600160a01b031633145b6108465760405162461bcd60e51b815260040180806020018281038252603981526020018061180e6039913960400191505060405180910390fd5b6005546001600160a01b03163314801561087157506002546005546001600160a01b03908116911614155b156108d3576001546001600160401b03600160401b909104811662eff1000181164290911610156108d35760405162461bcd60e51b81526004018080602001828103825260448152602001806116496044913960600191505060405180910390fd5b6001600160a01b0382166108f0576108eb83826111cc565b6108fb565b6108fb828483611261565b816001600160a01b0316836001600160a01b0316336001600160a01b03167fde200220117ba95c9a6c4a1a13bb06b0b7be90faa85c8fb4576630119f891693846040518082815260200191505060405180910390a45050600160005550565b6005546001600160a01b031690565b6212750081565b62eff10081565b6002546001600160a01b031633146109c05760405162461bcd60e51b81526004018080602001828103825260378152602001806119206037913960400191505060405180910390fd5b600554600160a01b900460ff1615610a095760405162461bcd60e51b81526004018080602001828103825260378152602001806115af6037913960400191505060405180910390fd5b6005805460ff60a01b1916600160a01b179055600180546001600160401b034216600160401b026fffffffffffffffff0000000000000000199091161790556040517f2064d51aa5a8bd67928c7675e267e05c67ad5adf7c9098d0a602d01f36fda9c590600090a1565b6004546001600160a01b03163314610abc5760405162461bcd60e51b81526004018080602001828103825260418152602001806115346041913960600191505060405180910390fd5b60048054600580546001600160a01b038084166001600160a01b03199283161792839055921690925560408051929091168252517fcc267667d474ef34ee2de2d060e7c8b2c7295cefa22e57fd7049e22b5fdb5396916020908290030190a1565b60026000541415610b75576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000556006546001600160a01b03163314610bc35760405162461bcd60e51b81526004018080602001828103825260278152602001806117b66027913960400191505060405180910390fd5b3415610c5b576001600160a01b03821615610c0f5760405162461bcd60e51b815260040180806020018281038252602f81526020018061161a602f913960400191505060405180910390fd5b34816001600160c01b031614610c565760405162461bcd60e51b815260040180806020018281038252602881526020018061150c6028913960400191505060405180910390fd5b610e84565b60065460408051636eb1769f60e11b81526001600160a01b03928316600482015230602482015290516001600160c01b0384169285169163dd62ed3e916044808301926020929190829003018186803b158015610cb757600080fd5b505afa158015610ccb573d6000803e3d6000fd5b505050506040513d6020811015610ce157600080fd5b50511015610d205760405162461bcd60e51b81526004018080602001828103825260308152602001806119576030913960400191505060405180910390fd5b600654604080516001600160a01b0392831660248201523060448201526001600160c01b03841660648083019190915282518083039091018152608490910182526020810180516001600160e01b03166323b872dd60e01b178152915181516000946060949088169392918291908083835b60208310610db15780518252601f199092019160209182019101610d92565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610e13576040519150601f19603f3d011682016040523d82523d6000602084013e610e18565b606091505b5091509150818015610e46575080511580610e465750808060200190516020811015610e4357600080fd5b50515b610e815760405162461bcd60e51b81526004018080602001828103825260318152602001806117dd6031913960400191505060405180910390fd5b50505b610e8f8383836113b5565b5050600160005550565b6002546001600160a01b03163314610ee25760405162461bcd60e51b81526004018080602001828103825260368152602001806116fa6036913960400191505060405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b03163314610f4d5760405162461bcd60e51b81526004018080602001828103825260438152602001806117736043913960600191505060405180910390fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415610fc7576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055600554600160a01b900460ff16156110155760405162461bcd60e51b815260040180806020018281038252602a815260200180611847602a913960400191505060405180910390fd5b60408051606084811b6001600160601b03199081166020808501919091529185901b166034830152825180830360280181526048909201835281519181019190912060008181526007909252919020546001600160c01b0316806110aa5760405162461bcd60e51b81526004018080602001828103825260278152602001806119876027913960400191505060405180910390fd5b6001546000838152600760205260409020546001600160401b03918216600160c01b90910482160181164290911610156111155760405162461bcd60e51b81526004018080602001828103825260358152602001806118eb6035913960400191505060405180910390fd5b6000828152600760205260408120556001600160a01b03831661114a5761114584826001600160c01b03166111cc565b61115e565b61115e8385836001600160c01b0316611261565b836001600160a01b0316836001600160a01b03167f72608e45b52a95a12c2ac7f15ff53f92fc9572c9d84b6e6b5d7f0f7826cf32718360405180826001600160c01b0316815260200191505060405180910390a3505060016000555050565b6003546001600160a01b031681565b6040516000906001600160a01b0384169083908381818185875af1925050503d8060008114611217576040519150601f19603f3d011682016040523d82523d6000602084013e61121c565b606091505b505090508061125c5760405162461bcd60e51b815260040180806020018281038252603281526020018061168d6032913960400191505060405180910390fd5b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b602083106112de5780518252601f1990920191602091820191016112bf565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114611340576040519150601f19603f3d011682016040523d82523d6000602084013e611345565b606091505b5091509150818015611373575080511580611373575080806020019051602081101561137057600080fd5b50515b6113ae5760405162461bcd60e51b815260040180806020018281038252603a815260200180611575603a913960400191505060405180910390fd5b5050505050565b60408051606085811b6001600160601b03199081166020808501919091529186901b166034830152825180830360280181526048909201835281519181019190912060008181526007909252919020546001600160c01b0390811683810191821610156114535760405162461bcd60e51b81526004018080602001828103825260348152602001806118716034913960400191505060405180910390fd5b60008281526007602090815260409182902080546001600160401b03428116600160c01b9081026001600160c01b038089166001600160c01b03199095169490941784161793849055855192891683529092049091169181019190915281516001600160a01b0380881693908916927f41219b99485f78192a5b9b1be28c7d53c3a2bdbe7900ae40c79fae8d9d6108fd929081900390910190a35050505050565b60408051808201909152600080825260208201529056fe5769746864726177616c44656c617965723a3a6465706f7369743a2057524f4e475f414d4f554e545769746864726177616c44656c617965723a3a636c61696d456d657267656e6379436f756e63696c3a204f4e4c595f50454e44494e475f474f5645524e414e43455769746864726177616c44656c617965723a3a5f746f6b656e5769746864726177616c3a20544f4b454e5f5452414e534645525f4641494c45445769746864726177616c44656c617965723a3a656e61626c65456d657267656e63794d6f64653a20414c52454144595f454e41424c45445769746864726177616c44656c617965723a3a65736361706548617463685769746864726177616c3a204f4e4c595f454d4f44455769746864726177616c44656c617965723a3a6465706f7369743a2057524f4e475f544f4b454e5f414444524553535769746864726177616c44656c617965723a3a65736361706548617463685769746864726177616c3a204e4f5f4d41585f454d455247454e43595f4d4f44455f54494d455769746864726177616c44656c617965723a3a5f6574685769746864726177616c3a205452414e534645525f4641494c45445769746864726177616c44656c617965723a3a636c61696d476f7665726e616e63653a204f4e4c595f50454e44494e475f474f5645524e414e43455769746864726177616c44656c617965723a3a7472616e73666572476f7665726e616e63653a204f4e4c595f474f5645524e414e43455769746864726177616c44656c617965723a3a6368616e67655769746864726177616c44656c61793a204f4e4c595f524f4c4c55505f4f525f474f5645524e414e43455769746864726177616c44656c617965723a3a7472616e73666572456d657267656e6379436f756e63696c3a204f4e4c595f454d455247454e43595f434f554e43494c5769746864726177616c44656c617965723a3a6465706f7369743a204f4e4c595f524f4c4c55505769746864726177616c44656c617965723a3a6465706f7369743a20544f4b454e5f5452414e534645525f4641494c45445769746864726177616c44656c617965723a3a65736361706548617463685769746864726177616c3a204f4e4c595f474f5645524e414e43455769746864726177616c44656c617965723a3a6465706f7369743a20454d455247454e43595f4d4f44455769746864726177616c44656c617965723a3a5f70726f636573734465706f7369743a204445504f5349545f4f564552464c4f575769746864726177616c44656c617965723a3a6368616e67655769746864726177616c44656c61793a20455843454544535f4d41585f5749544844524157414c5f44454c41595769746864726177616c44656c617965723a3a7769746864726177616c3a205749544844524157414c5f4e4f545f414c4c4f5745445769746864726177616c44656c617965723a3a656e61626c65456d657267656e63794d6f64653a204f4e4c595f474f5645524e414e43455769746864726177616c44656c617965723a3a6465706f7369743a204e4f545f454e4f5547485f414c4c4f57414e43455769746864726177616c44656c617965723a3a7769746864726177616c3a204e4f5f46554e4453a2646970667358221220c4d2d2ed93c1882b6ac4ed396f96e7cb641d8d532478667c300863af7ce1fa4264736f6c634300060c00335769746864726177616c44656c617965723a3a7769746864726177616c44656c61796572496e697469616c697a657220414444524553535f305f4e4f545f56414c49440000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000679b11e0229959c1d3d27c9d20529e4c5df7997c0000000000000000000000006873d7012eaa33e393aa7bba23712f673d6e52260000000000000000000000000a2e0eb98df29318d1e6de32f0ea29fa1b4da134
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000e10000000000000000000000000679b11e0229959c1d3d27c9d20529e4c5df7997c0000000000000000000000006873d7012eaa33e393aa7bba23712f673d6e52260000000000000000000000000a2e0eb98df29318d1e6de32f0ea29fa1b4da134
-----Decoded View---------------
Arg [0] : _initialWithdrawalDelay (uint64): 3600
Arg [1] : _initialHermezRollup (address): 0x679b11e0229959c1d3d27c9d20529e4c5df7997c
Arg [2] : _initialHermezGovernanceAddress (address): 0x6873d7012eaa33e393aa7bba23712f673d6e5226
Arg [3] : _initialEmergencyCouncil (address): 0x0a2e0eb98df29318d1e6de32f0ea29fa1b4da134
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000e10
Arg [1] : 000000000000000000000000679b11e0229959c1d3d27c9d20529e4c5df7997c
Arg [2] : 0000000000000000000000006873d7012eaa33e393aa7bba23712f673d6e5226
Arg [3] : 0000000000000000000000000a2e0eb98df29318d1e6de32f0ea29fa1b4da134
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.