Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 14527447 | 964 days ago | IN | 0 ETH | 0.36872055 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NodesV2
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: MIT pragma solidity 0.6.12; import "../lib/openzeppelin/contracts/3.4.1/token/ERC20/IERC20.sol"; import "./interfaces/IERC1155Preset.sol"; import "./interfaces/StrongPoolInterface.sol"; import "./lib/AdminAccessControl.sol"; import "./lib/rewards.sol"; contract NodesV2 is AdminAccessControl { event Requested(address indexed miner); event Claimed(address indexed miner, uint256 reward); event Paid(address indexed entity, uint128 nodeId, bool isRenewal, uint256 upToBlockNumber); IERC20 public strongToken; StrongPoolInterface public strongPool; bool public initDone; uint256 public activeEntities; address payable public feeCollector; uint256 public rewardPerBlockNumerator; uint256 public rewardPerBlockDenominator; uint256 public rewardPerBlockNumeratorNew; uint256 public rewardPerBlockDenominatorNew; uint256 public rewardPerBlockNewEffectiveBlock; uint256 public claimingFeeNumerator; uint256 public claimingFeeDenominator; uint256 public requestingFeeInWei; uint256 public strongFeeInWei; uint256 public recurringFeeInWei; uint256 public recurringPaymentCycleInBlocks; uint256 public rewardBalance; uint256 public claimingFeeInWei; uint256 public gracePeriodInBlocks; uint128 public maxNodes; uint256 public maxPaymentPeriods; mapping(bytes => uint256) public entityNodePaidOnBlock; mapping(bytes => uint256) public entityNodeClaimedOnBlock; mapping(address => uint128) public entityNodeCount; function init( address _strongTokenAddress, address _strongPoolAddress, uint256 _rewardPerBlockNumeratorValue, uint256 _rewardPerBlockDenominatorValue, uint256 _requestingFeeInWeiValue, uint256 _strongFeeInWeiValue, uint256 _recurringFeeInWeiValue, uint256 _recurringPaymentCycleInBlocksValue, uint256 _claimingFeeNumeratorValue, uint256 _claimingFeeDenominatorValue ) public { require(!initDone, "init done"); strongToken = IERC20(_strongTokenAddress); strongPool = StrongPoolInterface(_strongPoolAddress); rewardPerBlockNumerator = _rewardPerBlockNumeratorValue; rewardPerBlockDenominator = _rewardPerBlockDenominatorValue; requestingFeeInWei = _requestingFeeInWeiValue; strongFeeInWei = _strongFeeInWeiValue; recurringFeeInWei = _recurringFeeInWeiValue; claimingFeeNumerator = _claimingFeeNumeratorValue; claimingFeeDenominator = _claimingFeeDenominatorValue; recurringPaymentCycleInBlocks = _recurringPaymentCycleInBlocksValue; maxNodes = 100; initDone = true; } // // Getters // ------------------------------------------------------------------------------------------------------------------- function canBePaid(address _entity, uint128 _nodeId) public view returns (bool) { return !hasNodeExpired(_entity, _nodeId) && !hasMaxPayments(_entity, _nodeId); } function doesNodeExist(address _entity, uint128 _nodeId) public view returns (bool) { return entityNodePaidOnBlock[getNodeId(_entity, _nodeId)] > 0; } function hasNodeExpired(address _entity, uint128 _nodeId) public view returns (bool) { uint256 blockLastPaidOn = entityNodePaidOnBlock[getNodeId(_entity, _nodeId)]; return block.number > blockLastPaidOn + recurringPaymentCycleInBlocks + gracePeriodInBlocks; } function hasMaxPayments(address _entity, uint128 _nodeId) public view returns (bool) { uint256 blockLastPaidOn = entityNodePaidOnBlock[getNodeId(_entity, _nodeId)]; uint256 limit = block.number + recurringPaymentCycleInBlocks * maxPaymentPeriods; return blockLastPaidOn + recurringPaymentCycleInBlocks >= limit; } function getNodeId(address _entity, uint128 _nodeId) public view returns (bytes memory) { uint128 id = _nodeId != 0 ? _nodeId : entityNodeCount[_entity] + 1; return abi.encodePacked(_entity, id); } function getNodePaidOn(address _entity, uint128 _nodeId) public view returns (uint256) { return entityNodePaidOnBlock[getNodeId(_entity, _nodeId)]; } function getReward(address _entity, uint128 _nodeId) public view returns (uint256) { return getRewardByBlock(_entity, _nodeId, block.number); } function getRewardAll(address _entity, uint256 _blockNumber) public view returns (uint256) { uint256 rewardsAll = 0; for (uint128 i = 1; i <= entityNodeCount[_entity]; i++) { rewardsAll = rewardsAll + getRewardByBlock(_entity, i, _blockNumber > 0 ? _blockNumber : block.number); } return rewardsAll; } function getRewardByBlock(address _entity, uint128 _nodeId, uint256 _blockNumber) public view returns (uint256) { bytes memory id = getNodeId(_entity, _nodeId); uint256 blockLastClaimedOn = entityNodeClaimedOnBlock[id] != 0 ? entityNodeClaimedOnBlock[id] : entityNodePaidOnBlock[id]; if (_blockNumber > block.number) return 0; if (blockLastClaimedOn == 0) return 0; if (_blockNumber < blockLastClaimedOn) return 0; uint256[2] memory rewardBlocks = rewards.blocks(blockLastClaimedOn, rewardPerBlockNewEffectiveBlock, _blockNumber); uint256 rewardOld = rewardPerBlockDenominator > 0 ? rewardBlocks[0] * rewardPerBlockNumerator / rewardPerBlockDenominator : 0; uint256 rewardNew = rewardPerBlockDenominatorNew > 0 ? rewardBlocks[1] * rewardPerBlockNumeratorNew / rewardPerBlockDenominatorNew : 0; return rewardOld + rewardNew; } function isEntityActive(address _entity) public view returns (bool) { return doesNodeExist(_entity, 1) && !hasNodeExpired(_entity, 1); } // // Actions // ------------------------------------------------------------------------------------------------------------------- function requestAccess() public payable { require(entityNodeCount[msg.sender] < maxNodes, "limit reached"); require(msg.value == requestingFeeInWei, "invalid fee"); uint128 nodeId = entityNodeCount[msg.sender] + 1; bytes memory id = getNodeId(msg.sender, nodeId); activeEntities ++; entityNodePaidOnBlock[id] = block.number; entityNodeClaimedOnBlock[id] = block.number; entityNodeCount[msg.sender] = entityNodeCount[msg.sender] + 1; feeCollector.transfer(msg.value); strongToken.transferFrom(msg.sender, feeCollector, strongFeeInWei); emit Paid(msg.sender, nodeId, false, entityNodePaidOnBlock[id] + recurringPaymentCycleInBlocks); } function payFee(uint128 _nodeId) public payable { address sender = msg.sender == address(this) ? tx.origin : msg.sender; bytes memory id = getNodeId(sender, _nodeId); require(doesNodeExist(sender, _nodeId), "doesnt exist"); require(hasNodeExpired(sender, _nodeId) == false, "too late"); require(hasMaxPayments(sender, _nodeId) == false, "too soon"); require(msg.value == recurringFeeInWei, "invalid fee"); feeCollector.transfer(msg.value); entityNodePaidOnBlock[id] = entityNodePaidOnBlock[id] + recurringPaymentCycleInBlocks; emit Paid(sender, _nodeId, true, entityNodePaidOnBlock[id]); } function claim(uint128 _nodeId, uint256 _blockNumber, bool _toStrongPool) public payable returns (bool) { address sender = msg.sender == address(this) ? tx.origin : msg.sender; bytes memory id = getNodeId(sender, _nodeId); uint256 blockLastClaimedOn = entityNodeClaimedOnBlock[id] != 0 ? entityNodeClaimedOnBlock[id] : entityNodePaidOnBlock[id]; uint256 blockLastPaidOn = entityNodePaidOnBlock[id]; require(blockLastClaimedOn != 0, "never claimed"); require(_blockNumber <= block.number, "invalid block"); require(_blockNumber > blockLastClaimedOn, "too soon"); if (recurringFeeInWei != 0) { require(_blockNumber < blockLastPaidOn + recurringPaymentCycleInBlocks, "pay fee"); } uint256 reward = getRewardByBlock(sender, _nodeId, _blockNumber); require(reward > 0, "no reward"); uint256 fee = reward * claimingFeeNumerator / claimingFeeDenominator; require(msg.value >= fee, "invalid fee"); feeCollector.transfer(msg.value); if (_toStrongPool) { strongToken.approve(address(strongPool), reward); strongPool.mineFor(sender, reward); } else { strongToken.transfer(sender, reward); } rewardBalance -= reward; entityNodeClaimedOnBlock[id] = _blockNumber; emit Claimed(sender, reward); return true; } function claimAll(uint256 _blockNumber, bool _toStrongPool) public payable { uint256 value = msg.value; for (uint16 i = 1; i <= entityNodeCount[msg.sender]; i++) { uint256 reward = getRewardByBlock(msg.sender, i, _blockNumber); uint256 fee = reward * claimingFeeNumerator / claimingFeeDenominator; require(value >= fee, "invalid fee"); require(this.claim{value : fee}(i, _blockNumber, _toStrongPool), "claim failed"); value -= fee; } } function payAll(uint256 _nodeCount) public payable { require(_nodeCount > 0, "invalid value"); require(msg.value == recurringFeeInWei * _nodeCount, "invalid fee"); for (uint16 nodeId = 1; nodeId <= entityNodeCount[msg.sender]; nodeId++) { if (!canBePaid(msg.sender, nodeId)) { continue; } this.payFee{value : recurringFeeInWei}(nodeId); _nodeCount -= 1; } require(_nodeCount == 0, "invalid count"); } // // Admin // ------------------------------------------------------------------------------------------------------------------- function deposit(uint256 _amount) public onlyRole(adminControl.SUPER_ADMIN()) { require(_amount > 0); strongToken.transferFrom(msg.sender, address(this), _amount); rewardBalance += _amount; } function withdraw(address _destination, uint256 _amount) public onlyRole(adminControl.SUPER_ADMIN()) { require(_amount > 0); require(rewardBalance >= _amount, "not enough"); strongToken.transfer(_destination, _amount); rewardBalance -= _amount; } function updateFeeCollector(address payable _newFeeCollector) public onlyRole(adminControl.SUPER_ADMIN()) { require(_newFeeCollector != address(0)); feeCollector = _newFeeCollector; } function updateRequestingFee(uint256 _feeInWei) public onlyRole(adminControl.SERVICE_ADMIN()) { requestingFeeInWei = _feeInWei; } function updateStrongFee(uint256 _feeInWei) public onlyRole(adminControl.SERVICE_ADMIN()) { strongFeeInWei = _feeInWei; } function updateClaimingFee(uint256 _numerator, uint256 _denominator) public onlyRole(adminControl.SERVICE_ADMIN()) { require(_denominator != 0); claimingFeeNumerator = _numerator; claimingFeeDenominator = _denominator; } function updateRecurringFee(uint256 _feeInWei) public onlyRole(adminControl.SERVICE_ADMIN()) { recurringFeeInWei = _feeInWei; } function updateRecurringPaymentCycleInBlocks(uint256 _blocks) public onlyRole(adminControl.SERVICE_ADMIN()) { require(_blocks > 0); recurringPaymentCycleInBlocks = _blocks; } function updateGracePeriodInBlocks(uint256 _blocks) public onlyRole(adminControl.SERVICE_ADMIN()) { require(_blocks > 0); gracePeriodInBlocks = _blocks; } function updateLimits(uint128 _maxNodes, uint256 _maxPaymentPeriods) public onlyRole(adminControl.SERVICE_ADMIN()) { maxNodes = _maxNodes; maxPaymentPeriods = _maxPaymentPeriods; } function updateRewardPerBlock(uint256 _numerator, uint256 _denominator) public onlyRole(adminControl.SERVICE_ADMIN()) { require(_denominator != 0); rewardPerBlockNumerator = _numerator; rewardPerBlockDenominator = _denominator; } function updateRewardPerBlockNew(uint256 _numerator, uint256 _denominator, uint256 _effectiveBlock) public onlyRole(adminControl.SERVICE_ADMIN()) { require(_denominator != 0); rewardPerBlockNumeratorNew = _numerator; rewardPerBlockDenominatorNew = _denominator; rewardPerBlockNewEffectiveBlock = _effectiveBlock != 0 ? _effectiveBlock : block.number; } function setTokenContract(address strongTokenAddress) external onlyRole(adminControl.SUPER_ADMIN()) { strongToken = IERC20(strongTokenAddress); } function withdrawToken(IERC20 token, address recipient, uint256 amount) external onlyRole(adminControl.SUPER_ADMIN()) { require(token.transfer(recipient, amount)); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155Preset { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); /** * @dev Creates `amount` new tokens for `to`, of token type `id`. * * See {ERC1155-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to, uint256 id, uint256 amount, bytes memory data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] variant of {mint}. */ function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) external; function getOwnerIdByIndex(address owner, uint256 index) external view returns (uint256); function getOwnerIdIndex(address owner, uint256 id) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; interface StrongPoolInterface { function mineFor(address miner, uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "../interfaces/IAdminControl.sol"; abstract contract AdminAccessControl { IAdminControl public adminControl; modifier onlyRole(uint8 _role) { require(address(adminControl) == address(0) || adminControl.hasRole(_role, msg.sender), "no access"); _; } function addAdminControlContract(address _contract) public onlyRole(0) { adminControl = IAdminControl(_contract); } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "./SafeMath.sol"; library rewards { using SafeMath for uint256; function blocks(uint256 lastClaimedOnBlock, uint256 newRewardBlock, uint256 blockNumber) internal pure returns (uint256[2] memory) { if (lastClaimedOnBlock >= blockNumber) return [uint256(0), uint256(0)]; if (blockNumber <= newRewardBlock || newRewardBlock == 0) { return [blockNumber.sub(lastClaimedOnBlock), uint256(0)]; } else if (lastClaimedOnBlock >= newRewardBlock) { return [uint256(0), blockNumber.sub(lastClaimedOnBlock)]; } else { return [newRewardBlock.sub(lastClaimedOnBlock), blockNumber.sub(newRewardBlock)]; } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; interface IAdminControl { function hasRole(uint8 _role, address _account) external view returns (bool); function SUPER_ADMIN() external view returns (uint8); function ADMIN() external view returns (uint8); function SERVICE_ADMIN() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint128","name":"nodeId","type":"uint128"},{"indexed":false,"internalType":"bool","name":"isRenewal","type":"bool"},{"indexed":false,"internalType":"uint256","name":"upToBlockNumber","type":"uint256"}],"name":"Paid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"miner","type":"address"}],"name":"Requested","type":"event"},{"inputs":[],"name":"activeEntities","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"addAdminControlContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminControl","outputs":[{"internalType":"contract IAdminControl","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"}],"name":"canBePaid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"},{"internalType":"bool","name":"_toStrongPool","type":"bool"}],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blockNumber","type":"uint256"},{"internalType":"bool","name":"_toStrongPool","type":"bool"}],"name":"claimAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimingFeeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimingFeeInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimingFeeNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"}],"name":"doesNodeExist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityNodeClaimedOnBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"entityNodeCount","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityNodePaidOnBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"}],"name":"getNodeId","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"}],"name":"getNodePaidOn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"}],"name":"getReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"getRewardAll","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"}],"name":"getRewardByBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gracePeriodInBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"}],"name":"hasMaxPayments","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"}],"name":"hasNodeExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_strongTokenAddress","type":"address"},{"internalType":"address","name":"_strongPoolAddress","type":"address"},{"internalType":"uint256","name":"_rewardPerBlockNumeratorValue","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlockDenominatorValue","type":"uint256"},{"internalType":"uint256","name":"_requestingFeeInWeiValue","type":"uint256"},{"internalType":"uint256","name":"_strongFeeInWeiValue","type":"uint256"},{"internalType":"uint256","name":"_recurringFeeInWeiValue","type":"uint256"},{"internalType":"uint256","name":"_recurringPaymentCycleInBlocksValue","type":"uint256"},{"internalType":"uint256","name":"_claimingFeeNumeratorValue","type":"uint256"},{"internalType":"uint256","name":"_claimingFeeDenominatorValue","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"}],"name":"isEntityActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNodes","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPaymentPeriods","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeCount","type":"uint256"}],"name":"payAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_nodeId","type":"uint128"}],"name":"payFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"recurringFeeInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recurringPaymentCycleInBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"requestAccess","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestingFeeInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlockDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlockDenominatorNew","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlockNewEffectiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlockNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlockNumeratorNew","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"strongTokenAddress","type":"address"}],"name":"setTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strongFeeInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strongPool","outputs":[{"internalType":"contract StrongPoolInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strongToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numerator","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"updateClaimingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newFeeCollector","type":"address"}],"name":"updateFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blocks","type":"uint256"}],"name":"updateGracePeriodInBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_maxNodes","type":"uint128"},{"internalType":"uint256","name":"_maxPaymentPeriods","type":"uint256"}],"name":"updateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeInWei","type":"uint256"}],"name":"updateRecurringFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_blocks","type":"uint256"}],"name":"updateRecurringPaymentCycleInBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeInWei","type":"uint256"}],"name":"updateRequestingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numerator","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"updateRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numerator","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"},{"internalType":"uint256","name":"_effectiveBlock","type":"uint256"}],"name":"updateRewardPerBlockNew","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeInWei","type":"uint256"}],"name":"updateStrongFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_destination","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613bb0806100206000396000f3fe60806040526004361061036a5760003560e01c80639162c594116101c6578063d48ba486116100f7578063e877db1a11610095578063f28b039e1161006f578063f28b039e14610d94578063f3368f9014610da9578063f3fef3a314610dd3578063fed0a20e14610e0c5761036a565b8063e877db1a14610d4d578063eb2f481714610d77578063ed5998da14610d7f5761036a565b8063da7169b3116100d1578063da7169b314610cd5578063dc0bbf0814610d0e578063ddf0185f14610d23578063e195232e14610d385761036a565b8063d48ba48614610bf0578063d4aadbc614610ca3578063d9df77de14610cc05761036a565b8063b6b55f2511610164578063c3d5864f1161013e578063c3d5864f14610b4b578063c415b95c14610b60578063c8b81e1514610b75578063d2c35ce814610bbd5761036a565b8063b6b55f2514610ad9578063bbcd5bbe14610b03578063c2b2fdca14610b365761036a565b8063a77e2825116101a0578063a77e282514610a15578063aa5c3ab414610a64578063ae749c4214610a79578063b0e8a45d14610aa35761036a565b80639162c594146109d6578063965d61b9146109eb57806399e6f70014610a005761036a565b806334dce6b3116102a05780636f3001551161023e5780637ba90928116102185780637ba90928146108b05780638123fdbb146108da57806387f48f4e146109915780638aa9a37f146109a65761036a565b80636f300155146108535780637a0b9255146108685780637a5d5cf41461089b5761036a565b8063555d3e631161027a578063555d3e63146107745780635c4f18fa146107a5578063623ef910146107e75780636c52ec10146108115761036a565b806334dce6b3146106cb57806339941fa4146106fe5780633bb58b67146107325761036a565b806319a1f5ae1161030d578063255ebc8d116102e7578063255ebc8d146105b8578063266655621461060e578063268e5e4f14610650578063326f1073146106925761036a565b806319a1f5ae146104805780631ce7aff9146105335780631d851bbd146105a35761036a565b80630a8d1be2116103495780630a8d1be2146104005780630f694584146104305780630fe48b3614610456578063198858981461046b5761036a565b8062a469171461036f57806301e336671461039657806309a07fd2146103d9575b600080fd5b6103946004803603604081101561038557600080fd5b50803590602001351515610e21565b005b3480156103a257600080fd5b50610394600480360360608110156103b957600080fd5b506001600160a01b03813581169160208101359091169060400135610f86565b3480156103e557600080fd5b506103ee61115b565b60408051918252519081900360200190f35b34801561040c57600080fd5b506103946004803603604081101561042357600080fd5b5080359060200135611161565b6103946004803603602081101561044657600080fd5b50356001600160801b03166112c0565b34801561046257600080fd5b506103ee6115bf565b34801561047757600080fd5b506103ee6115c5565b34801561048c57600080fd5b506103ee600480360360208110156104a357600080fd5b8101906020810181356401000000008111156104be57600080fd5b8201836020820111156104d057600080fd5b803590602001918460018302840111640100000000831117156104f257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506115cb945050505050565b34801561053f57600080fd5b50610394600480360361014081101561055757600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e0810135906101008101359061012001356115e8565b3480156105af57600080fd5b506103ee6116b0565b3480156105c457600080fd5b506105fa600480360360408110156105db57600080fd5b5080356001600160a01b031690602001356001600160801b03166116b6565b604080519115158252519081900360200190f35b34801561061a57600080fd5b506105fa6004803603604081101561063157600080fd5b5080356001600160a01b031690602001356001600160801b0316611739565b34801561065c57600080fd5b506103ee6004803603604081101561067357600080fd5b5080356001600160a01b031690602001356001600160801b03166117b0565b34801561069e57600080fd5b50610394600480360360408110156106b557600080fd5b506001600160801b038135169060200135611822565b3480156106d757600080fd5b506105fa600480360360208110156106ee57600080fd5b50356001600160a01b0316611992565b6105fa6004803603606081101561071457600080fd5b506001600160801b03813516906020810135906040013515156119b9565b34801561073e57600080fd5b506103ee6004803603604081101561075557600080fd5b5080356001600160a01b031690602001356001600160801b0316611fa4565b34801561078057600080fd5b50610789611fb1565b604080516001600160a01b039092168252519081900360200190f35b3480156107b157600080fd5b506105fa600480360360408110156107c857600080fd5b5080356001600160a01b031690602001356001600160801b0316611fc0565b3480156107f357600080fd5b506103946004803603602081101561080a57600080fd5b5035611fe6565b34801561081d57600080fd5b506105fa6004803603604081101561083457600080fd5b5080356001600160a01b031690602001356001600160801b0316612135565b34801561085f57600080fd5b506103ee6121b5565b34801561087457600080fd5b506103946004803603602081101561088b57600080fd5b50356001600160a01b03166121bb565b3480156108a757600080fd5b506103ee6122b0565b3480156108bc57600080fd5b50610394600480360360208110156108d357600080fd5b50356122b6565b3480156108e657600080fd5b5061091c600480360360408110156108fd57600080fd5b5080356001600160a01b031690602001356001600160801b0316612412565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561095657818101518382015260200161093e565b50505050905090810190601f1680156109835780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561099d57600080fd5b506103ee61249c565b3480156109b257600080fd5b50610394600480360360408110156109c957600080fd5b50803590602001356124a2565b3480156109e257600080fd5b506103ee612601565b3480156109f757600080fd5b50610789612607565b348015610a0c57600080fd5b506103ee612616565b348015610a2157600080fd5b50610a4860048036036020811015610a3857600080fd5b50356001600160a01b031661261c565b604080516001600160801b039092168252519081900360200190f35b348015610a7057600080fd5b506103ee612637565b348015610a8557600080fd5b5061039460048036036020811015610a9c57600080fd5b503561263d565b348015610aaf57600080fd5b5061039460048036036060811015610ac657600080fd5b508035906020810135906040013561278c565b348015610ae557600080fd5b5061039460048036036020811015610afc57600080fd5b50356128ff565b348015610b0f57600080fd5b5061039460048036036020811015610b2657600080fd5b50356001600160a01b0316612ae8565b348015610b4257600080fd5b506103ee612c54565b348015610b5757600080fd5b506103ee612c5a565b348015610b6c57600080fd5b50610789612c60565b348015610b8157600080fd5b506103ee60048036036060811015610b9857600080fd5b506001600160a01b03813516906001600160801b036020820135169060400135612c6f565b348015610bc957600080fd5b5061039460048036036020811015610be057600080fd5b50356001600160a01b0316612e5e565b348015610bfc57600080fd5b506103ee60048036036020811015610c1357600080fd5b810190602081018135640100000000811115610c2e57600080fd5b820183602082011115610c4057600080fd5b80359060200191846001830284011164010000000083111715610c6257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612fdd945050505050565b61039460048036036020811015610cb957600080fd5b5035612ffa565b348015610ccc57600080fd5b506103ee61317d565b348015610ce157600080fd5b506103ee60048036036040811015610cf857600080fd5b506001600160a01b038135169060200135613183565b348015610d1a57600080fd5b506103ee6131e3565b348015610d2f57600080fd5b50610a486131e9565b348015610d4457600080fd5b506107896131f8565b348015610d5957600080fd5b5061039460048036036020811015610d7057600080fd5b5035613207565b610394613363565b348015610d8b57600080fd5b506103ee6136bc565b348015610da057600080fd5b506103ee6136c2565b348015610db557600080fd5b5061039460048036036020811015610dcc57600080fd5b50356136c8565b348015610ddf57600080fd5b5061039460048036036040811015610df657600080fd5b506001600160a01b038135169060200135613817565b348015610e1857600080fd5b506105fa613a42565b3460015b336000908152601760205260409020546001600160801b031661ffff821611610f80576000610e59338361ffff1687612c6f565b90506000600b54600a54830281610e6c57fe5b04905080841015610eb2576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b60408051630e6507e960e21b815261ffff85166004820152602481018890528615156044820152905130916339941fa491849160648082019260209290919082900301818588803b158015610f0657600080fd5b505af1158015610f1a573d6000803e3d6000fd5b50505050506040513d6020811015610f3157600080fd5b5051610f73576040805162461bcd60e51b815260206004820152600c60248201526b18db185a5b4819985a5b195960a21b604482015290519081900360640190fd5b9092039150600101610e25565b50505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fd257600080fd5b505afa158015610fe6573d6000803e3d6000fd5b505050506040513d6020811015610ffc57600080fd5b50516000546001600160a01b03161580611092575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561106557600080fd5b505afa158015611079573d6000803e3d6000fd5b505050506040513d602081101561108f57600080fd5b50515b6110cf576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b836001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561112657600080fd5b505af115801561113a573d6000803e3d6000fd5b505050506040513d602081101561115057600080fd5b5051610f8057600080fd5b600a5481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ad57600080fd5b505afa1580156111c1573d6000803e3d6000fd5b505050506040513d60208110156111d757600080fd5b50516000546001600160a01b0316158061126d575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561124057600080fd5b505afa158015611254573d6000803e3d6000fd5b505050506040513d602081101561126a57600080fd5b50515b6112aa576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b816112b457600080fd5b50600591909155600655565b60003330146112cf57336112d1565b325b905060606112df8284612412565b90506112eb8284611739565b61132b576040805162461bcd60e51b815260206004820152600c60248201526b191bd95cdb9d08195e1a5cdd60a21b604482015290519081900360640190fd5b6113358284612135565b15611372576040805162461bcd60e51b8152602060048201526008602482015267746f6f206c61746560c01b604482015290519081900360640190fd5b61137c82846116b6565b156113b9576040805162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015290519081900360640190fd5b600e5434146113fd576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b6004546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015611436573d6000803e3d6000fd5b50600f546015826040518082805190602001908083835b6020831061146c5780518252601f19909201916020918201910161144d565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420548651950194601594879450925082918401908083835b602083106114cd5780518252601f1990920191602091820191016114ae565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902081905550816001600160a01b03167fd8722907e22bdf7371f82757663f42769580522cf1fc9af2c0740ac3135e9d508460016015856040518082805190602001908083835b602083106115645780518252601f199092019160209182019101611545565b51815160001960209485036101000a01908116901991909116179052920194855250604080519485900382018520546001600160801b03909716855294151590840152505080820192909252519081900360600190a2505050565b600f5481565b60065481565b805160208183018101805160168252928201919093012091525481565b600254600160a01b900460ff1615611633576040805162461bcd60e51b8152602060048201526009602482015268696e697420646f6e6560b81b604482015290519081900360640190fd5b600180546001600160a01b039b8c166001600160a01b0319918216179091556002805460059a909a55600698909855600c96909655600d94909455600e92909255600a91909155600b91909155600f55601380546001600160801b031916606417905560ff60a01b1993909416919093161716600160a01b179055565b60095481565b60008060156116c58585612412565b6040518082805190602001908083835b602083106116f45780518252601f1990920191602091820191016116d5565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054601454600f549081024301910110159695505050505050565b60008060156117488585612412565b6040518082805190602001908083835b602083106117775780518252601f199092019160209182019101611758565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549290921195945050505050565b600060156117be8484612412565b6040518082805190602001908083835b602083106117ed5780518252601f1990920191602091820191016117ce565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205495945050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561186e57600080fd5b505afa158015611882573d6000803e3d6000fd5b505050506040513d602081101561189857600080fd5b50516000546001600160a01b0316158061192e575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561190157600080fd5b505afa158015611915573d6000803e3d6000fd5b505050506040513d602081101561192b57600080fd5b50515b61196b576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50601380546001600160801b0319166001600160801b039390931692909217909155601455565b600061199f826001611739565b80156119b357506119b1826001612135565b155b92915050565b6000803330146119c957336119cb565b325b905060606119d98287612412565b905060006016826040518082805190602001908083835b60208310611a0f5780518252601f1990920191602091820191016119f0565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205415159150611aac9050576015826040518082805190602001908083835b60208310611a775780518252601f199092019160209182019101611a58565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150611b0e9050565b6016826040518082805190602001908083835b60208310611ade5780518252601f199092019160209182019101611abf565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150505b905060006015836040518082805190602001908083835b60208310611b445780518252601f199092019160209182019101611b25565b51815160001960209485036101000a019081169019919091161790529201948552506040519384900301909220549250505081611bb8576040805162461bcd60e51b815260206004820152600d60248201526c1b995d995c8818db185a5b5959609a1b604482015290519081900360640190fd5b43871115611bfd576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c696420626c6f636b60981b604482015290519081900360640190fd5b818711611c3c576040805162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015290519081900360640190fd5b600e5415611c8657600f5481018710611c86576040805162461bcd60e51b81526020600482015260076024820152667061792066656560c81b604482015290519081900360640190fd5b6000611c93858a8a612c6f565b905060008111611cd6576040805162461bcd60e51b81526020600482015260096024820152681b9bc81c995dd85c9960ba1b604482015290519081900360640190fd5b6000600b54600a54830281611ce757fe5b04905080341015611d2d576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b6004546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015611d66573d6000803e3d6000fd5b508715611e64576001546002546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b158015611dc657600080fd5b505af1158015611dda573d6000803e3d6000fd5b505050506040513d6020811015611df057600080fd5b5050600254604080516330d6a97560e01b81526001600160a01b03898116600483015260248201869052915191909216916330d6a97591604480830192600092919082900301818387803b158015611e4757600080fd5b505af1158015611e5b573d6000803e3d6000fd5b50505050611ee7565b6001546040805163a9059cbb60e01b81526001600160a01b038981166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611eba57600080fd5b505af1158015611ece573d6000803e3d6000fd5b505050506040513d6020811015611ee457600080fd5b50505b60108054839003905560405185518a91601691889190819060208401908083835b60208310611f275780518252601f199092019160209182019101611f08565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185209590955586845293516001600160a01b038b16947fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a948290030192509050a2600196505050505050505b9392505050565b6000611f9d838343612c6f565b6000546001600160a01b031681565b6000611fcc8383612135565b158015611f9d5750611fde83836116b6565b159392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561203257600080fd5b505afa158015612046573d6000803e3d6000fd5b505050506040513d602081101561205c57600080fd5b50516000546001600160a01b031615806120f2575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156120c557600080fd5b505afa1580156120d9573d6000803e3d6000fd5b505050506040513d60208110156120ef57600080fd5b50515b61212f576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600d55565b60008060156121448585612412565b6040518082805190602001908083835b602083106121735780518252601f199092019160209182019101612154565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054601254600f549091010143119695505050505050565b600c5481565b600080546001600160a01b03161580612250575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561222357600080fd5b505afa158015612237573d6000803e3d6000fd5b505050506040513d602081101561224d57600080fd5b50515b61228d576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b60075481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561230257600080fd5b505afa158015612316573d6000803e3d6000fd5b505050506040513d602081101561232c57600080fd5b50516000546001600160a01b031615806123c2575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561239557600080fd5b505afa1580156123a9573d6000803e3d6000fd5b505050506040513d60208110156123bf57600080fd5b50515b6123ff576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6000821161240c57600080fd5b50601255565b606060006001600160801b03831661244e576001600160a01b0384166000908152601760205260409020546001600160801b0316600101612450565b825b6040805160609690961b6bffffffffffffffffffffffff1916602087015260809190911b6001600160801b03191660348601528051808603602401815260449095019052509192915050565b600b5481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124ee57600080fd5b505afa158015612502573d6000803e3d6000fd5b505050506040513d602081101561251857600080fd5b50516000546001600160a01b031615806125ae575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561258157600080fd5b505afa158015612595573d6000803e3d6000fd5b505050506040513d60208110156125ab57600080fd5b50515b6125eb576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b816125f557600080fd5b50600a91909155600b55565b600e5481565b6001546001600160a01b031681565b60055481565b6017602052600090815260409020546001600160801b031681565b60105481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561268957600080fd5b505afa15801561269d573d6000803e3d6000fd5b505050506040513d60208110156126b357600080fd5b50516000546001600160a01b03161580612749575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561271c57600080fd5b505afa158015612730573d6000803e3d6000fd5b505050506040513d602081101561274657600080fd5b50515b612786576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600c55565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127d857600080fd5b505afa1580156127ec573d6000803e3d6000fd5b505050506040513d602081101561280257600080fd5b50516000546001600160a01b03161580612898575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561286b57600080fd5b505afa15801561287f573d6000803e3d6000fd5b505050506040513d602081101561289557600080fd5b50515b6128d5576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b826128df57600080fd5b60078490556008839055816128f457436128f6565b815b60095550505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561294b57600080fd5b505afa15801561295f573d6000803e3d6000fd5b505050506040513d602081101561297557600080fd5b50516000546001600160a01b03161580612a0b575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156129de57600080fd5b505afa1580156129f2573d6000803e3d6000fd5b505050506040513d6020811015612a0857600080fd5b50515b612a48576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b60008211612a5557600080fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015612aaf57600080fd5b505af1158015612ac3573d6000803e3d6000fd5b505050506040513d6020811015612ad957600080fd5b50506010805490920190915550565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b3457600080fd5b505afa158015612b48573d6000803e3d6000fd5b505050506040513d6020811015612b5e57600080fd5b50516000546001600160a01b03161580612bf4575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015612bc757600080fd5b505afa158015612bdb573d6000803e3d6000fd5b505050506040513d6020811015612bf157600080fd5b50515b612c31576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b60115481565b60125481565b6004546001600160a01b031681565b60006060612c7d8585612412565b905060006016826040518082805190602001908083835b60208310612cb35780518252601f199092019160209182019101612c94565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205415159150612d509050576015826040518082805190602001908083835b60208310612d1b5780518252601f199092019160209182019101612cfc565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150612db29050565b6016826040518082805190602001908083835b60208310612d825780518252601f199092019160209182019101612d63565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150505b905043841115612dc757600092505050611f9d565b80612dd757600092505050611f9d565b80841015612dea57600092505050611f9d565b612df2613b5c565b612dff8260095487613a52565b905060008060065411612e13576000612e25565b60065460055483510281612e2357fe5b045b905060008060085411612e39576000612e4e565b60085460075460208501510281612e4c57fe5b045b9190910198975050505050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015612eaa57600080fd5b505afa158015612ebe573d6000803e3d6000fd5b505050506040513d6020811015612ed457600080fd5b50516000546001600160a01b03161580612f6a575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015612f3d57600080fd5b505afa158015612f51573d6000803e3d6000fd5b505050506040513d6020811015612f6757600080fd5b50515b612fa7576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6001600160a01b038216612fba57600080fd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055565b805160208183018101805160158252928201919093012091525481565b6000811161303f576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c69642076616c756560981b604482015290519081900360640190fd5b80600e54023414613085576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b60015b336000908152601760205260409020546001600160801b031661ffff821611613136576130b9338261ffff16611fc0565b6130c25761312e565b306001600160a01b0316630f694584600e54836040518363ffffffff1660e01b8152600401808261ffff1681526020019150506000604051808303818588803b15801561310e57600080fd5b505af1158015613122573d6000803e3d6000fd5b50505050506001820391505b600101613088565b50801561317a576040805162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a590818dbdd5b9d609a1b604482015290519081900360640190fd5b50565b600d5481565b60008060015b6001600160a01b0385166000908152601760205260409020546001600160801b03908116908216116131db576131cf8582600087116131c857436131ca565b865b612c6f565b90910190600101613189565b509392505050565b60035481565b6013546001600160801b031681565b6002546001600160a01b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325357600080fd5b505afa158015613267573d6000803e3d6000fd5b505050506040513d602081101561327d57600080fd5b50516000546001600160a01b03161580613313575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156132e657600080fd5b505afa1580156132fa573d6000803e3d6000fd5b505050506040513d602081101561331057600080fd5b50515b613350576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6000821161335d57600080fd5b50600f55565b601354336000908152601760205260409020546001600160801b039182169116106133c5576040805162461bcd60e51b815260206004820152600d60248201526c1b1a5b5a5d081c995858da1959609a1b604482015290519081900360640190fd5b600c543414613409576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b336000818152601760205260409020546001600160801b0316600101906060906134339083612412565b600380546001019055604051815191925043916015918491819060208401908083835b602083106134755780518252601f199092019160209182019101613456565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842094909455505082514392601692859290918291908401908083835b602083106134da5780518252601f1990920191602091820191016134bb565b51815160001960209485036101000a0190811690199190911617905292019485525060408051948590038201852095909555336000908152601790915293842080546001600160801b03808216600101166001600160801b031990911617905550506004546001600160a01b0316913480156108fc02929091818181858888f19350505050158015613570573d6000803e3d6000fd5b5060015460048054600d54604080516323b872dd60e01b815233948101949094526001600160a01b0392831660248501526044840191909152519216916323b872dd916064808201926020929091908290030181600087803b1580156135d557600080fd5b505af11580156135e9573d6000803e3d6000fd5b505050506040513d60208110156135ff57600080fd5b5050600f54604051825133927fd8722907e22bdf7371f82757663f42769580522cf1fc9af2c0740ac3135e9d5092869260009291601591889190819060208401908083835b602083106136635780518252601f199092019160209182019101613644565b51815160001960209485036101000a01908116901991909116179052920194855250604080519485900382018520546001600160801b039098168552951515908401525050920182820152519081900360600190a25050565b60085481565b60145481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561371457600080fd5b505afa158015613728573d6000803e3d6000fd5b505050506040513d602081101561373e57600080fd5b50516000546001600160a01b031615806137d4575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156137a757600080fd5b505afa1580156137bb573d6000803e3d6000fd5b505050506040513d60208110156137d157600080fd5b50515b613811576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600e55565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561386357600080fd5b505afa158015613877573d6000803e3d6000fd5b505050506040513d602081101561388d57600080fd5b50516000546001600160a01b03161580613923575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156138f657600080fd5b505afa15801561390a573d6000803e3d6000fd5b505050506040513d602081101561392057600080fd5b50515b613960576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6000821161396d57600080fd5b8160105410156139b1576040805162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b604482015290519081900360640190fd5b6001546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015613a0757600080fd5b505af1158015613a1b573d6000803e3d6000fd5b505050506040513d6020811015613a3157600080fd5b505060108054929092039091555050565b600254600160a01b900460ff1681565b613a5a613b5c565b818410613a7b57506040805180820190915260008082526020820152611f9d565b8282111580613a88575082155b15613ab3576040805180820190915280613aa28487613aff565b815260200160008152509050611f9d565b828410613adf57604080518082019091526000815260208101613ad68487613aff565b90529050611f9d565b6040805180820190915280613af48587613aff565b8152602001613ad684865b600082821115613b56576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6040518060400160405280600290602082028036833750919291505056fea2646970667358221220ae9d26f54326d62b8f66b31156e63e997d7ca2e2f3580e98261ece0682cf601264736f6c634300060c0033
Deployed Bytecode
0x60806040526004361061036a5760003560e01c80639162c594116101c6578063d48ba486116100f7578063e877db1a11610095578063f28b039e1161006f578063f28b039e14610d94578063f3368f9014610da9578063f3fef3a314610dd3578063fed0a20e14610e0c5761036a565b8063e877db1a14610d4d578063eb2f481714610d77578063ed5998da14610d7f5761036a565b8063da7169b3116100d1578063da7169b314610cd5578063dc0bbf0814610d0e578063ddf0185f14610d23578063e195232e14610d385761036a565b8063d48ba48614610bf0578063d4aadbc614610ca3578063d9df77de14610cc05761036a565b8063b6b55f2511610164578063c3d5864f1161013e578063c3d5864f14610b4b578063c415b95c14610b60578063c8b81e1514610b75578063d2c35ce814610bbd5761036a565b8063b6b55f2514610ad9578063bbcd5bbe14610b03578063c2b2fdca14610b365761036a565b8063a77e2825116101a0578063a77e282514610a15578063aa5c3ab414610a64578063ae749c4214610a79578063b0e8a45d14610aa35761036a565b80639162c594146109d6578063965d61b9146109eb57806399e6f70014610a005761036a565b806334dce6b3116102a05780636f3001551161023e5780637ba90928116102185780637ba90928146108b05780638123fdbb146108da57806387f48f4e146109915780638aa9a37f146109a65761036a565b80636f300155146108535780637a0b9255146108685780637a5d5cf41461089b5761036a565b8063555d3e631161027a578063555d3e63146107745780635c4f18fa146107a5578063623ef910146107e75780636c52ec10146108115761036a565b806334dce6b3146106cb57806339941fa4146106fe5780633bb58b67146107325761036a565b806319a1f5ae1161030d578063255ebc8d116102e7578063255ebc8d146105b8578063266655621461060e578063268e5e4f14610650578063326f1073146106925761036a565b806319a1f5ae146104805780631ce7aff9146105335780631d851bbd146105a35761036a565b80630a8d1be2116103495780630a8d1be2146104005780630f694584146104305780630fe48b3614610456578063198858981461046b5761036a565b8062a469171461036f57806301e336671461039657806309a07fd2146103d9575b600080fd5b6103946004803603604081101561038557600080fd5b50803590602001351515610e21565b005b3480156103a257600080fd5b50610394600480360360608110156103b957600080fd5b506001600160a01b03813581169160208101359091169060400135610f86565b3480156103e557600080fd5b506103ee61115b565b60408051918252519081900360200190f35b34801561040c57600080fd5b506103946004803603604081101561042357600080fd5b5080359060200135611161565b6103946004803603602081101561044657600080fd5b50356001600160801b03166112c0565b34801561046257600080fd5b506103ee6115bf565b34801561047757600080fd5b506103ee6115c5565b34801561048c57600080fd5b506103ee600480360360208110156104a357600080fd5b8101906020810181356401000000008111156104be57600080fd5b8201836020820111156104d057600080fd5b803590602001918460018302840111640100000000831117156104f257600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506115cb945050505050565b34801561053f57600080fd5b50610394600480360361014081101561055757600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e0810135906101008101359061012001356115e8565b3480156105af57600080fd5b506103ee6116b0565b3480156105c457600080fd5b506105fa600480360360408110156105db57600080fd5b5080356001600160a01b031690602001356001600160801b03166116b6565b604080519115158252519081900360200190f35b34801561061a57600080fd5b506105fa6004803603604081101561063157600080fd5b5080356001600160a01b031690602001356001600160801b0316611739565b34801561065c57600080fd5b506103ee6004803603604081101561067357600080fd5b5080356001600160a01b031690602001356001600160801b03166117b0565b34801561069e57600080fd5b50610394600480360360408110156106b557600080fd5b506001600160801b038135169060200135611822565b3480156106d757600080fd5b506105fa600480360360208110156106ee57600080fd5b50356001600160a01b0316611992565b6105fa6004803603606081101561071457600080fd5b506001600160801b03813516906020810135906040013515156119b9565b34801561073e57600080fd5b506103ee6004803603604081101561075557600080fd5b5080356001600160a01b031690602001356001600160801b0316611fa4565b34801561078057600080fd5b50610789611fb1565b604080516001600160a01b039092168252519081900360200190f35b3480156107b157600080fd5b506105fa600480360360408110156107c857600080fd5b5080356001600160a01b031690602001356001600160801b0316611fc0565b3480156107f357600080fd5b506103946004803603602081101561080a57600080fd5b5035611fe6565b34801561081d57600080fd5b506105fa6004803603604081101561083457600080fd5b5080356001600160a01b031690602001356001600160801b0316612135565b34801561085f57600080fd5b506103ee6121b5565b34801561087457600080fd5b506103946004803603602081101561088b57600080fd5b50356001600160a01b03166121bb565b3480156108a757600080fd5b506103ee6122b0565b3480156108bc57600080fd5b50610394600480360360208110156108d357600080fd5b50356122b6565b3480156108e657600080fd5b5061091c600480360360408110156108fd57600080fd5b5080356001600160a01b031690602001356001600160801b0316612412565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561095657818101518382015260200161093e565b50505050905090810190601f1680156109835780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561099d57600080fd5b506103ee61249c565b3480156109b257600080fd5b50610394600480360360408110156109c957600080fd5b50803590602001356124a2565b3480156109e257600080fd5b506103ee612601565b3480156109f757600080fd5b50610789612607565b348015610a0c57600080fd5b506103ee612616565b348015610a2157600080fd5b50610a4860048036036020811015610a3857600080fd5b50356001600160a01b031661261c565b604080516001600160801b039092168252519081900360200190f35b348015610a7057600080fd5b506103ee612637565b348015610a8557600080fd5b5061039460048036036020811015610a9c57600080fd5b503561263d565b348015610aaf57600080fd5b5061039460048036036060811015610ac657600080fd5b508035906020810135906040013561278c565b348015610ae557600080fd5b5061039460048036036020811015610afc57600080fd5b50356128ff565b348015610b0f57600080fd5b5061039460048036036020811015610b2657600080fd5b50356001600160a01b0316612ae8565b348015610b4257600080fd5b506103ee612c54565b348015610b5757600080fd5b506103ee612c5a565b348015610b6c57600080fd5b50610789612c60565b348015610b8157600080fd5b506103ee60048036036060811015610b9857600080fd5b506001600160a01b03813516906001600160801b036020820135169060400135612c6f565b348015610bc957600080fd5b5061039460048036036020811015610be057600080fd5b50356001600160a01b0316612e5e565b348015610bfc57600080fd5b506103ee60048036036020811015610c1357600080fd5b810190602081018135640100000000811115610c2e57600080fd5b820183602082011115610c4057600080fd5b80359060200191846001830284011164010000000083111715610c6257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612fdd945050505050565b61039460048036036020811015610cb957600080fd5b5035612ffa565b348015610ccc57600080fd5b506103ee61317d565b348015610ce157600080fd5b506103ee60048036036040811015610cf857600080fd5b506001600160a01b038135169060200135613183565b348015610d1a57600080fd5b506103ee6131e3565b348015610d2f57600080fd5b50610a486131e9565b348015610d4457600080fd5b506107896131f8565b348015610d5957600080fd5b5061039460048036036020811015610d7057600080fd5b5035613207565b610394613363565b348015610d8b57600080fd5b506103ee6136bc565b348015610da057600080fd5b506103ee6136c2565b348015610db557600080fd5b5061039460048036036020811015610dcc57600080fd5b50356136c8565b348015610ddf57600080fd5b5061039460048036036040811015610df657600080fd5b506001600160a01b038135169060200135613817565b348015610e1857600080fd5b506105fa613a42565b3460015b336000908152601760205260409020546001600160801b031661ffff821611610f80576000610e59338361ffff1687612c6f565b90506000600b54600a54830281610e6c57fe5b04905080841015610eb2576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b60408051630e6507e960e21b815261ffff85166004820152602481018890528615156044820152905130916339941fa491849160648082019260209290919082900301818588803b158015610f0657600080fd5b505af1158015610f1a573d6000803e3d6000fd5b50505050506040513d6020811015610f3157600080fd5b5051610f73576040805162461bcd60e51b815260206004820152600c60248201526b18db185a5b4819985a5b195960a21b604482015290519081900360640190fd5b9092039150600101610e25565b50505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fd257600080fd5b505afa158015610fe6573d6000803e3d6000fd5b505050506040513d6020811015610ffc57600080fd5b50516000546001600160a01b03161580611092575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561106557600080fd5b505afa158015611079573d6000803e3d6000fd5b505050506040513d602081101561108f57600080fd5b50515b6110cf576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b836001600160a01b031663a9059cbb84846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561112657600080fd5b505af115801561113a573d6000803e3d6000fd5b505050506040513d602081101561115057600080fd5b5051610f8057600080fd5b600a5481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ad57600080fd5b505afa1580156111c1573d6000803e3d6000fd5b505050506040513d60208110156111d757600080fd5b50516000546001600160a01b0316158061126d575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561124057600080fd5b505afa158015611254573d6000803e3d6000fd5b505050506040513d602081101561126a57600080fd5b50515b6112aa576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b816112b457600080fd5b50600591909155600655565b60003330146112cf57336112d1565b325b905060606112df8284612412565b90506112eb8284611739565b61132b576040805162461bcd60e51b815260206004820152600c60248201526b191bd95cdb9d08195e1a5cdd60a21b604482015290519081900360640190fd5b6113358284612135565b15611372576040805162461bcd60e51b8152602060048201526008602482015267746f6f206c61746560c01b604482015290519081900360640190fd5b61137c82846116b6565b156113b9576040805162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015290519081900360640190fd5b600e5434146113fd576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b6004546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015611436573d6000803e3d6000fd5b50600f546015826040518082805190602001908083835b6020831061146c5780518252601f19909201916020918201910161144d565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420548651950194601594879450925082918401908083835b602083106114cd5780518252601f1990920191602091820191016114ae565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902081905550816001600160a01b03167fd8722907e22bdf7371f82757663f42769580522cf1fc9af2c0740ac3135e9d508460016015856040518082805190602001908083835b602083106115645780518252601f199092019160209182019101611545565b51815160001960209485036101000a01908116901991909116179052920194855250604080519485900382018520546001600160801b03909716855294151590840152505080820192909252519081900360600190a2505050565b600f5481565b60065481565b805160208183018101805160168252928201919093012091525481565b600254600160a01b900460ff1615611633576040805162461bcd60e51b8152602060048201526009602482015268696e697420646f6e6560b81b604482015290519081900360640190fd5b600180546001600160a01b039b8c166001600160a01b0319918216179091556002805460059a909a55600698909855600c96909655600d94909455600e92909255600a91909155600b91909155600f55601380546001600160801b031916606417905560ff60a01b1993909416919093161716600160a01b179055565b60095481565b60008060156116c58585612412565b6040518082805190602001908083835b602083106116f45780518252601f1990920191602091820191016116d5565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054601454600f549081024301910110159695505050505050565b60008060156117488585612412565b6040518082805190602001908083835b602083106117775780518252601f199092019160209182019101611758565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549290921195945050505050565b600060156117be8484612412565b6040518082805190602001908083835b602083106117ed5780518252601f1990920191602091820191016117ce565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205495945050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561186e57600080fd5b505afa158015611882573d6000803e3d6000fd5b505050506040513d602081101561189857600080fd5b50516000546001600160a01b0316158061192e575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561190157600080fd5b505afa158015611915573d6000803e3d6000fd5b505050506040513d602081101561192b57600080fd5b50515b61196b576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50601380546001600160801b0319166001600160801b039390931692909217909155601455565b600061199f826001611739565b80156119b357506119b1826001612135565b155b92915050565b6000803330146119c957336119cb565b325b905060606119d98287612412565b905060006016826040518082805190602001908083835b60208310611a0f5780518252601f1990920191602091820191016119f0565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205415159150611aac9050576015826040518082805190602001908083835b60208310611a775780518252601f199092019160209182019101611a58565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150611b0e9050565b6016826040518082805190602001908083835b60208310611ade5780518252601f199092019160209182019101611abf565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150505b905060006015836040518082805190602001908083835b60208310611b445780518252601f199092019160209182019101611b25565b51815160001960209485036101000a019081169019919091161790529201948552506040519384900301909220549250505081611bb8576040805162461bcd60e51b815260206004820152600d60248201526c1b995d995c8818db185a5b5959609a1b604482015290519081900360640190fd5b43871115611bfd576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c696420626c6f636b60981b604482015290519081900360640190fd5b818711611c3c576040805162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015290519081900360640190fd5b600e5415611c8657600f5481018710611c86576040805162461bcd60e51b81526020600482015260076024820152667061792066656560c81b604482015290519081900360640190fd5b6000611c93858a8a612c6f565b905060008111611cd6576040805162461bcd60e51b81526020600482015260096024820152681b9bc81c995dd85c9960ba1b604482015290519081900360640190fd5b6000600b54600a54830281611ce757fe5b04905080341015611d2d576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b6004546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015611d66573d6000803e3d6000fd5b508715611e64576001546002546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b158015611dc657600080fd5b505af1158015611dda573d6000803e3d6000fd5b505050506040513d6020811015611df057600080fd5b5050600254604080516330d6a97560e01b81526001600160a01b03898116600483015260248201869052915191909216916330d6a97591604480830192600092919082900301818387803b158015611e4757600080fd5b505af1158015611e5b573d6000803e3d6000fd5b50505050611ee7565b6001546040805163a9059cbb60e01b81526001600160a01b038981166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611eba57600080fd5b505af1158015611ece573d6000803e3d6000fd5b505050506040513d6020811015611ee457600080fd5b50505b60108054839003905560405185518a91601691889190819060208401908083835b60208310611f275780518252601f199092019160209182019101611f08565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185209590955586845293516001600160a01b038b16947fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a948290030192509050a2600196505050505050505b9392505050565b6000611f9d838343612c6f565b6000546001600160a01b031681565b6000611fcc8383612135565b158015611f9d5750611fde83836116b6565b159392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561203257600080fd5b505afa158015612046573d6000803e3d6000fd5b505050506040513d602081101561205c57600080fd5b50516000546001600160a01b031615806120f2575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156120c557600080fd5b505afa1580156120d9573d6000803e3d6000fd5b505050506040513d60208110156120ef57600080fd5b50515b61212f576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600d55565b60008060156121448585612412565b6040518082805190602001908083835b602083106121735780518252601f199092019160209182019101612154565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054601254600f549091010143119695505050505050565b600c5481565b600080546001600160a01b03161580612250575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561222357600080fd5b505afa158015612237573d6000803e3d6000fd5b505050506040513d602081101561224d57600080fd5b50515b61228d576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b60075481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561230257600080fd5b505afa158015612316573d6000803e3d6000fd5b505050506040513d602081101561232c57600080fd5b50516000546001600160a01b031615806123c2575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561239557600080fd5b505afa1580156123a9573d6000803e3d6000fd5b505050506040513d60208110156123bf57600080fd5b50515b6123ff576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6000821161240c57600080fd5b50601255565b606060006001600160801b03831661244e576001600160a01b0384166000908152601760205260409020546001600160801b0316600101612450565b825b6040805160609690961b6bffffffffffffffffffffffff1916602087015260809190911b6001600160801b03191660348601528051808603602401815260449095019052509192915050565b600b5481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156124ee57600080fd5b505afa158015612502573d6000803e3d6000fd5b505050506040513d602081101561251857600080fd5b50516000546001600160a01b031615806125ae575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561258157600080fd5b505afa158015612595573d6000803e3d6000fd5b505050506040513d60208110156125ab57600080fd5b50515b6125eb576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b816125f557600080fd5b50600a91909155600b55565b600e5481565b6001546001600160a01b031681565b60055481565b6017602052600090815260409020546001600160801b031681565b60105481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561268957600080fd5b505afa15801561269d573d6000803e3d6000fd5b505050506040513d60208110156126b357600080fd5b50516000546001600160a01b03161580612749575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561271c57600080fd5b505afa158015612730573d6000803e3d6000fd5b505050506040513d602081101561274657600080fd5b50515b612786576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600c55565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127d857600080fd5b505afa1580156127ec573d6000803e3d6000fd5b505050506040513d602081101561280257600080fd5b50516000546001600160a01b03161580612898575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561286b57600080fd5b505afa15801561287f573d6000803e3d6000fd5b505050506040513d602081101561289557600080fd5b50515b6128d5576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b826128df57600080fd5b60078490556008839055816128f457436128f6565b815b60095550505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561294b57600080fd5b505afa15801561295f573d6000803e3d6000fd5b505050506040513d602081101561297557600080fd5b50516000546001600160a01b03161580612a0b575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156129de57600080fd5b505afa1580156129f2573d6000803e3d6000fd5b505050506040513d6020811015612a0857600080fd5b50515b612a48576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b60008211612a5557600080fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015612aaf57600080fd5b505af1158015612ac3573d6000803e3d6000fd5b505050506040513d6020811015612ad957600080fd5b50506010805490920190915550565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015612b3457600080fd5b505afa158015612b48573d6000803e3d6000fd5b505050506040513d6020811015612b5e57600080fd5b50516000546001600160a01b03161580612bf4575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015612bc757600080fd5b505afa158015612bdb573d6000803e3d6000fd5b505050506040513d6020811015612bf157600080fd5b50515b612c31576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b60115481565b60125481565b6004546001600160a01b031681565b60006060612c7d8585612412565b905060006016826040518082805190602001908083835b60208310612cb35780518252601f199092019160209182019101612c94565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205415159150612d509050576015826040518082805190602001908083835b60208310612d1b5780518252601f199092019160209182019101612cfc565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150612db29050565b6016826040518082805190602001908083835b60208310612d825780518252601f199092019160209182019101612d63565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150505b905043841115612dc757600092505050611f9d565b80612dd757600092505050611f9d565b80841015612dea57600092505050611f9d565b612df2613b5c565b612dff8260095487613a52565b905060008060065411612e13576000612e25565b60065460055483510281612e2357fe5b045b905060008060085411612e39576000612e4e565b60085460075460208501510281612e4c57fe5b045b9190910198975050505050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015612eaa57600080fd5b505afa158015612ebe573d6000803e3d6000fd5b505050506040513d6020811015612ed457600080fd5b50516000546001600160a01b03161580612f6a575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015612f3d57600080fd5b505afa158015612f51573d6000803e3d6000fd5b505050506040513d6020811015612f6757600080fd5b50515b612fa7576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6001600160a01b038216612fba57600080fd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055565b805160208183018101805160158252928201919093012091525481565b6000811161303f576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c69642076616c756560981b604482015290519081900360640190fd5b80600e54023414613085576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b60015b336000908152601760205260409020546001600160801b031661ffff821611613136576130b9338261ffff16611fc0565b6130c25761312e565b306001600160a01b0316630f694584600e54836040518363ffffffff1660e01b8152600401808261ffff1681526020019150506000604051808303818588803b15801561310e57600080fd5b505af1158015613122573d6000803e3d6000fd5b50505050506001820391505b600101613088565b50801561317a576040805162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a590818dbdd5b9d609a1b604482015290519081900360640190fd5b50565b600d5481565b60008060015b6001600160a01b0385166000908152601760205260409020546001600160801b03908116908216116131db576131cf8582600087116131c857436131ca565b865b612c6f565b90910190600101613189565b509392505050565b60035481565b6013546001600160801b031681565b6002546001600160a01b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561325357600080fd5b505afa158015613267573d6000803e3d6000fd5b505050506040513d602081101561327d57600080fd5b50516000546001600160a01b03161580613313575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156132e657600080fd5b505afa1580156132fa573d6000803e3d6000fd5b505050506040513d602081101561331057600080fd5b50515b613350576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6000821161335d57600080fd5b50600f55565b601354336000908152601760205260409020546001600160801b039182169116106133c5576040805162461bcd60e51b815260206004820152600d60248201526c1b1a5b5a5d081c995858da1959609a1b604482015290519081900360640190fd5b600c543414613409576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b336000818152601760205260409020546001600160801b0316600101906060906134339083612412565b600380546001019055604051815191925043916015918491819060208401908083835b602083106134755780518252601f199092019160209182019101613456565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842094909455505082514392601692859290918291908401908083835b602083106134da5780518252601f1990920191602091820191016134bb565b51815160001960209485036101000a0190811690199190911617905292019485525060408051948590038201852095909555336000908152601790915293842080546001600160801b03808216600101166001600160801b031990911617905550506004546001600160a01b0316913480156108fc02929091818181858888f19350505050158015613570573d6000803e3d6000fd5b5060015460048054600d54604080516323b872dd60e01b815233948101949094526001600160a01b0392831660248501526044840191909152519216916323b872dd916064808201926020929091908290030181600087803b1580156135d557600080fd5b505af11580156135e9573d6000803e3d6000fd5b505050506040513d60208110156135ff57600080fd5b5050600f54604051825133927fd8722907e22bdf7371f82757663f42769580522cf1fc9af2c0740ac3135e9d5092869260009291601591889190819060208401908083835b602083106136635780518252601f199092019160209182019101613644565b51815160001960209485036101000a01908116901991909116179052920194855250604080519485900382018520546001600160801b039098168552951515908401525050920182820152519081900360600190a25050565b60085481565b60145481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561371457600080fd5b505afa158015613728573d6000803e3d6000fd5b505050506040513d602081101561373e57600080fd5b50516000546001600160a01b031615806137d4575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156137a757600080fd5b505afa1580156137bb573d6000803e3d6000fd5b505050506040513d60208110156137d157600080fd5b50515b613811576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600e55565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561386357600080fd5b505afa158015613877573d6000803e3d6000fd5b505050506040513d602081101561388d57600080fd5b50516000546001600160a01b03161580613923575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156138f657600080fd5b505afa15801561390a573d6000803e3d6000fd5b505050506040513d602081101561392057600080fd5b50515b613960576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6000821161396d57600080fd5b8160105410156139b1576040805162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b604482015290519081900360640190fd5b6001546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015613a0757600080fd5b505af1158015613a1b573d6000803e3d6000fd5b505050506040513d6020811015613a3157600080fd5b505060108054929092039091555050565b600254600160a01b900460ff1681565b613a5a613b5c565b818410613a7b57506040805180820190915260008082526020820152611f9d565b8282111580613a88575082155b15613ab3576040805180820190915280613aa28487613aff565b815260200160008152509050611f9d565b828410613adf57604080518082019091526000815260208101613ad68487613aff565b90529050611f9d565b6040805180820190915280613af48587613aff565b8152602001613ad684865b600082821115613b56576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6040518060400160405280600290602082028036833750919291505056fea2646970667358221220ae9d26f54326d62b8f66b31156e63e997d7ca2e2f3580e98261ece0682cf601264736f6c634300060c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.