ETH Price: $3,333.96 (+2.27%)
Gas: 1 Gwei

Contract

0xCA208DCfbEF22941D176858A640190C2222C8c8F
 

Overview

ETH Balance

0.00009674 ETH

Eth Value

$0.32 (@ $3,333.96/ETH)

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Governance123328022021-04-29 2:53:021187 days ago1619664782IN
0xCA208DCf...2222C8c8F
0 ETH0.0019660858
Set Governance123199712021-04-27 3:31:561189 days ago1619494316IN
0xCA208DCf...2222C8c8F
0 ETH0.0024535759
Withdraw Nest118692622021-02-16 17:40:461259 days ago1613497246IN
0xCA208DCf...2222C8c8F
0 ETH0.00399428147
Withdraw Nest118692602021-02-16 17:40:321259 days ago1613497232IN
0xCA208DCf...2222C8c8F
0 ETH0.00399428147
Set Governance116847342021-01-19 8:46:371287 days ago1611045997IN
0xCA208DCf...2222C8c8F
0 ETH0.0062847150
Set Governance116845532021-01-19 8:08:291287 days ago1611043709IN
0xCA208DCf...2222C8c8F
0 ETH0.0062847150
Set Governance116845302021-01-19 8:03:441287 days ago1611043424IN
0xCA208DCf...2222C8c8F
0 ETH0.0050247150
Set Governance116842052021-01-19 6:50:011287 days ago1611039001IN
0xCA208DCf...2222C8c8F
0 ETH0.0023448670
Set Contracts116840272021-01-19 6:06:461287 days ago1611036406IN
0xCA208DCf...2222C8c8F
0 ETH0.0134677970
0x60806040116837022021-01-19 5:01:101287 days ago1611032470IN
 Create: NestPool
0 ETH0.2675789190

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
123328102021-04-29 2:54:071187 days ago1619664847
0xCA208DCf...2222C8c8F
60 ETH
123211902021-04-27 8:06:461189 days ago1619510806
0xCA208DCf...2222C8c8F
400 ETH
123211592021-04-27 8:00:181189 days ago1619510418
0xCA208DCf...2222C8c8F
120 ETH
123210862021-04-27 7:47:231189 days ago1619509643
0xCA208DCf...2222C8c8F
331 ETH
123208792021-04-27 6:55:301189 days ago1619506530
0xCA208DCf...2222C8c8F
60 ETH
123208242021-04-27 6:42:111189 days ago1619505731
0xCA208DCf...2222C8c8F
60 ETH
123100062021-04-25 14:32:491191 days ago1619361169
0xCA208DCf...2222C8c8F
60 ETH
122879952021-04-22 4:58:141194 days ago1619067494
0xCA208DCf...2222C8c8F
60 ETH
122878832021-04-22 4:32:211194 days ago1619065941
0xCA208DCf...2222C8c8F
30 ETH
122870772021-04-22 1:23:321194 days ago1619054612
0xCA208DCf...2222C8c8F
30 ETH
122865962021-04-21 23:38:551194 days ago1619048335
0xCA208DCf...2222C8c8F
39.8673 ETH
122865242021-04-21 23:24:171194 days ago1619047457
0xCA208DCf...2222C8c8F
169.867225 ETH
122845352021-04-21 16:09:391195 days ago1619021379
0xCA208DCf...2222C8c8F
20 ETH
122834082021-04-21 11:50:571195 days ago1619005857
0xCA208DCf...2222C8c8F
60 ETH
122833152021-04-21 11:29:221195 days ago1619004562
0xCA208DCf...2222C8c8F
60 ETH
122832202021-04-21 11:06:591195 days ago1619003219
0xCA208DCf...2222C8c8F
60 ETH
122831292021-04-21 10:49:001195 days ago1619002140
0xCA208DCf...2222C8c8F
60 ETH
122830822021-04-21 10:36:391195 days ago1619001399
0xCA208DCf...2222C8c8F
60 ETH
122829942021-04-21 10:19:411195 days ago1619000381
0xCA208DCf...2222C8c8F
28.3057 ETH
122828862021-04-21 9:58:181195 days ago1618999098
0xCA208DCf...2222C8c8F
298.3057346 ETH
122822602021-04-21 7:34:241195 days ago1618990464
0xCA208DCf...2222C8c8F
50 ETH
122804662021-04-21 1:02:241195 days ago1618966944
0xCA208DCf...2222C8c8F
30 ETH
122798262021-04-20 22:38:201196 days ago1618958300
0xCA208DCf...2222C8c8F
40 ETH
122797022021-04-20 22:08:291196 days ago1618956509
0xCA208DCf...2222C8c8F
60 ETH
122795802021-04-20 21:42:491196 days ago1618954969
0xCA208DCf...2222C8c8F
30 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NestPool

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 13 : NestPool.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.6.12;

import "./lib/SafeMath.sol";
import "./lib/AddressPayable.sol";
import "./lib/SafeERC20.sol";
import './lib/TransferHelper.sol';
import "./iface/INestPool.sol";
import "./iface/INestDAO.sol";
import "./iface/INestMining.sol";
import "./iface/INestQuery.sol";
import "./iface/INestStaking.sol";
import "./iface/INNRewardPool.sol";
import "./iface/INTokenController.sol";

/// @title NestPool
/// @author Inf Loop - <[email protected]>
/// @author Paradox  - <[email protected]>

