false
false

Contract Address Details

0xAd0BFA476FB71215BA026EBE60FfA9b31D98Efe7

Contract Name
Timelock
Creator
0x68b6f4–0b8438 at 0x485850–d7ca40
Balance
0 KCS ( )
Tokens
Fetching tokens...
Transactions
158 Transactions
Transfers
0 Transfers
Gas Used
48,355,711
Last Balance Update
45214060
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
Timelock




Optimization enabled
true
Compiler version
v0.7.6+commit.7338295f




Optimization runs
200
Verified at
2022-04-01T08:19:11.180147Z

Constructor Arguments

00000000000000000000000068b6f473a6cb4e5da1159e4dc6b2a2c76a0b843800000000000000000000000000000000000000000000000000000000000000b4

Arg [0] (address) : 0x68b6f473a6cb4e5da1159e4dc6b2a2c76a0b8438
Arg [1] (uint256) : 180

              

project:/contracts/gov/Timelock.sol

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.7.6;


import "@openzeppelin/contracts/math/SafeMath.sol";

/// @title Admin to all OpenLeverage contracts
/// @author OpenLeverage
/// @dev Fork from compound https://github.com/compound-finance/compound-protocol/blob/master/contracts/Timelock.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 = 3 minutes;
    uint public constant MAXIMUM_DELAY = 3 days;

    address public admin;
    address public pendingAdmin;
    uint public delay;
    bool public admin_initialized;

    mapping(bytes32 => bool) public queuedTransactions;


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

        admin = admin_;
        delay = delay_;
        admin_initialized = false;
    }

    fallback() external payable {}

    receive() external payable {}

    modifier onlyAdmin() {
        require(msg.sender == admin);
        _;
    }

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

        emit NewDelay(delay);
    }

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

        emit NewAdmin(admin);
    }

    function setPendingAdmin(address pendingAdmin_) public {
        if (admin_initialized) {
            require(msg.sender == address(this), "Call must come from Timelock");
        } else {
            require(msg.sender == admin, "Call must come from admin");
            admin_initialized = true;
        }
        pendingAdmin = pendingAdmin_;
        emit NewPendingAdmin(pendingAdmin);
    }

    /// @dev Save transactions before execution. Allowed to cancel before eta
    /// @param target Address of contract to call.
    /// @param value Amount of native token send along with the transaction.
    /// @param signature Function signature of the target contract.
    /// @param data Argument pass to the target function.
    /// @param eta time before execution.
    /// @return ID of the transaction
    function queueTransaction(address target, uint value, string memory signature, bytes memory data, uint eta) public returns (bytes32) {
        require(msg.sender == admin, "Call must come from admin");
        require(eta >= getBlockTimestamp().add(delay), "ETA 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;
    }

    /// @dev cancel queued transactions.
    /// @param target Address of contract to call.
    /// @param value Amount of native token send along with the transaction.
    /// @param signature Function signature of the target contract.
    /// @param data Argument pass to the target function.
    /// @param eta time before execution.
    function cancelTransaction(address target, uint value, string memory signature, bytes memory data, uint eta) public {
        require(msg.sender == admin, "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);
    }

    /// @dev execute queued transactions.
    /// @param target Address of contract to call.
    /// @param value Amount of native token send along with the transaction.
    /// @param signature Function signature of the target contract.
    /// @param data Argument pass to the target function.
    /// @param eta time before execution.
    function executeTransaction(address target, uint value, string memory signature, bytes memory data, uint eta) public payable returns (bytes memory) {
        require(msg.sender == admin, "Call must come from admin");

        bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
        if (admin_initialized) {
            require(queuedTransactions[txHash], "Tx hasn't been queued");
            require(getBlockTimestamp() >= eta, "Not surpassed timelock");
            require(getBlockTimestamp() <= eta.add(GRACE_PERIOD), "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, "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;
    }
}
        

@openzeppelin/contracts/math/SafeMath.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
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) {
        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) {
        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) {
        // 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) {
        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) {
        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) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }

    /**
     * @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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    /**
     * @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. 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) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b > 0, "SafeMath: modulo by zero");
        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) {
        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.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryDiv}.
     *
     * 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) {
        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) {
        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":"fallback","stateMutability":"payable"},{"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":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"admin_initialized","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

0x608060405234801561001057600080fd5b5060405161170a38038061170a8339818101604052604081101561003357600080fd5b50805160209091015160b4811015610092576040805162461bcd60e51b815260206004820152601960248201527f44656c6179206d75737420657863656564206d696e696d756d00000000000000604482015290519081900360640190fd5b6203f4808111156100ea576040805162461bcd60e51b815260206004820152601d60248201527f44656c6179206d757374206e6f7420657863656564206d6178696d756d000000604482015290519081900360640190fd5b600080546001600160a01b039093166001600160a01b0319909316929092179091556002556003805460ff191690556115e2806101286000396000f3fe6080604052600436106100e15760003560e01c80636fc1f57e1161007f578063c1a287e211610059578063c1a287e21461062c578063e177246e14610641578063f2b065371461066b578063f851a44014610695576100e8565b80636fc1f57e146105d95780637d645fab14610602578063b1b43ae514610617576100e8565b80633a66f901116100bb5780633a66f901146102e55780634dd18bf514610444578063591fcdfe146104775780636a42b8f8146105c4576100e8565b80630825f38f146100ea5780630e18b6811461029f57806326782247146102b4576100e8565b366100e857005b005b61022a600480360360a081101561010057600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561012f57600080fd5b82018360208201111561014157600080fd5b803590602001918460018302840111600160201b8311171561016257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156101b457600080fd5b8201836020820111156101c657600080fd5b803590602001918460018302840111600160201b831117156101e757600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506106aa915050565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026457818101518382015260200161024c565b50505050905090810190601f1680156102915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ab57600080fd5b506100e8610c0c565b3480156102c057600080fd5b506102c9610cbe565b604080516001600160a01b039092168252519081900360200190f35b3480156102f157600080fd5b50610432600480360360a081101561030857600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561033757600080fd5b82018360208201111561034957600080fd5b803590602001918460018302840111600160201b8311171561036a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156103bc57600080fd5b8201836020820111156103ce57600080fd5b803590602001918460018302840111600160201b831117156103ef57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610ccd915050565b60408051918252519081900360200190f35b34801561045057600080fd5b506100e86004803603602081101561046757600080fd5b50356001600160a01b0316610ff0565b34801561048357600080fd5b506100e8600480360360a081101561049a57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156104c957600080fd5b8201836020820111156104db57600080fd5b803590602001918460018302840111600160201b831117156104fc57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561054e57600080fd5b82018360208201111561056057600080fd5b803590602001918460018302840111600160201b8311171561058157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925061110d915050565b3480156105d057600080fd5b506104326113cc565b3480156105e557600080fd5b506105ee6113d2565b604080519115158252519081900360200190f35b34801561060e57600080fd5b506104326113db565b34801561062357600080fd5b506104326113e2565b34801561063857600080fd5b506104326113e7565b34801561064d57600080fd5b506100e86004803603602081101561066457600080fd5b50356113ee565b34801561067757600080fd5b506105ee6004803603602081101561068e57600080fd5b5035611523565b3480156106a157600080fd5b506102c9611538565b6000546060906001600160a01b03163314610708576040805162461bcd60e51b815260206004820152601960248201527821b0b6361036bab9ba1031b7b6b290333937b69030b236b4b760391b604482015290519081900360640190fd5b6000868686868660405160200180866001600160a01b031681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101561076e578181015183820152602001610756565b50505050905090810190601f16801561079b5780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b838110156107ce5781810151838201526020016107b6565b50505050905090810190601f1680156107fb5780820380516001836020036101000a031916815260200191505b5060408051601f19818403018152919052805160209091012060035490995060ff1615975061095296505050505050505760008181526004602052604090205460ff16610887576040805162461bcd60e51b8152602060048201526015602482015274151e081a185cdb89dd081899595b881c5d595d5959605a1b604482015290519081900360640190fd5b82610890611547565b10156108dc576040805162461bcd60e51b81526020600482015260166024820152754e6f74207375727061737365642074696d656c6f636b60501b604482015290519081900360640190fd5b6108e9836212750061154b565b6108f1611547565b111561093b576040805162461bcd60e51b81526020600482015260146024820152735472616e73616374696f6e206973207374616c6560601b604482015290519081900360640190fd5b6000818152600460205260409020805460ff191690555b60608551600014156109655750836109e8565b85805190602001208560405160200180836001600160e01b031916815260040182805190602001908083835b602083106109b05780518252601f199092019160209182019101610991565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b600080896001600160a01b031689846040518082805190602001908083835b60208310610a265780518252601f199092019160209182019101610a07565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610a88576040519150601f19603f3d011682016040523d82523d6000602084013e610a8d565b606091505b509150915081610ae4576040805162461bcd60e51b815260206004820152601e60248201527f5472616e73616374696f6e20657865637574696f6e2072657665727465640000604482015290519081900360640190fd5b896001600160a01b0316847fa560e3198060a2f10670c1ec5b403077ea6ae93ca8de1c32b451dc1a943cd6e78b8b8b8b604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015610b61578181015183820152602001610b49565b50505050905090810190601f168015610b8e5780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b83811015610bc1578181015183820152602001610ba9565b50505050905090810190601f168015610bee5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a39998505050505050505050565b6001546001600160a01b03163314610c6b576040805162461bcd60e51b815260206004820152601b60248201527f43616c6c206d7573742066726f6d2070656e64696e6741646d696e0000000000604482015290519081900360640190fd5b60008054336001600160a01b031991821617808355600180549092169091556040516001600160a01b03909116917f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c91a2565b6001546001600160a01b031681565b600080546001600160a01b03163314610d29576040805162461bcd60e51b815260206004820152601960248201527821b0b6361036bab9ba1031b7b6b290333937b69030b236b4b760391b604482015290519081900360640190fd5b610d3d600254610d37611547565b9061154b565b821015610d8a576040805162461bcd60e51b8152602060048201526016602482015275455441206d75737420736174697366792064656c617960501b604482015290519081900360640190fd5b6000868686868660405160200180866001600160a01b031681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015610df0578181015183820152602001610dd8565b50505050905090810190601f168015610e1d5780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b83811015610e50578181015183820152602001610e38565b50505050905090810190601f168015610e7d5780820380516001836020036101000a031916815260200191505b5097505050505050505060405160208183030381529060405280519060200120905060016004600083815260200190815260200160002060006101000a81548160ff021916908315150217905550866001600160a01b0316817f76e2796dc3a81d57b0e8504b647febcbeeb5f4af818e164f11eef8131a6a763f88888888604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015610f48578181015183820152602001610f30565b50505050905090810190601f168015610f755780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b83811015610fa8578181015183820152602001610f90565b50505050905090810190601f168015610fd55780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a39695505050505050565b60035460ff16156110545733301461104f576040805162461bcd60e51b815260206004820152601c60248201527f43616c6c206d75737420636f6d652066726f6d2054696d656c6f636b00000000604482015290519081900360640190fd5b6110bd565b6000546001600160a01b031633146110af576040805162461bcd60e51b815260206004820152601960248201527821b0b6361036bab9ba1031b7b6b290333937b69030b236b4b760391b604482015290519081900360640190fd5b6003805460ff191660011790555b600180546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a75690600090a250565b6000546001600160a01b03163314611168576040805162461bcd60e51b815260206004820152601960248201527821b0b6361036bab9ba1031b7b6b290333937b69030b236b4b760391b604482015290519081900360640190fd5b6000858585858560405160200180866001600160a01b031681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156111ce5781810151838201526020016111b6565b50505050905090810190601f1680156111fb5780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561122e578181015183820152602001611216565b50505050905090810190601f16801561125b5780820380516001836020036101000a031916815260200191505b5097505050505050505060405160208183030381529060405280519060200120905060006004600083815260200190815260200160002060006101000a81548160ff021916908315150217905550856001600160a01b0316817f2fffc091a501fd91bfbff27141450d3acb40fb8e6d8382b243ec7a812a3aaf8787878787604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101561132657818101518382015260200161130e565b50505050905090810190601f1680156113535780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561138657818101518382015260200161136e565b50505050905090810190601f1680156113b35780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a3505050505050565b60025481565b60035460ff1681565b6203f48081565b60b481565b6212750081565b333014611442576040805162461bcd60e51b815260206004820152601c60248201527f43616c6c206d75737420636f6d652066726f6d2054696d656c6f636b00000000604482015290519081900360640190fd5b60b4811015611498576040805162461bcd60e51b815260206004820152601960248201527f44656c6179206d75737420657863656564206d696e696d756d00000000000000604482015290519081900360640190fd5b6203f4808111156114f0576040805162461bcd60e51b815260206004820152601d60248201527f44656c6179206d757374206e6f7420657863656564206d6178696d756d000000604482015290519081900360640190fd5b600281905560405181907f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c90600090a250565b60046020526000908152604090205460ff1681565b6000546001600160a01b031681565b4290565b6000828201838110156115a5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b939250505056fea2646970667358221220dcc4e1057a9e8f4ebe10a12d66784ea2a0395c1c6b96285534763c07859c299664736f6c6343000706003300000000000000000000000068b6f473a6cb4e5da1159e4dc6b2a2c76a0b843800000000000000000000000000000000000000000000000000000000000000b4

Deployed ByteCode

0x6080604052600436106100e15760003560e01c80636fc1f57e1161007f578063c1a287e211610059578063c1a287e21461062c578063e177246e14610641578063f2b065371461066b578063f851a44014610695576100e8565b80636fc1f57e146105d95780637d645fab14610602578063b1b43ae514610617576100e8565b80633a66f901116100bb5780633a66f901146102e55780634dd18bf514610444578063591fcdfe146104775780636a42b8f8146105c4576100e8565b80630825f38f146100ea5780630e18b6811461029f57806326782247146102b4576100e8565b366100e857005b005b61022a600480360360a081101561010057600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561012f57600080fd5b82018360208201111561014157600080fd5b803590602001918460018302840111600160201b8311171561016257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156101b457600080fd5b8201836020820111156101c657600080fd5b803590602001918460018302840111600160201b831117156101e757600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506106aa915050565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561026457818101518382015260200161024c565b50505050905090810190601f1680156102915780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102ab57600080fd5b506100e8610c0c565b3480156102c057600080fd5b506102c9610cbe565b604080516001600160a01b039092168252519081900360200190f35b3480156102f157600080fd5b50610432600480360360a081101561030857600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561033757600080fd5b82018360208201111561034957600080fd5b803590602001918460018302840111600160201b8311171561036a57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156103bc57600080fd5b8201836020820111156103ce57600080fd5b803590602001918460018302840111600160201b831117156103ef57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610ccd915050565b60408051918252519081900360200190f35b34801561045057600080fd5b506100e86004803603602081101561046757600080fd5b50356001600160a01b0316610ff0565b34801561048357600080fd5b506100e8600480360360a081101561049a57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b8111156104c957600080fd5b8201836020820111156104db57600080fd5b803590602001918460018302840111600160201b831117156104fc57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561054e57600080fd5b82018360208201111561056057600080fd5b803590602001918460018302840111600160201b8311171561058157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550509135925061110d915050565b3480156105d057600080fd5b506104326113cc565b3480156105e557600080fd5b506105ee6113d2565b604080519115158252519081900360200190f35b34801561060e57600080fd5b506104326113db565b34801561062357600080fd5b506104326113e2565b34801561063857600080fd5b506104326113e7565b34801561064d57600080fd5b506100e86004803603602081101561066457600080fd5b50356113ee565b34801561067757600080fd5b506105ee6004803603602081101561068e57600080fd5b5035611523565b3480156106a157600080fd5b506102c9611538565b6000546060906001600160a01b03163314610708576040805162461bcd60e51b815260206004820152601960248201527821b0b6361036bab9ba1031b7b6b290333937b69030b236b4b760391b604482015290519081900360640190fd5b6000868686868660405160200180866001600160a01b031681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101561076e578181015183820152602001610756565b50505050905090810190601f16801561079b5780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b838110156107ce5781810151838201526020016107b6565b50505050905090810190601f1680156107fb5780820380516001836020036101000a031916815260200191505b5060408051601f19818403018152919052805160209091012060035490995060ff1615975061095296505050505050505760008181526004602052604090205460ff16610887576040805162461bcd60e51b8152602060048201526015602482015274151e081a185cdb89dd081899595b881c5d595d5959605a1b604482015290519081900360640190fd5b82610890611547565b10156108dc576040805162461bcd60e51b81526020600482015260166024820152754e6f74207375727061737365642074696d656c6f636b60501b604482015290519081900360640190fd5b6108e9836212750061154b565b6108f1611547565b111561093b576040805162461bcd60e51b81526020600482015260146024820152735472616e73616374696f6e206973207374616c6560601b604482015290519081900360640190fd5b6000818152600460205260409020805460ff191690555b60608551600014156109655750836109e8565b85805190602001208560405160200180836001600160e01b031916815260040182805190602001908083835b602083106109b05780518252601f199092019160209182019101610991565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b600080896001600160a01b031689846040518082805190602001908083835b60208310610a265780518252601f199092019160209182019101610a07565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114610a88576040519150601f19603f3d011682016040523d82523d6000602084013e610a8d565b606091505b509150915081610ae4576040805162461bcd60e51b815260206004820152601e60248201527f5472616e73616374696f6e20657865637574696f6e2072657665727465640000604482015290519081900360640190fd5b896001600160a01b0316847fa560e3198060a2f10670c1ec5b403077ea6ae93ca8de1c32b451dc1a943cd6e78b8b8b8b604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015610b61578181015183820152602001610b49565b50505050905090810190601f168015610b8e5780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b83811015610bc1578181015183820152602001610ba9565b50505050905090810190601f168015610bee5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a39998505050505050505050565b6001546001600160a01b03163314610c6b576040805162461bcd60e51b815260206004820152601b60248201527f43616c6c206d7573742066726f6d2070656e64696e6741646d696e0000000000604482015290519081900360640190fd5b60008054336001600160a01b031991821617808355600180549092169091556040516001600160a01b03909116917f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c91a2565b6001546001600160a01b031681565b600080546001600160a01b03163314610d29576040805162461bcd60e51b815260206004820152601960248201527821b0b6361036bab9ba1031b7b6b290333937b69030b236b4b760391b604482015290519081900360640190fd5b610d3d600254610d37611547565b9061154b565b821015610d8a576040805162461bcd60e51b8152602060048201526016602482015275455441206d75737420736174697366792064656c617960501b604482015290519081900360640190fd5b6000868686868660405160200180866001600160a01b031681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015610df0578181015183820152602001610dd8565b50505050905090810190601f168015610e1d5780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b83811015610e50578181015183820152602001610e38565b50505050905090810190601f168015610e7d5780820380516001836020036101000a031916815260200191505b5097505050505050505060405160208183030381529060405280519060200120905060016004600083815260200190815260200160002060006101000a81548160ff021916908315150217905550866001600160a01b0316817f76e2796dc3a81d57b0e8504b647febcbeeb5f4af818e164f11eef8131a6a763f88888888604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b83811015610f48578181015183820152602001610f30565b50505050905090810190601f168015610f755780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b83811015610fa8578181015183820152602001610f90565b50505050905090810190601f168015610fd55780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a39695505050505050565b60035460ff16156110545733301461104f576040805162461bcd60e51b815260206004820152601c60248201527f43616c6c206d75737420636f6d652066726f6d2054696d656c6f636b00000000604482015290519081900360640190fd5b6110bd565b6000546001600160a01b031633146110af576040805162461bcd60e51b815260206004820152601960248201527821b0b6361036bab9ba1031b7b6b290333937b69030b236b4b760391b604482015290519081900360640190fd5b6003805460ff191660011790555b600180546001600160a01b0319166001600160a01b0383811691909117918290556040519116907f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a75690600090a250565b6000546001600160a01b03163314611168576040805162461bcd60e51b815260206004820152601960248201527821b0b6361036bab9ba1031b7b6b290333937b69030b236b4b760391b604482015290519081900360640190fd5b6000858585858560405160200180866001600160a01b031681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156111ce5781810151838201526020016111b6565b50505050905090810190601f1680156111fb5780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561122e578181015183820152602001611216565b50505050905090810190601f16801561125b5780820380516001836020036101000a031916815260200191505b5097505050505050505060405160208183030381529060405280519060200120905060006004600083815260200190815260200160002060006101000a81548160ff021916908315150217905550856001600160a01b0316817f2fffc091a501fd91bfbff27141450d3acb40fb8e6d8382b243ec7a812a3aaf8787878787604051808581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b8381101561132657818101518382015260200161130e565b50505050905090810190601f1680156113535780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561138657818101518382015260200161136e565b50505050905090810190601f1680156113b35780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390a3505050505050565b60025481565b60035460ff1681565b6203f48081565b60b481565b6212750081565b333014611442576040805162461bcd60e51b815260206004820152601c60248201527f43616c6c206d75737420636f6d652066726f6d2054696d656c6f636b00000000604482015290519081900360640190fd5b60b4811015611498576040805162461bcd60e51b815260206004820152601960248201527f44656c6179206d75737420657863656564206d696e696d756d00000000000000604482015290519081900360640190fd5b6203f4808111156114f0576040805162461bcd60e51b815260206004820152601d60248201527f44656c6179206d757374206e6f7420657863656564206d6178696d756d000000604482015290519081900360640190fd5b600281905560405181907f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c90600090a250565b60046020526000908152604090205460ff1681565b6000546001600160a01b031681565b4290565b6000828201838110156115a5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b939250505056fea2646970667358221220dcc4e1057a9e8f4ebe10a12d66784ea2a0395c1c6b96285534763c07859c299664736f6c63430007060033