Address Details
contract

0xd1508A235Aa8B23E8fDC36643EAeCB2Ba6a0ae7d

Contract Name
NounsDAOExecutor
Creator
0x8b2f36–66963a at 0x40bf21–7c57ef
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
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
16206149
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
NounsDAOExecutor




Optimization enabled
false
Compiler version
v0.8.7+commit.e28d00a7




EVM Version
london




Verified at
2023-05-19T23:51:38.239353Z

contracts/governance/NounsDAOExecutor.sol

// SPDX-License-Identifier: BSD-3-Clause

/// @title The Nouns DAO executor and treasury

/*********************************
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 * ░░░░░░█████████░░█████████░░░ *
 * ░░░░░░██░░░████░░██░░░████░░░ *
 * ░░██████░░░████████░░░████░░░ *
 * ░░██░░██░░░████░░██░░░████░░░ *
 * ░░██░░██░░░████░░██░░░████░░░ *
 * ░░░░░░█████████░░█████████░░░ *
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 * ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ *
 *********************************/

// LICENSE
// NounsDAOExecutor.sol is a modified version of Compound Lab's Timelock.sol:
// https://github.com/compound-finance/compound-protocol/blob/20abad28055a2f91df48a90f8bb6009279a4cb35/contracts/Timelock.sol
//
// Timelock.sol source code Copyright 2020 Compound Labs, Inc. licensed under the BSD-3-Clause license.
// With modifications by Nounders DAO.
//
// Additional conditions of BSD-3-Clause can be found here: https://opensource.org/licenses/BSD-3-Clause
//
// MODIFICATIONS
// NounsDAOExecutor.sol modifies Timelock to use Solidity 0.8.x receive(), fallback(), and built-in over/underflow protection
// This contract acts as executor of Nouns DAO governance and its treasury, so it has been modified to accept ETH.