/// @dev The contract is for bookkeeping ETH, NEST and Tokens. It is served as a vault, such that 
///     assets are transferred internally to save GAS.
contract NestPool is INestPool {
    
    using address_make_payable for address;
    using SafeMath for uint256;
    using SafeERC20 for ERC20;

    uint8 private flag;  // 0: UNINITIALIZED  | 1: INITIALIZED
    uint256 public minedNestAmount; 

    address override public governance;
    address public addrOfNestBurning = address(0x1);

    // Contracts 
    address public C_NestDAO;
    address public C_NestMining;
    ERC20   public C_NestToken;
    address public C_NTokenController;
    address public C_NNToken;
    address public C_NNRewardPool;
    address public C_NestStaking;
    address public C_NestQuery;

    // eth ledger for all miners
    mapping(address => uint256) _eth_ledger;
    // token => miner => amount 
    mapping(address => mapping(address => uint256)) _token_ledger;

    // mapping(address => uint256) _nest_ledger;

    mapping(address => address) _token_ntoken_mapping;

    // parameters 

    constructor() public 
    {
        governance = msg.sender;
    }

    receive() external payable { }

    /* ========== MODIFIERS ========== */

    modifier onlyGovernance() 
    {
        require(msg.sender == governance, "Nest:Pool:!governance");
        _;
    }

    modifier onlyBy(address _contract) 
    {
        require(msg.sender == _contract, "Nest:Pool:!Auth");
        _;
    }

    modifier onlyGovOrBy(address _contract) 
    {
        require(msg.sender == governance || msg.sender == _contract, "Nest:Pool:!Auth");
        _;
    }

    /*
    modifier onlyGovOrBy2(address _contract, address _contract2)
    {
        require(msg.sender == governance || msg.sender == _contract || msg.sender == _contract2, "Nest:Pool:!Auth");
        _;
    }

    modifier onlyGovOrBy3(address _contract1, address _contract2, address _contract3)
    {
        require(msg.sender == governance
            || msg.sender == _contract1
            || msg.sender == _contract2
            || msg.sender == _contract3, "Nest:Pool:!Auth");
        _;
    }
    */
    modifier onlyByNest()
    {
        require(msg.sender == C_NestMining
            || msg.sender == C_NTokenController 
            || msg.sender == C_NestDAO 
            || msg.sender == C_NestStaking 
            || msg.sender == C_NNRewardPool 
            || msg.sender == C_NestQuery, "Nest:Pool:!Auth");
        _;
    }

    modifier onlyMiningContract()
    {
        require(address(msg.sender) == C_NestMining, "Nest:Pool:onlyMining");
        _;
    }

    /* ========== GOVERNANCE ========== */

    function setGovernance(address _gov) 
        override external onlyGovernance 
    { 
        mapping(address => uint256) storage _nest_ledger = _token_ledger[address(C_NestToken)];
        _nest_ledger[_gov] = _nest_ledger[governance];  
        _nest_ledger[governance] = 0;
        governance = _gov;
    }

    function setContracts(
            address NestToken, address NestMining, 
            address NestStaking, address NTokenController, 
            address NNToken, address NNRewardPool, 
            address NestQuery, address NestDAO
        ) 
        external onlyGovernance
    {
        if (NestToken != address(0)) {
            C_NestToken = ERC20(NestToken);
        }
        if (NestMining != address(0)) {
            C_NestMining = NestMining;
        }
        if (NTokenController != address(0)) {
            C_NTokenController = NTokenController;
        }
        if (NNToken != address(0)) {
            C_NNToken = NNToken;
        }
        if (NNRewardPool != address(0)) {
            C_NNRewardPool = NNRewardPool;
        }
        if (NestStaking != address(0)) {
            C_NestStaking = NestStaking;
        }
        if (NestQuery != address(0)) {
            C_NestQuery = NestQuery;
        }
        if (NestDAO != address(0)) {
            C_NestDAO = NestDAO;
        }
    }

    /// @dev Set the total amount of NEST in the pool. After Nest v3.5 upgrading, all 
    ///    of the unmined NEST will be transferred by the governer to this pool. 
    function initNestLedger(uint256 amount) 
        override external onlyGovernance 
    {
        require(_token_ledger[address(C_NestToken)][address(governance)] == 0, "Nest:Pool:!init"); 
        _token_ledger[address(C_NestToken)][address(governance)] = amount;
    }

    function getNTokenFromToken(address token) 
        override view public returns (address) 
    {
        return _token_ntoken_mapping[token];
    }

    function setNTokenToToken(address token, address ntoken) 
        override 
        public
        onlyGovOrBy(C_NTokenController) 
    {
        _token_ntoken_mapping[token] = ntoken;
        _token_ntoken_mapping[ntoken] = ntoken;
    }

    /* ========== ONLY FOR EMERGENCY ========== */

    // function drainEth(address to, uint256 amount) 
    //     external onlyGovernance
    // {
    //     TransferHelper.safeTransferETH(to, amount);
    // }

    function drainNest(address to, uint256 amount, address gov) 
         override external onlyGovernance
    {
         require(_token_ledger[address(C_NestToken)][gov] >= amount, "Nest:Pool:!amount");
         C_NestToken.transfer(to, amount);
    }

    function transferNestInPool(address from, address to, uint256 amount) 
        external onlyByNest
    {
        if (amount == 0) {
            return;
        }
        mapping(address => uint256) storage _nest_ledger = _token_ledger[address(C_NestToken)];
        uint256 blnc = _nest_ledger[from];
        require (blnc >= amount, "Nest:Pool:!amount");
        _nest_ledger[from] = blnc.sub(amount);
        _nest_ledger[to] = _nest_ledger[to].add(amount);
    }

    function transferTokenInPool(address token, address from, address to, uint256 amount) 
        external onlyByNest
    {
        if (amount == 0) {
            return;
        }
        uint256 blnc = _token_ledger[token][from];
        require (blnc >= amount, "Nest:Pool:!amount");
        _token_ledger[token][from] = blnc.sub(amount);
        _token_ledger[token][to] = _token_ledger[token][to].add(amount);
    }

    function transferEthInPool(address from, address to, uint256 amount) 
        external onlyByNest
    {
        if (amount == 0) {
            return;
        }
        uint256 blnc = _eth_ledger[from];
        require (blnc >= amount, "Nest:Pool:!amount");
        _eth_ledger[from] = blnc.sub(amount);
        _eth_ledger[to] = _eth_ledger[to].add(amount);
    }


    /* ========== FREEZING/UNFREEZING ========== */

    // NOTE: Guarded by onlyMiningContract

    function freezeEth(address miner, uint256 ethAmount) 
        override public onlyBy(C_NestMining) 
    {
        // emit LogAddress("freezeEthAndToken> miner", miner);
        // emit LogAddress("freezeEthAndToken> token", token);
        uint256 blncs = _eth_ledger[miner];
        require(blncs >= ethAmount, "Nest:Pool:BAL(eth)<0");
        _eth_ledger[miner] = blncs - ethAmount;  //safe_math: checked before
        _eth_ledger[address(this)] =  _eth_ledger[address(this)].add(ethAmount);
    }

    function unfreezeEth(address miner, uint256 ethAmount) 
        override public onlyBy(C_NestMining)  
    {
        if (ethAmount > 0) {
            // LogUint("unfreezeEthAndToken> _eth_ledger[address(0x0)]", _eth_ledger[address(0x0)]);
            // LogUint("unfreezeEthAndToken> _eth_ledger[miner]", _eth_ledger[miner]);
            // LogUint("unfreezeEthAndToken> ethAmount", ethAmount);
            _eth_ledger[address(this)] =  _eth_ledger[address(this)].sub(ethAmount);
            _eth_ledger[miner] = _eth_ledger[miner].add(ethAmount);
        } 
    }

    function freezeNest(address miner, uint256 nestAmount) 
        override public onlyBy(C_NestMining)  
    {
        mapping(address => uint256) storage _nest_ledger = _token_ledger[address(C_NestToken)];

        uint256 blncs = _nest_ledger[miner];
        
        _nest_ledger[address(this)] =  _nest_ledger[address(this)].add(nestAmount);

        if (blncs < nestAmount) {
            _nest_ledger[miner] = 0; 
            require(C_NestToken.transferFrom(miner,  address(this), nestAmount - blncs), "Nest:Pool:!transfer"); //safe math
        } else {
            _nest_ledger[miner] = blncs - nestAmount;  //safe math
        }
    }

    function unfreezeNest(address miner, uint256 nestAmount) 
        override public onlyBy(C_NestMining)  
    {
        mapping(address => uint256) storage _nest_ledger = _token_ledger[address(C_NestToken)];

        if (nestAmount > 0) {
            _nest_ledger[address(this)] =  _nest_ledger[address(this)].sub(nestAmount);
            _nest_ledger[miner] = _nest_ledger[miner].add(nestAmount); 
        }
    }

    function freezeToken(address miner, address token, uint256 tokenAmount) 
        override external onlyBy(C_NestMining)  
    {
        uint256 blncs = _token_ledger[token][miner];
        _token_ledger[token][address(this)] =  _token_ledger[token][address(this)].add(tokenAmount);
        if (blncs < tokenAmount) {
            _token_ledger[token][miner] = 0; 
            ERC20(token).safeTransferFrom(address(miner),  address(this), tokenAmount - blncs); //safe math
        } else {
            _token_ledger[token][miner] = blncs - tokenAmount;  //safe math
        }
    }

    function unfreezeToken(address miner, address token, uint256 tokenAmount) 
        override external onlyBy(C_NestMining)  
    {
        if (tokenAmount > 0) {
            _token_ledger[token][address(this)] =  _token_ledger[token][address(this)].sub(tokenAmount);
            _token_ledger[token][miner] = _token_ledger[token][miner].add(tokenAmount); 
        }
    }

    function freezeEthAndToken(address miner, uint256 ethAmount, address token, uint256 tokenAmount) 
        override external onlyBy(C_NestMining)  
    {
        uint256 blncs = _eth_ledger[miner];
        require(blncs >= ethAmount, "Nest:Pool:!eth");
        _eth_ledger[miner] = blncs - ethAmount;  //safe_math: checked before
        _eth_ledger[address(this)] =  _eth_ledger[address(this)].add(ethAmount);

        blncs = _token_ledger[token][miner];
        _token_ledger[token][address(this)] =  _token_ledger[token][address(this)].add(tokenAmount);
        if (blncs < tokenAmount) {
            _token_ledger[token][miner] = 0;
            ERC20(token).safeTransferFrom(address(miner),  address(this), tokenAmount - blncs); //safe math
        } else {
            _token_ledger[token][miner] = blncs - tokenAmount;  //safe math
        }
    }

    function unfreezeEthAndToken(address miner, uint256 ethAmount, address token, uint256 tokenAmount) 
        override external onlyBy(C_NestMining)  
    {
        if (ethAmount > 0) {
            _eth_ledger[address(this)] =  _eth_ledger[address(this)].sub(ethAmount);
            _eth_ledger[miner] = _eth_ledger[miner].add(ethAmount);
        } 

        if (tokenAmount > 0) {
            _token_ledger[token][address(this)] =  _token_ledger[token][address(this)].sub(tokenAmount);
            _token_ledger[token][miner] = _token_ledger[token][miner].add(tokenAmount); 
        }
    }

    /* ========== BALANCE ========== */


    function balanceOfNestInPool(address miner) 
        override public view returns (uint256)
    {
        mapping(address => uint256) storage _nest_ledger = _token_ledger[address(C_NestToken)];

        return _nest_ledger[miner];
    }

    function balanceOfEthInPool(address miner) 
        override public view returns (uint256)
    {
        return _eth_ledger[miner];
    }

    function balanceOfTokenInPool(address miner, address token) 
        override public view returns (uint256)
    {
        return _token_ledger[token][miner];
    }

    function balanceOfEthFreezed() public view returns (uint256)
    {
        return _eth_ledger[address(this)];
    }

    function balanceOfTokenFreezed(address token) public view returns (uint256)
    {
        return _token_ledger[token][address(this)];
    }

    /* ========== DISTRIBUTING ========== */

    function addNest(address miner, uint256 amount) 
        override public onlyBy(C_NestMining)
    {
        mapping(address => uint256) storage _nest_ledger = _token_ledger[address(C_NestToken)];
        _nest_ledger[governance] = _nest_ledger[governance].sub(amount);
        _nest_ledger[miner] = _nest_ledger[miner].add(amount);
        minedNestAmount = minedNestAmount.add(amount);
    }

    function addNToken(address miner, address ntoken, uint256 amount) 
        override public onlyBy(C_NestMining)
    {
        _token_ledger[ntoken][miner] = _token_ledger[ntoken][miner].add(amount);
    }

    /* ========== DEPOSIT ========== */

    // NOTE: Guarded by onlyMiningContract

    function depositEth(address miner) 
        override payable external onlyGovOrBy(C_NestMining) 
    {
        _eth_ledger[miner] =  _eth_ledger[miner].add(msg.value);
    }

    function depositNToken(address miner, address from, address ntoken, uint256 amount) 
        override external onlyGovOrBy(C_NestMining) 
    {
        ERC20(ntoken).transferFrom(from, address(this), amount);
        _token_ledger[ntoken][miner] =  _token_ledger[ntoken][miner].add(amount);
    }

    /* ========== WITHDRAW ========== */

    // NOTE: Guarded by onlyGovOrBy(C_NestMining), onlyGovOrBy(C_NestStaking)
    
    /// @dev If amount == 0, it won't go stuck
    function withdrawEth(address miner, uint256 ethAmount) 
        override public onlyByNest
    {
        uint256 blncs = _eth_ledger[miner];
        require(ethAmount <= blncs, "Nest:Pool:!blncs");
        if (ethAmount > 0) {
            _eth_ledger[miner] = blncs - ethAmount; // safe math
            TransferHelper.safeTransferETH(miner, ethAmount);
        }
    }

    /// @dev If amount == 0, it won't go stuck
    function withdrawToken(address miner, address token, uint256 tokenAmount) 
        override public onlyByNest
    {
        uint256 blncs = _token_ledger[token][miner];
        require(tokenAmount <= blncs, "Nest:Pool:!blncs");
        if (tokenAmount > 0) {
            _token_ledger[token][miner] = blncs - tokenAmount; // safe math
            ERC20(token).safeTransfer(miner, tokenAmount);
        }
    }


    /// @dev If amount == 0, it won't go stuck
    function withdrawNest(address miner, uint256 amount) 
        override public onlyByNest
    {
        mapping(address => uint256) storage _nest_ledger = _token_ledger[address(C_NestToken)];

        uint256 blncs = _nest_ledger[miner];
        require(amount <= blncs, "Nest:Pool:!blncs");
        if (amount > 0) {
            _nest_ledger[miner] = blncs - amount;  // safe math
            require(C_NestToken.transfer(miner, amount),"Nest:Pool:!TRANS");
        }
    }


    /// @dev If amount == 0, it won't go stuck
    function withdrawEthAndToken(address miner, uint256 ethAmount, address token, uint256 tokenAmount) 
        override public onlyBy(C_NestMining)
    {
        uint256 blncs = _eth_ledger[miner];
        if (ethAmount <= blncs && ethAmount > 0) {
            _eth_ledger[miner] = blncs - ethAmount;  // safe math
            TransferHelper.safeTransferETH(miner, ethAmount);
        }

        blncs = _token_ledger[token][miner];
        if (tokenAmount <= blncs && tokenAmount > 0) {
            _token_ledger[token][miner] = blncs - tokenAmount;  // safe math
            ERC20(token).safeTransfer(miner, tokenAmount);
        }
    }

    /// @dev If amount == 0, it won't go stuck
    function withdrawNTokenAndTransfer(address miner, address ntoken, uint256 amount, address to) 
        override public onlyBy(C_NestStaking)
    {
        uint256 blncs = _token_ledger[ntoken][miner];
        require(amount <= blncs, "Nest:Pool:!blncs");
        if (amount > 0) {
            _token_ledger[ntoken][miner] = blncs - amount;  // safe math
            require(ERC20(ntoken).transfer(to, amount),"Nest:Pool:!TRANS");
        }
    }

    /* ========== HELPERS (VIEWS) ========== */
    // the user needs to be reminded of the parameter settings    
    function assetsList(uint256 len, address[] memory tokenList) 
        public view returns (uint256[] memory) 
    {
        // len < = length(tokenList) + 1
        require(len == tokenList.length + 1, "Nest: Pool: !assetsList");
        uint256[] memory list = new uint256[](len);
        list[0] = _eth_ledger[address(msg.sender)];
        for (uint i = 0; i < len - 1; i++) {
            address _token = tokenList[i];
            list[i+1] = _token_ledger[_token][address(msg.sender)];
        }
        return list;
    }

    function addrOfNestMining() override public view returns (address) 
    {
        return C_NestMining;
    }

    function addrOfNestToken() override public view returns (address) 
    {
        return address(C_NestToken);
    }

    function addrOfNTokenController() override public view returns (address) 
    {
        return C_NTokenController;
    }
    
    function addrOfNNRewardPool() override public view returns (address) 
    {
        return C_NNRewardPool;
    }

    function addrOfNNToken() override public view returns (address) 
    {
        return C_NNToken;
    }

    function addrOfNestStaking() override public view returns (address) 
    {
        return C_NestStaking;
    }

    function addrOfNestQuery() override public view returns (address) 
    {
        return C_NestQuery;
    }

    function addrOfNestDAO() override public view returns (address) 
    {
        return C_NestDAO;
    }

    function addressOfBurnedNest() override public view returns (address) 
    {
        return addrOfNestBurning;
    }

    // function getMinerNToken(address miner, address token) public view returns (uint256 tokenAmount) 
    // {
    //     if (token != address(0x0)) {
    //         tokenAmount = _token_ledger[token][miner];
    //     }
    // } 
        
    function getMinerEthAndToken(address miner, address token) 
        public view returns (uint256 ethAmount, uint256 tokenAmount) 
    {
        ethAmount = _eth_ledger[miner];
        if (token != address(0x0)) {
            tokenAmount = _token_ledger[token][miner];
        }
    } 

    function getMinerNest(address miner) public view returns (uint256 nestAmount) 
    {
        mapping(address => uint256) storage _nest_ledger = _token_ledger[address(C_NestToken)];

        nestAmount = _nest_ledger[miner];
    } 

}

