Contract Address Details

0x90a249C395315296E5585D3770A22E0753c6C5f3

Contract Name
LongTermPledge
Creator
0x523009–fcc29c at 0x9f3a02–6b0792
Balance
0 NMT
Tokens
Fetching tokens...
Transactions
0 Transactions
Transfers
0 Transfers
Gas Used
Fetching gas used...
Last Balance Update
12806365
Contract name:
LongTermPledge




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




Optimization runs
200
EVM Version
default




Verified at
2024-08-29T08:11:37.318438Z

Contract source code

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

interface IPledge {
    function upadeNodesStake(
        address[] calldata addrs,
        uint256[] calldata uints,
        uint256 expiredTime,
        string calldata chain
    ) external;
    function nodeAddrSta(address nodeAddr) external view returns (bool);
    function nodeChainAmount(string memory chain, address nodeAddr) external view returns (uint256);
}

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;
    }
}

contract LongTermPledge is Ownable{
    bool private reentrancyLock;
    IPledge public pledgeContract;
    uint256 public lockPeriod;
    uint256 public stakeTokenNum;         
    mapping(uint256 => StakeTokenMsg) public stakeTokenMsg;  
    mapping(address => uint256[]) private stakeList;
    

    event StakeToken(uint256 indexed _stakeIndex, address _userAddr, address _nodeAddr, uint256 _amount, uint256 _time,  uint256 _lockTime, address _token);
    event CancleStakeToken(uint256 indexed _stakeIndex, address indexed _userAddr, address _nodeAddr, uint256 _time);
    event UpdateLockPeriod(uint256 time);
    event UpdateStake(uint256 indexed _stakeIndex, uint256 _lockTime);
    

    struct StakeTokenMsg {
        address userAddr;
        address nodeAddr;
        uint256 start;
        uint256 lockTime;
        uint256 end;
        uint256 tokenAmount;
        address tokenAddr;
    }

    modifier nonReentrant() {
        require(!reentrancyLock);
        reentrancyLock = true;
        _;
        reentrancyLock = false;
    }

    constructor(){_disableInitializers();}

    function init(address _pledgeContract) external initializer{
        __Ownable_init_unchained();
        __LongTermPledge_init_unchained(_pledgeContract);
    }

    function __LongTermPledge_init_unchained(address _pledgeContract) internal initializer{
        pledgeContract = IPledge(_pledgeContract);
        lockPeriod = 182 days;
        reentrancyLock = false;
    }

    function updateLockPeriod(uint256 _lockPeriod) external onlyOwner{
        require(_lockPeriod <= 2* 365 days && _lockPeriod >= 30 days, "lockPeriod error");
        lockPeriod = _lockPeriod;
        emit UpdateLockPeriod(_lockPeriod);
    }
    
    function stake(address _nodeAddr, address _token, uint256 _amount, bool _type) payable external nonReentrant(){
        _stake(msg.sender, _nodeAddr, _token, _amount, _type);
    }
      
    function migrateStake(address _sender, address _nodeAddr, bool _type) payable external{
        require(msg.sender == address(pledgeContract), "pledgeContract error");
        _stake(_sender, _nodeAddr, address(0), 0, _type);
    }
   
    function _stake(address _sender, address _nodeAddr, address _token, uint256 _amount, bool _type) internal{
        _amount = msg.value;
        require(_token == address(0), "token error");
        require(_amount >= 0, "value error");
        require(pledgeContract.nodeAddrSta(_nodeAddr), "nodeAddr error");
        uint256 _nodeStakeNum = pledgeContract.nodeChainAmount("Netmind", _nodeAddr) + _amount;
        address[] memory _addrArray = new address[](1) ;
        _addrArray[0] = _nodeAddr;
        uint256[] memory _stakeAmount = new uint256[](1);
        _stakeAmount[0] = _nodeStakeNum;
        pledgeContract.upadeNodesStake(_addrArray, _stakeAmount, block.timestamp+10, "Netmind");
        uint256 _stakeTokenNum = ++stakeTokenNum;
        uint256 _lockTime=0;
        if(!_type){
            _lockTime = block.timestamp + lockPeriod;
        }
        stakeTokenMsg[_stakeTokenNum] = StakeTokenMsg(_sender, _nodeAddr, block.timestamp, _lockTime, 0, _amount, _token);
        stakeList[_sender].push(_stakeTokenNum);
        emit StakeToken(_stakeTokenNum, _sender, _nodeAddr, _amount, block.timestamp, _lockTime,_token);
    }

    function cancleStake(uint256[] calldata _indexs) external nonReentrant(){
        address _sender = msg.sender;
        for (uint256 i = 0; i < _indexs.length; i++) {
            uint256 _stakeTokenMark = _indexs[i];
            if (_stakeTokenMark > 0){
                StakeTokenMsg storage _stakeTokenMsg = stakeTokenMsg[_stakeTokenMark];
                require(_stakeTokenMsg.userAddr == _sender, "sender error");
                require(_stakeTokenMsg.lockTime != 0 && _stakeTokenMsg.lockTime < block.timestamp, "lockTime error");
                require(_stakeTokenMsg.end == 0, "The Stake has been redeemed");
                _stakeTokenMsg.end = block.timestamp;
                payable(_stakeTokenMsg.userAddr).transfer(_stakeTokenMsg.tokenAmount);
                uint256 _nodeStakeNum = pledgeContract.nodeChainAmount("Netmind", _stakeTokenMsg.nodeAddr) - _stakeTokenMsg.tokenAmount;
                address[] memory _addrArray = new address[](1) ;
                _addrArray[0] = _stakeTokenMsg.nodeAddr;
                uint256[] memory _stakeAmount = new uint256[](1);
                _stakeAmount[0] = _nodeStakeNum;
                pledgeContract.upadeNodesStake(_addrArray, _stakeAmount, block.timestamp+10, "Netmind");
                emit CancleStakeToken(_stakeTokenMark, _sender, _stakeTokenMsg.nodeAddr, block.timestamp);
            }
        }
    }
    
    function switchStake(uint256 _index, bool _type) external nonReentrant(){
        StakeTokenMsg storage _stakeTokenMsg = stakeTokenMsg[_index];
        require(_stakeTokenMsg.userAddr == msg.sender, "sender error");
        require(_stakeTokenMsg.end == 0, "The Stake has been redeemed");
        require(_stakeTokenMsg.lockTime ==0 || _stakeTokenMsg.lockTime > block.timestamp);
        if(_type){
            _stakeTokenMsg.lockTime = 0;
        }else {
            _stakeTokenMsg.lockTime = _stakeTokenMsg.start + ((block.timestamp - _stakeTokenMsg.start)/lockPeriod +1) * lockPeriod;   
        }
        emit UpdateStake(_index, _stakeTokenMsg.lockTime);
    }

    function updateStake(uint256 _index, bool _type) external nonReentrant(){
        StakeTokenMsg storage _stakeTokenMsg = stakeTokenMsg[_index];
        require(_stakeTokenMsg.userAddr == msg.sender, "sender error");
        require(_stakeTokenMsg.end == 0, "The Stake has been redeemed");
        require(_stakeTokenMsg.lockTime !=0 && _stakeTokenMsg.lockTime <= block.timestamp);
        _stakeTokenMsg.start = block.timestamp;
        if(_type){
            _stakeTokenMsg.lockTime = 0;
        }else {
            _stakeTokenMsg.lockTime = block.timestamp + lockPeriod;
        }
        emit UpdateStake(_index, _stakeTokenMsg.lockTime);
    }

    function getStakeList(address addr) public view returns(uint256[] memory){
        return stakeList[addr];
    }

    function getStakeLockTime(uint256 _index) public view returns(uint256){
        StakeTokenMsg storage _stakeTokenMsg = stakeTokenMsg[_index];
        uint256 lockTime = _stakeTokenMsg.lockTime;
        if(_stakeTokenMsg.lockTime==0){
            lockTime = _stakeTokenMsg.start + ((block.timestamp - _stakeTokenMsg.start)/lockPeriod +1) * lockPeriod;
        }
        return lockTime;
    }



}
        

