Address Details
contract

0x1BDB37DAA42E37bFCa4C5536AcF93b1173588981

Contract Name
Timelock
Creator
0x4a27c0–5f6ee3 at 0x80ac40–f7ae3c
Balance
0 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
17 Transactions
Transfers
5 Transfers
Gas Used
714,037
Last Balance Update
9693461
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
Timelock




Optimization enabled
true
Compiler version
v0.8.3+commit.8d00100c




Optimization runs
999999
EVM Version
istanbul




Verified at
2021-08-04T15:18:54.129953Z

Contract source code

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.3;

import "../../openzeppelin-solidity/contracts/SafeMath.sol";

contract Timelock {
    using SafeMath for uint;

    event NewAdmin(address indexed newAdmin);
    event NewPendingAdmin(address indexed newPendingAdmin);
    event NewDelay(uint indexed newDelay);
    event CancelTransaction(bytes32 indexed txHash, address indexed target, uint value, string signature,  bytes data, uint eta);
    event ExecuteTransaction(bytes32 indexed txHash, address indexed target, uint value, string signature,  bytes data, uint eta);
    event QueueTransaction(bytes32 indexed txHash, address indexed target, uint value, string signature, bytes data, uint eta);

    uint public constant GRACE_PERIOD = 14 days;
    uint public constant MINIMUM_DELAY = 2 days;
    uint public constant MAXIMUM_DELAY = 30 days;

    address public admin;
    address public pendingAdmin;
    uint public delay;

    mapping (bytes32 => bool) public queuedTransactions;


    constructor(address admin_, uint delay_) {
        require(delay_ >= MINIMUM_DELAY, "Timelock::constructor: Delay must exceed minimum delay.");
        require(delay_ <= MAXIMUM_DELAY, "Timelock::setDelay: Delay must not exceed maximum delay.");

        admin = admin_;
        delay = delay_;
    }

    receive() external payable { }

    function setDelay(uint delay_) public {
        require(msg.sender == address(this), "Timelock::setDelay: Call must come from Timelock.");
        require(delay_ >= MINIMUM_DELAY, "Timelock::setDelay: Delay must exceed minimum delay.");
        require(delay_ <= MAXIMUM_DELAY, "Timelock::setDelay: Delay must not exceed maximum delay.");
        delay = delay_;

        emit NewDelay(delay);
    }

    function acceptAdmin() public {
        require(msg.sender == pendingAdmin, "Timelock::acceptAdmin: Call must come from pendingAdmin.");
        admin = msg.sender;
        pendingAdmin = address(0);

        emit NewAdmin(admin);
    }

    function setPendingAdmin(address pendingAdmin_) public {
        require(msg.sender == address(this), "Timelock::setPendingAdmin: Call must come from Timelock.");
        pendingAdmin = pendingAdmin_;

        emit NewPendingAdmin(pendingAdmin);
    }

    function queueTransaction(address target, uint value, string memory signature, bytes memory data, uint eta) public returns (bytes32) {
        require(msg.sender == admin, "Timelock::queueTransaction: Call must come from admin.");
        require(eta >= getBlockTimestamp().add(delay), "Timelock::queueTransaction: Estimated execution block must satisfy delay.");

        bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
        queuedTransactions[txHash] = true;

        emit QueueTransaction(txHash, target, value, signature, data, eta);
        return txHash;
    }

    function cancelTransaction(address target, uint value, string memory signature, bytes memory data, uint eta) public {
        require(msg.sender == admin, "Timelock::cancelTransaction: Call must come from admin.");

        bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
        queuedTransactions[txHash] = false;

        emit CancelTransaction(txHash, target, value, signature, data, eta);
    }

    function executeTransaction(address target, uint value, string memory signature, bytes memory data, uint eta) public payable returns (bytes memory) {
        require(msg.sender == admin, "Timelock::executeTransaction: Call must come from admin.");

        bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
        require(queuedTransactions[txHash], "Timelock::executeTransaction: Transaction hasn't been queued.");
        require(getBlockTimestamp() >= eta, "Timelock::executeTransaction: Transaction hasn't surpassed time lock.");
        require(getBlockTimestamp() <= eta.add(GRACE_PERIOD), "Timelock::executeTransaction: Transaction is stale.");

        queuedTransactions[txHash] = false;

        bytes memory callData;

        if (bytes(signature).length == 0) {
            callData = data;
        } else {
            callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data);
        }

        // solium-disable-next-line security/no-call-value
        (bool success, bytes memory returnData) = target.call{value: value}(callData);
        require(success, "Timelock::executeTransaction: Transaction execution reverted.");

        emit ExecuteTransaction(txHash, target, value, signature, data, eta);

        return returnData;
    }

    function getBlockTimestamp() internal view returns (uint) {
        // solium-disable-next-line security/no-block-members
        return block.timestamp;
    }
}
        

SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}
          

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"admin_","internalType":"address"},{"type":"uint256","name":"delay_","internalType":"uint256"}]},{"type":"event","name":"CancelTransaction","inputs":[{"type":"bytes32","name":"txHash","internalType":"bytes32","indexed":true},{"type":"address","name":"target","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"string","name":"signature","internalType":"string","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false},{"type":"uint256","name":"eta","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ExecuteTransaction","inputs":[{"type":"bytes32","name":"txHash","internalType":"bytes32","indexed":true},{"type":"address","name":"target","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"string","name":"signature","internalType":"string","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false},{"type":"uint256","name":"eta","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NewAdmin","inputs":[{"type":"address","name":"newAdmin","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"NewDelay","inputs":[{"type":"uint256","name":"newDelay","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"NewPendingAdmin","inputs":[{"type":"address","name":"newPendingAdmin","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"QueueTransaction","inputs":[{"type":"bytes32","name":"txHash","internalType":"bytes32","indexed":true},{"type":"address","name":"target","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"string","name":"signature","internalType":"string","indexed":false},{"type":"bytes","name":"data","internalType":"bytes","indexed":false},{"type":"uint256","name":"eta","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"GRACE_PERIOD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MAXIMUM_DELAY","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MINIMUM_DELAY","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"acceptAdmin","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"admin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancelTransaction","inputs":[{"type":"address","name":"target","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"string","name":"signature","internalType":"string"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint256","name":"eta","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"delay","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[{"type":"bytes","name":"","internalType":"bytes"}],"name":"executeTransaction","inputs":[{"type":"address","name":"target","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"string","name":"signature","internalType":"string"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint256","name":"eta","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pendingAdmin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"queueTransaction","inputs":[{"type":"address","name":"target","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"string","name":"signature","internalType":"string"},{"type":"bytes","name":"data","internalType":"bytes"},{"type":"uint256","name":"eta","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"queuedTransactions","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDelay","inputs":[{"type":"uint256","name":"delay_","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPendingAdmin","inputs":[{"type":"address","name":"pendingAdmin_","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b506040516114c83803806114c883398101604081905261002f9161014f565b6202a3008110156100ad5760405162461bcd60e51b815260206004820152603760248201527f54696d656c6f636b3a3a636f6e7374727563746f723a2044656c6179206d757360448201527f7420657863656564206d696e696d756d2064656c61792e00000000000000000060648201526084015b60405180910390fd5b62278d008111156101265760405162461bcd60e51b815260206004820152603860248201527f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d757374206e60448201527f6f7420657863656564206d6178696d756d2064656c61792e000000000000000060648201526084016100a4565b600080546001600160a01b0319166001600160a01b039390931692909217909155600255610187565b60008060408385031215610161578182fd5b82516001600160a01b0381168114610177578283fd5b6020939093015192949293505050565b611332806101966000396000f3fe6080604052600436106100d65760003560e01c80636a42b8f81161007f578063c1a287e211610059578063c1a287e214610226578063e177246e1461023d578063f2b065371461025d578063f851a4401461029d576100dd565b80636a42b8f8146101e25780637d645fab146101f8578063b1b43ae51461020f576100dd565b80633a66f901116100b05780633a66f901146101745780634dd18bf5146101a2578063591fcdfe146101c2576100dd565b80630825f38f146100e25780630e18b6811461010b5780632678224714610122576100dd565b366100dd57005b600080fd5b6100f56100f0366004611044565b6102ca565b6040516101029190611210565b60405180910390f35b34801561011757600080fd5b5061012061078a565b005b34801561012e57600080fd5b5060015461014f9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610102565b34801561018057600080fd5b5061019461018f366004611044565b610892565b604051908152602001610102565b3480156101ae57600080fd5b506101206101bd36600461102a565b610aea565b3480156101ce57600080fd5b506101206101dd366004611044565b610be8565b3480156101ee57600080fd5b5061019460025481565b34801561020457600080fd5b5061019462278d0081565b34801561021b57600080fd5b506101946202a30081565b34801561023257600080fd5b506101946212750081565b34801561024957600080fd5b506101206102583660046110f0565b610d72565b34801561026957600080fd5b5061028d6102783660046110f0565b60036020526000908152604090205460ff1681565b6040519015158152602001610102565b3480156102a957600080fd5b5060005461014f9073ffffffffffffffffffffffffffffffffffffffff1681565b60005460609073ffffffffffffffffffffffffffffffffffffffff163314610379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20436160448201527f6c6c206d75737420636f6d652066726f6d2061646d696e2e000000000000000060648201526084015b60405180910390fd5b600086868686866040516020016103949594939291906111b6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600390935291205490915060ff16610469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e206861736e2774206265656e207175657565642e0000006064820152608401610370565b8242101561051f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e206861736e2774207375727061737365642074696d652060648201527f6c6f636b2e000000000000000000000000000000000000000000000000000000608482015260a401610370565b61052c8362127500610f5a565b4211156105bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e206973207374616c652e000000000000000000000000006064820152608401610370565b600081815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905584516060906105ff57508361062b565b858051906020012085604051602001610619929190611152565b60405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff168984604051610654919061119a565b60006040518083038185875af1925050503d8060008114610691576040519150601f19603f3d011682016040523d82523d6000602084013e610696565b606091505b509150915081610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e20657865637574696f6e2072657665727465642e0000006064820152608401610370565b8973ffffffffffffffffffffffffffffffffffffffff16847fa560e3198060a2f10670c1ec5b403077ea6ae93ca8de1c32b451dc1a943cd6e78b8b8b8b6040516107759493929190611223565b60405180910390a39998505050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f54696d656c6f636b3a3a61636365707441646d696e3a2043616c6c206d75737460448201527f20636f6d652066726f6d2070656e64696e6741646d696e2e00000000000000006064820152608401610370565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000918216811783556001805490921690915560405190917f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c91a2565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461093a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f54696d656c6f636b3a3a71756575655472616e73616374696f6e3a2043616c6c60448201527f206d75737420636f6d652066726f6d2061646d696e2e000000000000000000006064820152608401610370565b61094d6002546109474290565b90610f5a565b821015610a02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f54696d656c6f636b3a3a71756575655472616e73616374696f6e3a204573746960448201527f6d6174656420657865637574696f6e20626c6f636b206d75737420736174697360648201527f66792064656c61792e0000000000000000000000000000000000000000000000608482015260a401610370565b60008686868686604051602001610a1d9594939291906111b6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206000818152600390925291902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055915073ffffffffffffffffffffffffffffffffffffffff88169082907f76e2796dc3a81d57b0e8504b647febcbeeb5f4af818e164f11eef8131a6a763f90610ad8908a908a908a908a90611223565b60405180910390a39695505050505050565b333014610b79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f54696d656c6f636b3a3a73657450656e64696e6741646d696e3a2043616c6c2060448201527f6d75737420636f6d652066726f6d2054696d656c6f636b2e00000000000000006064820152608401610370565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a75690600090a250565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f54696d656c6f636b3a3a63616e63656c5472616e73616374696f6e3a2043616c60448201527f6c206d75737420636f6d652066726f6d2061646d696e2e0000000000000000006064820152608401610370565b60008585858585604051602001610caa9594939291906111b6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206000818152600390925291902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055915073ffffffffffffffffffffffffffffffffffffffff87169082907f2fffc091a501fd91bfbff27141450d3acb40fb8e6d8382b243ec7a812a3aaf8790610d62908990899089908990611223565b60405180910390a3505050505050565b333014610e01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b3a3a73657444656c61793a2043616c6c206d75737420636f60448201527f6d652066726f6d2054696d656c6f636b2e0000000000000000000000000000006064820152608401610370565b6202a300811015610e94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d757374206560448201527f7863656564206d696e696d756d2064656c61792e0000000000000000000000006064820152608401610370565b62278d00811115610f27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d757374206e60448201527f6f7420657863656564206d6178696d756d2064656c61792e00000000000000006064820152608401610370565b600281905560405181907f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c90600090a250565b6000610f668284611260565b9392505050565b600067ffffffffffffffff80841115610f8857610f886112cd565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610fce57610fce6112cd565b81604052809350858152868686011115610fe757600080fd5b858560208301376000602087830101525050509392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461102557600080fd5b919050565b60006020828403121561103b578081fd5b610f6682611001565b600080600080600060a0868803121561105b578081fd5b61106486611001565b945060208601359350604086013567ffffffffffffffff80821115611087578283fd5b818801915088601f83011261109a578283fd5b6110a989833560208501610f6d565b945060608801359150808211156110be578283fd5b508601601f810188136110cf578182fd5b6110de88823560208401610f6d565b95989497509295608001359392505050565b600060208284031215611101578081fd5b5035919050565b6000815180845261112081602086016020860161129d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000084168252825161118c81600485016020870161129d565b919091016004019392505050565b600082516111ac81846020870161129d565b9190910192915050565b600073ffffffffffffffffffffffffffffffffffffffff8716825285602083015260a060408301526111eb60a0830186611108565b82810360608401526111fd8186611108565b9150508260808301529695505050505050565b600060208252610f666020830184611108565b60008582526080602083015261123c6080830186611108565b828103604084015261124e8186611108565b91505082606083015295945050505050565b60008219821115611298577f4e487b710000000000000000000000000000000000000000000000000000000081526011600452602481fd5b500190565b60005b838110156112b85781810151838201526020016112a0565b838111156112c7576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea26469706673582212205ffd2f82166442e1e9d950d6fc2bae0adcbe5ca294289d569aa7f425a38043e164736f6c63430008030033000000000000000000000000489aac7cb9a3b233e4a289ec92284c8d83d49c6f000000000000000000000000000000000000000000000000000000000002a300

Deployed ByteCode

0x6080604052600436106100d65760003560e01c80636a42b8f81161007f578063c1a287e211610059578063c1a287e214610226578063e177246e1461023d578063f2b065371461025d578063f851a4401461029d576100dd565b80636a42b8f8146101e25780637d645fab146101f8578063b1b43ae51461020f576100dd565b80633a66f901116100b05780633a66f901146101745780634dd18bf5146101a2578063591fcdfe146101c2576100dd565b80630825f38f146100e25780630e18b6811461010b5780632678224714610122576100dd565b366100dd57005b600080fd5b6100f56100f0366004611044565b6102ca565b6040516101029190611210565b60405180910390f35b34801561011757600080fd5b5061012061078a565b005b34801561012e57600080fd5b5060015461014f9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610102565b34801561018057600080fd5b5061019461018f366004611044565b610892565b604051908152602001610102565b3480156101ae57600080fd5b506101206101bd36600461102a565b610aea565b3480156101ce57600080fd5b506101206101dd366004611044565b610be8565b3480156101ee57600080fd5b5061019460025481565b34801561020457600080fd5b5061019462278d0081565b34801561021b57600080fd5b506101946202a30081565b34801561023257600080fd5b506101946212750081565b34801561024957600080fd5b506101206102583660046110f0565b610d72565b34801561026957600080fd5b5061028d6102783660046110f0565b60036020526000908152604090205460ff1681565b6040519015158152602001610102565b3480156102a957600080fd5b5060005461014f9073ffffffffffffffffffffffffffffffffffffffff1681565b60005460609073ffffffffffffffffffffffffffffffffffffffff163314610379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20436160448201527f6c6c206d75737420636f6d652066726f6d2061646d696e2e000000000000000060648201526084015b60405180910390fd5b600086868686866040516020016103949594939291906111b6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000818152600390935291205490915060ff16610469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e206861736e2774206265656e207175657565642e0000006064820152608401610370565b8242101561051f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604560248201527f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e206861736e2774207375727061737365642074696d652060648201527f6c6f636b2e000000000000000000000000000000000000000000000000000000608482015260a401610370565b61052c8362127500610f5a565b4211156105bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e206973207374616c652e000000000000000000000000006064820152608401610370565b600081815260036020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905584516060906105ff57508361062b565b858051906020012085604051602001610619929190611152565b60405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff168984604051610654919061119a565b60006040518083038185875af1925050503d8060008114610691576040519150601f19603f3d011682016040523d82523d6000602084013e610696565b606091505b509150915081610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e20657865637574696f6e2072657665727465642e0000006064820152608401610370565b8973ffffffffffffffffffffffffffffffffffffffff16847fa560e3198060a2f10670c1ec5b403077ea6ae93ca8de1c32b451dc1a943cd6e78b8b8b8b6040516107759493929190611223565b60405180910390a39998505050505050505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f54696d656c6f636b3a3a61636365707441646d696e3a2043616c6c206d75737460448201527f20636f6d652066726f6d2070656e64696e6741646d696e2e00000000000000006064820152608401610370565b60008054337fffffffffffffffffffffffff0000000000000000000000000000000000000000918216811783556001805490921690915560405190917f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c91a2565b6000805473ffffffffffffffffffffffffffffffffffffffff16331461093a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f54696d656c6f636b3a3a71756575655472616e73616374696f6e3a2043616c6c60448201527f206d75737420636f6d652066726f6d2061646d696e2e000000000000000000006064820152608401610370565b61094d6002546109474290565b90610f5a565b821015610a02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f54696d656c6f636b3a3a71756575655472616e73616374696f6e3a204573746960448201527f6d6174656420657865637574696f6e20626c6f636b206d75737420736174697360648201527f66792064656c61792e0000000000000000000000000000000000000000000000608482015260a401610370565b60008686868686604051602001610a1d9594939291906111b6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206000818152600390925291902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055915073ffffffffffffffffffffffffffffffffffffffff88169082907f76e2796dc3a81d57b0e8504b647febcbeeb5f4af818e164f11eef8131a6a763f90610ad8908a908a908a908a90611223565b60405180910390a39695505050505050565b333014610b79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f54696d656c6f636b3a3a73657450656e64696e6741646d696e3a2043616c6c2060448201527f6d75737420636f6d652066726f6d2054696d656c6f636b2e00000000000000006064820152608401610370565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a75690600090a250565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f54696d656c6f636b3a3a63616e63656c5472616e73616374696f6e3a2043616c60448201527f6c206d75737420636f6d652066726f6d2061646d696e2e0000000000000000006064820152608401610370565b60008585858585604051602001610caa9594939291906111b6565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201206000818152600390925291902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055915073ffffffffffffffffffffffffffffffffffffffff87169082907f2fffc091a501fd91bfbff27141450d3acb40fb8e6d8382b243ec7a812a3aaf8790610d62908990899089908990611223565b60405180910390a3505050505050565b333014610e01576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f54696d656c6f636b3a3a73657444656c61793a2043616c6c206d75737420636f60448201527f6d652066726f6d2054696d656c6f636b2e0000000000000000000000000000006064820152608401610370565b6202a300811015610e94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d757374206560448201527f7863656564206d696e696d756d2064656c61792e0000000000000000000000006064820152608401610370565b62278d00811115610f27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d757374206e60448201527f6f7420657863656564206d6178696d756d2064656c61792e00000000000000006064820152608401610370565b600281905560405181907f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c90600090a250565b6000610f668284611260565b9392505050565b600067ffffffffffffffff80841115610f8857610f886112cd565b604051601f85017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715610fce57610fce6112cd565b81604052809350858152868686011115610fe757600080fd5b858560208301376000602087830101525050509392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461102557600080fd5b919050565b60006020828403121561103b578081fd5b610f6682611001565b600080600080600060a0868803121561105b578081fd5b61106486611001565b945060208601359350604086013567ffffffffffffffff80821115611087578283fd5b818801915088601f83011261109a578283fd5b6110a989833560208501610f6d565b945060608801359150808211156110be578283fd5b508601601f810188136110cf578182fd5b6110de88823560208401610f6d565b95989497509295608001359392505050565b600060208284031215611101578081fd5b5035919050565b6000815180845261112081602086016020860161129d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000084168252825161118c81600485016020870161129d565b919091016004019392505050565b600082516111ac81846020870161129d565b9190910192915050565b600073ffffffffffffffffffffffffffffffffffffffff8716825285602083015260a060408301526111eb60a0830186611108565b82810360608401526111fd8186611108565b9150508260808301529695505050505050565b600060208252610f666020830184611108565b60008582526080602083015261123c6080830186611108565b828103604084015261124e8186611108565b91505082606083015295945050505050565b60008219821115611298577f4e487b710000000000000000000000000000000000000000000000000000000081526011600452602481fd5b500190565b60005b838110156112b85781810151838201526020016112a0565b838111156112c7576000848401525b50505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fdfea26469706673582212205ffd2f82166442e1e9d950d6fc2bae0adcbe5ca294289d569aa7f425a38043e164736f6c63430008030033