File 2 of 13 : SafeMath.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.6.12;

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x, 'ds-math-add-overflow');
    }

    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x, 'ds-math-sub-underflow');
    }

    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow');
    }

    function div(uint x, uint y) internal pure returns (uint z) {
        require(y > 0, "ds-math-div-zero");
        z = x / y;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    }
}

File 3 of 13 : AddressPayable.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.6.12;

library address_make_payable {
   function make_payable(address x) internal pure returns (address payable) {
      return address(uint160(x));
   }
}

File 4 of 13 : SafeERC20.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.6.12;

import "./Address.sol";
import "./SafeMath.sol";

library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(ERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(ERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(ERC20 token, address spender, uint256 value) internal {
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(ERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(ERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }
    function callOptionalReturn(ERC20 token, bytes memory data) private {
        require(address(token).isContract(), "SafeERC20: call to non-contract");
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

interface ERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 5 of 13 : TransferHelper.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.6.12;

// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
    function safeApprove(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('approve(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
    }

    function safeTransfer(address token, address to, uint value) internal {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
    }

    function safeTransferFrom(address token, address from, address to, uint value) internal {
        // bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
        require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
    }

    function safeTransferETH(address to, uint value) internal {
        (bool success,) = to.call{value:value}(new bytes(0));
        require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
    }
}

File 6 of 13 : INestPool.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.6.12;

import "../lib/SafeERC20.sol";

interface INestPool {

    // function getNTokenFromToken(address token) view external returns (address);
    // function setNTokenToToken(address token, address ntoken) external; 

    function addNest(address miner, uint256 amount) external;
    function addNToken(address contributor, address ntoken, uint256 amount) external;

    function depositEth(address miner) external payable;
    function depositNToken(address miner,  address from, address ntoken, uint256 amount) external;

    function freezeEth(address miner, uint256 ethAmount) external; 
    function unfreezeEth(address miner, uint256 ethAmount) external;

    function freezeNest(address miner, uint256 nestAmount) external;
    function unfreezeNest(address miner, uint256 nestAmount) external;

    function freezeToken(address miner, address token, uint256 tokenAmount) external; 
    function unfreezeToken(address miner, address token, uint256 tokenAmount) external;

    function freezeEthAndToken(address miner, uint256 ethAmount, address token, uint256 tokenAmount) external;
    function unfreezeEthAndToken(address miner, uint256 ethAmount, address token, uint256 tokenAmount) external;

    function getNTokenFromToken(address token) external view returns (address); 
    function setNTokenToToken(address token, address ntoken) external; 

    function withdrawEth(address miner, uint256 ethAmount) external;
    function withdrawToken(address miner, address token, uint256 tokenAmount) external;

    function withdrawNest(address miner, uint256 amount) external;
    function withdrawEthAndToken(address miner, uint256 ethAmount, address token, uint256 tokenAmount) external;
    // function withdrawNToken(address miner, address ntoken, uint256 amount) external;
    function withdrawNTokenAndTransfer(address miner, address ntoken, uint256 amount, address to) external;


    function balanceOfNestInPool(address miner) external view returns (uint256);
    function balanceOfEthInPool(address miner) external view returns (uint256);
    function balanceOfTokenInPool(address miner, address token)  external view returns (uint256);

    function addrOfNestToken() external view returns (address);
    function addrOfNestMining() external view returns (address);
    function addrOfNTokenController() external view returns (address);
    function addrOfNNRewardPool() external view returns (address);
    function addrOfNNToken() external view returns (address);
    function addrOfNestStaking() external view returns (address);
    function addrOfNestQuery() external view returns (address);
    function addrOfNestDAO() external view returns (address);

    function addressOfBurnedNest() external view returns (address);

    function setGovernance(address _gov) external; 
    function governance() external view returns(address);
    function initNestLedger(uint256 amount) external;
    function drainNest(address to, uint256 amount, address gov) external;

}

File 7 of 13 : INestDAO.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.6.12;

interface INestDAO {

    function addETHReward(address ntoken) external payable; 

    function addNestReward(uint256 amount) external;

    /// @dev Only for governance
    function loadContracts() external; 

    /// @dev Only for governance
    function loadGovernance() external;
    
    /// @dev Only for governance
    function start() external; 

    function initEthLedger(address ntoken, uint256 amount) external;

    event NTokenRedeemed(address ntoken, address user, uint256 amount);

    event AssetsCollected(address user, uint256 ethAmount, uint256 nestAmount);

    event ParamsSetup(address gov, uint256 oldParam, uint256 newParam);

    event FlagSet(address gov, uint256 flag);

}

File 8 of 13 : INestMining.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;

import "../lib/SafeERC20.sol";


interface INestMining {
    
    struct Params {
        uint8    miningEthUnit;     // = 10;
        uint32   nestStakedNum1k;   // = 1;
        uint8    biteFeeRate;       // = 1; 
        uint8    miningFeeRate;     // = 10;
        uint8    priceDurationBlock; 
        uint8    maxBiteNestedLevel; // = 3;
        uint8    biteInflateFactor;
        uint8    biteNestInflateFactor;
    }

    function priceOf(address token) external view returns(uint256 ethAmount, uint256 tokenAmount, uint256 bn);
    
    function priceListOfToken(address token, uint8 num) external view returns(uint128[] memory data, uint256 bn);

    // function priceOfTokenAtHeight(address token, uint64 atHeight) external view returns(uint256 ethAmount, uint256 tokenAmount, uint64 bn);

    function latestPriceOf(address token) external view returns (uint256 ethAmount, uint256 tokenAmount, uint256 bn);

    function priceAvgAndSigmaOf(address token) 
        external view returns (uint128, uint128, int128, uint32);

    function minedNestAmount() external view returns (uint256);

    /// @dev Only for governance
    function loadContracts() external; 
    
    function loadGovernance() external;

    function upgrade() external;

    function setup(uint32   genesisBlockNumber, uint128  latestMiningHeight, uint128  minedNestTotalAmount, Params calldata initParams) external;

    function setParams1(uint128  latestMiningHeight, uint128  minedNestTotalAmount) external;
}

File 9 of 13 : INestQuery.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.6.12;

/// @title The interface of NestQuery
/// @author Inf Loop - <[email protected]>
/// @author Paradox  - <[email protected]>
interface INestQuery {

    /// @notice Activate a pay-per-query defi client with NEST tokens
    /// @dev No contract is allowed to call it
    /// @param defi The addres of client (DeFi DApp)
    function activate(address defi) external;

    /// @notice Deactivate a pay-per-query defi client
    /// @param defi The address of a client (DeFi DApp)
    function deactivate(address defi) external;

    /// @notice Query for PPQ (pay-per-query) clients
    /// @dev Consider that if a user call a DeFi that queries NestQuery, DeFi should
    ///     pass the user's wallet address to query() as `payback`.
    /// @param token The address of token contract
    /// @param payback The address of change
    function query(address token, address payback) 
        external payable returns (uint256, uint256, uint256);

    /// @notice Query for PPQ (pay-per-query) clients
    /// @param token The address of token contract
    /// @param payback The address of change
    /// @return ethAmount The amount of ETH in pair (ETH, TOKEN)
    /// @return tokenAmount The amount of TOKEN in pair (ETH, TOKEN)
    /// @return avgPrice The average of last 50 prices 
    /// @return vola The volatility of prices 
    /// @return bn The block number when (ETH, TOKEN) takes into effective
    function queryPriceAvgVola(address token, address payback) 
        external payable returns (uint256, uint256, uint128, int128, uint256);

    /// @notice The main function called by DeFi clients, compatible to Nest Protocol v3.0 
    /// @dev  The payback address is ZERO, so the changes are kept in this contract
    ///         The ABI keeps consist with Nest v3.0
    /// @param tokenAddress The address of token contract address
    /// @return ethAmount The amount of ETH in price pair (ETH, ERC20)
    /// @return erc20Amount The amount of ERC20 in price pair (ETH, ERC20)
    /// @return blockNum The block.number where the price is being in effect
    function updateAndCheckPriceNow(address tokenAddress) 
        external payable returns (uint256, uint256, uint256);

    /// @notice A non-free function for querying price 
    /// @param token  The address of the token contract
    /// @param num    The number of price sheets in the list
    /// @param payback The address for change
    /// @return The array of prices, each of which is (blockNnumber, ethAmount, tokenAmount)
    function queryPriceList(address token, uint8 num, address payback) 
        external payable returns (uint128[] memory);

    /// @notice A view function returning the historical price list from the current block
    /// @param token  The address of the token contract
    /// @param num    The number of price sheets in the list
    /// @return The array of prices, each of which is (blockNnumber, ethAmount, tokenAmount)
    function priceList(address token, uint8 num) 
        external view returns (uint128[] memory);

    /// @notice A view function returning the latestPrice
    /// @param token  The address of the token contract
    function latestPrice(address token)
    external view returns (uint256 ethAmount, uint256 tokenAmount, uint128 avgPrice, int128 vola, uint256 bn) ;

    /// @dev Only for governance
    function loadContracts() external; 

    /// @dev Only for governance
    function loadGovernance() external; 


    event ClientActivated(address, uint256, uint256);
    // event ClientRenewed(address, uint256, uint256, uint256);
    event PriceQueried(address client, address token, uint256 ethAmount, uint256 tokenAmount, uint256 bn);
    event PriceAvgVolaQueried(address client, address token, uint256 bn, uint128 avgPrice, int128 vola);

    event PriceListQueried(address client, address token, uint256 bn, uint8 num);

    // governance events
    event ParamsSetup(address gov, uint256 oldParams, uint256 newParams);
    event FlagSet(address gov, uint256 flag);
}

File 10 of 13 : INestStaking.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.6.12;


interface INestStaking {
    // Views

    /// @dev How many stakingToken (XToken) deposited into to this reward pool (staking pool)
    /// @param  ntoken The address of NToken
    /// @return The total amount of XTokens deposited in this staking pool
    function totalStaked(address ntoken) external view returns (uint256);

    /// @dev How many stakingToken (XToken) deposited by the target account
    /// @param  ntoken The address of NToken
    /// @param  account The target account
    /// @return The total amount of XToken deposited in this staking pool
    function stakedBalanceOf(address ntoken, address account) external view returns (uint256);


    // Mutative
    /// @dev Stake/Deposit into the reward pool (staking pool)
    /// @param  ntoken The address of NToken
    /// @param  amount The target amount
    function stake(address ntoken, uint256 amount) external;

    function stakeFromNestPool(address ntoken, uint256 amount) external;

    /// @dev Withdraw from the reward pool (staking pool), get the original tokens back
    /// @param  ntoken The address of NToken
    /// @param  amount The target amount
    function unstake(address ntoken, uint256 amount) external;

    /// @dev Claim the reward the user earned
    /// @param ntoken The address of NToken
    /// @return The amount of ethers as rewards
    function claim(address ntoken) external returns (uint256);

    /// @dev Add ETH reward to the staking pool
    /// @param ntoken The address of NToken
    function addETHReward(address ntoken) external payable;

    /// @dev Only for governance
    function loadContracts() external; 

    /// @dev Only for governance
    function loadGovernance() external; 

    function pause() external;

    function resume() external;

    //function setParams(uint8 dividendShareRate) external;

    /* ========== EVENTS ========== */

    // Events
    event RewardAdded(address ntoken, address sender, uint256 reward);
    event NTokenStaked(address ntoken, address indexed user, uint256 amount);
    event NTokenUnstaked(address ntoken, address indexed user, uint256 amount);
    event SavingWithdrawn(address ntoken, address indexed to, uint256 amount);
    event RewardClaimed(address ntoken, address indexed user, uint256 reward);

    event FlagSet(address gov, uint256 flag);
}

File 11 of 13 : INNRewardPool.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.6.12;

/// @title NNRewardPool
/// @author Inf Loop - <[email protected]>
/// @author Paradox  - <[email protected]>

interface INNRewardPool {
    
    /* [DEPRECATED]
        uint256 constant DEV_REWARD_PERCENTAGE   = 5;
        uint256 constant NN_REWARD_PERCENTAGE    = 15;
        uint256 constant MINER_REWARD_PERCENTAGE = 80;
    */

    /// @notice Add rewards for Nest-Nodes, only governance or NestMining (contract) are allowed
    /// @dev  The rewards need to pull from NestPool
    /// @param _amount The amount of Nest token as the rewards to each nest-node
    function addNNReward(uint256 _amount) external;

    /// @notice Claim rewards by Nest-Nodes
    /// @dev The rewards need to pull from NestPool
    function claimNNReward() external ;  

    /// @dev The callback function called by NNToken.transfer()
    /// @param fromAdd The address of 'from' to transfer
    /// @param toAdd The address of 'to' to transfer
    function nodeCount(address fromAdd, address toAdd) external;

    /// @notice Show the amount of rewards unclaimed
    /// @return reward The reward of a NN holder
    function unclaimedNNReward() external view returns (uint256 reward);

    /// @dev Only for governance
    function loadContracts() external; 

    /// @dev Only for governance
    function loadGovernance() external; 

    /* ========== EVENTS ============== */

    /// @notice When rewards are added to the pool
    /// @param reward The amount of Nest Token
    /// @param allRewards The snapshot of all rewards accumulated
    event NNRewardAdded(uint256 reward, uint256 allRewards);

    /// @notice When rewards are claimed by nodes 
    /// @param nnode The address of the nest node
    /// @param share The amount of Nest Token claimed by the nest node
    event NNRewardClaimed(address nnode, uint256 share);

    /// @notice When flag of state is set by governance 
    /// @param gov The address of the governance
    /// @param flag The value of the new flag
    event FlagSet(address gov, uint256 flag);
}

File 12 of 13 : INTokenController.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity ^0.6.12;
pragma experimental ABIEncoderV2;

interface INTokenController {

    /// @dev A struct for an ntoken
    ///     size: 2 x 256bit
    struct NTokenTag {
        address owner;          // the owner with the highest bid
        uint128 nestFee;        // NEST amount staked for opening a NToken
        uint64  startTime;      // the start time of service
        uint8   state;          // =0: normal | =1 disabled
        uint56  _reserved;      // padding space
    }

    function open(address token) external;
    
    function NTokenTagOf(address token) external view returns (NTokenTag memory);

    /// @dev Only for governance
    function loadContracts() external; 

    function loadGovernance() external;

    function setParams(uint256 _openFeeNestAmount) external;

    event ParamsSetup(address gov, uint256 oldParam, uint256 newParam);

    event FlagSet(address gov, uint256 flag);

}

File 13 of 13 : Address.sol
// SPDX-License-Identifier: GPL-3.0-or-later

pragma solidity 0.6.12;

library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        (bool success, ) = recipient.call{value:amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"C_NNRewardPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"C_NNToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"C_NTokenController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"C_NestDAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"C_NestMining","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"C_NestQuery","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"C_NestStaking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"C_NestToken","outputs":[{"internalType":"contract ERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"address","name":"ntoken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addNToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"addNest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addrOfNNRewardPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addrOfNNToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addrOfNTokenController","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addrOfNestBurning","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addrOfNestDAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addrOfNestMining","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addrOfNestQuery","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addrOfNestStaking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addrOfNestToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addressOfBurnedNest","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"len","type":"uint256"},{"internalType":"address[]","name":"tokenList","type":"address[]"}],"name":"assetsList","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfEthFreezed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"}],"name":"balanceOfEthInPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"}],"name":"balanceOfNestInPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"balanceOfTokenFreezed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"balanceOfTokenInPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"}],"name":"depositEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"ntoken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"depositNToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"gov","type":"address"}],"name":"drainNest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"freezeEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"freezeEthAndToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"uint256","name":"nestAmount","type":"uint256"}],"name":"freezeNest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"freezeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getMinerEthAndToken","outputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"}],"name":"getMinerNest","outputs":[{"internalType":"uint256","name":"nestAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNTokenFromToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"initNestLedger","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minedNestAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"NestToken","type":"address"},{"internalType":"address","name":"NestMining","type":"address"},{"internalType":"address","name":"NestStaking","type":"address"},{"internalType":"address","name":"NTokenController","type":"address"},{"internalType":"address","name":"NNToken","type":"address"},{"internalType":"address","name":"NNRewardPool","type":"address"},{"internalType":"address","name":"NestQuery","type":"address"},{"internalType":"address","name":"NestDAO","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"ntoken","type":"address"}],"name":"setNTokenToToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferEthInPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferNestInPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferTokenInPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"unfreezeEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"unfreezeEthAndToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"uint256","name":"nestAmount","type":"uint256"}],"name":"unfreezeNest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"unfreezeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"withdrawEthAndToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"address","name":"ntoken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"withdrawNTokenAndTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawNest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"miner","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600380546001600160a01b031916600117905534801561002357600080fd5b50600280546001600160a01b0319163317905561340b806100456000396000f3fe6080604052600436106103395760003560e01c80639ad8d6f7116101ab578063c2c5c909116100f7578063e2b4e58811610095578063ea7b2f321161006f578063ea7b2f3214610d17578063f5eafc5f14610d6b578063f60d7a2414610d80578063fa81c6e814610db957610340565b8063e2b4e58814610c8c578063e2b57d4514610ccf578063e3c1387414610d0257610340565b8063d68d6ae4116100d1578063d68d6ae414610bcf578063d797920b14610c16578063dd074cc714610c16578063e08805bb14610c4957610340565b8063c2c5c90914610b6a578063c6baae6214610b7f578063d03becd814610bba57610340565b8063ab033ea911610164578063b399d0681161013e578063b399d06814610ac4578063bd4291c114610ad9578063bf76fe7014610aee578063c2a6390e14610b2757610340565b8063ab033ea914610a38578063ad9d4ba314610a6b578063b19d954c14610a9157610340565b80639ad8d6f7146109315780639b942a331461099d578063a1107d30146109b2578063a199b320146109c7578063a1c7962e146109dc578063a798e17d146109f157610340565b80635c3a6cf211610285578063784bab931161022357806385636ce5116101fd57806385636ce51461088b578063872f1961146108c457806393f0c62c1461090757806397dcd0b31461091c57610340565b8063784bab93146108035780637f4794481461081857806384a70acf1461086157610340565b806361bced9d1161025f57806361bced9d146107635780636c29847b146107a65780636e660427146107bb57806372956b69146107d057610340565b80635c3a6cf2146106a85780635e7103c8146106e1578063610255021461071c57610340565b806329e07d7f116102f25780634dee7533116102cc5780634dee7533146105625780634f94637b146105775780635951883e1461058c5780635aa6e6751461069357610340565b806329e07d7f146104975780632dc8decd146104e05780633abc19651461051957610340565b806301e33667146103455780631b9a91a41461038a5780631c1ab1a1146103c35780631ec31821146103ea5780632411643b14610423578063278980d51461046657610340565b3661034057005b600080fd5b34801561035157600080fd5b506103886004803603606081101561036857600080fd5b506001600160a01b03813581169160208101359091169060400135610dce565b005b34801561039657600080fd5b50610388600480360360408110156103ad57600080fd5b506001600160a01b038135169060200135610f36565b3480156103cf57600080fd5b506103d861107f565b60408051918252519081900360200190f35b3480156103f657600080fd5b506103886004803603604081101561040d57600080fd5b506001600160a01b038135169060200135611085565b34801561042f57600080fd5b506103886004803603606081101561044657600080fd5b506001600160a01b0381358116916020810135909116906040013561117c565b34801561047257600080fd5b5061047b61130d565b604080516001600160a01b039092168252519081900360200190f35b3480156104a357600080fd5b50610388600480360360808110156104ba57600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561131c565b3480156104ec57600080fd5b506103886004803603604081101561050357600080fd5b506001600160a01b03813516906020013561146b565b34801561052557600080fd5b506103886004803603608081101561053c57600080fd5b506001600160a01b03813581169160208101358216916040820135916060013516611614565b34801561056e57600080fd5b5061047b6117bb565b34801561058357600080fd5b5061047b6117ca565b34801561059857600080fd5b50610643600480360360408110156105af57600080fd5b813591908101906040810160208201356401000000008111156105d157600080fd5b8201836020820111156105e357600080fd5b8035906020019184602083028401116401000000008311171561060557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506117d9945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561067f578181015183820152602001610667565b505050509050019250505060405180910390f35b34801561069f57600080fd5b5061047b611920565b3480156106b457600080fd5b50610388600480360360408110156106cb57600080fd5b506001600160a01b03813516906020013561192f565b3480156106ed57600080fd5b506103886004803603604081101561070457600080fd5b506001600160a01b0381358116916020013516611a16565b34801561072857600080fd5b506103886004803603608081101561073f57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611abe565b34801561076f57600080fd5b506103886004803603606081101561078657600080fd5b506001600160a01b03813581169160208101359091169060400135611c7f565b3480156107b257600080fd5b5061047b611d2f565b3480156107c757600080fd5b5061047b611d3e565b3480156107dc57600080fd5b5061047b600480360360208110156107f357600080fd5b50356001600160a01b0316611d4d565b34801561080f57600080fd5b5061047b611d6b565b34801561082457600080fd5b506103886004803603608081101561083b57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135611d7a565b34801561086d57600080fd5b506103886004803603602081101561088457600080fd5b5035611f1c565b34801561089757600080fd5b50610388600480360360408110156108ae57600080fd5b506001600160a01b038135169060200135612011565b3480156108d057600080fd5b50610388600480360360608110156108e757600080fd5b506001600160a01b038135811691602081013591604090910135166120c9565b34801561091357600080fd5b5061047b612211565b34801561092857600080fd5b5061047b612220565b34801561093d57600080fd5b50610388600480360361010081101561095557600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c082013581169160e001351661222f565b3480156109a957600080fd5b5061047b6123e8565b3480156109be57600080fd5b5061047b6123f7565b3480156109d357600080fd5b506103d8612406565b3480156109e857600080fd5b5061047b612419565b3480156109fd57600080fd5b5061038860048036036080811015610a1457600080fd5b506001600160a01b0381358116916020810135916040820135169060600135612428565b348015610a4457600080fd5b5061038860048036036020811015610a5b57600080fd5b50356001600160a01b031661253f565b61038860048036036020811015610a8157600080fd5b50356001600160a01b03166125ee565b348015610a9d57600080fd5b506103d860048036036020811015610ab457600080fd5b50356001600160a01b0316612698565b348015610ad057600080fd5b5061047b6126be565b348015610ae557600080fd5b5061047b6126cd565b348015610afa57600080fd5b5061038860048036036040811015610b1157600080fd5b506001600160a01b0381351690602001356126dc565b348015610b3357600080fd5b5061038860048036036060811015610b4a57600080fd5b506001600160a01b038135811691602081013590911690604001356127af565b348015610b7657600080fd5b5061047b61286b565b348015610b8b57600080fd5b506103d860048036036040811015610ba257600080fd5b506001600160a01b038135811691602001351661287a565b348015610bc657600080fd5b5061047b6128a6565b348015610bdb57600080fd5b5061038860048036036080811015610bf257600080fd5b506001600160a01b03813581169160208101359160408201351690606001356128b5565b348015610c2257600080fd5b506103d860048036036020811015610c3957600080fd5b50356001600160a01b03166129d7565b348015610c5557600080fd5b5061038860048036036060811015610c6c57600080fd5b506001600160a01b03813581169160208101359091169060400135612a06565b348015610c9857600080fd5b5061038860048036036060811015610caf57600080fd5b506001600160a01b03813581169160208101359091169060400135612b23565b348015610cdb57600080fd5b506103d860048036036020811015610cf257600080fd5b50356001600160a01b0316612c9d565b348015610d0e57600080fd5b5061047b612cb8565b348015610d2357600080fd5b50610d5260048036036040811015610d3a57600080fd5b506001600160a01b0381358116916020013516612cc7565b6040805192835260208301919091528051918290030190f35b348015610d7757600080fd5b5061047b612d18565b348015610d8c57600080fd5b5061038860048036036040811015610da357600080fd5b506001600160a01b038135169060200135612d27565b348015610dc557600080fd5b5061047b612f2b565b6005546001600160a01b0316331480610df157506007546001600160a01b031633145b80610e0657506004546001600160a01b031633145b80610e1b5750600a546001600160a01b031633145b80610e3057506009546001600160a01b031633145b80610e455750600b546001600160a01b031633145b610e84576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038083166000908152600d602090815260408083209387168352929052205480821115610ef2576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b8115610f30576001600160a01b038084166000818152600d602090815260408083209489168352939052919091208383039055610f30908584612f3a565b50505050565b6005546001600160a01b0316331480610f5957506007546001600160a01b031633145b80610f6e57506004546001600160a01b031633145b80610f835750600a546001600160a01b031633145b80610f9857506009546001600160a01b031633145b80610fad5750600b546001600160a01b031633145b610fec576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600c60205260409020548082111561104d576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b811561107a576001600160a01b0383166000908152600c60205260409020828203905561107a8383612f8c565b505050565b60015481565b6005546001600160a01b03163381146110d3576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600c602052604090205482811015611138576040805162461bcd60e51b815260206004820152601460248201527304e6573743a506f6f6c3a42414c28657468293c360641b604482015290519081900360640190fd5b6001600160a01b0384166000908152600c60205260408082208584039055308252902054611166908461307f565b306000908152600c602052604090205550505050565b6005546001600160a01b031633148061119f57506007546001600160a01b031633145b806111b457506004546001600160a01b031633145b806111c95750600a546001600160a01b031633145b806111de57506009546001600160a01b031633145b806111f35750600b546001600160a01b031633145b611232576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b8061123c5761107a565b6006546001600160a01b039081166000908152600d60209081526040808320938716835290839052902054828110156112b0576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b6112ba81846130ce565b6001600160a01b0380871660009081526020859052604080822093909355908616815220546112e9908461307f565b6001600160a01b038516600090815260209390935260409092209190915550505050565b6008546001600160a01b031681565b6005546002546001600160a01b0391821691163314806113445750336001600160a01b038216145b611383576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b038681166004830152306024830152604482018590529151918516916323b872dd916064808201926020929091908290030181600087803b1580156113dc57600080fd5b505af11580156113f0573d6000803e3d6000fd5b505050506040513d602081101561140657600080fd5b50506001600160a01b038084166000908152600d6020908152604080832093891683529290522054611438908361307f565b6001600160a01b039384166000908152600d60209081526040808320989096168252969096529290942091909155505050565b6005546001600160a01b03163381146114b9576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d60209081526040808320938716835290839052808220543083529120546114f5908561307f565b30600090815260208490526040902055838110156115ef576001600160a01b0380861660008181526020858152604080832083905560065481516323b872dd60e01b81526004810195909552306024860152868a03604486015290519416936323b872dd93606480820194918390030190829087803b15801561157757600080fd5b505af115801561158b573d6000803e3d6000fd5b505050506040513d60208110156115a157600080fd5b50516115ea576040805162461bcd60e51b81526020600482015260136024820152722732b9ba1d2837b7b61d10ba3930b739b332b960691b604482015290519081900360640190fd5b61160d565b6001600160a01b038516600090815260208390526040902084820390555b5050505050565b600a546001600160a01b0316338114611662576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038085166000908152600d6020908152604080832093891683529290522054808411156116d0576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b83156117b3576001600160a01b038086166000818152600d602090815260408083208b8616845282528083208987039055805163a9059cbb60e01b815294881660048601526024850189905251929363a9059cbb9360448083019491928390030190829087803b15801561174357600080fd5b505af1158015611757573d6000803e3d6000fd5b505050506040513d602081101561176d57600080fd5b50516117b3576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a215452414e5360801b604482015290519081900360640190fd5b505050505050565b6009546001600160a01b031690565b6004546001600160a01b031681565b606081516001018314611833576040805162461bcd60e51b815260206004820152601760248201527f4e6573743a20506f6f6c3a20216173736574734c697374000000000000000000604482015290519081900360640190fd5b60608367ffffffffffffffff8111801561184c57600080fd5b50604051908082528060200260200182016040528015611876578160200160208202803683370190505b50336000908152600c602052604081205482519293509183919061189657fe5b60200260200101818152505060005b600185038110156119165760008482815181106118be57fe5b6020908102919091018101516001600160a01b0381166000908152600d83526040808220338352909352919091205484519192509084906001850190811061190257fe5b6020908102919091010152506001016118a5565b5090505b92915050565b6002546001600160a01b031681565b6005546001600160a01b031633811461197d576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d602090815260408083206002549094168352908390529020546119b590846130ce565b6002546001600160a01b0390811660009081526020849052604080822093909355908616815220546119e7908461307f565b6001600160a01b038516600090815260208390526040902055600154611a0d908461307f565b60015550505050565b6007546002546001600160a01b039182169116331480611a3e5750336001600160a01b038216145b611a7d576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b506001600160a01b039182166000908152600e60205260408082208054949093166001600160a01b0319948516811790935582825290208054909216179055565b6005546001600160a01b0316338114611b0c576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0385166000908152600c602052604090205484811015611b6b576040805162461bcd60e51b815260206004820152600e60248201526d09ccae6e874a0deded87442cae8d60931b604482015290519081900360640190fd5b6001600160a01b0386166000908152600c60205260408082208784039055308252902054611b99908661307f565b306000818152600c60209081526040808320949094556001600160a01b038881168352600d8252848320908b1683529052828120549181529190912054909150611be3908461307f565b6001600160a01b0385166000908152600d6020908152604080832030845290915290205582811015611c4d576001600160a01b038085166000818152600d60209081526040808320948b16835293905291822091909155611c4890873084870361311e565b6117b3565b6001600160a01b038085166000908152600d60209081526040808320938a168352929052208382039055505050505050565b6005546001600160a01b0316338114611ccd576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038084166000908152600d6020908152604080832093881683529290522054611cfd908361307f565b6001600160a01b039384166000908152600d602090815260408083209790961682529590955292909320919091555050565b6003546001600160a01b031690565b6005546001600160a01b031681565b6001600160a01b039081166000908152600e60205260409020541690565b600a546001600160a01b031681565b6005546001600160a01b0316331480611d9d57506007546001600160a01b031633145b80611db257506004546001600160a01b031633145b80611dc75750600a546001600160a01b031633145b80611ddc57506009546001600160a01b031633145b80611df15750600b546001600160a01b031633145b611e30576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b80611e3a57610f30565b6001600160a01b038085166000908152600d602090815260408083209387168352929052205481811015611ea9576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b611eb381836130ce565b6001600160a01b038681166000908152600d6020908152604080832089851684529091528082209390935590851681522054611eef908361307f565b6001600160a01b038087166000908152600d60209081526040808320938816835292905220555050505050565b6002546001600160a01b03163314611f73576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d602090815260408083206002549094168352929052205415611fe3576040805162461bcd60e51b815260206004820152600f60248201526e13995cdd0e941bdbdb0e885a5b9a5d608a1b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d6020908152604080832060025490941683529290522055565b6005546001600160a01b031633811461205f576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b811561107a57306000908152600c602052604090205461207f90836130ce565b306000908152600c6020526040808220929092556001600160a01b038516815220546120ab908361307f565b6001600160a01b0384166000908152600c6020526040902055505050565b6002546001600160a01b03163314612120576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d6020908152604080832093851683529290522054821115612191576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b6006546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156121e757600080fd5b505af11580156121fb573d6000803e3d6000fd5b505050506040513d602081101561160d57600080fd5b6008546001600160a01b031690565b6006546001600160a01b031690565b6002546001600160a01b03163314612286576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6001600160a01b038816156122b157600680546001600160a01b0319166001600160a01b038a161790555b6001600160a01b038716156122dc57600580546001600160a01b0319166001600160a01b0389161790555b6001600160a01b0385161561230757600780546001600160a01b0319166001600160a01b0387161790555b6001600160a01b0384161561233257600880546001600160a01b0319166001600160a01b0386161790555b6001600160a01b0383161561235d57600980546001600160a01b0319166001600160a01b0385161790555b6001600160a01b0386161561238857600a80546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038216156123b357600b80546001600160a01b0319166001600160a01b0384161790555b6001600160a01b038116156123de57600480546001600160a01b0319166001600160a01b0383161790555b5050505050505050565b6007546001600160a01b031681565b6004546001600160a01b031690565b306000908152600c602052604090205490565b6006546001600160a01b031681565b6005546001600160a01b0316338114612476576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0385166000908152600c602052604090205480851180159061249f5750600085115b156124cb576001600160a01b0386166000908152600c6020526040902085820390556124cb8686612f8c565b506001600160a01b038084166000908152600d60209081526040808320938916835292905220548083118015906125025750600083115b156117b3576001600160a01b038085166000818152600d60209081526040808320948b1683529390529190912084830390556117b3908785612f3a565b6002546001600160a01b03163314612596576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d60209081526040808320600280548616855292528083205494841680845281842095909555815490931682529181205580546001600160a01b0319169091179055565b6005546002546001600160a01b0391821691163314806126165750336001600160a01b038216145b612655576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600c6020526040902054612678903461307f565b6001600160a01b039092166000908152600c602052604090209190915550565b6001600160a01b03166000908152600d6020908152604080832030845290915290205490565b600a546001600160a01b031690565b6005546001600160a01b031690565b6005546001600160a01b031633811461272a576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b03166000908152600d602052604090208215610f30573060009081526020829052604090205461276490846130ce565b30600090815260208390526040808220929092556001600160a01b03861681522054612790908461307f565b6001600160a01b03851660009081526020839052604090205550505050565b6005546001600160a01b03163381146127fd576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b8115610f30576001600160a01b0383166000908152600d6020908152604080832030845290915290205461283190836130ce565b6001600160a01b038481166000908152600d602090815260408083203084529091528082209390935590861681522054611cfd908361307f565b600b546001600160a01b031690565b6001600160a01b038082166000908152600d602090815260408083209386168352929052205492915050565b6007546001600160a01b031690565b6005546001600160a01b0316338114612903576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b831561296957306000908152600c602052604090205461292390856130ce565b306000908152600c6020526040808220929092556001600160a01b0387168152205461294f908561307f565b6001600160a01b0386166000908152600c60205260409020555b811561160d576001600160a01b0383166000908152600d6020908152604080832030845290915290205461299d90836130ce565b6001600160a01b038481166000908152600d602090815260408083203084529091528082209390935590871681522054611438908361307f565b6006546001600160a01b039081166000908152600d602090815260408083209490931682529290925290205490565b6005546001600160a01b0316338114612a54576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038381166000908152600d6020908152604080832093881683529290528181205430825291902054612a8d908461307f565b6001600160a01b0385166000908152600d6020908152604080832030845290915290205582811015612af2576001600160a01b038085166000818152600d60209081526040808320948a168352939052918220919091556115ea90863084870361311e565b6001600160a01b038085166000908152600d6020908152604080832093891683529290522083820390555050505050565b6005546001600160a01b0316331480612b4657506007546001600160a01b031633145b80612b5b57506004546001600160a01b031633145b80612b705750600a546001600160a01b031633145b80612b8557506009546001600160a01b031633145b80612b9a5750600b546001600160a01b031633145b612bd9576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b80612be35761107a565b6001600160a01b0383166000908152600c602052604090205481811015612c45576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b612c4f81836130ce565b6001600160a01b038086166000908152600c60205260408082209390935590851681522054612c7e908361307f565b6001600160a01b0384166000908152600c602052604090205550505050565b6001600160a01b03166000908152600c602052604090205490565b6003546001600160a01b031681565b6001600160a01b038083166000908152600c602052604081205491831615612d1157506001600160a01b038083166000908152600d60209081526040808320938716835292905220545b9250929050565b600b546001600160a01b031681565b6005546001600160a01b0316331480612d4a57506007546001600160a01b031633145b80612d5f57506004546001600160a01b031633145b80612d745750600a546001600160a01b031633145b80612d8957506009546001600160a01b031633145b80612d9e5750600b546001600160a01b031633145b612ddd576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d6020908152604080832093861683529083905290205480831115612e50576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b8215610f30576001600160a01b038085166000818152602085815260408083208887039055600654815163a9059cbb60e01b8152600481019590955260248501899052905194169363a9059cbb93604480820194918390030190829087803b158015612ebb57600080fd5b505af1158015612ecf573d6000803e3d6000fd5b505050506040513d6020811015612ee557600080fd5b5051610f30576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a215452414e5360801b604482015290519081900360640190fd5b6009546001600160a01b031681565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261107a908490613174565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310612fd85780518252601f199092019160209182019101612fb9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461303a576040519150601f19603f3d011682016040523d82523d6000602084013e61303f565b606091505b505090508061107a5760405162461bcd60e51b81526004018080602001828103825260238152602001806133896023913960400191505060405180910390fd5b8082018281101561191a576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b8082038281111561191a576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610f309085905b613186826001600160a01b031661332c565b6131d7576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106132155780518252601f1990920191602091820191016131f6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613277576040519150601f19603f3d011682016040523d82523d6000602084013e61327c565b606091505b5091509150816132d3576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610f30578080602001905160208110156132ef57600080fd5b5051610f305760405162461bcd60e51b815260040180806020018281038252602a8152602001806133ac602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061336057508115155b94935050505056fe4e6573743a506f6f6c3a214175746800000000000000000000000000000000005472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220592419a63951513cb848d1df90d37f5087c496f4668d497efeed4ad5a7eafb4964736f6c634300060c0033