pragma solidity ^0.8.6;

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

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

    address public admin;
    address public pendingAdmin;
    uint256 public delay;

    mapping(bytes32 => bool) public queuedTransactions;

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

        admin = admin_;
        delay = delay_;
    }

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

        emit NewDelay(delay);
    }

    function acceptAdmin() public {
        require(msg.sender == pendingAdmin, 'NounsDAOExecutor::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),
            'NounsDAOExecutor::setPendingAdmin: Call must come from NounsDAOExecutor.'
        );
        pendingAdmin = pendingAdmin_;

        emit NewPendingAdmin(pendingAdmin);
    }

    function queueTransaction(
        address target,
        uint256 value,
        string memory signature,
        bytes memory data,
        uint256 eta
    ) public returns (bytes32) {
        require(msg.sender == admin, 'NounsDAOExecutor::queueTransaction: Call must come from admin.');
        require(
            eta >= getBlockTimestamp() + delay,
            'NounsDAOExecutor::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,
        uint256 value,
        string memory signature,
        bytes memory data,
        uint256 eta
    ) public {
        require(msg.sender == admin, 'NounsDAOExecutor::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,
        uint256 value,
        string memory signature,
        bytes memory data,
        uint256 eta
    ) public returns (bytes memory) {
        require(msg.sender == admin, 'NounsDAOExecutor::executeTransaction: Call must come from admin.');

        bytes32 txHash = keccak256(abi.encode(target, value, signature, data, eta));
        require(queuedTransactions[txHash], "NounsDAOExecutor::executeTransaction: Transaction hasn't been queued.");
        require(
            getBlockTimestamp() >= eta,
            "NounsDAOExecutor::executeTransaction: Transaction hasn't surpassed time lock."
        );
        require(
            getBlockTimestamp() <= eta + GRACE_PERIOD,
            'NounsDAOExecutor::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, 'NounsDAOExecutor::executeTransaction: Transaction execution reverted.');

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

        return returnData;
    }

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

    receive() external payable {}

    fallback() external payable {}
}
        

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":"nonpayable","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

0x60806040523480156200001157600080fd5b506040516200212d3803806200212d833981810160405281019062000037919062000146565b6202a30081101562000080576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200007790620001fd565b60405180910390fd5b62278d00811115620000c9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c090620001db565b60405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600281905550505062000345565b600081519050620001298162000311565b92915050565b60008151905062000140816200032b565b92915050565b6000806040838503121562000160576200015f6200026e565b5b6000620001708582860162000118565b925050602062000183858286016200012f565b9150509250929050565b60006200019c6040836200021f565b9150620001a98262000273565b604082019050919050565b6000620001c3603f836200021f565b9150620001d082620002c2565b604082019050919050565b60006020820190508181036000830152620001f6816200018d565b9050919050565b600060208201905081810360008301526200021881620001b4565b9050919050565b600082825260208201905092915050565b60006200023d8262000244565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600080fd5b7f4e6f756e7344414f4578656375746f723a3a73657444656c61793a2044656c6160008201527f79206d757374206e6f7420657863656564206d6178696d756d2064656c61792e602082015250565b7f4e6f756e7344414f4578656375746f723a3a636f6e7374727563746f723a204460008201527f656c6179206d75737420657863656564206d696e696d756d2064656c61792e00602082015250565b6200031c8162000230565b81146200032857600080fd5b50565b620003368162000264565b81146200034257600080fd5b50565b611dd880620003556000396000f3fe6080604052600436106100c65760003560e01c80636a42b8f81161007f578063c1a287e211610059578063c1a287e21461025e578063e177246e14610289578063f2b06537146102b2578063f851a440146102ef576100cd565b80636a42b8f8146101dd5780637d645fab14610208578063b1b43ae514610233576100cd565b80630825f38f146100cf5780630e18b6811461010c57806326782247146101235780633a66f9011461014e5780634dd18bf51461018b578063591fcdfe146101b4576100cd565b366100cd57005b005b3480156100db57600080fd5b506100f660048036038101906100f19190610eed565b61031a565b60405161010391906113a8565b60405180910390f35b34801561011857600080fd5b50610121610660565b005b34801561012f57600080fd5b506101386107d7565b60405161014591906112f6565b60405180910390f35b34801561015a57600080fd5b5061017560048036038101906101709190610eed565b6107fd565b604051610182919061138d565b60405180910390f35b34801561019757600080fd5b506101b260048036038101906101ad9190610ec0565b6109a6565b005b3480156101c057600080fd5b506101db60048036038101906101d69190610eed565b610abd565b005b3480156101e957600080fd5b506101f2610c07565b6040516101ff919061156a565b60405180910390f35b34801561021457600080fd5b5061021d610c0d565b60405161022a919061156a565b60405180910390f35b34801561023f57600080fd5b50610248610c14565b604051610255919061156a565b60405180910390f35b34801561026a57600080fd5b50610273610c1b565b604051610280919061156a565b60405180910390f35b34801561029557600080fd5b506102b060048036038101906102ab9190610fcd565b610c22565b005b3480156102be57600080fd5b506102d960048036038101906102d49190610fa0565b610d55565b6040516102e69190611372565b60405180910390f35b3480156102fb57600080fd5b50610304610d75565b60405161031191906112f6565b60405180910390f35b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a1906113ca565b60405180910390fd5b600086868686866040516020016103c5959493929190611311565b6040516020818303038152906040528051906020012090506003600082815260200190815260200160002060009054906101000a900460ff1661043d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104349061146a565b60405180910390fd5b82610446610d99565b1015610487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047e906114aa565b60405180910390fd5b621275008361049691906116a2565b61049e610d99565b11156104df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d69061152a565b60405180910390fd5b60006003600083815260200190815260200160002060006101000a81548160ff021916908315150217905550606060008651141561051f5784905061054b565b8580519060200120856040516020016105399291906112b7565b60405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff16898460405161057491906112df565b60006040518083038185875af1925050503d80600081146105b1576040519150601f19603f3d011682016040523d82523d6000602084013e6105b6565b606091505b5091509150816105fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f2906114ca565b60405180910390fd5b8973ffffffffffffffffffffffffffffffffffffffff16847fa560e3198060a2f10670c1ec5b403077ea6ae93ca8de1c32b451dc1a943cd6e78b8b8b8b6040516106489493929190611585565b60405180910390a38094505050505095945050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e79061140a565b60405180910390fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60405160405180910390a2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461088e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610885906113ea565b60405180910390fd5b600254610899610d99565b6108a391906116a2565b8210156108e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108dc9061154a565b60405180910390fd5b60008686868686604051602001610900959493929190611311565b60405160208183030381529060405280519060200120905060016003600083815260200190815260200160002060006101000a81548160ff0219169083151502179055508673ffffffffffffffffffffffffffffffffffffffff16817f76e2796dc3a81d57b0e8504b647febcbeeb5f4af818e164f11eef8131a6a763f888888886040516109919493929190611585565b60405180910390a38091505095945050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b9061150a565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a75660405160405180910390a250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b429061144a565b60405180910390fd5b60008585858585604051602001610b66959493929190611311565b60405160208183030381529060405280519060200120905060006003600083815260200190815260200160002060006101000a81548160ff0219169083151502179055508573ffffffffffffffffffffffffffffffffffffffff16817f2fffc091a501fd91bfbff27141450d3acb40fb8e6d8382b243ec7a812a3aaf8787878787604051610bf79493929190611585565b60405180910390a3505050505050565b60025481565b62278d0081565b6202a30081565b6212750081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c879061148a565b60405180910390fd5b6202a300811015610cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccd906114ea565b60405180910390fd5b62278d00811115610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d139061142a565b60405180910390fd5b806002819055506002547f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c60405160405180910390a250565b60036020528060005260406000206000915054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600042905090565b6000610db4610daf846115fd565b6115d8565b905082815260208101848484011115610dd057610dcf611856565b5b610ddb848285611776565b509392505050565b6000610df6610df18461162e565b6115d8565b905082815260208101848484011115610e1257610e11611856565b5b610e1d848285611776565b509392505050565b600081359050610e3481611d5d565b92915050565b600081359050610e4981611d74565b92915050565b600082601f830112610e6457610e63611851565b5b8135610e74848260208601610da1565b91505092915050565b600082601f830112610e9257610e91611851565b5b8135610ea2848260208601610de3565b91505092915050565b600081359050610eba81611d8b565b92915050565b600060208284031215610ed657610ed5611860565b5b6000610ee484828501610e25565b91505092915050565b600080600080600060a08688031215610f0957610f08611860565b5b6000610f1788828901610e25565b9550506020610f2888828901610eab565b945050604086013567ffffffffffffffff811115610f4957610f4861185b565b5b610f5588828901610e7d565b935050606086013567ffffffffffffffff811115610f7657610f7561185b565b5b610f8288828901610e4f565b9250506080610f9388828901610eab565b9150509295509295909350565b600060208284031215610fb657610fb5611860565b5b6000610fc484828501610e3a565b91505092915050565b600060208284031215610fe357610fe2611860565b5b6000610ff184828501610eab565b91505092915050565b611003816116f8565b82525050565b6110128161170a565b82525050565b61102181611716565b82525050565b61103861103382611720565b6117e9565b82525050565b60006110498261165f565b6110538185611675565b9350611063818560208601611785565b61106c81611865565b840191505092915050565b60006110828261165f565b61108c8185611686565b935061109c818560208601611785565b80840191505092915050565b60006110b38261166a565b6110bd8185611691565b93506110cd818560208601611785565b6110d681611865565b840191505092915050565b60006110ee604083611691565b91506110f982611876565b604082019050919050565b6000611111603e83611691565b915061111c826118c5565b604082019050919050565b6000611134604083611691565b915061113f82611914565b604082019050919050565b6000611157604083611691565b915061116282611963565b604082019050919050565b600061117a603f83611691565b9150611185826119b2565b604082019050919050565b600061119d604583611691565b91506111a882611a01565b606082019050919050565b60006111c0604183611691565b91506111cb82611a76565b606082019050919050565b60006111e3604d83611691565b91506111ee82611aeb565b606082019050919050565b6000611206604583611691565b915061121182611b60565b606082019050919050565b6000611229603c83611691565b915061123482611bd5565b604082019050919050565b600061124c604883611691565b915061125782611c24565b606082019050919050565b600061126f603b83611691565b915061127a82611c99565b604082019050919050565b6000611292605183611691565b915061129d82611ce8565b606082019050919050565b6112b18161176c565b82525050565b60006112c38285611027565b6004820191506112d38284611077565b91508190509392505050565b60006112eb8284611077565b915081905092915050565b600060208201905061130b6000830184610ffa565b92915050565b600060a0820190506113266000830188610ffa565b61133360208301876112a8565b818103604083015261134581866110a8565b90508181036060830152611359818561103e565b905061136860808301846112a8565b9695505050505050565b60006020820190506113876000830184611009565b92915050565b60006020820190506113a26000830184611018565b92915050565b600060208201905081810360008301526113c2818461103e565b905092915050565b600060208201905081810360008301526113e3816110e1565b9050919050565b6000602082019050818103600083015261140381611104565b9050919050565b6000602082019050818103600083015261142381611127565b9050919050565b600060208201905081810360008301526114438161114a565b9050919050565b600060208201905081810360008301526114638161116d565b9050919050565b6000602082019050818103600083015261148381611190565b9050919050565b600060208201905081810360008301526114a3816111b3565b9050919050565b600060208201905081810360008301526114c3816111d6565b9050919050565b600060208201905081810360008301526114e3816111f9565b9050919050565b600060208201905081810360008301526115038161121c565b9050919050565b600060208201905081810360008301526115238161123f565b9050919050565b6000602082019050818103600083015261154381611262565b9050919050565b6000602082019050818103600083015261156381611285565b9050919050565b600060208201905061157f60008301846112a8565b92915050565b600060808201905061159a60008301876112a8565b81810360208301526115ac81866110a8565b905081810360408301526115c0818561103e565b90506115cf60608301846112a8565b95945050505050565b60006115e26115f3565b90506115ee82826117b8565b919050565b6000604051905090565b600067ffffffffffffffff82111561161857611617611822565b5b61162182611865565b9050602081019050919050565b600067ffffffffffffffff82111561164957611648611822565b5b61165282611865565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006116ad8261176c565b91506116b88361176c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156116ed576116ec6117f3565b5b828201905092915050565b60006117038261174c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156117a3578082015181840152602081019050611788565b838111156117b2576000848401525b50505050565b6117c182611865565b810181811067ffffffffffffffff821117156117e0576117df611822565b5b80604052505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f756e7344414f4578656375746f723a3a657865637574655472616e73616360008201527f74696f6e3a2043616c6c206d75737420636f6d652066726f6d2061646d696e2e602082015250565b7f4e6f756e7344414f4578656375746f723a3a71756575655472616e736163746960008201527f6f6e3a2043616c6c206d75737420636f6d652066726f6d2061646d696e2e0000602082015250565b7f4e6f756e7344414f4578656375746f723a3a61636365707441646d696e3a204360008201527f616c6c206d75737420636f6d652066726f6d2070656e64696e6741646d696e2e602082015250565b7f4e6f756e7344414f4578656375746f723a3a73657444656c61793a2044656c6160008201527f79206d757374206e6f7420657863656564206d6178696d756d2064656c61792e602082015250565b7f4e6f756e7344414f4578656375746f723a3a63616e63656c5472616e7361637460008201527f696f6e3a2043616c6c206d75737420636f6d652066726f6d2061646d696e2e00602082015250565b7f4e6f756e7344414f4578656375746f723a3a657865637574655472616e73616360008201527f74696f6e3a205472616e73616374696f6e206861736e2774206265656e20717560208201527f657565642e000000000000000000000000000000000000000000000000000000604082015250565b7f4e6f756e7344414f4578656375746f723a3a73657444656c61793a2043616c6c60008201527f206d75737420636f6d652066726f6d204e6f756e7344414f4578656375746f7260208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b7f4e6f756e7344414f4578656375746f723a3a657865637574655472616e73616360008201527f74696f6e3a205472616e73616374696f6e206861736e2774207375727061737360208201527f65642074696d65206c6f636b2e00000000000000000000000000000000000000604082015250565b7f4e6f756e7344414f4578656375746f723a3a657865637574655472616e73616360008201527f74696f6e3a205472616e73616374696f6e20657865637574696f6e207265766560208201527f727465642e000000000000000000000000000000000000000000000000000000604082015250565b7f4e6f756e7344414f4578656375746f723a3a73657444656c61793a2044656c6160008201527f79206d75737420657863656564206d696e696d756d2064656c61792e00000000602082015250565b7f4e6f756e7344414f4578656375746f723a3a73657450656e64696e6741646d6960008201527f6e3a2043616c6c206d75737420636f6d652066726f6d204e6f756e7344414f4560208201527f78656375746f722e000000000000000000000000000000000000000000000000604082015250565b7f4e6f756e7344414f4578656375746f723a3a657865637574655472616e73616360008201527f74696f6e3a205472616e73616374696f6e206973207374616c652e0000000000602082015250565b7f4e6f756e7344414f4578656375746f723a3a71756575655472616e736163746960008201527f6f6e3a20457374696d6174656420657865637574696f6e20626c6f636b206d7560208201527f737420736174697366792064656c61792e000000000000000000000000000000604082015250565b611d66816116f8565b8114611d7157600080fd5b50565b611d7d81611716565b8114611d8857600080fd5b50565b611d948161176c565b8114611d9f57600080fd5b5056fea2646970667358221220b172b3b4df7d573ef8b157e563017dafc2a42611a08eb69d198431477e0589be64736f6c6343000807003300000000000000000000000002cd45bb95d810e3c75ddb67faaf6a1c9ed4ea29000000000000000000000000000000000000000000000000000000000002a300

Deployed ByteCode

0x6080604052600436106100c65760003560e01c80636a42b8f81161007f578063c1a287e211610059578063c1a287e21461025e578063e177246e14610289578063f2b06537146102b2578063f851a440146102ef576100cd565b80636a42b8f8146101dd5780637d645fab14610208578063b1b43ae514610233576100cd565b80630825f38f146100cf5780630e18b6811461010c57806326782247146101235780633a66f9011461014e5780634dd18bf51461018b578063591fcdfe146101b4576100cd565b366100cd57005b005b3480156100db57600080fd5b506100f660048036038101906100f19190610eed565b61031a565b60405161010391906113a8565b60405180910390f35b34801561011857600080fd5b50610121610660565b005b34801561012f57600080fd5b506101386107d7565b60405161014591906112f6565b60405180910390f35b34801561015a57600080fd5b5061017560048036038101906101709190610eed565b6107fd565b604051610182919061138d565b60405180910390f35b34801561019757600080fd5b506101b260048036038101906101ad9190610ec0565b6109a6565b005b3480156101c057600080fd5b506101db60048036038101906101d69190610eed565b610abd565b005b3480156101e957600080fd5b506101f2610c07565b6040516101ff919061156a565b60405180910390f35b34801561021457600080fd5b5061021d610c0d565b60405161022a919061156a565b60405180910390f35b34801561023f57600080fd5b50610248610c14565b604051610255919061156a565b60405180910390f35b34801561026a57600080fd5b50610273610c1b565b604051610280919061156a565b60405180910390f35b34801561029557600080fd5b506102b060048036038101906102ab9190610fcd565b610c22565b005b3480156102be57600080fd5b506102d960048036038101906102d49190610fa0565b610d55565b6040516102e69190611372565b60405180910390f35b3480156102fb57600080fd5b50610304610d75565b60405161031191906112f6565b60405180910390f35b606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146103aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103a1906113ca565b60405180910390fd5b600086868686866040516020016103c5959493929190611311565b6040516020818303038152906040528051906020012090506003600082815260200190815260200160002060009054906101000a900460ff1661043d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104349061146a565b60405180910390fd5b82610446610d99565b1015610487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161047e906114aa565b60405180910390fd5b621275008361049691906116a2565b61049e610d99565b11156104df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d69061152a565b60405180910390fd5b60006003600083815260200190815260200160002060006101000a81548160ff021916908315150217905550606060008651141561051f5784905061054b565b8580519060200120856040516020016105399291906112b7565b60405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff16898460405161057491906112df565b60006040518083038185875af1925050503d80600081146105b1576040519150601f19603f3d011682016040523d82523d6000602084013e6105b6565b606091505b5091509150816105fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f2906114ca565b60405180910390fd5b8973ffffffffffffffffffffffffffffffffffffffff16847fa560e3198060a2f10670c1ec5b403077ea6ae93ca8de1c32b451dc1a943cd6e78b8b8b8b6040516106489493929190611585565b60405180910390a38094505050505095945050505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146106f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e79061140a565b60405180910390fd5b336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c60405160405180910390a2565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461088e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610885906113ea565b60405180910390fd5b600254610899610d99565b6108a391906116a2565b8210156108e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108dc9061154a565b60405180910390fd5b60008686868686604051602001610900959493929190611311565b60405160208183030381529060405280519060200120905060016003600083815260200190815260200160002060006101000a81548160ff0219169083151502179055508673ffffffffffffffffffffffffffffffffffffffff16817f76e2796dc3a81d57b0e8504b647febcbeeb5f4af818e164f11eef8131a6a763f888888886040516109919493929190611585565b60405180910390a38091505095945050505050565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0b9061150a565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f69d78e38a01985fbb1462961809b4b2d65531bc93b2b94037f3334b82ca4a75660405160405180910390a250565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b429061144a565b60405180910390fd5b60008585858585604051602001610b66959493929190611311565b60405160208183030381529060405280519060200120905060006003600083815260200190815260200160002060006101000a81548160ff0219169083151502179055508573ffffffffffffffffffffffffffffffffffffffff16817f2fffc091a501fd91bfbff27141450d3acb40fb8e6d8382b243ec7a812a3aaf8787878787604051610bf79493929190611585565b60405180910390a3505050505050565b60025481565b62278d0081565b6202a30081565b6212750081565b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c879061148a565b60405180910390fd5b6202a300811015610cd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccd906114ea565b60405180910390fd5b62278d00811115610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d139061142a565b60405180910390fd5b806002819055506002547f948b1f6a42ee138b7e34058ba85a37f716d55ff25ff05a763f15bed6a04c8d2c60405160405180910390a250565b60036020528060005260406000206000915054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600042905090565b6000610db4610daf846115fd565b6115d8565b905082815260208101848484011115610dd057610dcf611856565b5b610ddb848285611776565b509392505050565b6000610df6610df18461162e565b6115d8565b905082815260208101848484011115610e1257610e11611856565b5b610e1d848285611776565b509392505050565b600081359050610e3481611d5d565b92915050565b600081359050610e4981611d74565b92915050565b600082601f830112610e6457610e63611851565b5b8135610e74848260208601610da1565b91505092915050565b600082601f830112610e9257610e91611851565b5b8135610ea2848260208601610de3565b91505092915050565b600081359050610eba81611d8b565b92915050565b600060208284031215610ed657610ed5611860565b5b6000610ee484828501610e25565b91505092915050565b600080600080600060a08688031215610f0957610f08611860565b5b6000610f1788828901610e25565b9550506020610f2888828901610eab565b945050604086013567ffffffffffffffff811115610f4957610f4861185b565b5b610f5588828901610e7d565b935050606086013567ffffffffffffffff811115610f7657610f7561185b565b5b610f8288828901610e4f565b9250506080610f9388828901610eab565b9150509295509295909350565b600060208284031215610fb657610fb5611860565b5b6000610fc484828501610e3a565b91505092915050565b600060208284031215610fe357610fe2611860565b5b6000610ff184828501610eab565b91505092915050565b611003816116f8565b82525050565b6110128161170a565b82525050565b61102181611716565b82525050565b61103861103382611720565b6117e9565b82525050565b60006110498261165f565b6110538185611675565b9350611063818560208601611785565b61106c81611865565b840191505092915050565b60006110828261165f565b61108c8185611686565b935061109c818560208601611785565b80840191505092915050565b60006110b38261166a565b6110bd8185611691565b93506110cd818560208601611785565b6110d681611865565b840191505092915050565b60006110ee604083611691565b91506110f982611876565b604082019050919050565b6000611111603e83611691565b915061111c826118c5565b604082019050919050565b6000611134604083611691565b915061113f82611914565b604082019050919050565b6000611157604083611691565b915061116282611963565b604082019050919050565b600061117a603f83611691565b9150611185826119b2565b604082019050919050565b600061119d604583611691565b91506111a882611a01565b606082019050919050565b60006111c0604183611691565b91506111cb82611a76565b606082019050919050565b60006111e3604d83611691565b91506111ee82611aeb565b606082019050919050565b6000611206604583611691565b915061121182611b60565b606082019050919050565b6000611229603c83611691565b915061123482611bd5565b604082019050919050565b600061124c604883611691565b915061125782611c24565b606082019050919050565b600061126f603b83611691565b915061127a82611c99565b604082019050919050565b6000611292605183611691565b915061129d82611ce8565b606082019050919050565b6112b18161176c565b82525050565b60006112c38285611027565b6004820191506112d38284611077565b91508190509392505050565b60006112eb8284611077565b915081905092915050565b600060208201905061130b6000830184610ffa565b92915050565b600060a0820190506113266000830188610ffa565b61133360208301876112a8565b818103604083015261134581866110a8565b90508181036060830152611359818561103e565b905061136860808301846112a8565b9695505050505050565b60006020820190506113876000830184611009565b92915050565b60006020820190506113a26000830184611018565b92915050565b600060208201905081810360008301526113c2818461103e565b905092915050565b600060208201905081810360008301526113e3816110e1565b9050919050565b6000602082019050818103600083015261140381611104565b9050919050565b6000602082019050818103600083015261142381611127565b9050919050565b600060208201905081810360008301526114438161114a565b9050919050565b600060208201905081810360008301526114638161116d565b9050919050565b6000602082019050818103600083015261148381611190565b9050919050565b600060208201905081810360008301526114a3816111b3565b9050919050565b600060208201905081810360008301526114c3816111d6565b9050919050565b600060208201905081810360008301526114e3816111f9565b9050919050565b600060208201905081810360008301526115038161121c565b9050919050565b600060208201905081810360008301526115238161123f565b9050919050565b6000602082019050818103600083015261154381611262565b9050919050565b6000602082019050818103600083015261156381611285565b9050919050565b600060208201905061157f60008301846112a8565b92915050565b600060808201905061159a60008301876112a8565b81810360208301526115ac81866110a8565b905081810360408301526115c0818561103e565b90506115cf60608301846112a8565b95945050505050565b60006115e26115f3565b90506115ee82826117b8565b919050565b6000604051905090565b600067ffffffffffffffff82111561161857611617611822565b5b61162182611865565b9050602081019050919050565b600067ffffffffffffffff82111561164957611648611822565b5b61165282611865565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b60006116ad8261176c565b91506116b88361176c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156116ed576116ec6117f3565b5b828201905092915050565b60006117038261174c565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156117a3578082015181840152602081019050611788565b838111156117b2576000848401525b50505050565b6117c182611865565b810181811067ffffffffffffffff821117156117e0576117df611822565b5b80604052505050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f756e7344414f4578656375746f723a3a657865637574655472616e73616360008201527f74696f6e3a2043616c6c206d75737420636f6d652066726f6d2061646d696e2e602082015250565b7f4e6f756e7344414f4578656375746f723a3a71756575655472616e736163746960008201527f6f6e3a2043616c6c206d75737420636f6d652066726f6d2061646d696e2e0000602082015250565b7f4e6f756e7344414f4578656375746f723a3a61636365707441646d696e3a204360008201527f616c6c206d75737420636f6d652066726f6d2070656e64696e6741646d696e2e602082015250565b7f4e6f756e7344414f4578656375746f723a3a73657444656c61793a2044656c6160008201527f79206d757374206e6f7420657863656564206d6178696d756d2064656c61792e602082015250565b7f4e6f756e7344414f4578656375746f723a3a63616e63656c5472616e7361637460008201527f696f6e3a2043616c6c206d75737420636f6d652066726f6d2061646d696e2e00602082015250565b7f4e6f756e7344414f4578656375746f723a3a657865637574655472616e73616360008201527f74696f6e3a205472616e73616374696f6e206861736e2774206265656e20717560208201527f657565642e000000000000000000000000000000000000000000000000000000604082015250565b7f4e6f756e7344414f4578656375746f723a3a73657444656c61793a2043616c6c60008201527f206d75737420636f6d652066726f6d204e6f756e7344414f4578656375746f7260208201527f2e00000000000000000000000000000000000000000000000000000000000000604082015250565b7f4e6f756e7344414f4578656375746f723a3a657865637574655472616e73616360008201527f74696f6e3a205472616e73616374696f6e206861736e2774207375727061737360208201527f65642074696d65206c6f636b2e00000000000000000000000000000000000000604082015250565b7f4e6f756e7344414f4578656375746f723a3a657865637574655472616e73616360008201527f74696f6e3a205472616e73616374696f6e20657865637574696f6e207265766560208201527f727465642e000000000000000000000000000000000000000000000000000000604082015250565b7f4e6f756e7344414f4578656375746f723a3a73657444656c61793a2044656c6160008201527f79206d75737420657863656564206d696e696d756d2064656c61792e00000000602082015250565b7f4e6f756e7344414f4578656375746f723a3a73657450656e64696e6741646d6960008201527f6e3a2043616c6c206d75737420636f6d652066726f6d204e6f756e7344414f4560208201527f78656375746f722e000000000000000000000000000000000000000000000000604082015250565b7f4e6f756e7344414f4578656375746f723a3a657865637574655472616e73616360008201527f74696f6e3a205472616e73616374696f6e206973207374616c652e0000000000602082015250565b7f4e6f756e7344414f4578656375746f723a3a71756575655472616e736163746960008201527f6f6e3a20457374696d6174656420657865637574696f6e20626c6f636b206d7560208201527f737420736174697366792064656c61792e000000000000000000000000000000604082015250565b611d66816116f8565b8114611d7157600080fd5b50565b611d7d81611716565b8114611d8857600080fd5b50565b611d948161176c565b8114611d9f57600080fd5b5056fea2646970667358221220b172b3b4df7d573ef8b157e563017dafc2a42611a08eb69d198431477e0589be64736f6c63430008070033