Address Details
contract

0xF9d414813e189c1b6dB7Fce7806aF42629239e38

Contract Name
MoolaTimelock
Creator
0x007e71–f37016 at 0x561bef–590dd1
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
5 Transactions
Transfers
3 Transfers
Gas Used
225,953
Last Balance Update
18846303
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
MoolaTimelock




Optimization enabled
true
Compiler version
v0.8.16+commit.07a7930e




Optimization runs
200
EVM Version
london




Verified at
2022-09-22T13:17:38.969119Z

contracts/controller/MoolaTimelock.sol

// SPDX-License-Identifier: BSD-3-Clause
pragma solidity ^0.8.10;

import "../utils/SafeMath.sol";

contract MoolaTimelock {
    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_) public {
        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_;
    }

    fallback() 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;
    }
}
        

/contracts/utils/SafeMath.sol

// SPDX-License-Identifier: BSD-3-Clause
pragma solidity ^0.8.10;

// From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol
// Subject to the MIT license.

/**
 * @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, reverting on overflow.
   *
   * Counterpart to Solidity's `+` operator.
   *
   * Requirements:
   * - Addition cannot overflow.
   */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c;
    unchecked {
      c = a + b;
    }
    require(c >= a, "SafeMath: addition overflow");

    return c;
  }

  /**
   * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow.
   *
   * Counterpart to Solidity's `+` operator.
   *
   * Requirements:
   * - Addition cannot overflow.
   */
  function add(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    uint256 c;
    unchecked {
      c = a + b;
    }
    require(c >= a, errorMessage);

    return c;
  }

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

  /**
   * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative).
   *
   * Counterpart to Solidity's `-` operator.
   *
   * Requirements:
   * - Subtraction cannot underflow.
   */
  function sub(
    uint256 a,
    uint256 b,
    string memory errorMessage
  ) internal pure returns (uint256) {
    require(b <= a, errorMessage);
    uint256 c = a - b;

    return c;
  }

  /**
   * @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) {
    // 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 0;
    }

    uint256 c;
    unchecked {
      c = a * b;
    }
    require(c / a == b, "SafeMath: multiplication overflow");

    return c;
  }

  /**
   * @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,
    string memory errorMessage
  ) internal pure returns (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 0;
    }

    uint256 c;
    unchecked {
      c = a * b;
    }
    require(c / a == b, errorMessage);

    return c;
  }

  /**
   * @dev Returns the integer division of two unsigned integers.
   * Reverts 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) {
    return div(a, b, "SafeMath: division by zero");
  }

  /**
   * @dev Returns the integer division of two unsigned integers.
   * Reverts with custom message 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,
    string memory errorMessage
  ) internal pure returns (uint256) {
    // Solidity only automatically asserts when dividing by 0
    require(b > 0, errorMessage);
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold

    return c;
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts 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 mod(a, b, "SafeMath: modulo by zero");
  }

  /**
   * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
   * Reverts with custom message 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,
    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":"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"}]}]
              

Contract Creation Code

0x608060405234801561001057600080fd5b506040516110d93803806110d983398101604081905261002f9161014f565b6202a3008110156100ad5760405162461bcd60e51b815260206004820152603760248201527f54696d656c6f636b3a3a636f6e7374727563746f723a2044656c6179206d757360448201527f7420657863656564206d696e696d756d2064656c61792e00000000000000000060648201526084015b60405180910390fd5b62278d008111156101265760405162461bcd60e51b815260206004820152603860248201527f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d757374206e60448201527f6f7420657863656564206d6178696d756d2064656c61792e000000000000000060648201526084016100a4565b600080546001600160a01b0319166001600160a01b039390931692909217909155600255610189565b6000806040838503121561016257600080fd5b82516001600160a01b038116811461017957600080fd5b6020939093015192949293505050565b610f41806101986000396000f3fe6080604052600436106100bc5760003560e01c80636a42b8f811610079578063c1a287e211610056578063c1a287e2146101e6578063e177246e146101fd578063f2b065371461021d578063f851a4401461025d57005b80636a42b8f8146101a25780637d645fab146101b8578063b1b43ae5146101cf57005b80630825f38f146100be5780630e18b681146100e757806326782247146100fc5780633a66f901146101345780634dd18bf514610162578063591fcdfe14610182575b005b6100d16100cc366004610ccd565b61027d565b6040516100de9190610dce565b60405180910390f35b3480156100f357600080fd5b506100bc6105ef565b34801561010857600080fd5b5060015461011c906001600160a01b031681565b6040516001600160a01b0390911681526020016100de565b34801561014057600080fd5b5061015461014f366004610ccd565b6106b8565b6040519081526020016100de565b34801561016e57600080fd5b506100bc61017d366004610de1565b61086b565b34801561018e57600080fd5b506100bc61019d366004610ccd565b61092a565b3480156101ae57600080fd5b5061015460025481565b3480156101c457600080fd5b5061015462278d0081565b3480156101db57600080fd5b506101546202a30081565b3480156101f257600080fd5b506101546212750081565b34801561020957600080fd5b506100bc610218366004610dfc565b610a44565b34801561022957600080fd5b5061024d610238366004610dfc565b60036020526000908152604090205460ff1681565b60405190151581526020016100de565b34801561026957600080fd5b5060005461011c906001600160a01b031681565b6000546060906001600160a01b031633146103055760405162461bcd60e51b815260206004820152603860248201527f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20436160448201527f6c6c206d75737420636f6d652066726f6d2061646d696e2e000000000000000060648201526084015b60405180910390fd5b60008686868686604051602001610320959493929190610e15565b60408051601f1981840301815291815281516020928301206000818152600390935291205490915060ff166103ab5760405162461bcd60e51b815260206004820152603d6024820152600080516020610eec83398151915260448201527f616e73616374696f6e206861736e2774206265656e207175657565642e00000060648201526084016102fc565b8242101561041d5760405162461bcd60e51b81526020600482015260456024820152600080516020610eec83398151915260448201527f616e73616374696f6e206861736e2774207375727061737365642074696d65206064820152643637b1b59760d91b608482015260a4016102fc565b61042a8362127500610bc9565b4211156104835760405162461bcd60e51b81526020600482015260336024820152600080516020610eec83398151915260448201527230b739b0b1ba34b7b71034b99039ba30b6329760691b60648201526084016102fc565b6000818152600360205260408120805460ff191690558551606091036104aa5750836104d6565b8580519060200120856040516020016104c4929190610e61565b60405160208183030381529060405290505b600080896001600160a01b031689846040516104f29190610e92565b60006040518083038185875af1925050503d806000811461052f576040519150601f19603f3d011682016040523d82523d6000602084013e610534565b606091505b50915091508161059a5760405162461bcd60e51b815260206004820152603d6024820152600080516020610eec83398151915260448201527f616e73616374696f6e20657865637574696f6e2072657665727465642e00000060648201526084016102fc565b896001600160a01b0316847fa560e3198060a2f10670c1ec5b403077ea6ae93ca8de1c32b451dc1a943cd6e78b8b8b8b6040516105da9493929190610eae565b60405180910390a39998505050505050505050565b6001546001600160a01b0316331461066f5760405162461bcd60e51b815260206004820152603860248201527f54696d656c6f636b3a3a61636365707441646d696e3a2043616c6c206d75737460448201527f20636f6d652066726f6d2070656e64696e6741646d696e2e000000000000000060648201526084016102fc565b60008054336001600160a01b0319918216811783556001805490921690915560405190917f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c91a2565b600080546001600160a01b031633146107325760405162461bcd60e51b815260206004820152603660248201527f54696d656c6f636b3a3a71756575655472616e73616374696f6e3a2043616c6c6044820152751036bab9ba1031b7b6b290333937b69030b236b4b71760511b60648201526084016102fc565b61074560025461073f4290565b90610bc9565b8210156107cc5760405162461bcd60e51b815260206004820152604960248201527f54696d656c6f636b3a3a71756575655472616e73616374696f6e3a204573746960448201527f6d6174656420657865637574696f6e20626c6f636b206d757374207361746973606482015268333c903232b630bc9760b91b608482015260a4016102fc565b600086868686866040516020016107e7959493929190610e15565b60408051601f19818403018152828252805160209182012060008181526003909252919020805460ff1916600117905591506001600160a01b0388169082907f76e2796dc3a81d57b0e8504b647febcbeeb5f4af818e164f11eef8131a6a763f90610859908a908a908a908a90610eae565b60405180910390a39695505050505050565b3330146108e05760405162461bcd60e51b815260206004820152603860248201527f54696d656c6f636b3a3a73657450656e64696e6741646d696e3a2043616c6c2060448201527f6d75737420636f6d652066726f6d2054696d656c6f636b2e000000000000000060648201526084016102fc565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a75690600090a250565b6000546001600160a01b031633146109aa5760405162461bcd60e51b815260206004820152603760248201527f54696d656c6f636b3a3a63616e63656c5472616e73616374696f6e3a2043616c60448201527f6c206d75737420636f6d652066726f6d2061646d696e2e00000000000000000060648201526084016102fc565b600085858585856040516020016109c5959493929190610e15565b60408051601f19818403018152828252805160209182012060008181526003909252919020805460ff1916905591506001600160a01b0387169082907f2fffc091a501fd91bfbff27141450d3acb40fb8e6d8382b243ec7a812a3aaf8790610a34908990899089908990610eae565b60405180910390a3505050505050565b333014610aad5760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b3a3a73657444656c61793a2043616c6c206d75737420636f60448201527036b290333937b6902a34b6b2b637b1b59760791b60648201526084016102fc565b6202a300811015610b1d5760405162461bcd60e51b815260206004820152603460248201527f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d75737420656044820152733c31b2b2b21036b4b734b6bab6903232b630bc9760611b60648201526084016102fc565b62278d00811115610b965760405162461bcd60e51b815260206004820152603860248201527f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d757374206e60448201527f6f7420657863656564206d6178696d756d2064656c61792e000000000000000060648201526084016102fc565b600281905560405181907f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c90600090a250565b600082820183811015610c1e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016102fc565b9392505050565b80356001600160a01b0381168114610c3c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115610c7257610c72610c41565b604051601f8501601f19908116603f01168101908282118183101715610c9a57610c9a610c41565b81604052809350858152868686011115610cb357600080fd5b858560208301376000602087830101525050509392505050565b600080600080600060a08688031215610ce557600080fd5b610cee86610c25565b945060208601359350604086013567ffffffffffffffff80821115610d1257600080fd5b818801915088601f830112610d2657600080fd5b610d3589833560208501610c57565b94506060880135915080821115610d4b57600080fd5b508601601f81018813610d5d57600080fd5b610d6c88823560208401610c57565b95989497509295608001359392505050565b60005b83811015610d99578181015183820152602001610d81565b50506000910152565b60008151808452610dba816020860160208601610d7e565b601f01601f19169290920160200192915050565b602081526000610c1e6020830184610da2565b600060208284031215610df357600080fd5b610c1e82610c25565b600060208284031215610e0e57600080fd5b5035919050565b60018060a01b038616815284602082015260a060408201526000610e3c60a0830186610da2565b8281036060840152610e4e8186610da2565b9150508260808301529695505050505050565b6001600160e01b0319831681528151600090610e84816004850160208701610d7e565b919091016004019392505050565b60008251610ea4818460208701610d7e565b9190910192915050565b848152608060208201526000610ec76080830186610da2565b8281036040840152610ed98186610da2565b9150508260608301529594505050505056fe54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a205472a26469706673582212208168a0764398280650ab509e69fbdc8ea5e29838c9b0c54718c5099572f2885664736f6c63430008100033000000000000000000000000007e71f8f069884d9dc3aa1f8d8e7fc112f37016000000000000000000000000000000000000000000000000000000000002a300

Deployed ByteCode

0x6080604052600436106100bc5760003560e01c80636a42b8f811610079578063c1a287e211610056578063c1a287e2146101e6578063e177246e146101fd578063f2b065371461021d578063f851a4401461025d57005b80636a42b8f8146101a25780637d645fab146101b8578063b1b43ae5146101cf57005b80630825f38f146100be5780630e18b681146100e757806326782247146100fc5780633a66f901146101345780634dd18bf514610162578063591fcdfe14610182575b005b6100d16100cc366004610ccd565b61027d565b6040516100de9190610dce565b60405180910390f35b3480156100f357600080fd5b506100bc6105ef565b34801561010857600080fd5b5060015461011c906001600160a01b031681565b6040516001600160a01b0390911681526020016100de565b34801561014057600080fd5b5061015461014f366004610ccd565b6106b8565b6040519081526020016100de565b34801561016e57600080fd5b506100bc61017d366004610de1565b61086b565b34801561018e57600080fd5b506100bc61019d366004610ccd565b61092a565b3480156101ae57600080fd5b5061015460025481565b3480156101c457600080fd5b5061015462278d0081565b3480156101db57600080fd5b506101546202a30081565b3480156101f257600080fd5b506101546212750081565b34801561020957600080fd5b506100bc610218366004610dfc565b610a44565b34801561022957600080fd5b5061024d610238366004610dfc565b60036020526000908152604090205460ff1681565b60405190151581526020016100de565b34801561026957600080fd5b5060005461011c906001600160a01b031681565b6000546060906001600160a01b031633146103055760405162461bcd60e51b815260206004820152603860248201527f54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a20436160448201527f6c6c206d75737420636f6d652066726f6d2061646d696e2e000000000000000060648201526084015b60405180910390fd5b60008686868686604051602001610320959493929190610e15565b60408051601f1981840301815291815281516020928301206000818152600390935291205490915060ff166103ab5760405162461bcd60e51b815260206004820152603d6024820152600080516020610eec83398151915260448201527f616e73616374696f6e206861736e2774206265656e207175657565642e00000060648201526084016102fc565b8242101561041d5760405162461bcd60e51b81526020600482015260456024820152600080516020610eec83398151915260448201527f616e73616374696f6e206861736e2774207375727061737365642074696d65206064820152643637b1b59760d91b608482015260a4016102fc565b61042a8362127500610bc9565b4211156104835760405162461bcd60e51b81526020600482015260336024820152600080516020610eec83398151915260448201527230b739b0b1ba34b7b71034b99039ba30b6329760691b60648201526084016102fc565b6000818152600360205260408120805460ff191690558551606091036104aa5750836104d6565b8580519060200120856040516020016104c4929190610e61565b60405160208183030381529060405290505b600080896001600160a01b031689846040516104f29190610e92565b60006040518083038185875af1925050503d806000811461052f576040519150601f19603f3d011682016040523d82523d6000602084013e610534565b606091505b50915091508161059a5760405162461bcd60e51b815260206004820152603d6024820152600080516020610eec83398151915260448201527f616e73616374696f6e20657865637574696f6e2072657665727465642e00000060648201526084016102fc565b896001600160a01b0316847fa560e3198060a2f10670c1ec5b403077ea6ae93ca8de1c32b451dc1a943cd6e78b8b8b8b6040516105da9493929190610eae565b60405180910390a39998505050505050505050565b6001546001600160a01b0316331461066f5760405162461bcd60e51b815260206004820152603860248201527f54696d656c6f636b3a3a61636365707441646d696e3a2043616c6c206d75737460448201527f20636f6d652066726f6d2070656e64696e6741646d696e2e000000000000000060648201526084016102fc565b60008054336001600160a01b0319918216811783556001805490921690915560405190917f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c91a2565b600080546001600160a01b031633146107325760405162461bcd60e51b815260206004820152603660248201527f54696d656c6f636b3a3a71756575655472616e73616374696f6e3a2043616c6c6044820152751036bab9ba1031b7b6b290333937b69030b236b4b71760511b60648201526084016102fc565b61074560025461073f4290565b90610bc9565b8210156107cc5760405162461bcd60e51b815260206004820152604960248201527f54696d656c6f636b3a3a71756575655472616e73616374696f6e3a204573746960448201527f6d6174656420657865637574696f6e20626c6f636b206d757374207361746973606482015268333c903232b630bc9760b91b608482015260a4016102fc565b600086868686866040516020016107e7959493929190610e15565b60408051601f19818403018152828252805160209182012060008181526003909252919020805460ff1916600117905591506001600160a01b0388169082907f76e2796dc3a81d57b0e8504b647febcbeeb5f4af818e164f11eef8131a6a763f90610859908a908a908a908a90610eae565b60405180910390a39695505050505050565b3330146108e05760405162461bcd60e51b815260206004820152603860248201527f54696d656c6f636b3a3a73657450656e64696e6741646d696e3a2043616c6c2060448201527f6d75737420636f6d652066726f6d2054696d656c6f636b2e000000000000000060648201526084016102fc565b600180546001600160a01b0319166001600160a01b0383169081179091556040517f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a75690600090a250565b6000546001600160a01b031633146109aa5760405162461bcd60e51b815260206004820152603760248201527f54696d656c6f636b3a3a63616e63656c5472616e73616374696f6e3a2043616c60448201527f6c206d75737420636f6d652066726f6d2061646d696e2e00000000000000000060648201526084016102fc565b600085858585856040516020016109c5959493929190610e15565b60408051601f19818403018152828252805160209182012060008181526003909252919020805460ff1916905591506001600160a01b0387169082907f2fffc091a501fd91bfbff27141450d3acb40fb8e6d8382b243ec7a812a3aaf8790610a34908990899089908990610eae565b60405180910390a3505050505050565b333014610aad5760405162461bcd60e51b815260206004820152603160248201527f54696d656c6f636b3a3a73657444656c61793a2043616c6c206d75737420636f60448201527036b290333937b6902a34b6b2b637b1b59760791b60648201526084016102fc565b6202a300811015610b1d5760405162461bcd60e51b815260206004820152603460248201527f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d75737420656044820152733c31b2b2b21036b4b734b6bab6903232b630bc9760611b60648201526084016102fc565b62278d00811115610b965760405162461bcd60e51b815260206004820152603860248201527f54696d656c6f636b3a3a73657444656c61793a2044656c6179206d757374206e60448201527f6f7420657863656564206d6178696d756d2064656c61792e000000000000000060648201526084016102fc565b600281905560405181907f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c90600090a250565b600082820183811015610c1e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016102fc565b9392505050565b80356001600160a01b0381168114610c3c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115610c7257610c72610c41565b604051601f8501601f19908116603f01168101908282118183101715610c9a57610c9a610c41565b81604052809350858152868686011115610cb357600080fd5b858560208301376000602087830101525050509392505050565b600080600080600060a08688031215610ce557600080fd5b610cee86610c25565b945060208601359350604086013567ffffffffffffffff80821115610d1257600080fd5b818801915088601f830112610d2657600080fd5b610d3589833560208501610c57565b94506060880135915080821115610d4b57600080fd5b508601601f81018813610d5d57600080fd5b610d6c88823560208401610c57565b95989497509295608001359392505050565b60005b83811015610d99578181015183820152602001610d81565b50506000910152565b60008151808452610dba816020860160208601610d7e565b601f01601f19169290920160200192915050565b602081526000610c1e6020830184610da2565b600060208284031215610df357600080fd5b610c1e82610c25565b600060208284031215610e0e57600080fd5b5035919050565b60018060a01b038616815284602082015260a060408201526000610e3c60a0830186610da2565b8281036060840152610e4e8186610da2565b9150508260808301529695505050505050565b6001600160e01b0319831681528151600090610e84816004850160208701610d7e565b919091016004019392505050565b60008251610ea4818460208701610d7e565b9190910192915050565b848152608060208201526000610ec76080830186610da2565b8281036040840152610ed98186610da2565b9150508260608301529594505050505056fe54696d656c6f636b3a3a657865637574655472616e73616374696f6e3a205472a26469706673582212208168a0764398280650ab509e69fbdc8ea5e29838c9b0c54718c5099572f2885664736f6c63430008100033