Deployed Bytecode

0x6080604052600436106103395760003560e01c80639ad8d6f7116101ab578063c2c5c909116100f7578063e2b4e58811610095578063ea7b2f321161006f578063ea7b2f3214610d17578063f5eafc5f14610d6b578063f60d7a2414610d80578063fa81c6e814610db957610340565b8063e2b4e58814610c8c578063e2b57d4514610ccf578063e3c1387414610d0257610340565b8063d68d6ae4116100d1578063d68d6ae414610bcf578063d797920b14610c16578063dd074cc714610c16578063e08805bb14610c4957610340565b8063c2c5c90914610b6a578063c6baae6214610b7f578063d03becd814610bba57610340565b8063ab033ea911610164578063b399d0681161013e578063b399d06814610ac4578063bd4291c114610ad9578063bf76fe7014610aee578063c2a6390e14610b2757610340565b8063ab033ea914610a38578063ad9d4ba314610a6b578063b19d954c14610a9157610340565b80639ad8d6f7146109315780639b942a331461099d578063a1107d30146109b2578063a199b320146109c7578063a1c7962e146109dc578063a798e17d146109f157610340565b80635c3a6cf211610285578063784bab931161022357806385636ce5116101fd57806385636ce51461088b578063872f1961146108c457806393f0c62c1461090757806397dcd0b31461091c57610340565b8063784bab93146108035780637f4794481461081857806384a70acf1461086157610340565b806361bced9d1161025f57806361bced9d146107635780636c29847b146107a65780636e660427146107bb57806372956b69146107d057610340565b80635c3a6cf2146106a85780635e7103c8146106e1578063610255021461071c57610340565b806329e07d7f116102f25780634dee7533116102cc5780634dee7533146105625780634f94637b146105775780635951883e1461058c5780635aa6e6751461069357610340565b806329e07d7f146104975780632dc8decd146104e05780633abc19651461051957610340565b806301e33667146103455780631b9a91a41461038a5780631c1ab1a1146103c35780631ec31821146103ea5780632411643b14610423578063278980d51461046657610340565b3661034057005b600080fd5b34801561035157600080fd5b506103886004803603606081101561036857600080fd5b506001600160a01b03813581169160208101359091169060400135610dce565b005b34801561039657600080fd5b50610388600480360360408110156103ad57600080fd5b506001600160a01b038135169060200135610f36565b3480156103cf57600080fd5b506103d861107f565b60408051918252519081900360200190f35b3480156103f657600080fd5b506103886004803603604081101561040d57600080fd5b506001600160a01b038135169060200135611085565b34801561042f57600080fd5b506103886004803603606081101561044657600080fd5b506001600160a01b0381358116916020810135909116906040013561117c565b34801561047257600080fd5b5061047b61130d565b604080516001600160a01b039092168252519081900360200190f35b3480156104a357600080fd5b50610388600480360360808110156104ba57600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561131c565b3480156104ec57600080fd5b506103886004803603604081101561050357600080fd5b506001600160a01b03813516906020013561146b565b34801561052557600080fd5b506103886004803603608081101561053c57600080fd5b506001600160a01b03813581169160208101358216916040820135916060013516611614565b34801561056e57600080fd5b5061047b6117bb565b34801561058357600080fd5b5061047b6117ca565b34801561059857600080fd5b50610643600480360360408110156105af57600080fd5b813591908101906040810160208201356401000000008111156105d157600080fd5b8201836020820111156105e357600080fd5b8035906020019184602083028401116401000000008311171561060557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506117d9945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561067f578181015183820152602001610667565b505050509050019250505060405180910390f35b34801561069f57600080fd5b5061047b611920565b3480156106b457600080fd5b50610388600480360360408110156106cb57600080fd5b506001600160a01b03813516906020013561192f565b3480156106ed57600080fd5b506103886004803603604081101561070457600080fd5b506001600160a01b0381358116916020013516611a16565b34801561072857600080fd5b506103886004803603608081101561073f57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611abe565b34801561076f57600080fd5b506103886004803603606081101561078657600080fd5b506001600160a01b03813581169160208101359091169060400135611c7f565b3480156107b257600080fd5b5061047b611d2f565b3480156107c757600080fd5b5061047b611d3e565b3480156107dc57600080fd5b5061047b600480360360208110156107f357600080fd5b50356001600160a01b0316611d4d565b34801561080f57600080fd5b5061047b611d6b565b34801561082457600080fd5b506103886004803603608081101561083b57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135611d7a565b34801561086d57600080fd5b506103886004803603602081101561088457600080fd5b5035611f1c565b34801561089757600080fd5b50610388600480360360408110156108ae57600080fd5b506001600160a01b038135169060200135612011565b3480156108d057600080fd5b50610388600480360360608110156108e757600080fd5b506001600160a01b038135811691602081013591604090910135166120c9565b34801561091357600080fd5b5061047b612211565b34801561092857600080fd5b5061047b612220565b34801561093d57600080fd5b50610388600480360361010081101561095557600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c082013581169160e001351661222f565b3480156109a957600080fd5b5061047b6123e8565b3480156109be57600080fd5b5061047b6123f7565b3480156109d357600080fd5b506103d8612406565b3480156109e857600080fd5b5061047b612419565b3480156109fd57600080fd5b5061038860048036036080811015610a1457600080fd5b506001600160a01b0381358116916020810135916040820135169060600135612428565b348015610a4457600080fd5b5061038860048036036020811015610a5b57600080fd5b50356001600160a01b031661253f565b61038860048036036020811015610a8157600080fd5b50356001600160a01b03166125ee565b348015610a9d57600080fd5b506103d860048036036020811015610ab457600080fd5b50356001600160a01b0316612698565b348015610ad057600080fd5b5061047b6126be565b348015610ae557600080fd5b5061047b6126cd565b348015610afa57600080fd5b5061038860048036036040811015610b1157600080fd5b506001600160a01b0381351690602001356126dc565b348015610b3357600080fd5b5061038860048036036060811015610b4a57600080fd5b506001600160a01b038135811691602081013590911690604001356127af565b348015610b7657600080fd5b5061047b61286b565b348015610b8b57600080fd5b506103d860048036036040811015610ba257600080fd5b506001600160a01b038135811691602001351661287a565b348015610bc657600080fd5b5061047b6128a6565b348015610bdb57600080fd5b5061038860048036036080811015610bf257600080fd5b506001600160a01b03813581169160208101359160408201351690606001356128b5565b348015610c2257600080fd5b506103d860048036036020811015610c3957600080fd5b50356001600160a01b03166129d7565b348015610c5557600080fd5b5061038860048036036060811015610c6c57600080fd5b506001600160a01b03813581169160208101359091169060400135612a06565b348015610c9857600080fd5b5061038860048036036060811015610caf57600080fd5b506001600160a01b03813581169160208101359091169060400135612b23565b348015610cdb57600080fd5b506103d860048036036020811015610cf257600080fd5b50356001600160a01b0316612c9d565b348015610d0e57600080fd5b5061047b612cb8565b348015610d2357600080fd5b50610d5260048036036040811015610d3a57600080fd5b506001600160a01b0381358116916020013516612cc7565b6040805192835260208301919091528051918290030190f35b348015610d7757600080fd5b5061047b612d18565b348015610d8c57600080fd5b5061038860048036036040811015610da357600080fd5b506001600160a01b038135169060200135612d27565b348015610dc557600080fd5b5061047b612f2b565b6005546001600160a01b0316331480610df157506007546001600160a01b031633145b80610e0657506004546001600160a01b031633145b80610e1b5750600a546001600160a01b031633145b80610e3057506009546001600160a01b031633145b80610e455750600b546001600160a01b031633145b610e84576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038083166000908152600d602090815260408083209387168352929052205480821115610ef2576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b8115610f30576001600160a01b038084166000818152600d602090815260408083209489168352939052919091208383039055610f30908584612f3a565b50505050565b6005546001600160a01b0316331480610f5957506007546001600160a01b031633145b80610f6e57506004546001600160a01b031633145b80610f835750600a546001600160a01b031633145b80610f9857506009546001600160a01b031633145b80610fad5750600b546001600160a01b031633145b610fec576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600c60205260409020548082111561104d576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b811561107a576001600160a01b0383166000908152600c60205260409020828203905561107a8383612f8c565b505050565b60015481565b6005546001600160a01b03163381146110d3576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600c602052604090205482811015611138576040805162461bcd60e51b815260206004820152601460248201527304e6573743a506f6f6c3a42414c28657468293c360641b604482015290519081900360640190fd5b6001600160a01b0384166000908152600c60205260408082208584039055308252902054611166908461307f565b306000908152600c602052604090205550505050565b6005546001600160a01b031633148061119f57506007546001600160a01b031633145b806111b457506004546001600160a01b031633145b806111c95750600a546001600160a01b031633145b806111de57506009546001600160a01b031633145b806111f35750600b546001600160a01b031633145b611232576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b8061123c5761107a565b6006546001600160a01b039081166000908152600d60209081526040808320938716835290839052902054828110156112b0576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b6112ba81846130ce565b6001600160a01b0380871660009081526020859052604080822093909355908616815220546112e9908461307f565b6001600160a01b038516600090815260209390935260409092209190915550505050565b6008546001600160a01b031681565b6005546002546001600160a01b0391821691163314806113445750336001600160a01b038216145b611383576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b038681166004830152306024830152604482018590529151918516916323b872dd916064808201926020929091908290030181600087803b1580156113dc57600080fd5b505af11580156113f0573d6000803e3d6000fd5b505050506040513d602081101561140657600080fd5b50506001600160a01b038084166000908152600d6020908152604080832093891683529290522054611438908361307f565b6001600160a01b039384166000908152600d60209081526040808320989096168252969096529290942091909155505050565b6005546001600160a01b03163381146114b9576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d60209081526040808320938716835290839052808220543083529120546114f5908561307f565b30600090815260208490526040902055838110156115ef576001600160a01b0380861660008181526020858152604080832083905560065481516323b872dd60e01b81526004810195909552306024860152868a03604486015290519416936323b872dd93606480820194918390030190829087803b15801561157757600080fd5b505af115801561158b573d6000803e3d6000fd5b505050506040513d60208110156115a157600080fd5b50516115ea576040805162461bcd60e51b81526020600482015260136024820152722732b9ba1d2837b7b61d10ba3930b739b332b960691b604482015290519081900360640190fd5b61160d565b6001600160a01b038516600090815260208390526040902084820390555b5050505050565b600a546001600160a01b0316338114611662576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038085166000908152600d6020908152604080832093891683529290522054808411156116d0576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b83156117b3576001600160a01b038086166000818152600d602090815260408083208b8616845282528083208987039055805163a9059cbb60e01b815294881660048601526024850189905251929363a9059cbb9360448083019491928390030190829087803b15801561174357600080fd5b505af1158015611757573d6000803e3d6000fd5b505050506040513d602081101561176d57600080fd5b50516117b3576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a215452414e5360801b604482015290519081900360640190fd5b505050505050565b6009546001600160a01b031690565b6004546001600160a01b031681565b606081516001018314611833576040805162461bcd60e51b815260206004820152601760248201527f4e6573743a20506f6f6c3a20216173736574734c697374000000000000000000604482015290519081900360640190fd5b60608367ffffffffffffffff8111801561184c57600080fd5b50604051908082528060200260200182016040528015611876578160200160208202803683370190505b50336000908152600c602052604081205482519293509183919061189657fe5b60200260200101818152505060005b600185038110156119165760008482815181106118be57fe5b6020908102919091018101516001600160a01b0381166000908152600d83526040808220338352909352919091205484519192509084906001850190811061190257fe5b6020908102919091010152506001016118a5565b5090505b92915050565b6002546001600160a01b031681565b6005546001600160a01b031633811461197d576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d602090815260408083206002549094168352908390529020546119b590846130ce565b6002546001600160a01b0390811660009081526020849052604080822093909355908616815220546119e7908461307f565b6001600160a01b038516600090815260208390526040902055600154611a0d908461307f565b60015550505050565b6007546002546001600160a01b039182169116331480611a3e5750336001600160a01b038216145b611a7d576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b506001600160a01b039182166000908152600e60205260408082208054949093166001600160a01b0319948516811790935582825290208054909216179055565b6005546001600160a01b0316338114611b0c576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0385166000908152600c602052604090205484811015611b6b576040805162461bcd60e51b815260206004820152600e60248201526d09ccae6e874a0deded87442cae8d60931b604482015290519081900360640190fd5b6001600160a01b0386166000908152600c60205260408082208784039055308252902054611b99908661307f565b306000818152600c60209081526040808320949094556001600160a01b038881168352600d8252848320908b1683529052828120549181529190912054909150611be3908461307f565b6001600160a01b0385166000908152600d6020908152604080832030845290915290205582811015611c4d576001600160a01b038085166000818152600d60209081526040808320948b16835293905291822091909155611c4890873084870361311e565b6117b3565b6001600160a01b038085166000908152600d60209081526040808320938a168352929052208382039055505050505050565b6005546001600160a01b0316338114611ccd576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038084166000908152600d6020908152604080832093881683529290522054611cfd908361307f565b6001600160a01b039384166000908152600d602090815260408083209790961682529590955292909320919091555050565b6003546001600160a01b031690565b6005546001600160a01b031681565b6001600160a01b039081166000908152600e60205260409020541690565b600a546001600160a01b031681565b6005546001600160a01b0316331480611d9d57506007546001600160a01b031633145b80611db257506004546001600160a01b031633145b80611dc75750600a546001600160a01b031633145b80611ddc57506009546001600160a01b031633145b80611df15750600b546001600160a01b031633145b611e30576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b80611e3a57610f30565b6001600160a01b038085166000908152600d602090815260408083209387168352929052205481811015611ea9576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b611eb381836130ce565b6001600160a01b038681166000908152600d6020908152604080832089851684529091528082209390935590851681522054611eef908361307f565b6001600160a01b038087166000908152600d60209081526040808320938816835292905220555050505050565b6002546001600160a01b03163314611f73576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d602090815260408083206002549094168352929052205415611fe3576040805162461bcd60e51b815260206004820152600f60248201526e13995cdd0e941bdbdb0e885a5b9a5d608a1b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d6020908152604080832060025490941683529290522055565b6005546001600160a01b031633811461205f576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b811561107a57306000908152600c602052604090205461207f90836130ce565b306000908152600c6020526040808220929092556001600160a01b038516815220546120ab908361307f565b6001600160a01b0384166000908152600c6020526040902055505050565b6002546001600160a01b03163314612120576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d6020908152604080832093851683529290522054821115612191576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b6006546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156121e757600080fd5b505af11580156121fb573d6000803e3d6000fd5b505050506040513d602081101561160d57600080fd5b6008546001600160a01b031690565b6006546001600160a01b031690565b6002546001600160a01b03163314612286576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6001600160a01b038816156122b157600680546001600160a01b0319166001600160a01b038a161790555b6001600160a01b038716156122dc57600580546001600160a01b0319166001600160a01b0389161790555b6001600160a01b0385161561230757600780546001600160a01b0319166001600160a01b0387161790555b6001600160a01b0384161561233257600880546001600160a01b0319166001600160a01b0386161790555b6001600160a01b0383161561235d57600980546001600160a01b0319166001600160a01b0385161790555b6001600160a01b0386161561238857600a80546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038216156123b357600b80546001600160a01b0319166001600160a01b0384161790555b6001600160a01b038116156123de57600480546001600160a01b0319166001600160a01b0383161790555b5050505050505050565b6007546001600160a01b031681565b6004546001600160a01b031690565b306000908152600c602052604090205490565b6006546001600160a01b031681565b6005546001600160a01b0316338114612476576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0385166000908152600c602052604090205480851180159061249f5750600085115b156124cb576001600160a01b0386166000908152600c6020526040902085820390556124cb8686612f8c565b506001600160a01b038084166000908152600d60209081526040808320938916835292905220548083118015906125025750600083115b156117b3576001600160a01b038085166000818152600d60209081526040808320948b1683529390529190912084830390556117b3908785612f3a565b6002546001600160a01b03163314612596576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d60209081526040808320600280548616855292528083205494841680845281842095909555815490931682529181205580546001600160a01b0319169091179055565b6005546002546001600160a01b0391821691163314806126165750336001600160a01b038216145b612655576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600c6020526040902054612678903461307f565b6001600160a01b039092166000908152600c602052604090209190915550565b6001600160a01b03166000908152600d6020908152604080832030845290915290205490565b600a546001600160a01b031690565b6005546001600160a01b031690565b6005546001600160a01b031633811461272a576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b03166000908152600d602052604090208215610f30573060009081526020829052604090205461276490846130ce565b30600090815260208390526040808220929092556001600160a01b03861681522054612790908461307f565b6001600160a01b03851660009081526020839052604090205550505050565b6005546001600160a01b03163381146127fd576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b8115610f30576001600160a01b0383166000908152600d6020908152604080832030845290915290205461283190836130ce565b6001600160a01b038481166000908152600d602090815260408083203084529091528082209390935590861681522054611cfd908361307f565b600b546001600160a01b031690565b6001600160a01b038082166000908152600d602090815260408083209386168352929052205492915050565b6007546001600160a01b031690565b6005546001600160a01b0316338114612903576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b831561296957306000908152600c602052604090205461292390856130ce565b306000908152600c6020526040808220929092556001600160a01b0387168152205461294f908561307f565b6001600160a01b0386166000908152600c60205260409020555b811561160d576001600160a01b0383166000908152600d6020908152604080832030845290915290205461299d90836130ce565b6001600160a01b038481166000908152600d602090815260408083203084529091528082209390935590871681522054611438908361307f565b6006546001600160a01b039081166000908152600d602090815260408083209490931682529290925290205490565b6005546001600160a01b0316338114612a54576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038381166000908152600d6020908152604080832093881683529290528181205430825291902054612a8d908461307f565b6001600160a01b0385166000908152600d6020908152604080832030845290915290205582811015612af2576001600160a01b038085166000818152600d60209081526040808320948a168352939052918220919091556115ea90863084870361311e565b6001600160a01b038085166000908152600d6020908152604080832093891683529290522083820390555050505050565b6005546001600160a01b0316331480612b4657506007546001600160a01b031633145b80612b5b57506004546001600160a01b031633145b80612b705750600a546001600160a01b031633145b80612b8557506009546001600160a01b031633145b80612b9a5750600b546001600160a01b031633145b612bd9576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b80612be35761107a565b6001600160a01b0383166000908152600c602052604090205481811015612c45576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b612c4f81836130ce565b6001600160a01b038086166000908152600c60205260408082209390935590851681522054612c7e908361307f565b6001600160a01b0384166000908152600c602052604090205550505050565b6001600160a01b03166000908152600c602052604090205490565b6003546001600160a01b031681565b6001600160a01b038083166000908152600c602052604081205491831615612d1157506001600160a01b038083166000908152600d60209081526040808320938716835292905220545b9250929050565b600b546001600160a01b031681565b6005546001600160a01b0316331480612d4a57506007546001600160a01b031633145b80612d5f57506004546001600160a01b031633145b80612d745750600a546001600160a01b031633145b80612d8957506009546001600160a01b031633145b80612d9e5750600b546001600160a01b031633145b612ddd576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d6020908152604080832093861683529083905290205480831115612e50576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b8215610f30576001600160a01b038085166000818152602085815260408083208887039055600654815163a9059cbb60e01b8152600481019590955260248501899052905194169363a9059cbb93604480820194918390030190829087803b158015612ebb57600080fd5b505af1158015612ecf573d6000803e3d6000fd5b505050506040513d6020811015612ee557600080fd5b5051610f30576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a215452414e5360801b604482015290519081900360640190fd5b6009546001600160a01b031681565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261107a908490613174565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310612fd85780518252601f199092019160209182019101612fb9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461303a576040519150601f19603f3d011682016040523d82523d6000602084013e61303f565b606091505b505090508061107a5760405162461bcd60e51b81526004018080602001828103825260238152602001806133896023913960400191505060405180910390fd5b8082018281101561191a576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b8082038281111561191a576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610f309085905b613186826001600160a01b031661332c565b6131d7576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106132155780518252601f1990920191602091820191016131f6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613277576040519150601f19603f3d011682016040523d82523d6000602084013e61327c565b606091505b5091509150816132d3576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610f30578080602001905160208110156132ef57600080fd5b5051610f305760405162461bcd60e51b815260040180806020018281038252602a8152602001806133ac602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061336057508115155b94935050505056fe4e6573743a506f6f6c3a214175746800000000000000000000000000000000005472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220592419a63951513cb848d1df90d37f5087c496f4668d497efeed4ad5a7eafb4964736f6c634300060c0033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.