Feature Tip: Add private address tag to any address under My Name Tag !
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 | 12924074 | 1214 days ago | IN | 0 ETH | 0.14421418 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NodesV1
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 "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "./interfaces/IERC1155Preset.sol"; import "./interfaces/StrongPoolInterface.sol"; import "./lib/AdminAccessControl.sol"; import "./lib/rewards.sol"; contract NodesV1 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; } }
// 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/AdminControlInterface.sol"; abstract contract AdminAccessControl { AdminControlInterface 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 = AdminControlInterface(_contract); } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "@openzeppelin/contracts/math/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.12; interface AdminControlInterface { 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 <0.8.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", "abi" ] } }, "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 AdminControlInterface","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":[],"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"}]
Contract Creation Code
608060405234801561001057600080fd5b506137c3806100206000396000f3fe6080604052600436106103345760003560e01c80639162c594116101ab578063d48ba486116100f7578063e877db1a11610095578063f28b039e1161006f578063f28b039e14610ce8578063f3368f9014610cfd578063f3fef3a314610d27578063fed0a20e14610d6057610334565b8063e877db1a14610ca1578063eb2f481714610ccb578063ed5998da14610cd357610334565b8063da7169b3116100d1578063da7169b314610c29578063dc0bbf0814610c62578063ddf0185f14610c77578063e195232e14610c8c57610334565b8063d48ba48614610b44578063d4aadbc614610bf7578063d9df77de14610c1457610334565b8063b0e8a45d11610164578063c3d5864f1161013e578063c3d5864f14610a9f578063c415b95c14610ab4578063c8b81e1514610ac9578063d2c35ce814610b1157610334565b8063b0e8a45d14610a2a578063b6b55f2514610a60578063c2b2fdca14610a8a57610334565b80639162c5941461095d578063965d61b91461097257806399e6f70014610987578063a77e28251461099c578063aa5c3ab4146109eb578063ae749c4214610a0057610334565b806334dce6b3116102855780636f300155116102235780637ba90928116101fd5780637ba90928146108375780638123fdbb1461086157806387f48f4e146109185780638aa9a37f1461092d57610334565b80636f300155146107da5780637a0b9255146107ef5780637a5d5cf41461082257610334565b8063555d3e631161025f578063555d3e63146106fb5780635c4f18fa1461072c578063623ef9101461076e5780636c52ec101461079857610334565b806334dce6b31461065257806339941fa4146106855780633bb58b67146106b957610334565b806319a1f5ae116102f2578063255ebc8d116102cc578063255ebc8d1461053f5780632666556214610595578063268e5e4f146105d7578063326f10731461061957610334565b806319a1f5ae146104075780631ce7aff9146104ba5780631d851bbd1461052a57610334565b8062a469171461033957806309a07fd2146103605780630a8d1be2146103875780630f694584146103b75780630fe48b36146103dd57806319885898146103f2575b600080fd5b61035e6004803603604081101561034f57600080fd5b50803590602001351515610d75565b005b34801561036c57600080fd5b50610375610eda565b60408051918252519081900360200190f35b34801561039357600080fd5b5061035e600480360360408110156103aa57600080fd5b5080359060200135610ee0565b61035e600480360360208110156103cd57600080fd5b50356001600160801b031661103f565b3480156103e957600080fd5b5061037561133e565b3480156103fe57600080fd5b50610375611344565b34801561041357600080fd5b506103756004803603602081101561042a57600080fd5b81019060208101813564010000000081111561044557600080fd5b82018360208201111561045757600080fd5b8035906020019184600183028401116401000000008311171561047957600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061134a945050505050565b3480156104c657600080fd5b5061035e60048036036101408110156104de57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e081013590610100810135906101200135611367565b34801561053657600080fd5b5061037561142f565b34801561054b57600080fd5b506105816004803603604081101561056257600080fd5b5080356001600160a01b031690602001356001600160801b0316611435565b604080519115158252519081900360200190f35b3480156105a157600080fd5b50610581600480360360408110156105b857600080fd5b5080356001600160a01b031690602001356001600160801b03166114b8565b3480156105e357600080fd5b50610375600480360360408110156105fa57600080fd5b5080356001600160a01b031690602001356001600160801b031661152f565b34801561062557600080fd5b5061035e6004803603604081101561063c57600080fd5b506001600160801b0381351690602001356115a1565b34801561065e57600080fd5b506105816004803603602081101561067557600080fd5b50356001600160a01b0316611711565b6105816004803603606081101561069b57600080fd5b506001600160801b0381351690602081013590604001351515611738565b3480156106c557600080fd5b50610375600480360360408110156106dc57600080fd5b5080356001600160a01b031690602001356001600160801b0316611d23565b34801561070757600080fd5b50610710611d30565b604080516001600160a01b039092168252519081900360200190f35b34801561073857600080fd5b506105816004803603604081101561074f57600080fd5b5080356001600160a01b031690602001356001600160801b0316611d3f565b34801561077a57600080fd5b5061035e6004803603602081101561079157600080fd5b5035611d65565b3480156107a457600080fd5b50610581600480360360408110156107bb57600080fd5b5080356001600160a01b031690602001356001600160801b0316611eb4565b3480156107e657600080fd5b50610375611f34565b3480156107fb57600080fd5b5061035e6004803603602081101561081257600080fd5b50356001600160a01b0316611f3a565b34801561082e57600080fd5b5061037561202f565b34801561084357600080fd5b5061035e6004803603602081101561085a57600080fd5b5035612035565b34801561086d57600080fd5b506108a36004803603604081101561088457600080fd5b5080356001600160a01b031690602001356001600160801b0316612191565b6040805160208082528351818301528351919283929083019185019080838360005b838110156108dd5781810151838201526020016108c5565b50505050905090810190601f16801561090a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561092457600080fd5b5061037561221b565b34801561093957600080fd5b5061035e6004803603604081101561095057600080fd5b5080359060200135612221565b34801561096957600080fd5b50610375612380565b34801561097e57600080fd5b50610710612386565b34801561099357600080fd5b50610375612395565b3480156109a857600080fd5b506109cf600480360360208110156109bf57600080fd5b50356001600160a01b031661239b565b604080516001600160801b039092168252519081900360200190f35b3480156109f757600080fd5b506103756123b6565b348015610a0c57600080fd5b5061035e60048036036020811015610a2357600080fd5b50356123bc565b348015610a3657600080fd5b5061035e60048036036060811015610a4d57600080fd5b508035906020810135906040013561250b565b348015610a6c57600080fd5b5061035e60048036036020811015610a8357600080fd5b503561267e565b348015610a9657600080fd5b50610375612867565b348015610aab57600080fd5b5061037561286d565b348015610ac057600080fd5b50610710612873565b348015610ad557600080fd5b5061037560048036036060811015610aec57600080fd5b506001600160a01b03813516906001600160801b036020820135169060400135612882565b348015610b1d57600080fd5b5061035e60048036036020811015610b3457600080fd5b50356001600160a01b0316612a71565b348015610b5057600080fd5b5061037560048036036020811015610b6757600080fd5b810190602081018135640100000000811115610b8257600080fd5b820183602082011115610b9457600080fd5b80359060200191846001830284011164010000000083111715610bb657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612bf0945050505050565b61035e60048036036020811015610c0d57600080fd5b5035612c0d565b348015610c2057600080fd5b50610375612d90565b348015610c3557600080fd5b5061037560048036036040811015610c4c57600080fd5b506001600160a01b038135169060200135612d96565b348015610c6e57600080fd5b50610375612df6565b348015610c8357600080fd5b506109cf612dfc565b348015610c9857600080fd5b50610710612e0b565b348015610cad57600080fd5b5061035e60048036036020811015610cc457600080fd5b5035612e1a565b61035e612f76565b348015610cdf57600080fd5b506103756132cf565b348015610cf457600080fd5b506103756132d5565b348015610d0957600080fd5b5061035e60048036036020811015610d2057600080fd5b50356132db565b348015610d3357600080fd5b5061035e60048036036040811015610d4a57600080fd5b506001600160a01b03813516906020013561342a565b348015610d6c57600080fd5b50610581613655565b3460015b336000908152601760205260409020546001600160801b031661ffff821611610ed4576000610dad338361ffff1687612882565b90506000600b54600a54830281610dc057fe5b04905080841015610e06576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b60408051630e6507e960e21b815261ffff85166004820152602481018890528615156044820152905130916339941fa491849160648082019260209290919082900301818588803b158015610e5a57600080fd5b505af1158015610e6e573d6000803e3d6000fd5b50505050506040513d6020811015610e8557600080fd5b5051610ec7576040805162461bcd60e51b815260206004820152600c60248201526b18db185a5b4819985a5b195960a21b604482015290519081900360640190fd5b9092039150600101610d79565b50505050565b600a5481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2c57600080fd5b505afa158015610f40573d6000803e3d6000fd5b505050506040513d6020811015610f5657600080fd5b50516000546001600160a01b03161580610fec575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015610fbf57600080fd5b505afa158015610fd3573d6000803e3d6000fd5b505050506040513d6020811015610fe957600080fd5b50515b611029576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b8161103357600080fd5b50600591909155600655565b600033301461104e5733611050565b325b9050606061105e8284612191565b905061106a82846114b8565b6110aa576040805162461bcd60e51b815260206004820152600c60248201526b191bd95cdb9d08195e1a5cdd60a21b604482015290519081900360640190fd5b6110b48284611eb4565b156110f1576040805162461bcd60e51b8152602060048201526008602482015267746f6f206c61746560c01b604482015290519081900360640190fd5b6110fb8284611435565b15611138576040805162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015290519081900360640190fd5b600e54341461117c576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b6004546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156111b5573d6000803e3d6000fd5b50600f546015826040518082805190602001908083835b602083106111eb5780518252601f1990920191602091820191016111cc565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420548651950194601594879450925082918401908083835b6020831061124c5780518252601f19909201916020918201910161122d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902081905550816001600160a01b03167fd8722907e22bdf7371f82757663f42769580522cf1fc9af2c0740ac3135e9d508460016015856040518082805190602001908083835b602083106112e35780518252601f1990920191602091820191016112c4565b51815160001960209485036101000a01908116901991909116179052920194855250604080519485900382018520546001600160801b03909716855294151590840152505080820192909252519081900360600190a2505050565b600f5481565b60065481565b805160208183018101805160168252928201919093012091525481565b600254600160a01b900460ff16156113b2576040805162461bcd60e51b8152602060048201526009602482015268696e697420646f6e6560b81b604482015290519081900360640190fd5b600180546001600160a01b039b8c166001600160a01b0319918216179091556002805460059a909a55600698909855600c96909655600d94909455600e92909255600a91909155600b91909155600f55601380546001600160801b031916606417905560ff60a01b1993909416919093161716600160a01b179055565b60095481565b60008060156114448585612191565b6040518082805190602001908083835b602083106114735780518252601f199092019160209182019101611454565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054601454600f549081024301910110159695505050505050565b60008060156114c78585612191565b6040518082805190602001908083835b602083106114f65780518252601f1990920191602091820191016114d7565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549290921195945050505050565b6000601561153d8484612191565b6040518082805190602001908083835b6020831061156c5780518252601f19909201916020918201910161154d565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205495945050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115ed57600080fd5b505afa158015611601573d6000803e3d6000fd5b505050506040513d602081101561161757600080fd5b50516000546001600160a01b031615806116ad575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561168057600080fd5b505afa158015611694573d6000803e3d6000fd5b505050506040513d60208110156116aa57600080fd5b50515b6116ea576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50601380546001600160801b0319166001600160801b039390931692909217909155601455565b600061171e8260016114b8565b80156117325750611730826001611eb4565b155b92915050565b600080333014611748573361174a565b325b905060606117588287612191565b905060006016826040518082805190602001908083835b6020831061178e5780518252601f19909201916020918201910161176f565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220541515915061182b9050576015826040518082805190602001908083835b602083106117f65780518252601f1990920191602091820191016117d7565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054915061188d9050565b6016826040518082805190602001908083835b6020831061185d5780518252601f19909201916020918201910161183e565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150505b905060006015836040518082805190602001908083835b602083106118c35780518252601f1990920191602091820191016118a4565b51815160001960209485036101000a019081169019919091161790529201948552506040519384900301909220549250505081611937576040805162461bcd60e51b815260206004820152600d60248201526c1b995d995c8818db185a5b5959609a1b604482015290519081900360640190fd5b4387111561197c576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c696420626c6f636b60981b604482015290519081900360640190fd5b8187116119bb576040805162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015290519081900360640190fd5b600e5415611a0557600f5481018710611a05576040805162461bcd60e51b81526020600482015260076024820152667061792066656560c81b604482015290519081900360640190fd5b6000611a12858a8a612882565b905060008111611a55576040805162461bcd60e51b81526020600482015260096024820152681b9bc81c995dd85c9960ba1b604482015290519081900360640190fd5b6000600b54600a54830281611a6657fe5b04905080341015611aac576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b6004546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015611ae5573d6000803e3d6000fd5b508715611be3576001546002546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b158015611b4557600080fd5b505af1158015611b59573d6000803e3d6000fd5b505050506040513d6020811015611b6f57600080fd5b5050600254604080516330d6a97560e01b81526001600160a01b03898116600483015260248201869052915191909216916330d6a97591604480830192600092919082900301818387803b158015611bc657600080fd5b505af1158015611bda573d6000803e3d6000fd5b50505050611c66565b6001546040805163a9059cbb60e01b81526001600160a01b038981166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611c3957600080fd5b505af1158015611c4d573d6000803e3d6000fd5b505050506040513d6020811015611c6357600080fd5b50505b60108054839003905560405185518a91601691889190819060208401908083835b60208310611ca65780518252601f199092019160209182019101611c87565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185209590955586845293516001600160a01b038b16947fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a948290030192509050a2600196505050505050505b9392505050565b6000611d1c838343612882565b6000546001600160a01b031681565b6000611d4b8383611eb4565b158015611d1c5750611d5d8383611435565b159392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015611db157600080fd5b505afa158015611dc5573d6000803e3d6000fd5b505050506040513d6020811015611ddb57600080fd5b50516000546001600160a01b03161580611e71575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015611e4457600080fd5b505afa158015611e58573d6000803e3d6000fd5b505050506040513d6020811015611e6e57600080fd5b50515b611eae576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600d55565b6000806015611ec38585612191565b6040518082805190602001908083835b60208310611ef25780518252601f199092019160209182019101611ed3565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054601254600f549091010143119695505050505050565b600c5481565b600080546001600160a01b03161580611fcf575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015611fa257600080fd5b505afa158015611fb6573d6000803e3d6000fd5b505050506040513d6020811015611fcc57600080fd5b50515b61200c576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b60075481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561208157600080fd5b505afa158015612095573d6000803e3d6000fd5b505050506040513d60208110156120ab57600080fd5b50516000546001600160a01b03161580612141575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561211457600080fd5b505afa158015612128573d6000803e3d6000fd5b505050506040513d602081101561213e57600080fd5b50515b61217e576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6000821161218b57600080fd5b50601255565b606060006001600160801b0383166121cd576001600160a01b0384166000908152601760205260409020546001600160801b03166001016121cf565b825b6040805160609690961b6bffffffffffffffffffffffff1916602087015260809190911b6001600160801b03191660348601528051808603602401815260449095019052509192915050565b600b5481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561226d57600080fd5b505afa158015612281573d6000803e3d6000fd5b505050506040513d602081101561229757600080fd5b50516000546001600160a01b0316158061232d575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561230057600080fd5b505afa158015612314573d6000803e3d6000fd5b505050506040513d602081101561232a57600080fd5b50515b61236a576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b8161237457600080fd5b50600a91909155600b55565b600e5481565b6001546001600160a01b031681565b60055481565b6017602052600090815260409020546001600160801b031681565b60105481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561240857600080fd5b505afa15801561241c573d6000803e3d6000fd5b505050506040513d602081101561243257600080fd5b50516000546001600160a01b031615806124c8575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561249b57600080fd5b505afa1580156124af573d6000803e3d6000fd5b505050506040513d60208110156124c557600080fd5b50515b612505576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600c55565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561255757600080fd5b505afa15801561256b573d6000803e3d6000fd5b505050506040513d602081101561258157600080fd5b50516000546001600160a01b03161580612617575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156125ea57600080fd5b505afa1580156125fe573d6000803e3d6000fd5b505050506040513d602081101561261457600080fd5b50515b612654576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b8261265e57600080fd5b60078490556008839055816126735743612675565b815b60095550505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156126ca57600080fd5b505afa1580156126de573d6000803e3d6000fd5b505050506040513d60208110156126f457600080fd5b50516000546001600160a01b0316158061278a575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561275d57600080fd5b505afa158015612771573d6000803e3d6000fd5b505050506040513d602081101561278757600080fd5b50515b6127c7576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b600082116127d457600080fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561282e57600080fd5b505af1158015612842573d6000803e3d6000fd5b505050506040513d602081101561285857600080fd5b50506010805490920190915550565b60115481565b60125481565b6004546001600160a01b031681565b600060606128908585612191565b905060006016826040518082805190602001908083835b602083106128c65780518252601f1990920191602091820191016128a7565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054151591506129639050576015826040518082805190602001908083835b6020831061292e5780518252601f19909201916020918201910161290f565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205491506129c59050565b6016826040518082805190602001908083835b602083106129955780518252601f199092019160209182019101612976565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150505b9050438411156129da57600092505050611d1c565b806129ea57600092505050611d1c565b808410156129fd57600092505050611d1c565b612a0561376f565b612a128260095487613665565b905060008060065411612a26576000612a38565b60065460055483510281612a3657fe5b045b905060008060085411612a4c576000612a61565b60085460075460208501510281612a5f57fe5b045b9190910198975050505050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015612abd57600080fd5b505afa158015612ad1573d6000803e3d6000fd5b505050506040513d6020811015612ae757600080fd5b50516000546001600160a01b03161580612b7d575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015612b5057600080fd5b505afa158015612b64573d6000803e3d6000fd5b505050506040513d6020811015612b7a57600080fd5b50515b612bba576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6001600160a01b038216612bcd57600080fd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055565b805160208183018101805160158252928201919093012091525481565b60008111612c52576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c69642076616c756560981b604482015290519081900360640190fd5b80600e54023414612c98576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b60015b336000908152601760205260409020546001600160801b031661ffff821611612d4957612ccc338261ffff16611d3f565b612cd557612d41565b306001600160a01b0316630f694584600e54836040518363ffffffff1660e01b8152600401808261ffff1681526020019150506000604051808303818588803b158015612d2157600080fd5b505af1158015612d35573d6000803e3d6000fd5b50505050506001820391505b600101612c9b565b508015612d8d576040805162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a590818dbdd5b9d609a1b604482015290519081900360640190fd5b50565b600d5481565b60008060015b6001600160a01b0385166000908152601760205260409020546001600160801b0390811690821611612dee57612de2858260008711612ddb5743612ddd565b865b612882565b90910190600101612d9c565b509392505050565b60035481565b6013546001600160801b031681565b6002546001600160a01b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e6657600080fd5b505afa158015612e7a573d6000803e3d6000fd5b505050506040513d6020811015612e9057600080fd5b50516000546001600160a01b03161580612f26575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015612ef957600080fd5b505afa158015612f0d573d6000803e3d6000fd5b505050506040513d6020811015612f2357600080fd5b50515b612f63576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b60008211612f7057600080fd5b50600f55565b601354336000908152601760205260409020546001600160801b03918216911610612fd8576040805162461bcd60e51b815260206004820152600d60248201526c1b1a5b5a5d081c995858da1959609a1b604482015290519081900360640190fd5b600c54341461301c576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b336000818152601760205260409020546001600160801b0316600101906060906130469083612191565b600380546001019055604051815191925043916015918491819060208401908083835b602083106130885780518252601f199092019160209182019101613069565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842094909455505082514392601692859290918291908401908083835b602083106130ed5780518252601f1990920191602091820191016130ce565b51815160001960209485036101000a0190811690199190911617905292019485525060408051948590038201852095909555336000908152601790915293842080546001600160801b03808216600101166001600160801b031990911617905550506004546001600160a01b0316913480156108fc02929091818181858888f19350505050158015613183573d6000803e3d6000fd5b5060015460048054600d54604080516323b872dd60e01b815233948101949094526001600160a01b0392831660248501526044840191909152519216916323b872dd916064808201926020929091908290030181600087803b1580156131e857600080fd5b505af11580156131fc573d6000803e3d6000fd5b505050506040513d602081101561321257600080fd5b5050600f54604051825133927fd8722907e22bdf7371f82757663f42769580522cf1fc9af2c0740ac3135e9d5092869260009291601591889190819060208401908083835b602083106132765780518252601f199092019160209182019101613257565b51815160001960209485036101000a01908116901991909116179052920194855250604080519485900382018520546001600160801b039098168552951515908401525050920182820152519081900360600190a25050565b60085481565b60145481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561332757600080fd5b505afa15801561333b573d6000803e3d6000fd5b505050506040513d602081101561335157600080fd5b50516000546001600160a01b031615806133e7575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156133ba57600080fd5b505afa1580156133ce573d6000803e3d6000fd5b505050506040513d60208110156133e457600080fd5b50515b613424576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600e55565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561347657600080fd5b505afa15801561348a573d6000803e3d6000fd5b505050506040513d60208110156134a057600080fd5b50516000546001600160a01b03161580613536575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561350957600080fd5b505afa15801561351d573d6000803e3d6000fd5b505050506040513d602081101561353357600080fd5b50515b613573576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6000821161358057600080fd5b8160105410156135c4576040805162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b604482015290519081900360640190fd5b6001546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561361a57600080fd5b505af115801561362e573d6000803e3d6000fd5b505050506040513d602081101561364457600080fd5b505060108054929092039091555050565b600254600160a01b900460ff1681565b61366d61376f565b81841061368e57506040805180820190915260008082526020820152611d1c565b828211158061369b575082155b156136c65760408051808201909152806136b58487613712565b815260200160008152509050611d1c565b8284106136f2576040805180820190915260008152602081016136e98487613712565b90529050611d1c565b60408051808201909152806137078587613712565b81526020016136e984865b600082821115613769576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6040518060400160405280600290602082028036833750919291505056fea26469706673582212204b794022f2ec2b5abeddb17d358c4ba84946d0c28375abb8f9869f34c274269d64736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106103345760003560e01c80639162c594116101ab578063d48ba486116100f7578063e877db1a11610095578063f28b039e1161006f578063f28b039e14610ce8578063f3368f9014610cfd578063f3fef3a314610d27578063fed0a20e14610d6057610334565b8063e877db1a14610ca1578063eb2f481714610ccb578063ed5998da14610cd357610334565b8063da7169b3116100d1578063da7169b314610c29578063dc0bbf0814610c62578063ddf0185f14610c77578063e195232e14610c8c57610334565b8063d48ba48614610b44578063d4aadbc614610bf7578063d9df77de14610c1457610334565b8063b0e8a45d11610164578063c3d5864f1161013e578063c3d5864f14610a9f578063c415b95c14610ab4578063c8b81e1514610ac9578063d2c35ce814610b1157610334565b8063b0e8a45d14610a2a578063b6b55f2514610a60578063c2b2fdca14610a8a57610334565b80639162c5941461095d578063965d61b91461097257806399e6f70014610987578063a77e28251461099c578063aa5c3ab4146109eb578063ae749c4214610a0057610334565b806334dce6b3116102855780636f300155116102235780637ba90928116101fd5780637ba90928146108375780638123fdbb1461086157806387f48f4e146109185780638aa9a37f1461092d57610334565b80636f300155146107da5780637a0b9255146107ef5780637a5d5cf41461082257610334565b8063555d3e631161025f578063555d3e63146106fb5780635c4f18fa1461072c578063623ef9101461076e5780636c52ec101461079857610334565b806334dce6b31461065257806339941fa4146106855780633bb58b67146106b957610334565b806319a1f5ae116102f2578063255ebc8d116102cc578063255ebc8d1461053f5780632666556214610595578063268e5e4f146105d7578063326f10731461061957610334565b806319a1f5ae146104075780631ce7aff9146104ba5780631d851bbd1461052a57610334565b8062a469171461033957806309a07fd2146103605780630a8d1be2146103875780630f694584146103b75780630fe48b36146103dd57806319885898146103f2575b600080fd5b61035e6004803603604081101561034f57600080fd5b50803590602001351515610d75565b005b34801561036c57600080fd5b50610375610eda565b60408051918252519081900360200190f35b34801561039357600080fd5b5061035e600480360360408110156103aa57600080fd5b5080359060200135610ee0565b61035e600480360360208110156103cd57600080fd5b50356001600160801b031661103f565b3480156103e957600080fd5b5061037561133e565b3480156103fe57600080fd5b50610375611344565b34801561041357600080fd5b506103756004803603602081101561042a57600080fd5b81019060208101813564010000000081111561044557600080fd5b82018360208201111561045757600080fd5b8035906020019184600183028401116401000000008311171561047957600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061134a945050505050565b3480156104c657600080fd5b5061035e60048036036101408110156104de57600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e081013590610100810135906101200135611367565b34801561053657600080fd5b5061037561142f565b34801561054b57600080fd5b506105816004803603604081101561056257600080fd5b5080356001600160a01b031690602001356001600160801b0316611435565b604080519115158252519081900360200190f35b3480156105a157600080fd5b50610581600480360360408110156105b857600080fd5b5080356001600160a01b031690602001356001600160801b03166114b8565b3480156105e357600080fd5b50610375600480360360408110156105fa57600080fd5b5080356001600160a01b031690602001356001600160801b031661152f565b34801561062557600080fd5b5061035e6004803603604081101561063c57600080fd5b506001600160801b0381351690602001356115a1565b34801561065e57600080fd5b506105816004803603602081101561067557600080fd5b50356001600160a01b0316611711565b6105816004803603606081101561069b57600080fd5b506001600160801b0381351690602081013590604001351515611738565b3480156106c557600080fd5b50610375600480360360408110156106dc57600080fd5b5080356001600160a01b031690602001356001600160801b0316611d23565b34801561070757600080fd5b50610710611d30565b604080516001600160a01b039092168252519081900360200190f35b34801561073857600080fd5b506105816004803603604081101561074f57600080fd5b5080356001600160a01b031690602001356001600160801b0316611d3f565b34801561077a57600080fd5b5061035e6004803603602081101561079157600080fd5b5035611d65565b3480156107a457600080fd5b50610581600480360360408110156107bb57600080fd5b5080356001600160a01b031690602001356001600160801b0316611eb4565b3480156107e657600080fd5b50610375611f34565b3480156107fb57600080fd5b5061035e6004803603602081101561081257600080fd5b50356001600160a01b0316611f3a565b34801561082e57600080fd5b5061037561202f565b34801561084357600080fd5b5061035e6004803603602081101561085a57600080fd5b5035612035565b34801561086d57600080fd5b506108a36004803603604081101561088457600080fd5b5080356001600160a01b031690602001356001600160801b0316612191565b6040805160208082528351818301528351919283929083019185019080838360005b838110156108dd5781810151838201526020016108c5565b50505050905090810190601f16801561090a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561092457600080fd5b5061037561221b565b34801561093957600080fd5b5061035e6004803603604081101561095057600080fd5b5080359060200135612221565b34801561096957600080fd5b50610375612380565b34801561097e57600080fd5b50610710612386565b34801561099357600080fd5b50610375612395565b3480156109a857600080fd5b506109cf600480360360208110156109bf57600080fd5b50356001600160a01b031661239b565b604080516001600160801b039092168252519081900360200190f35b3480156109f757600080fd5b506103756123b6565b348015610a0c57600080fd5b5061035e60048036036020811015610a2357600080fd5b50356123bc565b348015610a3657600080fd5b5061035e60048036036060811015610a4d57600080fd5b508035906020810135906040013561250b565b348015610a6c57600080fd5b5061035e60048036036020811015610a8357600080fd5b503561267e565b348015610a9657600080fd5b50610375612867565b348015610aab57600080fd5b5061037561286d565b348015610ac057600080fd5b50610710612873565b348015610ad557600080fd5b5061037560048036036060811015610aec57600080fd5b506001600160a01b03813516906001600160801b036020820135169060400135612882565b348015610b1d57600080fd5b5061035e60048036036020811015610b3457600080fd5b50356001600160a01b0316612a71565b348015610b5057600080fd5b5061037560048036036020811015610b6757600080fd5b810190602081018135640100000000811115610b8257600080fd5b820183602082011115610b9457600080fd5b80359060200191846001830284011164010000000083111715610bb657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612bf0945050505050565b61035e60048036036020811015610c0d57600080fd5b5035612c0d565b348015610c2057600080fd5b50610375612d90565b348015610c3557600080fd5b5061037560048036036040811015610c4c57600080fd5b506001600160a01b038135169060200135612d96565b348015610c6e57600080fd5b50610375612df6565b348015610c8357600080fd5b506109cf612dfc565b348015610c9857600080fd5b50610710612e0b565b348015610cad57600080fd5b5061035e60048036036020811015610cc457600080fd5b5035612e1a565b61035e612f76565b348015610cdf57600080fd5b506103756132cf565b348015610cf457600080fd5b506103756132d5565b348015610d0957600080fd5b5061035e60048036036020811015610d2057600080fd5b50356132db565b348015610d3357600080fd5b5061035e60048036036040811015610d4a57600080fd5b506001600160a01b03813516906020013561342a565b348015610d6c57600080fd5b50610581613655565b3460015b336000908152601760205260409020546001600160801b031661ffff821611610ed4576000610dad338361ffff1687612882565b90506000600b54600a54830281610dc057fe5b04905080841015610e06576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b60408051630e6507e960e21b815261ffff85166004820152602481018890528615156044820152905130916339941fa491849160648082019260209290919082900301818588803b158015610e5a57600080fd5b505af1158015610e6e573d6000803e3d6000fd5b50505050506040513d6020811015610e8557600080fd5b5051610ec7576040805162461bcd60e51b815260206004820152600c60248201526b18db185a5b4819985a5b195960a21b604482015290519081900360640190fd5b9092039150600101610d79565b50505050565b600a5481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2c57600080fd5b505afa158015610f40573d6000803e3d6000fd5b505050506040513d6020811015610f5657600080fd5b50516000546001600160a01b03161580610fec575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015610fbf57600080fd5b505afa158015610fd3573d6000803e3d6000fd5b505050506040513d6020811015610fe957600080fd5b50515b611029576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b8161103357600080fd5b50600591909155600655565b600033301461104e5733611050565b325b9050606061105e8284612191565b905061106a82846114b8565b6110aa576040805162461bcd60e51b815260206004820152600c60248201526b191bd95cdb9d08195e1a5cdd60a21b604482015290519081900360640190fd5b6110b48284611eb4565b156110f1576040805162461bcd60e51b8152602060048201526008602482015267746f6f206c61746560c01b604482015290519081900360640190fd5b6110fb8284611435565b15611138576040805162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015290519081900360640190fd5b600e54341461117c576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b6004546040516001600160a01b03909116903480156108fc02916000818181858888f193505050501580156111b5573d6000803e3d6000fd5b50600f546015826040518082805190602001908083835b602083106111eb5780518252601f1990920191602091820191016111cc565b51815160209384036101000a60001901801990921691161790529201948552506040519384900381018420548651950194601594879450925082918401908083835b6020831061124c5780518252601f19909201916020918201910161122d565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902081905550816001600160a01b03167fd8722907e22bdf7371f82757663f42769580522cf1fc9af2c0740ac3135e9d508460016015856040518082805190602001908083835b602083106112e35780518252601f1990920191602091820191016112c4565b51815160001960209485036101000a01908116901991909116179052920194855250604080519485900382018520546001600160801b03909716855294151590840152505080820192909252519081900360600190a2505050565b600f5481565b60065481565b805160208183018101805160168252928201919093012091525481565b600254600160a01b900460ff16156113b2576040805162461bcd60e51b8152602060048201526009602482015268696e697420646f6e6560b81b604482015290519081900360640190fd5b600180546001600160a01b039b8c166001600160a01b0319918216179091556002805460059a909a55600698909855600c96909655600d94909455600e92909255600a91909155600b91909155600f55601380546001600160801b031916606417905560ff60a01b1993909416919093161716600160a01b179055565b60095481565b60008060156114448585612191565b6040518082805190602001908083835b602083106114735780518252601f199092019160209182019101611454565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054601454600f549081024301910110159695505050505050565b60008060156114c78585612191565b6040518082805190602001908083835b602083106114f65780518252601f1990920191602091820191016114d7565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549290921195945050505050565b6000601561153d8484612191565b6040518082805190602001908083835b6020831061156c5780518252601f19909201916020918201910161154d565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205495945050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115ed57600080fd5b505afa158015611601573d6000803e3d6000fd5b505050506040513d602081101561161757600080fd5b50516000546001600160a01b031615806116ad575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561168057600080fd5b505afa158015611694573d6000803e3d6000fd5b505050506040513d60208110156116aa57600080fd5b50515b6116ea576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50601380546001600160801b0319166001600160801b039390931692909217909155601455565b600061171e8260016114b8565b80156117325750611730826001611eb4565b155b92915050565b600080333014611748573361174a565b325b905060606117588287612191565b905060006016826040518082805190602001908083835b6020831061178e5780518252601f19909201916020918201910161176f565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220541515915061182b9050576015826040518082805190602001908083835b602083106117f65780518252601f1990920191602091820191016117d7565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054915061188d9050565b6016826040518082805190602001908083835b6020831061185d5780518252601f19909201916020918201910161183e565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150505b905060006015836040518082805190602001908083835b602083106118c35780518252601f1990920191602091820191016118a4565b51815160001960209485036101000a019081169019919091161790529201948552506040519384900301909220549250505081611937576040805162461bcd60e51b815260206004820152600d60248201526c1b995d995c8818db185a5b5959609a1b604482015290519081900360640190fd5b4387111561197c576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c696420626c6f636b60981b604482015290519081900360640190fd5b8187116119bb576040805162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015290519081900360640190fd5b600e5415611a0557600f5481018710611a05576040805162461bcd60e51b81526020600482015260076024820152667061792066656560c81b604482015290519081900360640190fd5b6000611a12858a8a612882565b905060008111611a55576040805162461bcd60e51b81526020600482015260096024820152681b9bc81c995dd85c9960ba1b604482015290519081900360640190fd5b6000600b54600a54830281611a6657fe5b04905080341015611aac576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b6004546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015611ae5573d6000803e3d6000fd5b508715611be3576001546002546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b158015611b4557600080fd5b505af1158015611b59573d6000803e3d6000fd5b505050506040513d6020811015611b6f57600080fd5b5050600254604080516330d6a97560e01b81526001600160a01b03898116600483015260248201869052915191909216916330d6a97591604480830192600092919082900301818387803b158015611bc657600080fd5b505af1158015611bda573d6000803e3d6000fd5b50505050611c66565b6001546040805163a9059cbb60e01b81526001600160a01b038981166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611c3957600080fd5b505af1158015611c4d573d6000803e3d6000fd5b505050506040513d6020811015611c6357600080fd5b50505b60108054839003905560405185518a91601691889190819060208401908083835b60208310611ca65780518252601f199092019160209182019101611c87565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185209590955586845293516001600160a01b038b16947fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a948290030192509050a2600196505050505050505b9392505050565b6000611d1c838343612882565b6000546001600160a01b031681565b6000611d4b8383611eb4565b158015611d1c5750611d5d8383611435565b159392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015611db157600080fd5b505afa158015611dc5573d6000803e3d6000fd5b505050506040513d6020811015611ddb57600080fd5b50516000546001600160a01b03161580611e71575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015611e4457600080fd5b505afa158015611e58573d6000803e3d6000fd5b505050506040513d6020811015611e6e57600080fd5b50515b611eae576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600d55565b6000806015611ec38585612191565b6040518082805190602001908083835b60208310611ef25780518252601f199092019160209182019101611ed3565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054601254600f549091010143119695505050505050565b600c5481565b600080546001600160a01b03161580611fcf575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015611fa257600080fd5b505afa158015611fb6573d6000803e3d6000fd5b505050506040513d6020811015611fcc57600080fd5b50515b61200c576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b60075481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561208157600080fd5b505afa158015612095573d6000803e3d6000fd5b505050506040513d60208110156120ab57600080fd5b50516000546001600160a01b03161580612141575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561211457600080fd5b505afa158015612128573d6000803e3d6000fd5b505050506040513d602081101561213e57600080fd5b50515b61217e576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6000821161218b57600080fd5b50601255565b606060006001600160801b0383166121cd576001600160a01b0384166000908152601760205260409020546001600160801b03166001016121cf565b825b6040805160609690961b6bffffffffffffffffffffffff1916602087015260809190911b6001600160801b03191660348601528051808603602401815260449095019052509192915050565b600b5481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561226d57600080fd5b505afa158015612281573d6000803e3d6000fd5b505050506040513d602081101561229757600080fd5b50516000546001600160a01b0316158061232d575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561230057600080fd5b505afa158015612314573d6000803e3d6000fd5b505050506040513d602081101561232a57600080fd5b50515b61236a576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b8161237457600080fd5b50600a91909155600b55565b600e5481565b6001546001600160a01b031681565b60055481565b6017602052600090815260409020546001600160801b031681565b60105481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561240857600080fd5b505afa15801561241c573d6000803e3d6000fd5b505050506040513d602081101561243257600080fd5b50516000546001600160a01b031615806124c8575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561249b57600080fd5b505afa1580156124af573d6000803e3d6000fd5b505050506040513d60208110156124c557600080fd5b50515b612505576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600c55565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561255757600080fd5b505afa15801561256b573d6000803e3d6000fd5b505050506040513d602081101561258157600080fd5b50516000546001600160a01b03161580612617575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156125ea57600080fd5b505afa1580156125fe573d6000803e3d6000fd5b505050506040513d602081101561261457600080fd5b50515b612654576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b8261265e57600080fd5b60078490556008839055816126735743612675565b815b60095550505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156126ca57600080fd5b505afa1580156126de573d6000803e3d6000fd5b505050506040513d60208110156126f457600080fd5b50516000546001600160a01b0316158061278a575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561275d57600080fd5b505afa158015612771573d6000803e3d6000fd5b505050506040513d602081101561278757600080fd5b50515b6127c7576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b600082116127d457600080fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561282e57600080fd5b505af1158015612842573d6000803e3d6000fd5b505050506040513d602081101561285857600080fd5b50506010805490920190915550565b60115481565b60125481565b6004546001600160a01b031681565b600060606128908585612191565b905060006016826040518082805190602001908083835b602083106128c65780518252601f1990920191602091820191016128a7565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054151591506129639050576015826040518082805190602001908083835b6020831061292e5780518252601f19909201916020918201910161290f565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205491506129c59050565b6016826040518082805190602001908083835b602083106129955780518252601f199092019160209182019101612976565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150505b9050438411156129da57600092505050611d1c565b806129ea57600092505050611d1c565b808410156129fd57600092505050611d1c565b612a0561376f565b612a128260095487613665565b905060008060065411612a26576000612a38565b60065460055483510281612a3657fe5b045b905060008060085411612a4c576000612a61565b60085460075460208501510281612a5f57fe5b045b9190910198975050505050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015612abd57600080fd5b505afa158015612ad1573d6000803e3d6000fd5b505050506040513d6020811015612ae757600080fd5b50516000546001600160a01b03161580612b7d575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015612b5057600080fd5b505afa158015612b64573d6000803e3d6000fd5b505050506040513d6020811015612b7a57600080fd5b50515b612bba576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6001600160a01b038216612bcd57600080fd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055565b805160208183018101805160158252928201919093012091525481565b60008111612c52576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c69642076616c756560981b604482015290519081900360640190fd5b80600e54023414612c98576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b60015b336000908152601760205260409020546001600160801b031661ffff821611612d4957612ccc338261ffff16611d3f565b612cd557612d41565b306001600160a01b0316630f694584600e54836040518363ffffffff1660e01b8152600401808261ffff1681526020019150506000604051808303818588803b158015612d2157600080fd5b505af1158015612d35573d6000803e3d6000fd5b50505050506001820391505b600101612c9b565b508015612d8d576040805162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a590818dbdd5b9d609a1b604482015290519081900360640190fd5b50565b600d5481565b60008060015b6001600160a01b0385166000908152601760205260409020546001600160801b0390811690821611612dee57612de2858260008711612ddb5743612ddd565b865b612882565b90910190600101612d9c565b509392505050565b60035481565b6013546001600160801b031681565b6002546001600160a01b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e6657600080fd5b505afa158015612e7a573d6000803e3d6000fd5b505050506040513d6020811015612e9057600080fd5b50516000546001600160a01b03161580612f26575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015612ef957600080fd5b505afa158015612f0d573d6000803e3d6000fd5b505050506040513d6020811015612f2357600080fd5b50515b612f63576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b60008211612f7057600080fd5b50600f55565b601354336000908152601760205260409020546001600160801b03918216911610612fd8576040805162461bcd60e51b815260206004820152600d60248201526c1b1a5b5a5d081c995858da1959609a1b604482015290519081900360640190fd5b600c54341461301c576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b336000818152601760205260409020546001600160801b0316600101906060906130469083612191565b600380546001019055604051815191925043916015918491819060208401908083835b602083106130885780518252601f199092019160209182019101613069565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842094909455505082514392601692859290918291908401908083835b602083106130ed5780518252601f1990920191602091820191016130ce565b51815160001960209485036101000a0190811690199190911617905292019485525060408051948590038201852095909555336000908152601790915293842080546001600160801b03808216600101166001600160801b031990911617905550506004546001600160a01b0316913480156108fc02929091818181858888f19350505050158015613183573d6000803e3d6000fd5b5060015460048054600d54604080516323b872dd60e01b815233948101949094526001600160a01b0392831660248501526044840191909152519216916323b872dd916064808201926020929091908290030181600087803b1580156131e857600080fd5b505af11580156131fc573d6000803e3d6000fd5b505050506040513d602081101561321257600080fd5b5050600f54604051825133927fd8722907e22bdf7371f82757663f42769580522cf1fc9af2c0740ac3135e9d5092869260009291601591889190819060208401908083835b602083106132765780518252601f199092019160209182019101613257565b51815160001960209485036101000a01908116901991909116179052920194855250604080519485900382018520546001600160801b039098168552951515908401525050920182820152519081900360600190a25050565b60085481565b60145481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561332757600080fd5b505afa15801561333b573d6000803e3d6000fd5b505050506040513d602081101561335157600080fd5b50516000546001600160a01b031615806133e7575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156133ba57600080fd5b505afa1580156133ce573d6000803e3d6000fd5b505050506040513d60208110156133e457600080fd5b50515b613424576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600e55565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561347657600080fd5b505afa15801561348a573d6000803e3d6000fd5b505050506040513d60208110156134a057600080fd5b50516000546001600160a01b03161580613536575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561350957600080fd5b505afa15801561351d573d6000803e3d6000fd5b505050506040513d602081101561353357600080fd5b50515b613573576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6000821161358057600080fd5b8160105410156135c4576040805162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b604482015290519081900360640190fd5b6001546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561361a57600080fd5b505af115801561362e573d6000803e3d6000fd5b505050506040513d602081101561364457600080fd5b505060108054929092039091555050565b600254600160a01b900460ff1681565b61366d61376f565b81841061368e57506040805180820190915260008082526020820152611d1c565b828211158061369b575082155b156136c65760408051808201909152806136b58487613712565b815260200160008152509050611d1c565b8284106136f2576040805180820190915260008152602081016136e98487613712565b90529050611d1c565b60408051808201909152806137078587613712565b81526020016136e984865b600082821115613769576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6040518060400160405280600290602082028036833750919291505056fea26469706673582212204b794022f2ec2b5abeddb17d358c4ba84946d0c28375abb8f9869f34c274269d64736f6c634300060c0033
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.