Contract ABI

[{"type":"constructor","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancleStake","inputs":[{"type":"uint256[]","name":"_indexs","internalType":"uint256[]"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"getStakeList","inputs":[{"type":"address","name":"addr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getStakeLockTime","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"init","inputs":[{"type":"address","name":"_pledgeContract","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"lockPeriod","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"migrateStake","inputs":[{"type":"address","name":"_sender","internalType":"address"},{"type":"address","name":"_nodeAddr","internalType":"address"},{"type":"bool","name":"_type","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IPledge"}],"name":"pledgeContract","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"stake","inputs":[{"type":"address","name":"_nodeAddr","internalType":"address"},{"type":"address","name":"_token","internalType":"address"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"bool","name":"_type","internalType":"bool"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"userAddr","internalType":"address"},{"type":"address","name":"nodeAddr","internalType":"address"},{"type":"uint256","name":"start","internalType":"uint256"},{"type":"uint256","name":"lockTime","internalType":"uint256"},{"type":"uint256","name":"end","internalType":"uint256"},{"type":"uint256","name":"tokenAmount","internalType":"uint256"},{"type":"address","name":"tokenAddr","internalType":"address"}],"name":"stakeTokenMsg","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"stakeTokenNum","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"switchStake","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"},{"type":"bool","name":"_type","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateLockPeriod","inputs":[{"type":"uint256","name":"_lockPeriod","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateStake","inputs":[{"type":"uint256","name":"_index","internalType":"uint256"},{"type":"bool","name":"_type","internalType":"bool"}]},{"type":"event","name":"CancleStakeToken","inputs":[{"type":"uint256","name":"_stakeIndex","indexed":true},{"type":"address","name":"_userAddr","indexed":true},{"type":"address","name":"_nodeAddr","indexed":false},{"type":"uint256","name":"_time","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","indexed":true},{"type":"address","name":"newOwner","indexed":true}],"anonymous":false},{"type":"event","name":"StakeToken","inputs":[{"type":"uint256","name":"_stakeIndex","indexed":true},{"type":"address","name":"_userAddr","indexed":false},{"type":"address","name":"_nodeAddr","indexed":false},{"type":"uint256","name":"_amount","indexed":false},{"type":"uint256","name":"_time","indexed":false},{"type":"uint256","name":"_lockTime","indexed":false},{"type":"address","name":"_token","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateLockPeriod","inputs":[{"type":"uint256","name":"time","indexed":false}],"anonymous":false},{"type":"event","name":"UpdateStake","inputs":[{"type":"uint256","name":"_stakeIndex","indexed":true},{"type":"uint256","name":"_lockTime","indexed":false}],"anonymous":false}]
            

Deployed ByteCode

0x6080604052600436106100fe5760003560e01c80638f32d59b11610095578063cc57465811610064578063cc57465814610299578063cd250f42146102ac578063e473f8a7146102cc578063f2fde38b14610372578063ff64d8101461039257600080fd5b80638f32d59b14610208578063907d3be51461023957806391db7b0d14610259578063acce5f3d1461027957600080fd5b8063557e6cfe116100d1578063557e6cfe14610181578063715018a6146101b957806385d4f055146101ce5780638da5cb5b146101e457600080fd5b806319ab453c146101035780632119e2ba146101255780633fd8b02f1461014557806354aaec8c1461016e575b600080fd5b34801561010f57600080fd5b5061012361011e366004611367565b6103bf565b005b34801561013157600080fd5b50610123610140366004611390565b610446565b34801561015157600080fd5b5061015b60025481565b6040519081526020015b60405180910390f35b61012361017c3660046113c0565b610590565b34801561018d57600080fd5b506001546101a1906001600160a01b031681565b6040516001600160a01b039091168152602001610165565b3480156101c557600080fd5b506101236105f4565b3480156101da57600080fd5b5061015b60035481565b3480156101f057600080fd5b506000546201000090046001600160a01b03166101a1565b34801561021457600080fd5b506000546201000090046001600160a01b031633146040519015158152602001610165565b34801561024557600080fd5b5061015b610254366004611407565b610675565b34801561026557600080fd5b50610123610274366004611407565b6106dd565b34801561028557600080fd5b50610123610294366004611420565b61079e565b6101236102a7366004611495565b610b01565b3480156102b857600080fd5b506101236102c7366004611390565b610b38565b3480156102d857600080fd5b506103316102e7366004611407565b600460208190526000918252604090912080546001820154600283015460038401549484015460058501546006909501546001600160a01b03948516969385169592949192911687565b604080516001600160a01b03988916815296881660208801528601949094526060850192909252608084015260a083015290911660c082015260e001610165565b34801561037e57600080fd5b5061012361038d366004611367565b610bfe565b34801561039e57600080fd5b506103b26103ad366004611367565b610c3a565b604051610165919061151f565b600054610100900460ff16806103d8575060005460ff16155b6103fd5760405162461bcd60e51b81526004016103f490611532565b60405180910390fd5b600054610100900460ff1615801561041f576000805461ffff19166101011790555b610427610ca6565b61043082610d5b565b8015610442576000805461ff00191690555b5050565b600054600160b01b900460ff161561045d57600080fd5b6000805460ff60b01b1916600160b01b17815582815260046020526040902080546001600160a01b031633146104a55760405162461bcd60e51b81526004016103f490611580565b6004810154156104c75760405162461bcd60e51b81526004016103f4906115a6565b600381015415806104db5750428160030154115b6104e457600080fd5b81156104f65760006003820155610540565b60025460025482600201544261050c91906115f3565b610516919061160c565b61052190600161162e565b61052b9190611641565b816002015461053a919061162e565b60038201555b827f8ad43e88fe33eb5492c9b34292dcb3a85e1d48c2e3ba903618fae99ed0fcf5be826003015460405161057691815260200190565b60405180910390a250506000805460ff60b01b1916905550565b6001546001600160a01b031633146105e15760405162461bcd60e51b8152602060048201526014602482015273383632b233b2a1b7b73a3930b1ba1032b93937b960611b60448201526064016103f4565b6105ef838360008085610df6565b505050565b6000546201000090046001600160a01b031633146106245760405162461bcd60e51b81526004016103f490611660565b60008054604051620100009091046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805462010000600160b01b0319169055565b600081815260046020526040812060038101548083036106d6576002546002548360020154426106a591906115f3565b6106af919061160c565b6106ba90600161162e565b6106c49190611641565b82600201546106d3919061162e565b90505b9392505050565b6000546201000090046001600160a01b0316331461070d5760405162461bcd60e51b81526004016103f490611660565b6303c267008111158015610724575062278d008110155b6107635760405162461bcd60e51b815260206004820152601060248201526f3637b1b5a832b934b7b21032b93937b960811b60448201526064016103f4565b60028190556040518181527ffa4546b9a95580d08eebcf7a95f651c534a1fe2ad1b2f3b30210b1568e0fd12a9060200160405180910390a150565b600054600160b01b900460ff16156107b557600080fd5b6000805460ff60b01b1916600160b01b17815533905b82811015610aee5760008484838181106107e7576107e7611695565b9050602002013590506000811115610adb57600081815260046020526040902080546001600160a01b038581169116146108335760405162461bcd60e51b81526004016103f490611580565b6003810154158015906108495750428160030154105b6108865760405162461bcd60e51b815260206004820152600e60248201526d3637b1b5aa34b6b29032b93937b960911b60448201526064016103f4565b6004810154156108a85760405162461bcd60e51b81526004016103f4906115a6565b426004820155805460058201546040516001600160a01b039092169181156108fc0291906000818181858888f193505050501580156108eb573d6000803e3d6000fd5b5060058101546001805490830154604051633c0f3f0360e11b8152600093926001600160a01b039081169263781e7e069261092c92909116906004016116ab565b602060405180830381865afa158015610949573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096d91906116ec565b61097791906115f3565b6040805160018082528183019092529192506000919060208083019080368337505050600184015481519192506001600160a01b03169082906000906109bf576109bf611695565b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526000918160200160208202803683370190505090508281600081518110610a1057610a10611695565b60209081029190910101526001546001600160a01b03166346defac58383610a3942600a61162e565b6040518463ffffffff1660e01b8152600401610a5793929190611705565b600060405180830381600087803b158015610a7157600080fd5b505af1158015610a85573d6000803e3d6000fd5b505050506001840154604080516001600160a01b0392831681524260208201529189169187917f32f0115ad5ecbe61fc028c71d04d7b8dd093bcb7785a110e450a491002ac6f6a910160405180910390a3505050505b5080610ae681611794565b9150506107cb565b50506000805460ff60b01b191690555050565b600054600160b01b900460ff1615610b1857600080fd5b6000805460ff60b01b1916600160b01b179055610aee3385858585610df6565b600054600160b01b900460ff1615610b4f57600080fd5b6000805460ff60b01b1916600160b01b17815582815260046020526040902080546001600160a01b03163314610b975760405162461bcd60e51b81526004016103f490611580565b600481015415610bb95760405162461bcd60e51b81526004016103f4906115a6565b600381015415801590610bd0575042816003015411155b610bd957600080fd5b4260028201558115610bf15760006003820155610540565b60025461053a904261162e565b6000546201000090046001600160a01b03163314610c2e5760405162461bcd60e51b81526004016103f490611660565b610c378161127d565b50565b6001600160a01b038116600090815260056020908152604091829020805483518184028101840190945280845260609392830182828015610c9a57602002820191906000526020600020905b815481526020019060010190808311610c86575b50505050509050919050565b600054610100900460ff1680610cbf575060005460ff16155b610cdb5760405162461bcd60e51b81526004016103f490611532565b600054610100900460ff16158015610cfd576000805461ffff19166101011790555b6000805462010000600160b01b03191633620100008102919091178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015610c37576000805461ff001916905550565b600054610100900460ff1680610d74575060005460ff16155b610d905760405162461bcd60e51b81526004016103f490611532565b600054610100900460ff16158015610db2576000805461ffff19166101011790555b600180546001600160a01b0319166001600160a01b03841617905562eff1006002556000805460ff60b01b191690558015610442576000805461ff00191690555050565b3491506001600160a01b03831615610e3e5760405162461bcd60e51b815260206004820152600b60248201526a3a37b5b2b71032b93937b960a91b60448201526064016103f4565b600154604051636157c81f60e01b81526001600160a01b03868116600483015290911690636157c81f90602401602060405180830381865afa158015610e88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eac91906117ad565b610ee95760405162461bcd60e51b815260206004820152600e60248201526d3737b232a0b232391032b93937b960911b60448201526064016103f4565b600154604051633c0f3f0360e11b815260009184916001600160a01b039091169063781e7e0690610f1e9089906004016116ab565b602060405180830381865afa158015610f3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5f91906116ec565b610f69919061162e565b60408051600180825281830190925291925060009190602080830190803683370190505090508581600081518110610fa357610fa3611695565b6001600160a01b0392909216602092830291909101909101526040805160018082528183019092526000918160200160208202803683370190505090508281600081518110610ff457610ff4611695565b60209081029190910101526001546001600160a01b03166346defac5838361101d42600a61162e565b6040518463ffffffff1660e01b815260040161103b93929190611705565b600060405180830381600087803b15801561105557600080fd5b505af1158015611069573d6000803e3d6000fd5b50505050600060036000815461107e90611794565b9182905550905060008561109c57600254611099904261162e565b90505b6040518060e001604052808b6001600160a01b031681526020018a6001600160a01b0316815260200142815260200182815260200160008152602001888152602001896001600160a01b03168152506004600084815260200190815260200160002060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160010160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550905050600560008b6001600160a01b03166001600160a01b03168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190915055817f0138c1552d21687e076c0ce8ae6632cc57a4076d85dcce2a083f4cf50ce29e968b8b8a42868e604051611269969594939291906001600160a01b039687168152948616602086015260408501939093526060840191909152608083015290911660a082015260c00190565b60405180910390a250505050505050505050565b6001600160a01b0381166112e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103f4565b600080546040516001600160a01b03808516936201000090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b80356001600160a01b038116811461136257600080fd5b919050565b60006020828403121561137957600080fd5b6106d68261134b565b8015158114610c3757600080fd5b600080604083850312156113a357600080fd5b8235915060208301356113b581611382565b809150509250929050565b6000806000606084860312156113d557600080fd5b6113de8461134b565b92506113ec6020850161134b565b915060408401356113fc81611382565b809150509250925092565b60006020828403121561141957600080fd5b5035919050565b6000806020838503121561143357600080fd5b823567ffffffffffffffff8082111561144b57600080fd5b818501915085601f83011261145f57600080fd5b81358181111561146e57600080fd5b8660208260051b850101111561148357600080fd5b60209290920196919550909350505050565b600080600080608085870312156114ab57600080fd5b6114b48561134b565b93506114c26020860161134b565b92506040850135915060608501356114d981611382565b939692955090935050565b600081518084526020808501945080840160005b83811015611514578151875295820195908201906001016114f8565b509495945050505050565b6020815260006106d660208301846114e4565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b6020808252600c908201526b39b2b73232b91032b93937b960a11b604082015260600190565b6020808252601b908201527f546865205374616b6520686173206265656e2072656465656d65640000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115611606576116066115dd565b92915050565b60008261162957634e487b7160e01b600052601260045260246000fd5b500490565b80820180821115611606576116066115dd565b600081600019048311821515161561165b5761165b6115dd565b500290565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6040815260006116d260408301600781526613995d1b5a5b9960ca1b602082015260400190565b6001600160a01b0393909316602092909201919091525090565b6000602082840312156116fe57600080fd5b5051919050565b6080808252845190820181905260009060209060a0840190828801845b828110156117475781516001600160a01b031684529284019290840190600101611722565b5050508381038285015261175b81876114e4565b915050836040840152828103606084015261178a81600781526613995d1b5a5b9960ca1b602082015260400190565b9695505050505050565b6000600182016117a6576117a66115dd565b5060010190565b6000602082840312156117bf57600080fd5b81516106d68161138256fea26469706673582212201e1d470e81e18569c6fbd38688effc91da311318330807a3a0f096ce5c46684064736f6c63430008100033