Contract 0xeFD96CFBaF1B0Dd24d3882B0D6b8D95F85634724

Contract Overview

Balance:
296.8852382878 Ether

Token:
Txn Hash
Method
Block
From
To
Value
0x0744a58725b417c5f6e55528fb000addffc4330547f6940fae1cc53602d2b0a7Withdrawal102132282022-02-22 15:37:2686 days 18 hrs ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.00011983 2.500000013
0x61e2f5853b296b3de07c8c6b8f2c2b8f5820fb583dd42d4e1e4c8d18e91a7035Withdrawal102131182022-02-22 15:09:5686 days 19 hrs ago0x5706399c1b310481acbd7a04258bd27db1fcf433 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000119830001 2.500000025
0x1561899cb84ff8239771b7307cb16f7bebf536356d068ba1c19d83b25151afdfWithdrawal101385662022-02-09 10:02:50100 days 29 mins ago0x56b2118d90cca76e4683efeceec35662372d64cd IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000110926652 2.500488079
0x084bff48dc926e806215654164c838b4cc50e85effc3dfb09663dae87922c040Withdrawal100633642022-01-27 8:32:18113 days 2 hrs ago0x56b2118d90cca76e4683efeceec35662372d64cd IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000119830001 2.500000022
0x8f9b88f33190404553039edcddfebf1c98964ae3eb0350ef6da73d8c861c0d3dWithdrawal98524242021-12-21 10:05:55150 days 26 mins ago0x56b2118d90cca76e4683efeceec35662372d64cd IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.00011983 2.500000011
0x359e0429e102e39c7f51041f984dac5e956598163b42eb07acb2a5a04aa6a341Withdrawal98476022021-12-20 14:00:02150 days 20 hrs ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.00011983 2.50000001
0x3788fa6f53309141f3ec1cf676a18f44b6edbf416762b7e63ade1ae3065bc8f9Withdrawal98310932021-12-17 17:11:55153 days 17 hrs ago0x45279cb343d8244b0d2f2c3274bc37d8f0f2c303 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.00009563 2.500000013
0x8303f324a5970e1532126a79f0afbd114f72b55a9ce5e96758902a781008c828Withdrawal98246132021-12-16 14:11:10154 days 20 hrs ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000121221138 2.529023168
0xc8cefd9fd18c6ee3d0066b29a6954728d384bdf43234eb04ddf349e63b301e71Withdrawal98128912021-12-14 10:40:27156 days 23 hrs ago0x56b2118d90cca76e4683efeceec35662372d64cd IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000908631818 18.956684854
0xe0d2adce19ccb6463401f0e7dd43a52c6ee7392d37a985fbe6333ffd6e1960c7Withdrawal97455432021-12-02 17:37:43168 days 16 hrs ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000131491006 2.743282293
0x3ec8e47883f13ea528428d6b462b008bdffa71a6dcfe8289818a184c10a53bf6Withdrawal97454962021-12-02 17:25:57168 days 17 hrs ago0x56b2118d90cca76e4683efeceec35662372d64cd IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000068970459 1.438923046
0xb5b59e180be4eca52953d92ba02da1da2011ed62b9c32d28602f123f0afd5545Withdrawal97283402021-11-29 17:55:15171 days 16 hrs ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000103627269 2.161964228
0x8c5f6d1e4b9ef7676ecbd4d529b891435d71ed85c87ecb18f96974f0f68ca7eeWithdrawal97281522021-11-29 17:08:15171 days 17 hrs ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.00011432172 2.385081374
0x804a381bfe3be6b6d59f3c9d8ba8cde1c90e4379fb0ca1c21925c6e5148b6f73Withdrawal97267882021-11-29 11:26:58171 days 23 hrs ago0x56b2118d90cca76e4683efeceec35662372d64cd IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000047932 1.000000018
0xf3e2a2d10c65a296579ff05124c5825052a9ed2cee8d0b49f3da1d3051b53677Withdrawal96989972021-11-24 15:37:21176 days 18 hrs ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000047932003 1.000000067
0xf7f5c1274eadb690c85631012d45bdf51ab0b40e3f26440c9b3948686f9a1078Withdrawal96988322021-11-24 14:56:06176 days 19 hrs ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000047932007 1.000000157
0xaee088f3451634cd1fe8f08c57d87603132f71cd1e1b8a1de3f8a8dd77cc6ba8Withdrawal96922402021-11-23 11:26:33177 days 23 hrs ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000047932 1.000000014
0x407af50a37fcdcd0dafe1e4f3fd54ddee8e52e22c1c610182e710c3eda8a0d32Withdrawal96920112021-11-23 10:29:17178 days 3 mins ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000047932001 1.000000022
0x895bec5168bc1f21956f5546372ded0bf7e7ce78b7863e6808b6ee4a3ce6c23fWithdrawal96917252021-11-23 9:17:46178 days 1 hr ago0x56b2118d90cca76e4683efeceec35662372d64cd IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000047932001 1.000000022
0xcccb64ea45ef6d8091b80c8c74f06e1fa71d8e20efb39676ab03c0ffdd726ae4Withdrawal96879182021-11-22 17:25:33178 days 17 hrs ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000163791691 2.51863223
0x54f4c9090c1d6643985a75ec3865b7adf89ab708dfedc1185c248061bdae89e4Withdrawal96875172021-11-22 15:45:14178 days 18 hrs ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000083288315 1.737634879
0xd2e1e4e00b6229438cffe3f35124fb282274131aec75ade4e73da9df33e3bc33Withdrawal96875132021-11-22 15:44:14178 days 18 hrs ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000064008388 1.673334434
0x6f55b8c783792854c98ead71cd29ed527673052b116c454c7c7947f08926c064Withdrawal96866882021-11-22 12:17:55178 days 22 hrs ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000048873609 1.019644698
0xb921180f8bc58971ce56ba20cfcb366686f1e1bb33620d057116fc6654144534Withdrawal96230812021-11-11 11:02:36189 days 23 hrs ago0x15868e0c2dfc14a47ffc7360a93addc994386b11 IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000110905 2.500000009
0x7309ced60034aab29d191d17f66ee8183bbcef16a7a52fbca4ff40bf04dd8cffWithdrawal95612172021-10-31 11:09:51200 days 23 hrs ago0xf5f7ded3ee675f456fdc25c7c6f15922bf57282b IN  0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether0.000049727611 1.300000302
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x0744a58725b417c5f6e55528fb000addffc4330547f6940fae1cc53602d2b0a7102132282022-02-22 15:37:2686 days 18 hrs ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
0xfd02bf09931cc7b731b8adb5a60e658f5df2ebdf8d8a325568c7723bd99c4fe6102131742022-02-22 15:23:5686 days 19 hrs ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
0xfd02bf09931cc7b731b8adb5a60e658f5df2ebdf8d8a325568c7723bd99c4fe6102131742022-02-22 15:23:5686 days 19 hrs ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
0xfd02bf09931cc7b731b8adb5a60e658f5df2ebdf8d8a325568c7723bd99c4fe6102131742022-02-22 15:23:5686 days 19 hrs ago 0x679b11e0229959c1d3d27c9d20529e4c5df7997c 0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether
0x70e127d513179ce0d4ad6c5b29428b437a0bf6ca240519696feec3ef7c5d9b95102131722022-02-22 15:23:2686 days 19 hrs ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
0x70e127d513179ce0d4ad6c5b29428b437a0bf6ca240519696feec3ef7c5d9b95102131722022-02-22 15:23:2686 days 19 hrs ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
0x70e127d513179ce0d4ad6c5b29428b437a0bf6ca240519696feec3ef7c5d9b95102131722022-02-22 15:23:2686 days 19 hrs ago 0x679b11e0229959c1d3d27c9d20529e4c5df7997c 0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether
0x61e2f5853b296b3de07c8c6b8f2c2b8f5820fb583dd42d4e1e4c8d18e91a7035102131182022-02-22 15:09:5686 days 19 hrs ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
0x1561899cb84ff8239771b7307cb16f7bebf536356d068ba1c19d83b25151afdf101385662022-02-09 10:02:50100 days 29 mins ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0x2521bc90b4f5fb9a8d61278197e5ff5cdbc4fbf20 Ether
0x85863aabe538e2a04c30672111d6a974ccda6c7c939f37e31da73f7b867df2db101384872022-02-09 9:43:04100 days 49 mins ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0x2521bc90b4f5fb9a8d61278197e5ff5cdbc4fbf20 Ether
0x85863aabe538e2a04c30672111d6a974ccda6c7c939f37e31da73f7b867df2db101384872022-02-09 9:43:04100 days 49 mins ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0x2521bc90b4f5fb9a8d61278197e5ff5cdbc4fbf20 Ether
0x85863aabe538e2a04c30672111d6a974ccda6c7c939f37e31da73f7b867df2db101384872022-02-09 9:43:04100 days 49 mins ago 0x679b11e0229959c1d3d27c9d20529e4c5df7997c 0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether
0x084bff48dc926e806215654164c838b4cc50e85effc3dfb09663dae87922c040100633642022-01-27 8:32:18113 days 2 hrs ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
0xf9d62849f158a5251bd96402a557cae671e6ef7155f192b09d2addf2a462940f100573952022-01-26 7:38:42114 days 2 hrs ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
0xf9d62849f158a5251bd96402a557cae671e6ef7155f192b09d2addf2a462940f100573952022-01-26 7:38:42114 days 2 hrs ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
0xf9d62849f158a5251bd96402a557cae671e6ef7155f192b09d2addf2a462940f100573952022-01-26 7:38:42114 days 2 hrs ago 0x679b11e0229959c1d3d27c9d20529e4c5df7997c 0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether
0x8f9b88f33190404553039edcddfebf1c98964ae3eb0350ef6da73d8c861c0d3d98524242021-12-21 10:05:55150 days 26 mins ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
0x359e0429e102e39c7f51041f984dac5e956598163b42eb07acb2a5a04aa6a34198476022021-12-20 14:00:02150 days 20 hrs ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
0x271d1f91ac51c74dc809c41db00ec5458c02b5d3e2e303e46087a7a056254f5b98474442021-12-20 13:20:31150 days 21 hrs ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
0x271d1f91ac51c74dc809c41db00ec5458c02b5d3e2e303e46087a7a056254f5b98474442021-12-20 13:20:31150 days 21 hrs ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
0x271d1f91ac51c74dc809c41db00ec5458c02b5d3e2e303e46087a7a056254f5b98474442021-12-20 13:20:31150 days 21 hrs ago 0x679b11e0229959c1d3d27c9d20529e4c5df7997c 0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240 Ether
0x3788fa6f53309141f3ec1cf676a18f44b6edbf416762b7e63ade1ae3065bc8f998310932021-12-17 17:11:55153 days 17 hrs ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240x45279cb343d8244b0d2f2c3274bc37d8f0f2c3030.1 Ether
0xb2ae7700fd6f4355c145c3970b1ad42dc46db0ec2e1d859e62bbb98864b1e0e698309192021-12-17 16:28:24153 days 18 hrs ago 0x679b11e0229959c1d3d27c9d20529e4c5df7997c 0xefd96cfbaf1b0dd24d3882b0d6b8d95f856347240.1 Ether
0x8303f324a5970e1532126a79f0afbd114f72b55a9ce5e96758902a781008c82898246132021-12-16 14:11:10154 days 20 hrs ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
0xc4a6b55920a52006689d8dac7148321387d49b4d8edc67a61aa8ae237498077398234072021-12-16 9:09:22155 days 1 hr ago 0xefd96cfbaf1b0dd24d3882b0d6b8d95f85634724 0xa1a31de489c9b977fa78c70c7f001da181e126fb0 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WithdrawalDelayer

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : WithdrawalDelayer.sol
// 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"
        );
    }
}

File 2 of 4 : IWithdrawalDelayer.sol
// 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;
}

File 3 of 4 : IERC20.sol
// 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);
}

File 4 of 4 : ReentrancyGuard.sol
// 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;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"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"}]

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


Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading

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.