Contract Address Details

0xd2aA47708AC61dd063448E49031D0e79F0dA5a57

Contract Name
RewardPool
Creator
0x523009–fcc29c at 0x8c6480–d2dca7
Balance
0 NMT
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
17868940
Contract name:
RewardPool




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




Optimization runs
200
EVM Version
default




Verified at
2024-11-19T00:27:02.118094Z

Contract source code

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0 ;

abstract contract Initializable {
    /**
     * @dev Indicates that the contract has been initialized.
     */
    bool private _initialized;

    /**
     * @dev Indicates that the contract is in the process of being initialized.
     */
    bool private _initializing;

    /**
     * @dev Modifier to protect an initializer function from being invoked twice.
     */
    modifier initializer() {
        require(_initializing || !_initialized, "Initializable: contract is already initialized");

        bool isTopLevelCall = !_initializing;
        if (isTopLevelCall) {
            _initializing = true;
            _initialized = true;
        }

        _;

        if (isTopLevelCall) {
            _initializing = false;
        }
    }

    function _disableInitializers() internal {
        _initialized = true;
    }
}

contract Ownable is Initializable{
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    function __Ownable_init_unchained() internal initializer {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


interface IConf {
    function acts(address ) external view returns(bool);
}


contract RewardPool is Initializable, Ownable {
    bytes32 public CONTRACT_DOMAIN;
    address public conf;
    address public Rewardcontract;
    uint256 public DailyMaxMove;
    uint256 public SigNum;
    uint256 public MoveNonce;
    mapping(uint256 => uint256) public DailyMoved;

    //manage move amount
    uint256 public Moveable;
    uint256 public BurnNonce;
    uint256 public burnLimit;

    event Move(uint256 indexed day, uint256 timestamp, address op, uint256 amt);
    event Burn(uint256 indexed day, uint256 timestamp, address op, uint256 amt);


    struct Sig {
        uint8 v;
        bytes32 r;
        bytes32 s;
    }

    function setMoveable(uint256  amt) public onlyOwner{
        Moveable = amt;
    }

    function setSigNum(uint256 num) public onlyOwner{
        SigNum = num;
    }
    
    function setDailyMaxMove(uint256 amt) public onlyOwner{
        DailyMaxMove = amt;
    }

    function setBurnLimit(uint256 amt) public onlyOwner{
        require(amt <= 5000000e18, "quantity exceeds limit");
        burnLimit = amt;
    }

    function burn(uint256 amt) public onlyOwner{
        require(burnLimit >= amt, "amt error");
        payable(address(0)).transfer(amt);
    }

    constructor(){_disableInitializers();}

    function init(address _conf, address _reward, uint256 _dailymaxmove, uint256 _signum, uint256 _moveable) public initializer{
        require(_conf != address(0), "_conf is zero address");
        require(_reward != address(0), "_reward is zero address");
        require(_signum > 1 , "_signum error");
        conf = _conf;
        Rewardcontract = _reward;
        DailyMaxMove = _dailymaxmove;
        SigNum = _signum;
        Moveable = _moveable;

        __Ownable_init_unchained();
        CONTRACT_DOMAIN = keccak256('Netmind RewardPool V1.0');
    }

    function move(uint256 nonce, uint256 amt,uint256 expir, uint8[] calldata vs, bytes32[] calldata rs) public{
        //check input
        require(nonce == MoveNonce++, "error nonce");
        require(amt <= Moveable, "out of moveable");
        require(block.timestamp <= expir, "sign expired");
        
        //check sign
        uint256 counter;
        uint256 len = vs.length;
        require(len*2 == rs.length, "Signature parameter length mismatch");
        bytes32 digest = getDigest(nonce, amt, expir);
        address[] memory signAddrs = new address[](len);
        for (uint256 i = 0; i < len; i++) {
            (bool result, address signAddr) = verifySign(digest, Sig(vs[i], rs[i*2], rs[i*2+1]));
            signAddrs[i] = signAddr;
            if (result){
                counter++;
            }
        }
        require(counter >= SigNum, "lack of signature");
        require(areElementsUnique(signAddrs), "duplicate signature");

        //move 
        uint256 day = block.timestamp / 1 days;
        DailyMoved[day]+= amt;
        require(DailyMoved[day] <= DailyMaxMove, "Out of daily max move");
        Moveable -= amt;
        payable(Rewardcontract).transfer(amt);
    
        emit Move(day, block.timestamp, msg.sender, amt);
    }

    function burn(uint256 nonce, uint256 amt,uint256 expir, uint8[] calldata vs, bytes32[] calldata rs) public{
        //check input
        require(nonce == BurnNonce++, "error nonce");
        require(amt <= Moveable, "out of moveable");
        require(block.timestamp <= expir, "sign expired");
        
        //check sign
        uint256 counter;
        uint256 len = vs.length;
        require(len*2 == rs.length, "Signature parameter length mismatch");
        bytes32 digest = getDigest(nonce, amt, expir);
        address[] memory signAddrs = new address[](len);
        for (uint256 i = 0; i < len; i++) {
            (bool result, address signAddr) = verifySign(digest, Sig(vs[i], rs[i*2], rs[i*2+1]));
            signAddrs[i] = signAddr;
            if (result){
                counter++;
            }
        }
        require(counter >= SigNum, "lack of signature");
        require(areElementsUnique(signAddrs), "duplicate signature");

        //move 
        uint256 day = block.timestamp / 1 days;
        DailyMoved[day]+= amt;
        require(DailyMoved[day] <= DailyMaxMove, "Out of daily max move");
        Moveable -= amt;
        payable(address(0)).transfer(amt);
    
        emit Burn(day, block.timestamp, msg.sender, amt);
    }

    function areElementsUnique(address[] memory arr) internal pure returns (bool) {
        for(uint i = 0; i < arr.length - 1; i++) {
            for(uint j = i + 1; j < arr.length; j++) {
                if (arr[i] == arr[j]) {
                    return false; 
                }
            }
        }
        return true; 
    }

    function verifySign(bytes32 _digest,Sig memory _sig) internal view returns (bool, address)  {
        require(uint256(_sig.s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");
        require(uint8(_sig.v) == 27 || uint8(_sig.v) == 28, "ECDSA: invalid signature 'v' value");
        bytes memory prefix = "\x19Ethereum Signed Message:\n32";
        bytes32 hash = keccak256(abi.encodePacked(prefix, _digest));
        address signer = ecrecover(hash, _sig.v, _sig.r, _sig.s);
        require(signer != address(0), "The signer is 0 address");
        bool isActs = IConf(conf).acts(signer); 
        return(isActs, signer); 
    }
    
    function getDigest(uint256 nonce, uint256 amt, uint256 expir) internal view returns(bytes32 digest){
        digest = keccak256(
            abi.encodePacked(
                '\x19\x01',
                DOMAIN_SEPARATOR(),
                keccak256(abi.encode(nonce, amt, expir)))
        );
    }

    function DOMAIN_SEPARATOR() public view returns(bytes32){
        return keccak256(
            abi.encode(
                keccak256('EIP712Domain(uint256 chainId,address verifyingContract)'),
                block.chainid,
                address(this)
            )
        );
    }
}

        

Contract ABI

[{"type":"constructor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"BurnNonce","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"CONTRACT_DOMAIN","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_SEPARATOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"DailyMaxMove","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"DailyMoved","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"MoveNonce","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"Moveable","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"Rewardcontract","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"SigNum","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amt","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"nonce","internalType":"uint256"},{"type":"uint256","name":"amt","internalType":"uint256"},{"type":"uint256","name":"expir","internalType":"uint256"},{"type":"uint8[]","name":"vs","internalType":"uint8[]"},{"type":"bytes32[]","name":"rs","internalType":"bytes32[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"burnLimit","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"conf","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"init","inputs":[{"type":"address","name":"_conf","internalType":"address"},{"type":"address","name":"_reward","internalType":"address"},{"type":"uint256","name":"_dailymaxmove","internalType":"uint256"},{"type":"uint256","name":"_signum","internalType":"uint256"},{"type":"uint256","name":"_moveable","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOwner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"move","inputs":[{"type":"uint256","name":"nonce","internalType":"uint256"},{"type":"uint256","name":"amt","internalType":"uint256"},{"type":"uint256","name":"expir","internalType":"uint256"},{"type":"uint8[]","name":"vs","internalType":"uint8[]"},{"type":"bytes32[]","name":"rs","internalType":"bytes32[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setBurnLimit","inputs":[{"type":"uint256","name":"amt","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDailyMaxMove","inputs":[{"type":"uint256","name":"amt","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMoveable","inputs":[{"type":"uint256","name":"amt","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSigNum","inputs":[{"type":"uint256","name":"num","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"event","name":"Burn","inputs":[{"type":"uint256","name":"day","indexed":true},{"type":"uint256","name":"timestamp","indexed":false},{"type":"address","name":"op","indexed":false},{"type":"uint256","name":"amt","indexed":false}],"anonymous":false},{"type":"event","name":"Move","inputs":[{"type":"uint256","name":"day","indexed":true},{"type":"uint256","name":"timestamp","indexed":false},{"type":"address","name":"op","indexed":false},{"type":"uint256","name":"amt","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false}]
            

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061014d5760003560e01c8063715018a6116100c3578063be9676e41161007c578063be9676e414610298578063c7ce2125146102ab578063d3d8d282146102be578063e686f1c7146102c7578063f2fde38b146102da578063f934436e146102ed57600080fd5b8063715018a61461022a57806385d1379c1461023257806387ece8341461023b5780638da5cb5b146102445780638f32d59b1461025b578063a76d64f51461028557600080fd5b80633644e515116101155780633644e515146101d557806342966c68146101dd57806351769d29146101f2578063546f33191461020557806364566332146102185780636eaa87091461022157600080fd5b8063082911b014610152578063087cb9891461016e57806317792729146101995780632162a55d146101ac5780632a9c72c8146101cc575b600080fd5b61015b60085481565b6040519081526020015b60405180910390f35b600354610181906001600160a01b031681565b6040516001600160a01b039091168152602001610165565b600254610181906001600160a01b031681565b61015b6101ba3660046114e9565b60076020526000908152604090205481565b61015b600a5481565b61015b610300565b6101f06101eb3660046114e9565b610359565b005b6101f06102003660046114e9565b610407565b6101f06102133660046114e9565b610496565b61015b60095481565b61015b60055481565b6101f06104d1565b61015b60065481565b61015b60015481565b6000546201000090046001600160a01b0316610181565b6102756000546201000090046001600160a01b0316331490565b6040519015158152602001610165565b6101f0610293366004611547565b610558565b6101f06102a63660046114e9565b61097f565b6101f06102b9366004611547565b6109ba565b61015b60045481565b6101f06102d53660046114e9565b610d45565b6101f06102e83660046115f0565b610d80565b6101f06102fb366004611612565b610dc2565b604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692186020820152469181019190915230606082015260009060800160405160208183030381529060405280519060200120905090565b6103736000546201000090046001600160a01b0316331490565b6103985760405162461bcd60e51b815260040161038f9061165f565b60405180910390fd5b80600a5410156103d65760405162461bcd60e51b815260206004820152600960248201526830b6ba1032b93937b960b91b604482015260640161038f565b60405160009082156108fc0290839083818181858288f19350505050158015610403573d6000803e3d6000fd5b5050565b6104216000546201000090046001600160a01b0316331490565b61043d5760405162461bcd60e51b815260040161038f9061165f565b6a0422ca8b0a00a4250000008111156104915760405162461bcd60e51b81526020600482015260166024820152751c5d585b9d1a5d1e48195e18d959591cc81b1a5b5a5d60521b604482015260640161038f565b600a55565b6104b06000546201000090046001600160a01b0316331490565b6104cc5760405162461bcd60e51b815260040161038f9061165f565b600555565b6104eb6000546201000090046001600160a01b0316331490565b6105075760405162461bcd60e51b815260040161038f9061165f565b60008054604051620100009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805462010000600160b01b0319169055565b60068054906000610568836116aa565b9190505587146105a85760405162461bcd60e51b815260206004820152600b60248201526a6572726f72206e6f6e636560a81b604482015260640161038f565b6008548611156105ec5760405162461bcd60e51b815260206004820152600f60248201526e6f7574206f66206d6f766561626c6560881b604482015260640161038f565b8442111561062b5760405162461bcd60e51b815260206004820152600c60248201526b1cda59db88195e1c1a5c995960a21b604482015260640161038f565b6000838261063a8260026116c3565b146106575760405162461bcd60e51b815260040161038f906116e2565b60006106648a8a8a610f82565b905060008267ffffffffffffffff81111561068157610681611725565b6040519080825280602002602001820160405280156106aa578160200160208202803683370190505b50905060005b838110156107b9576000806107598560405180606001604052808e8e888181106106dc576106dc61173b565b90506020020160208101906106f19190611751565b60ff1681526020018c8c6107068960026116c3565b8181106107155761071561173b565b9050602002013581526020018c8c88600261073091906116c3565b61073b906001611774565b81811061074a5761074a61173b565b90506020020135815250611003565b91509150808484815181106107705761077061173b565b60200260200101906001600160a01b031690816001600160a01b03168152505081156107a457866107a0816116aa565b9750505b505080806107b1906116aa565b9150506106b0565b506005548410156108005760405162461bcd60e51b81526020600482015260116024820152706c61636b206f66207369676e617475726560781b604482015260640161038f565b610809816112b1565b61084b5760405162461bcd60e51b81526020600482015260136024820152726475706c6963617465207369676e617475726560681b604482015260640161038f565b600061085a620151804261178d565b90508a60076000838152602001908152602001600020600082825461087f9190611774565b909155505060045460008281526007602052604090205411156108dc5760405162461bcd60e51b81526020600482015260156024820152744f7574206f66206461696c79206d6178206d6f766560581b604482015260640161038f565b8a600860008282546108ee91906117af565b90915550506003546040516001600160a01b03909116908c156108fc02908d906000818181858888f1935050505015801561092d573d6000803e3d6000fd5b50604080514281523360208201529081018c905281907fcce658af18efcde6ccdd0f9cca85c4700409fc898c67ff4f227eccf8d52e6c13906060015b60405180910390a2505050505050505050505050565b6109996000546201000090046001600160a01b0316331490565b6109b55760405162461bcd60e51b815260040161038f9061165f565b600855565b600980549060006109ca836116aa565b919050558714610a0a5760405162461bcd60e51b815260206004820152600b60248201526a6572726f72206e6f6e636560a81b604482015260640161038f565b600854861115610a4e5760405162461bcd60e51b815260206004820152600f60248201526e6f7574206f66206d6f766561626c6560881b604482015260640161038f565b84421115610a8d5760405162461bcd60e51b815260206004820152600c60248201526b1cda59db88195e1c1a5c995960a21b604482015260640161038f565b60008382610a9c8260026116c3565b14610ab95760405162461bcd60e51b815260040161038f906116e2565b6000610ac68a8a8a610f82565b905060008267ffffffffffffffff811115610ae357610ae3611725565b604051908082528060200260200182016040528015610b0c578160200160208202803683370190505b50905060005b83811015610b9e57600080610b3e8560405180606001604052808e8e888181106106dc576106dc61173b565b9150915080848481518110610b5557610b5561173b565b60200260200101906001600160a01b031690816001600160a01b0316815250508115610b895786610b85816116aa565b9750505b50508080610b96906116aa565b915050610b12565b50600554841015610be55760405162461bcd60e51b81526020600482015260116024820152706c61636b206f66207369676e617475726560781b604482015260640161038f565b610bee816112b1565b610c305760405162461bcd60e51b81526020600482015260136024820152726475706c6963617465207369676e617475726560681b604482015260640161038f565b6000610c3f620151804261178d565b90508a600760008381526020019081526020016000206000828254610c649190611774565b90915550506004546000828152600760205260409020541115610cc15760405162461bcd60e51b81526020600482015260156024820152744f7574206f66206461696c79206d6178206d6f766560581b604482015260640161038f565b8a60086000828254610cd391906117af565b90915550506040516000908c156108fc02908d9083818181858288f19350505050158015610d05573d6000803e3d6000fd5b50604080514281523360208201529081018c905281907ff425743f03337ed26b75c5a7d67af831219519d5494ba86024fd56f8270a197f90606001610969565b610d5f6000546201000090046001600160a01b0316331490565b610d7b5760405162461bcd60e51b815260040161038f9061165f565b600455565b610d9a6000546201000090046001600160a01b0316331490565b610db65760405162461bcd60e51b815260040161038f9061165f565b610dbf81611366565b50565b600054610100900460ff1680610ddb575060005460ff16155b610df75760405162461bcd60e51b815260040161038f906117c2565b600054610100900460ff16158015610e19576000805461ffff19166101011790555b6001600160a01b038616610e675760405162461bcd60e51b81526020600482015260156024820152745f636f6e66206973207a65726f206164647265737360581b604482015260640161038f565b6001600160a01b038516610ebd5760405162461bcd60e51b815260206004820152601760248201527f5f726577617264206973207a65726f2061646472657373000000000000000000604482015260640161038f565b60018311610efd5760405162461bcd60e51b815260206004820152600d60248201526c2fb9b4b3b73ab69032b93937b960991b604482015260640161038f565b600280546001600160a01b038089166001600160a01b0319928316179092556003805492881692909116919091179055600484905560058390556008829055610f44611434565b7f87261ef9ac64b5542ea8f22ffa53a9f4a151d09913e26d7a0d6076893f820d246001558015610f7a576000805461ff00191690555b505050505050565b6000610f8c610300565b60408051602081018790529081018590526060810184905260800160405160208183030381529060405280519060200120604051602001610fe492919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090509392505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0836040015160001c11156110885760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161038f565b826000015160ff16601b14806110a55750826000015160ff16601c145b6110fc5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161038f565b60006040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a33320000000081525090506000818660405160200161114b929190611810565b6040516020818303038152906040528051906020012090506000600182876000015188602001518960400151604051600081526020016040526040516111ad949392919093845260ff9290921660208401526040830152606082015260800190565b6020604051602081039080840390855afa1580156111cf573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166112325760405162461bcd60e51b815260206004820152601760248201527f546865207369676e657220697320302061646472657373000000000000000000604482015260640161038f565b600254604051639916328d60e01b81526001600160a01b0383811660048301526000921690639916328d90602401602060405180830381865afa15801561127d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a19190611842565b95509093505050505b9250929050565b6000805b600183516112c391906117af565b81101561135d5760006112d7826001611774565b90505b835181101561134a578381815181106112f5576112f561173b565b60200260200101516001600160a01b03168483815181106113185761131861173b565b60200260200101516001600160a01b031603611338575060009392505050565b80611342816116aa565b9150506112da565b5080611355816116aa565b9150506112b5565b50600192915050565b6001600160a01b0381166113cb5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161038f565b600080546040516001600160a01b03808516936201000090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b600054610100900460ff168061144d575060005460ff16155b6114695760405162461bcd60e51b815260040161038f906117c2565b600054610100900460ff1615801561148b576000805461ffff19166101011790555b6000805462010000600160b01b03191633620100008102919091178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610dbf576000805461ff001916905550565b6000602082840312156114fb57600080fd5b5035919050565b60008083601f84011261151457600080fd5b50813567ffffffffffffffff81111561152c57600080fd5b6020830191508360208260051b85010111156112aa57600080fd5b600080600080600080600060a0888a03121561156257600080fd5b873596506020880135955060408801359450606088013567ffffffffffffffff8082111561158f57600080fd5b61159b8b838c01611502565b909650945060808a01359150808211156115b457600080fd5b506115c18a828b01611502565b989b979a50959850939692959293505050565b80356001600160a01b03811681146115eb57600080fd5b919050565b60006020828403121561160257600080fd5b61160b826115d4565b9392505050565b600080600080600060a0868803121561162a57600080fd5b611633866115d4565b9450611641602087016115d4565b94979496505050506040830135926060810135926080909101359150565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000600182016116bc576116bc611694565b5060010190565b60008160001904831182151516156116dd576116dd611694565b500290565b60208082526023908201527f5369676e617475726520706172616d65746572206c656e677468206d69736d616040820152620e8c6d60eb1b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b60006020828403121561176357600080fd5b813560ff8116811461160b57600080fd5b8082018082111561178757611787611694565b92915050565b6000826117aa57634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561178757611787611694565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6000835160005b818110156118315760208187018101518583015201611817565b509190910191825250602001919050565b60006020828403121561185457600080fd5b8151801515811461160b57600080fdfea264697066735822122061afa40c87484c2a429cdaa5ceeefde1c85e9986870a8455520028f68e35814764736f6c63430008100033