More Info
Private Name Tags
ContractCreator
Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Governance | 12332802 | 1448 days ago | IN | 0 ETH | 0.00196608 | ||||
Set Governance | 12319971 | 1450 days ago | IN | 0 ETH | 0.00245357 | ||||
Withdraw Nest | 11869262 | 1519 days ago | IN | 0 ETH | 0.00399428 | ||||
Withdraw Nest | 11869260 | 1519 days ago | IN | 0 ETH | 0.00399428 | ||||
Set Governance | 11684734 | 1548 days ago | IN | 0 ETH | 0.0062847 | ||||
Set Governance | 11684553 | 1548 days ago | IN | 0 ETH | 0.0062847 | ||||
Set Governance | 11684530 | 1548 days ago | IN | 0 ETH | 0.0050247 | ||||
Set Governance | 11684205 | 1548 days ago | IN | 0 ETH | 0.00234486 | ||||
Set Contracts | 11684027 | 1548 days ago | IN | 0 ETH | 0.01346779 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
- | 12332810 | 1448 days ago | 60 ETH | ||||
- | 12321190 | 1450 days ago | 400 ETH | ||||
- | 12321159 | 1450 days ago | 120 ETH | ||||
- | 12321086 | 1450 days ago | 331 ETH | ||||
- | 12320879 | 1450 days ago | 60 ETH | ||||
- | 12320824 | 1450 days ago | 60 ETH | ||||
- | 12310006 | 1451 days ago | 60 ETH | ||||
- | 12287995 | 1455 days ago | 60 ETH | ||||
- | 12287883 | 1455 days ago | 30 ETH | ||||
- | 12287077 | 1455 days ago | 30 ETH | ||||
- | 12286596 | 1455 days ago | 39.8673 ETH | ||||
- | 12286524 | 1455 days ago | 169.867225 ETH | ||||
- | 12284535 | 1455 days ago | 20 ETH | ||||
- | 12283408 | 1455 days ago | 60 ETH | ||||
- | 12283315 | 1455 days ago | 60 ETH | ||||
- | 12283220 | 1455 days ago | 60 ETH | ||||
- | 12283129 | 1455 days ago | 60 ETH | ||||
- | 12283082 | 1456 days ago | 60 ETH | ||||
- | 12282994 | 1456 days ago | 28.3057 ETH | ||||
- | 12282886 | 1456 days ago | 298.3057346 ETH | ||||
- | 12282260 | 1456 days ago | 50 ETH | ||||
- | 12280466 | 1456 days ago | 30 ETH | ||||
- | 12279826 | 1456 days ago | 40 ETH | ||||
- | 12279702 | 1456 days ago | 60 ETH | ||||
- | 12279580 | 1456 days ago | 30 ETH |
Loading...
Loading
Contract Name:
NestPool
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// 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]; } }
// 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 } }
// 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)); } }
// 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); }
// 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'); } }
// 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; }
// 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); }
// 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; }
// 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); }
// 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); }
// 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); }
// 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); }
// 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"); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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"}]
Contract Creation Code
6080604052600380546001600160a01b031916600117905534801561002357600080fd5b50600280546001600160a01b0319163317905561340b806100456000396000f3fe6080604052600436106103395760003560e01c80639ad8d6f7116101ab578063c2c5c909116100f7578063e2b4e58811610095578063ea7b2f321161006f578063ea7b2f3214610d17578063f5eafc5f14610d6b578063f60d7a2414610d80578063fa81c6e814610db957610340565b8063e2b4e58814610c8c578063e2b57d4514610ccf578063e3c1387414610d0257610340565b8063d68d6ae4116100d1578063d68d6ae414610bcf578063d797920b14610c16578063dd074cc714610c16578063e08805bb14610c4957610340565b8063c2c5c90914610b6a578063c6baae6214610b7f578063d03becd814610bba57610340565b8063ab033ea911610164578063b399d0681161013e578063b399d06814610ac4578063bd4291c114610ad9578063bf76fe7014610aee578063c2a6390e14610b2757610340565b8063ab033ea914610a38578063ad9d4ba314610a6b578063b19d954c14610a9157610340565b80639ad8d6f7146109315780639b942a331461099d578063a1107d30146109b2578063a199b320146109c7578063a1c7962e146109dc578063a798e17d146109f157610340565b80635c3a6cf211610285578063784bab931161022357806385636ce5116101fd57806385636ce51461088b578063872f1961146108c457806393f0c62c1461090757806397dcd0b31461091c57610340565b8063784bab93146108035780637f4794481461081857806384a70acf1461086157610340565b806361bced9d1161025f57806361bced9d146107635780636c29847b146107a65780636e660427146107bb57806372956b69146107d057610340565b80635c3a6cf2146106a85780635e7103c8146106e1578063610255021461071c57610340565b806329e07d7f116102f25780634dee7533116102cc5780634dee7533146105625780634f94637b146105775780635951883e1461058c5780635aa6e6751461069357610340565b806329e07d7f146104975780632dc8decd146104e05780633abc19651461051957610340565b806301e33667146103455780631b9a91a41461038a5780631c1ab1a1146103c35780631ec31821146103ea5780632411643b14610423578063278980d51461046657610340565b3661034057005b600080fd5b34801561035157600080fd5b506103886004803603606081101561036857600080fd5b506001600160a01b03813581169160208101359091169060400135610dce565b005b34801561039657600080fd5b50610388600480360360408110156103ad57600080fd5b506001600160a01b038135169060200135610f36565b3480156103cf57600080fd5b506103d861107f565b60408051918252519081900360200190f35b3480156103f657600080fd5b506103886004803603604081101561040d57600080fd5b506001600160a01b038135169060200135611085565b34801561042f57600080fd5b506103886004803603606081101561044657600080fd5b506001600160a01b0381358116916020810135909116906040013561117c565b34801561047257600080fd5b5061047b61130d565b604080516001600160a01b039092168252519081900360200190f35b3480156104a357600080fd5b50610388600480360360808110156104ba57600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561131c565b3480156104ec57600080fd5b506103886004803603604081101561050357600080fd5b506001600160a01b03813516906020013561146b565b34801561052557600080fd5b506103886004803603608081101561053c57600080fd5b506001600160a01b03813581169160208101358216916040820135916060013516611614565b34801561056e57600080fd5b5061047b6117bb565b34801561058357600080fd5b5061047b6117ca565b34801561059857600080fd5b50610643600480360360408110156105af57600080fd5b813591908101906040810160208201356401000000008111156105d157600080fd5b8201836020820111156105e357600080fd5b8035906020019184602083028401116401000000008311171561060557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506117d9945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561067f578181015183820152602001610667565b505050509050019250505060405180910390f35b34801561069f57600080fd5b5061047b611920565b3480156106b457600080fd5b50610388600480360360408110156106cb57600080fd5b506001600160a01b03813516906020013561192f565b3480156106ed57600080fd5b506103886004803603604081101561070457600080fd5b506001600160a01b0381358116916020013516611a16565b34801561072857600080fd5b506103886004803603608081101561073f57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611abe565b34801561076f57600080fd5b506103886004803603606081101561078657600080fd5b506001600160a01b03813581169160208101359091169060400135611c7f565b3480156107b257600080fd5b5061047b611d2f565b3480156107c757600080fd5b5061047b611d3e565b3480156107dc57600080fd5b5061047b600480360360208110156107f357600080fd5b50356001600160a01b0316611d4d565b34801561080f57600080fd5b5061047b611d6b565b34801561082457600080fd5b506103886004803603608081101561083b57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135611d7a565b34801561086d57600080fd5b506103886004803603602081101561088457600080fd5b5035611f1c565b34801561089757600080fd5b50610388600480360360408110156108ae57600080fd5b506001600160a01b038135169060200135612011565b3480156108d057600080fd5b50610388600480360360608110156108e757600080fd5b506001600160a01b038135811691602081013591604090910135166120c9565b34801561091357600080fd5b5061047b612211565b34801561092857600080fd5b5061047b612220565b34801561093d57600080fd5b50610388600480360361010081101561095557600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c082013581169160e001351661222f565b3480156109a957600080fd5b5061047b6123e8565b3480156109be57600080fd5b5061047b6123f7565b3480156109d357600080fd5b506103d8612406565b3480156109e857600080fd5b5061047b612419565b3480156109fd57600080fd5b5061038860048036036080811015610a1457600080fd5b506001600160a01b0381358116916020810135916040820135169060600135612428565b348015610a4457600080fd5b5061038860048036036020811015610a5b57600080fd5b50356001600160a01b031661253f565b61038860048036036020811015610a8157600080fd5b50356001600160a01b03166125ee565b348015610a9d57600080fd5b506103d860048036036020811015610ab457600080fd5b50356001600160a01b0316612698565b348015610ad057600080fd5b5061047b6126be565b348015610ae557600080fd5b5061047b6126cd565b348015610afa57600080fd5b5061038860048036036040811015610b1157600080fd5b506001600160a01b0381351690602001356126dc565b348015610b3357600080fd5b5061038860048036036060811015610b4a57600080fd5b506001600160a01b038135811691602081013590911690604001356127af565b348015610b7657600080fd5b5061047b61286b565b348015610b8b57600080fd5b506103d860048036036040811015610ba257600080fd5b506001600160a01b038135811691602001351661287a565b348015610bc657600080fd5b5061047b6128a6565b348015610bdb57600080fd5b5061038860048036036080811015610bf257600080fd5b506001600160a01b03813581169160208101359160408201351690606001356128b5565b348015610c2257600080fd5b506103d860048036036020811015610c3957600080fd5b50356001600160a01b03166129d7565b348015610c5557600080fd5b5061038860048036036060811015610c6c57600080fd5b506001600160a01b03813581169160208101359091169060400135612a06565b348015610c9857600080fd5b5061038860048036036060811015610caf57600080fd5b506001600160a01b03813581169160208101359091169060400135612b23565b348015610cdb57600080fd5b506103d860048036036020811015610cf257600080fd5b50356001600160a01b0316612c9d565b348015610d0e57600080fd5b5061047b612cb8565b348015610d2357600080fd5b50610d5260048036036040811015610d3a57600080fd5b506001600160a01b0381358116916020013516612cc7565b6040805192835260208301919091528051918290030190f35b348015610d7757600080fd5b5061047b612d18565b348015610d8c57600080fd5b5061038860048036036040811015610da357600080fd5b506001600160a01b038135169060200135612d27565b348015610dc557600080fd5b5061047b612f2b565b6005546001600160a01b0316331480610df157506007546001600160a01b031633145b80610e0657506004546001600160a01b031633145b80610e1b5750600a546001600160a01b031633145b80610e3057506009546001600160a01b031633145b80610e455750600b546001600160a01b031633145b610e84576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038083166000908152600d602090815260408083209387168352929052205480821115610ef2576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b8115610f30576001600160a01b038084166000818152600d602090815260408083209489168352939052919091208383039055610f30908584612f3a565b50505050565b6005546001600160a01b0316331480610f5957506007546001600160a01b031633145b80610f6e57506004546001600160a01b031633145b80610f835750600a546001600160a01b031633145b80610f9857506009546001600160a01b031633145b80610fad5750600b546001600160a01b031633145b610fec576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600c60205260409020548082111561104d576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b811561107a576001600160a01b0383166000908152600c60205260409020828203905561107a8383612f8c565b505050565b60015481565b6005546001600160a01b03163381146110d3576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600c602052604090205482811015611138576040805162461bcd60e51b815260206004820152601460248201527304e6573743a506f6f6c3a42414c28657468293c360641b604482015290519081900360640190fd5b6001600160a01b0384166000908152600c60205260408082208584039055308252902054611166908461307f565b306000908152600c602052604090205550505050565b6005546001600160a01b031633148061119f57506007546001600160a01b031633145b806111b457506004546001600160a01b031633145b806111c95750600a546001600160a01b031633145b806111de57506009546001600160a01b031633145b806111f35750600b546001600160a01b031633145b611232576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b8061123c5761107a565b6006546001600160a01b039081166000908152600d60209081526040808320938716835290839052902054828110156112b0576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b6112ba81846130ce565b6001600160a01b0380871660009081526020859052604080822093909355908616815220546112e9908461307f565b6001600160a01b038516600090815260209390935260409092209190915550505050565b6008546001600160a01b031681565b6005546002546001600160a01b0391821691163314806113445750336001600160a01b038216145b611383576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b038681166004830152306024830152604482018590529151918516916323b872dd916064808201926020929091908290030181600087803b1580156113dc57600080fd5b505af11580156113f0573d6000803e3d6000fd5b505050506040513d602081101561140657600080fd5b50506001600160a01b038084166000908152600d6020908152604080832093891683529290522054611438908361307f565b6001600160a01b039384166000908152600d60209081526040808320989096168252969096529290942091909155505050565b6005546001600160a01b03163381146114b9576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d60209081526040808320938716835290839052808220543083529120546114f5908561307f565b30600090815260208490526040902055838110156115ef576001600160a01b0380861660008181526020858152604080832083905560065481516323b872dd60e01b81526004810195909552306024860152868a03604486015290519416936323b872dd93606480820194918390030190829087803b15801561157757600080fd5b505af115801561158b573d6000803e3d6000fd5b505050506040513d60208110156115a157600080fd5b50516115ea576040805162461bcd60e51b81526020600482015260136024820152722732b9ba1d2837b7b61d10ba3930b739b332b960691b604482015290519081900360640190fd5b61160d565b6001600160a01b038516600090815260208390526040902084820390555b5050505050565b600a546001600160a01b0316338114611662576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038085166000908152600d6020908152604080832093891683529290522054808411156116d0576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b83156117b3576001600160a01b038086166000818152600d602090815260408083208b8616845282528083208987039055805163a9059cbb60e01b815294881660048601526024850189905251929363a9059cbb9360448083019491928390030190829087803b15801561174357600080fd5b505af1158015611757573d6000803e3d6000fd5b505050506040513d602081101561176d57600080fd5b50516117b3576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a215452414e5360801b604482015290519081900360640190fd5b505050505050565b6009546001600160a01b031690565b6004546001600160a01b031681565b606081516001018314611833576040805162461bcd60e51b815260206004820152601760248201527f4e6573743a20506f6f6c3a20216173736574734c697374000000000000000000604482015290519081900360640190fd5b60608367ffffffffffffffff8111801561184c57600080fd5b50604051908082528060200260200182016040528015611876578160200160208202803683370190505b50336000908152600c602052604081205482519293509183919061189657fe5b60200260200101818152505060005b600185038110156119165760008482815181106118be57fe5b6020908102919091018101516001600160a01b0381166000908152600d83526040808220338352909352919091205484519192509084906001850190811061190257fe5b6020908102919091010152506001016118a5565b5090505b92915050565b6002546001600160a01b031681565b6005546001600160a01b031633811461197d576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d602090815260408083206002549094168352908390529020546119b590846130ce565b6002546001600160a01b0390811660009081526020849052604080822093909355908616815220546119e7908461307f565b6001600160a01b038516600090815260208390526040902055600154611a0d908461307f565b60015550505050565b6007546002546001600160a01b039182169116331480611a3e5750336001600160a01b038216145b611a7d576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b506001600160a01b039182166000908152600e60205260408082208054949093166001600160a01b0319948516811790935582825290208054909216179055565b6005546001600160a01b0316338114611b0c576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0385166000908152600c602052604090205484811015611b6b576040805162461bcd60e51b815260206004820152600e60248201526d09ccae6e874a0deded87442cae8d60931b604482015290519081900360640190fd5b6001600160a01b0386166000908152600c60205260408082208784039055308252902054611b99908661307f565b306000818152600c60209081526040808320949094556001600160a01b038881168352600d8252848320908b1683529052828120549181529190912054909150611be3908461307f565b6001600160a01b0385166000908152600d6020908152604080832030845290915290205582811015611c4d576001600160a01b038085166000818152600d60209081526040808320948b16835293905291822091909155611c4890873084870361311e565b6117b3565b6001600160a01b038085166000908152600d60209081526040808320938a168352929052208382039055505050505050565b6005546001600160a01b0316338114611ccd576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038084166000908152600d6020908152604080832093881683529290522054611cfd908361307f565b6001600160a01b039384166000908152600d602090815260408083209790961682529590955292909320919091555050565b6003546001600160a01b031690565b6005546001600160a01b031681565b6001600160a01b039081166000908152600e60205260409020541690565b600a546001600160a01b031681565b6005546001600160a01b0316331480611d9d57506007546001600160a01b031633145b80611db257506004546001600160a01b031633145b80611dc75750600a546001600160a01b031633145b80611ddc57506009546001600160a01b031633145b80611df15750600b546001600160a01b031633145b611e30576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b80611e3a57610f30565b6001600160a01b038085166000908152600d602090815260408083209387168352929052205481811015611ea9576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b611eb381836130ce565b6001600160a01b038681166000908152600d6020908152604080832089851684529091528082209390935590851681522054611eef908361307f565b6001600160a01b038087166000908152600d60209081526040808320938816835292905220555050505050565b6002546001600160a01b03163314611f73576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d602090815260408083206002549094168352929052205415611fe3576040805162461bcd60e51b815260206004820152600f60248201526e13995cdd0e941bdbdb0e885a5b9a5d608a1b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d6020908152604080832060025490941683529290522055565b6005546001600160a01b031633811461205f576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b811561107a57306000908152600c602052604090205461207f90836130ce565b306000908152600c6020526040808220929092556001600160a01b038516815220546120ab908361307f565b6001600160a01b0384166000908152600c6020526040902055505050565b6002546001600160a01b03163314612120576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d6020908152604080832093851683529290522054821115612191576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b6006546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156121e757600080fd5b505af11580156121fb573d6000803e3d6000fd5b505050506040513d602081101561160d57600080fd5b6008546001600160a01b031690565b6006546001600160a01b031690565b6002546001600160a01b03163314612286576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6001600160a01b038816156122b157600680546001600160a01b0319166001600160a01b038a161790555b6001600160a01b038716156122dc57600580546001600160a01b0319166001600160a01b0389161790555b6001600160a01b0385161561230757600780546001600160a01b0319166001600160a01b0387161790555b6001600160a01b0384161561233257600880546001600160a01b0319166001600160a01b0386161790555b6001600160a01b0383161561235d57600980546001600160a01b0319166001600160a01b0385161790555b6001600160a01b0386161561238857600a80546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038216156123b357600b80546001600160a01b0319166001600160a01b0384161790555b6001600160a01b038116156123de57600480546001600160a01b0319166001600160a01b0383161790555b5050505050505050565b6007546001600160a01b031681565b6004546001600160a01b031690565b306000908152600c602052604090205490565b6006546001600160a01b031681565b6005546001600160a01b0316338114612476576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0385166000908152600c602052604090205480851180159061249f5750600085115b156124cb576001600160a01b0386166000908152600c6020526040902085820390556124cb8686612f8c565b506001600160a01b038084166000908152600d60209081526040808320938916835292905220548083118015906125025750600083115b156117b3576001600160a01b038085166000818152600d60209081526040808320948b1683529390529190912084830390556117b3908785612f3a565b6002546001600160a01b03163314612596576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d60209081526040808320600280548616855292528083205494841680845281842095909555815490931682529181205580546001600160a01b0319169091179055565b6005546002546001600160a01b0391821691163314806126165750336001600160a01b038216145b612655576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600c6020526040902054612678903461307f565b6001600160a01b039092166000908152600c602052604090209190915550565b6001600160a01b03166000908152600d6020908152604080832030845290915290205490565b600a546001600160a01b031690565b6005546001600160a01b031690565b6005546001600160a01b031633811461272a576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b03166000908152600d602052604090208215610f30573060009081526020829052604090205461276490846130ce565b30600090815260208390526040808220929092556001600160a01b03861681522054612790908461307f565b6001600160a01b03851660009081526020839052604090205550505050565b6005546001600160a01b03163381146127fd576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b8115610f30576001600160a01b0383166000908152600d6020908152604080832030845290915290205461283190836130ce565b6001600160a01b038481166000908152600d602090815260408083203084529091528082209390935590861681522054611cfd908361307f565b600b546001600160a01b031690565b6001600160a01b038082166000908152600d602090815260408083209386168352929052205492915050565b6007546001600160a01b031690565b6005546001600160a01b0316338114612903576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b831561296957306000908152600c602052604090205461292390856130ce565b306000908152600c6020526040808220929092556001600160a01b0387168152205461294f908561307f565b6001600160a01b0386166000908152600c60205260409020555b811561160d576001600160a01b0383166000908152600d6020908152604080832030845290915290205461299d90836130ce565b6001600160a01b038481166000908152600d602090815260408083203084529091528082209390935590871681522054611438908361307f565b6006546001600160a01b039081166000908152600d602090815260408083209490931682529290925290205490565b6005546001600160a01b0316338114612a54576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038381166000908152600d6020908152604080832093881683529290528181205430825291902054612a8d908461307f565b6001600160a01b0385166000908152600d6020908152604080832030845290915290205582811015612af2576001600160a01b038085166000818152600d60209081526040808320948a168352939052918220919091556115ea90863084870361311e565b6001600160a01b038085166000908152600d6020908152604080832093891683529290522083820390555050505050565b6005546001600160a01b0316331480612b4657506007546001600160a01b031633145b80612b5b57506004546001600160a01b031633145b80612b705750600a546001600160a01b031633145b80612b8557506009546001600160a01b031633145b80612b9a5750600b546001600160a01b031633145b612bd9576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b80612be35761107a565b6001600160a01b0383166000908152600c602052604090205481811015612c45576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b612c4f81836130ce565b6001600160a01b038086166000908152600c60205260408082209390935590851681522054612c7e908361307f565b6001600160a01b0384166000908152600c602052604090205550505050565b6001600160a01b03166000908152600c602052604090205490565b6003546001600160a01b031681565b6001600160a01b038083166000908152600c602052604081205491831615612d1157506001600160a01b038083166000908152600d60209081526040808320938716835292905220545b9250929050565b600b546001600160a01b031681565b6005546001600160a01b0316331480612d4a57506007546001600160a01b031633145b80612d5f57506004546001600160a01b031633145b80612d745750600a546001600160a01b031633145b80612d8957506009546001600160a01b031633145b80612d9e5750600b546001600160a01b031633145b612ddd576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d6020908152604080832093861683529083905290205480831115612e50576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b8215610f30576001600160a01b038085166000818152602085815260408083208887039055600654815163a9059cbb60e01b8152600481019590955260248501899052905194169363a9059cbb93604480820194918390030190829087803b158015612ebb57600080fd5b505af1158015612ecf573d6000803e3d6000fd5b505050506040513d6020811015612ee557600080fd5b5051610f30576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a215452414e5360801b604482015290519081900360640190fd5b6009546001600160a01b031681565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261107a908490613174565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310612fd85780518252601f199092019160209182019101612fb9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461303a576040519150601f19603f3d011682016040523d82523d6000602084013e61303f565b606091505b505090508061107a5760405162461bcd60e51b81526004018080602001828103825260238152602001806133896023913960400191505060405180910390fd5b8082018281101561191a576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b8082038281111561191a576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610f309085905b613186826001600160a01b031661332c565b6131d7576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106132155780518252601f1990920191602091820191016131f6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613277576040519150601f19603f3d011682016040523d82523d6000602084013e61327c565b606091505b5091509150816132d3576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610f30578080602001905160208110156132ef57600080fd5b5051610f305760405162461bcd60e51b815260040180806020018281038252602a8152602001806133ac602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061336057508115155b94935050505056fe4e6573743a506f6f6c3a214175746800000000000000000000000000000000005472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220592419a63951513cb848d1df90d37f5087c496f4668d497efeed4ad5a7eafb4964736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106103395760003560e01c80639ad8d6f7116101ab578063c2c5c909116100f7578063e2b4e58811610095578063ea7b2f321161006f578063ea7b2f3214610d17578063f5eafc5f14610d6b578063f60d7a2414610d80578063fa81c6e814610db957610340565b8063e2b4e58814610c8c578063e2b57d4514610ccf578063e3c1387414610d0257610340565b8063d68d6ae4116100d1578063d68d6ae414610bcf578063d797920b14610c16578063dd074cc714610c16578063e08805bb14610c4957610340565b8063c2c5c90914610b6a578063c6baae6214610b7f578063d03becd814610bba57610340565b8063ab033ea911610164578063b399d0681161013e578063b399d06814610ac4578063bd4291c114610ad9578063bf76fe7014610aee578063c2a6390e14610b2757610340565b8063ab033ea914610a38578063ad9d4ba314610a6b578063b19d954c14610a9157610340565b80639ad8d6f7146109315780639b942a331461099d578063a1107d30146109b2578063a199b320146109c7578063a1c7962e146109dc578063a798e17d146109f157610340565b80635c3a6cf211610285578063784bab931161022357806385636ce5116101fd57806385636ce51461088b578063872f1961146108c457806393f0c62c1461090757806397dcd0b31461091c57610340565b8063784bab93146108035780637f4794481461081857806384a70acf1461086157610340565b806361bced9d1161025f57806361bced9d146107635780636c29847b146107a65780636e660427146107bb57806372956b69146107d057610340565b80635c3a6cf2146106a85780635e7103c8146106e1578063610255021461071c57610340565b806329e07d7f116102f25780634dee7533116102cc5780634dee7533146105625780634f94637b146105775780635951883e1461058c5780635aa6e6751461069357610340565b806329e07d7f146104975780632dc8decd146104e05780633abc19651461051957610340565b806301e33667146103455780631b9a91a41461038a5780631c1ab1a1146103c35780631ec31821146103ea5780632411643b14610423578063278980d51461046657610340565b3661034057005b600080fd5b34801561035157600080fd5b506103886004803603606081101561036857600080fd5b506001600160a01b03813581169160208101359091169060400135610dce565b005b34801561039657600080fd5b50610388600480360360408110156103ad57600080fd5b506001600160a01b038135169060200135610f36565b3480156103cf57600080fd5b506103d861107f565b60408051918252519081900360200190f35b3480156103f657600080fd5b506103886004803603604081101561040d57600080fd5b506001600160a01b038135169060200135611085565b34801561042f57600080fd5b506103886004803603606081101561044657600080fd5b506001600160a01b0381358116916020810135909116906040013561117c565b34801561047257600080fd5b5061047b61130d565b604080516001600160a01b039092168252519081900360200190f35b3480156104a357600080fd5b50610388600480360360808110156104ba57600080fd5b506001600160a01b0381358116916020810135821691604082013516906060013561131c565b3480156104ec57600080fd5b506103886004803603604081101561050357600080fd5b506001600160a01b03813516906020013561146b565b34801561052557600080fd5b506103886004803603608081101561053c57600080fd5b506001600160a01b03813581169160208101358216916040820135916060013516611614565b34801561056e57600080fd5b5061047b6117bb565b34801561058357600080fd5b5061047b6117ca565b34801561059857600080fd5b50610643600480360360408110156105af57600080fd5b813591908101906040810160208201356401000000008111156105d157600080fd5b8201836020820111156105e357600080fd5b8035906020019184602083028401116401000000008311171561060557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506117d9945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561067f578181015183820152602001610667565b505050509050019250505060405180910390f35b34801561069f57600080fd5b5061047b611920565b3480156106b457600080fd5b50610388600480360360408110156106cb57600080fd5b506001600160a01b03813516906020013561192f565b3480156106ed57600080fd5b506103886004803603604081101561070457600080fd5b506001600160a01b0381358116916020013516611a16565b34801561072857600080fd5b506103886004803603608081101561073f57600080fd5b506001600160a01b0381358116916020810135916040820135169060600135611abe565b34801561076f57600080fd5b506103886004803603606081101561078657600080fd5b506001600160a01b03813581169160208101359091169060400135611c7f565b3480156107b257600080fd5b5061047b611d2f565b3480156107c757600080fd5b5061047b611d3e565b3480156107dc57600080fd5b5061047b600480360360208110156107f357600080fd5b50356001600160a01b0316611d4d565b34801561080f57600080fd5b5061047b611d6b565b34801561082457600080fd5b506103886004803603608081101561083b57600080fd5b506001600160a01b03813581169160208101358216916040820135169060600135611d7a565b34801561086d57600080fd5b506103886004803603602081101561088457600080fd5b5035611f1c565b34801561089757600080fd5b50610388600480360360408110156108ae57600080fd5b506001600160a01b038135169060200135612011565b3480156108d057600080fd5b50610388600480360360608110156108e757600080fd5b506001600160a01b038135811691602081013591604090910135166120c9565b34801561091357600080fd5b5061047b612211565b34801561092857600080fd5b5061047b612220565b34801561093d57600080fd5b50610388600480360361010081101561095557600080fd5b506001600160a01b038135811691602081013582169160408201358116916060810135821691608082013581169160a081013582169160c082013581169160e001351661222f565b3480156109a957600080fd5b5061047b6123e8565b3480156109be57600080fd5b5061047b6123f7565b3480156109d357600080fd5b506103d8612406565b3480156109e857600080fd5b5061047b612419565b3480156109fd57600080fd5b5061038860048036036080811015610a1457600080fd5b506001600160a01b0381358116916020810135916040820135169060600135612428565b348015610a4457600080fd5b5061038860048036036020811015610a5b57600080fd5b50356001600160a01b031661253f565b61038860048036036020811015610a8157600080fd5b50356001600160a01b03166125ee565b348015610a9d57600080fd5b506103d860048036036020811015610ab457600080fd5b50356001600160a01b0316612698565b348015610ad057600080fd5b5061047b6126be565b348015610ae557600080fd5b5061047b6126cd565b348015610afa57600080fd5b5061038860048036036040811015610b1157600080fd5b506001600160a01b0381351690602001356126dc565b348015610b3357600080fd5b5061038860048036036060811015610b4a57600080fd5b506001600160a01b038135811691602081013590911690604001356127af565b348015610b7657600080fd5b5061047b61286b565b348015610b8b57600080fd5b506103d860048036036040811015610ba257600080fd5b506001600160a01b038135811691602001351661287a565b348015610bc657600080fd5b5061047b6128a6565b348015610bdb57600080fd5b5061038860048036036080811015610bf257600080fd5b506001600160a01b03813581169160208101359160408201351690606001356128b5565b348015610c2257600080fd5b506103d860048036036020811015610c3957600080fd5b50356001600160a01b03166129d7565b348015610c5557600080fd5b5061038860048036036060811015610c6c57600080fd5b506001600160a01b03813581169160208101359091169060400135612a06565b348015610c9857600080fd5b5061038860048036036060811015610caf57600080fd5b506001600160a01b03813581169160208101359091169060400135612b23565b348015610cdb57600080fd5b506103d860048036036020811015610cf257600080fd5b50356001600160a01b0316612c9d565b348015610d0e57600080fd5b5061047b612cb8565b348015610d2357600080fd5b50610d5260048036036040811015610d3a57600080fd5b506001600160a01b0381358116916020013516612cc7565b6040805192835260208301919091528051918290030190f35b348015610d7757600080fd5b5061047b612d18565b348015610d8c57600080fd5b5061038860048036036040811015610da357600080fd5b506001600160a01b038135169060200135612d27565b348015610dc557600080fd5b5061047b612f2b565b6005546001600160a01b0316331480610df157506007546001600160a01b031633145b80610e0657506004546001600160a01b031633145b80610e1b5750600a546001600160a01b031633145b80610e3057506009546001600160a01b031633145b80610e455750600b546001600160a01b031633145b610e84576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038083166000908152600d602090815260408083209387168352929052205480821115610ef2576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b8115610f30576001600160a01b038084166000818152600d602090815260408083209489168352939052919091208383039055610f30908584612f3a565b50505050565b6005546001600160a01b0316331480610f5957506007546001600160a01b031633145b80610f6e57506004546001600160a01b031633145b80610f835750600a546001600160a01b031633145b80610f9857506009546001600160a01b031633145b80610fad5750600b546001600160a01b031633145b610fec576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600c60205260409020548082111561104d576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b811561107a576001600160a01b0383166000908152600c60205260409020828203905561107a8383612f8c565b505050565b60015481565b6005546001600160a01b03163381146110d3576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0383166000908152600c602052604090205482811015611138576040805162461bcd60e51b815260206004820152601460248201527304e6573743a506f6f6c3a42414c28657468293c360641b604482015290519081900360640190fd5b6001600160a01b0384166000908152600c60205260408082208584039055308252902054611166908461307f565b306000908152600c602052604090205550505050565b6005546001600160a01b031633148061119f57506007546001600160a01b031633145b806111b457506004546001600160a01b031633145b806111c95750600a546001600160a01b031633145b806111de57506009546001600160a01b031633145b806111f35750600b546001600160a01b031633145b611232576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b8061123c5761107a565b6006546001600160a01b039081166000908152600d60209081526040808320938716835290839052902054828110156112b0576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b6112ba81846130ce565b6001600160a01b0380871660009081526020859052604080822093909355908616815220546112e9908461307f565b6001600160a01b038516600090815260209390935260409092209190915550505050565b6008546001600160a01b031681565b6005546002546001600160a01b0391821691163314806113445750336001600160a01b038216145b611383576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b604080516323b872dd60e01b81526001600160a01b038681166004830152306024830152604482018590529151918516916323b872dd916064808201926020929091908290030181600087803b1580156113dc57600080fd5b505af11580156113f0573d6000803e3d6000fd5b505050506040513d602081101561140657600080fd5b50506001600160a01b038084166000908152600d6020908152604080832093891683529290522054611438908361307f565b6001600160a01b039384166000908152600d60209081526040808320989096168252969096529290942091909155505050565b6005546001600160a01b03163381146114b9576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d60209081526040808320938716835290839052808220543083529120546114f5908561307f565b30600090815260208490526040902055838110156115ef576001600160a01b0380861660008181526020858152604080832083905560065481516323b872dd60e01b81526004810195909552306024860152868a03604486015290519416936323b872dd93606480820194918390030190829087803b15801561157757600080fd5b505af115801561158b573d6000803e3d6000fd5b505050506040513d60208110156115a157600080fd5b50516115ea576040805162461bcd60e51b81526020600482015260136024820152722732b9ba1d2837b7b61d10ba3930b739b332b960691b604482015290519081900360640190fd5b61160d565b6001600160a01b038516600090815260208390526040902084820390555b5050505050565b600a546001600160a01b0316338114611662576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038085166000908152600d6020908152604080832093891683529290522054808411156116d0576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b83156117b3576001600160a01b038086166000818152600d602090815260408083208b8616845282528083208987039055805163a9059cbb60e01b815294881660048601526024850189905251929363a9059cbb9360448083019491928390030190829087803b15801561174357600080fd5b505af1158015611757573d6000803e3d6000fd5b505050506040513d602081101561176d57600080fd5b50516117b3576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a215452414e5360801b604482015290519081900360640190fd5b505050505050565b6009546001600160a01b031690565b6004546001600160a01b031681565b606081516001018314611833576040805162461bcd60e51b815260206004820152601760248201527f4e6573743a20506f6f6c3a20216173736574734c697374000000000000000000604482015290519081900360640190fd5b60608367ffffffffffffffff8111801561184c57600080fd5b50604051908082528060200260200182016040528015611876578160200160208202803683370190505b50336000908152600c602052604081205482519293509183919061189657fe5b60200260200101818152505060005b600185038110156119165760008482815181106118be57fe5b6020908102919091018101516001600160a01b0381166000908152600d83526040808220338352909352919091205484519192509084906001850190811061190257fe5b6020908102919091010152506001016118a5565b5090505b92915050565b6002546001600160a01b031681565b6005546001600160a01b031633811461197d576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d602090815260408083206002549094168352908390529020546119b590846130ce565b6002546001600160a01b0390811660009081526020849052604080822093909355908616815220546119e7908461307f565b6001600160a01b038516600090815260208390526040902055600154611a0d908461307f565b60015550505050565b6007546002546001600160a01b039182169116331480611a3e5750336001600160a01b038216145b611a7d576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b506001600160a01b039182166000908152600e60205260408082208054949093166001600160a01b0319948516811790935582825290208054909216179055565b6005546001600160a01b0316338114611b0c576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0385166000908152600c602052604090205484811015611b6b576040805162461bcd60e51b815260206004820152600e60248201526d09ccae6e874a0deded87442cae8d60931b604482015290519081900360640190fd5b6001600160a01b0386166000908152600c60205260408082208784039055308252902054611b99908661307f565b306000818152600c60209081526040808320949094556001600160a01b038881168352600d8252848320908b1683529052828120549181529190912054909150611be3908461307f565b6001600160a01b0385166000908152600d6020908152604080832030845290915290205582811015611c4d576001600160a01b038085166000818152600d60209081526040808320948b16835293905291822091909155611c4890873084870361311e565b6117b3565b6001600160a01b038085166000908152600d60209081526040808320938a168352929052208382039055505050505050565b6005546001600160a01b0316338114611ccd576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038084166000908152600d6020908152604080832093881683529290522054611cfd908361307f565b6001600160a01b039384166000908152600d602090815260408083209790961682529590955292909320919091555050565b6003546001600160a01b031690565b6005546001600160a01b031681565b6001600160a01b039081166000908152600e60205260409020541690565b600a546001600160a01b031681565b6005546001600160a01b0316331480611d9d57506007546001600160a01b031633145b80611db257506004546001600160a01b031633145b80611dc75750600a546001600160a01b031633145b80611ddc57506009546001600160a01b031633145b80611df15750600b546001600160a01b031633145b611e30576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b80611e3a57610f30565b6001600160a01b038085166000908152600d602090815260408083209387168352929052205481811015611ea9576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b611eb381836130ce565b6001600160a01b038681166000908152600d6020908152604080832089851684529091528082209390935590851681522054611eef908361307f565b6001600160a01b038087166000908152600d60209081526040808320938816835292905220555050505050565b6002546001600160a01b03163314611f73576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d602090815260408083206002549094168352929052205415611fe3576040805162461bcd60e51b815260206004820152600f60248201526e13995cdd0e941bdbdb0e885a5b9a5d608a1b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d6020908152604080832060025490941683529290522055565b6005546001600160a01b031633811461205f576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b811561107a57306000908152600c602052604090205461207f90836130ce565b306000908152600c6020526040808220929092556001600160a01b038516815220546120ab908361307f565b6001600160a01b0384166000908152600c6020526040902055505050565b6002546001600160a01b03163314612120576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d6020908152604080832093851683529290522054821115612191576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b6006546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b1580156121e757600080fd5b505af11580156121fb573d6000803e3d6000fd5b505050506040513d602081101561160d57600080fd5b6008546001600160a01b031690565b6006546001600160a01b031690565b6002546001600160a01b03163314612286576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6001600160a01b038816156122b157600680546001600160a01b0319166001600160a01b038a161790555b6001600160a01b038716156122dc57600580546001600160a01b0319166001600160a01b0389161790555b6001600160a01b0385161561230757600780546001600160a01b0319166001600160a01b0387161790555b6001600160a01b0384161561233257600880546001600160a01b0319166001600160a01b0386161790555b6001600160a01b0383161561235d57600980546001600160a01b0319166001600160a01b0385161790555b6001600160a01b0386161561238857600a80546001600160a01b0319166001600160a01b0388161790555b6001600160a01b038216156123b357600b80546001600160a01b0319166001600160a01b0384161790555b6001600160a01b038116156123de57600480546001600160a01b0319166001600160a01b0383161790555b5050505050505050565b6007546001600160a01b031681565b6004546001600160a01b031690565b306000908152600c602052604090205490565b6006546001600160a01b031681565b6005546001600160a01b0316338114612476576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0385166000908152600c602052604090205480851180159061249f5750600085115b156124cb576001600160a01b0386166000908152600c6020526040902085820390556124cb8686612f8c565b506001600160a01b038084166000908152600d60209081526040808320938916835292905220548083118015906125025750600083115b156117b3576001600160a01b038085166000818152600d60209081526040808320948b1683529390529190912084830390556117b3908785612f3a565b6002546001600160a01b03163314612596576040805162461bcd60e51b81526020600482015260156024820152744e6573743a506f6f6c3a21676f7665726e616e636560581b604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d60209081526040808320600280548616855292528083205494841680845281842095909555815490931682529181205580546001600160a01b0319169091179055565b6005546002546001600160a01b0391821691163314806126165750336001600160a01b038216145b612655576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b0382166000908152600c6020526040902054612678903461307f565b6001600160a01b039092166000908152600c602052604090209190915550565b6001600160a01b03166000908152600d6020908152604080832030845290915290205490565b600a546001600160a01b031690565b6005546001600160a01b031690565b6005546001600160a01b031633811461272a576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b03166000908152600d602052604090208215610f30573060009081526020829052604090205461276490846130ce565b30600090815260208390526040808220929092556001600160a01b03861681522054612790908461307f565b6001600160a01b03851660009081526020839052604090205550505050565b6005546001600160a01b03163381146127fd576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b8115610f30576001600160a01b0383166000908152600d6020908152604080832030845290915290205461283190836130ce565b6001600160a01b038481166000908152600d602090815260408083203084529091528082209390935590861681522054611cfd908361307f565b600b546001600160a01b031690565b6001600160a01b038082166000908152600d602090815260408083209386168352929052205492915050565b6007546001600160a01b031690565b6005546001600160a01b0316338114612903576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b831561296957306000908152600c602052604090205461292390856130ce565b306000908152600c6020526040808220929092556001600160a01b0387168152205461294f908561307f565b6001600160a01b0386166000908152600c60205260409020555b811561160d576001600160a01b0383166000908152600d6020908152604080832030845290915290205461299d90836130ce565b6001600160a01b038481166000908152600d602090815260408083203084529091528082209390935590871681522054611438908361307f565b6006546001600160a01b039081166000908152600d602090815260408083209490931682529290925290205490565b6005546001600160a01b0316338114612a54576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6001600160a01b038381166000908152600d6020908152604080832093881683529290528181205430825291902054612a8d908461307f565b6001600160a01b0385166000908152600d6020908152604080832030845290915290205582811015612af2576001600160a01b038085166000818152600d60209081526040808320948a168352939052918220919091556115ea90863084870361311e565b6001600160a01b038085166000908152600d6020908152604080832093891683529290522083820390555050505050565b6005546001600160a01b0316331480612b4657506007546001600160a01b031633145b80612b5b57506004546001600160a01b031633145b80612b705750600a546001600160a01b031633145b80612b8557506009546001600160a01b031633145b80612b9a5750600b546001600160a01b031633145b612bd9576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b80612be35761107a565b6001600160a01b0383166000908152600c602052604090205481811015612c45576040805162461bcd60e51b815260206004820152601160248201527013995cdd0e941bdbdb0e88585b5bdd5b9d607a1b604482015290519081900360640190fd5b612c4f81836130ce565b6001600160a01b038086166000908152600c60205260408082209390935590851681522054612c7e908361307f565b6001600160a01b0384166000908152600c602052604090205550505050565b6001600160a01b03166000908152600c602052604090205490565b6003546001600160a01b031681565b6001600160a01b038083166000908152600c602052604081205491831615612d1157506001600160a01b038083166000908152600d60209081526040808320938716835292905220545b9250929050565b600b546001600160a01b031681565b6005546001600160a01b0316331480612d4a57506007546001600160a01b031633145b80612d5f57506004546001600160a01b031633145b80612d745750600a546001600160a01b031633145b80612d8957506009546001600160a01b031633145b80612d9e5750600b546001600160a01b031633145b612ddd576040805162461bcd60e51b815260206004820152600f6024820152600080516020613369833981519152604482015290519081900360640190fd5b6006546001600160a01b039081166000908152600d6020908152604080832093861683529083905290205480831115612e50576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a21626c6e637360801b604482015290519081900360640190fd5b8215610f30576001600160a01b038085166000818152602085815260408083208887039055600654815163a9059cbb60e01b8152600481019590955260248501899052905194169363a9059cbb93604480820194918390030190829087803b158015612ebb57600080fd5b505af1158015612ecf573d6000803e3d6000fd5b505050506040513d6020811015612ee557600080fd5b5051610f30576040805162461bcd60e51b815260206004820152601060248201526f4e6573743a506f6f6c3a215452414e5360801b604482015290519081900360640190fd5b6009546001600160a01b031681565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261107a908490613174565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b60208310612fd85780518252601f199092019160209182019101612fb9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461303a576040519150601f19603f3d011682016040523d82523d6000602084013e61303f565b606091505b505090508061107a5760405162461bcd60e51b81526004018080602001828103825260238152602001806133896023913960400191505060405180910390fd5b8082018281101561191a576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b8082038281111561191a576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610f309085905b613186826001600160a01b031661332c565b6131d7576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106132155780518252601f1990920191602091820191016131f6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613277576040519150601f19603f3d011682016040523d82523d6000602084013e61327c565b606091505b5091509150816132d3576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610f30578080602001905160208110156132ef57600080fd5b5051610f305760405162461bcd60e51b815260040180806020018281038252602a8152602001806133ac602a913960400191505060405180910390fd5b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061336057508115155b94935050505056fe4e6573743a506f6f6c3a214175746800000000000000000000000000000000005472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220592419a63951513cb848d1df90d37f5087c496f4668d497efeed4ad5a7eafb4964736f6c634300060c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1,579.2 | 0.00009674 | $0.152771 |
Loading...
Loading
Loading...
Loading
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.