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 | 13449648 | 1132 days ago | IN | 0 ETH | 0.37335496 |
Loading...
Loading
Contract Name:
NodesV2
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; import "./interfaces/IERC1155Preset.sol"; import "./interfaces/StrongPoolInterface.sol"; import "./lib/AdminAccessControl.sol"; import "./interfaces/StrongNFTBonusInterface.sol"; import "./lib/rewards.sol"; contract NodesV2 is AdminAccessControl { event Requested(address indexed miner); event Claimed(address indexed miner, uint256 reward); event Paid(address indexed entity, uint128 nodeId, bool isRenewal, uint256 upToBlockNumber); using SafeMath for uint256; 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; StrongNFTBonusInterface public strongNFTBonus; 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.add(recurringPaymentCycleInBlocks).add(gracePeriodInBlocks); } function hasMaxPayments(address _entity, uint128 _nodeId) public view returns (bool) { uint256 blockLastPaidOn = entityNodePaidOnBlock[getNodeId(_entity, _nodeId)]; uint256 limit = block.number.add(recurringPaymentCycleInBlocks.mul(maxPaymentPeriods)); return blockLastPaidOn.add(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.add(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].mul(rewardPerBlockNumerator).div(rewardPerBlockDenominator) : 0; uint256 rewardNew = rewardPerBlockDenominatorNew > 0 ? rewardBlocks[1].mul(rewardPerBlockNumeratorNew).div(rewardPerBlockDenominatorNew) : 0; uint256 bonus = address(strongNFTBonus) != address(0) ? strongNFTBonus.getBonus(_entity, _nodeId, blockLastClaimedOn, _blockNumber) : 0; return rewardOld.add(rewardNew).add(bonus); } 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 = activeEntities.add(1); 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].add(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].add(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) || msg.sender == address(strongNFTBonus) ? 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.add(recurringPaymentCycleInBlocks), "pay fee"); } uint256 reward = getRewardByBlock(sender, _nodeId, _blockNumber); require(reward > 0, "no reward"); uint256 fee = reward.mul(claimingFeeNumerator).div(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 = rewardBalance.sub(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.mul(claimingFeeNumerator).div(claimingFeeDenominator); require(value >= fee, "invalid fee"); require(this.claim{value : fee}(i, _blockNumber, _toStrongPool), "claim failed"); value = value.sub(fee); } } function payAll(uint256 _nodeCount) public payable { require(_nodeCount > 0, "invalid value"); require(msg.value == recurringFeeInWei.mul(_nodeCount), "invalid fee"); for (uint16 nodeId = 1; nodeId <= entityNodeCount[msg.sender]; nodeId++) { if (!canBePaid(msg.sender, nodeId)) { continue; } this.payFee{value : recurringFeeInWei}(nodeId); _nodeCount = _nodeCount.sub(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 = rewardBalance.add(_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 = rewardBalance.sub(_amount); } function updateFeeCollector(address payable _newFeeCollector) public onlyRole(adminControl.SUPER_ADMIN()) { require(_newFeeCollector != address(0)); feeCollector = _newFeeCollector; } function updateRequestingFee(uint256 _feeInWei) public onlyRole(adminControl.SERVICE_ADMIN()) { requestingFeeInWei = _feeInWei; } function updateStrongFee(uint256 _feeInWei) public onlyRole(adminControl.SERVICE_ADMIN()) { strongFeeInWei = _feeInWei; } function updateClaimingFee(uint256 _numerator, uint256 _denominator) public onlyRole(adminControl.SERVICE_ADMIN()) { require(_denominator != 0); claimingFeeNumerator = _numerator; claimingFeeDenominator = _denominator; } function updateRecurringFee(uint256 _feeInWei) public onlyRole(adminControl.SERVICE_ADMIN()) { recurringFeeInWei = _feeInWei; } function updateRecurringPaymentCycleInBlocks(uint256 _blocks) public onlyRole(adminControl.SERVICE_ADMIN()) { require(_blocks > 0); recurringPaymentCycleInBlocks = _blocks; } function updateGracePeriodInBlocks(uint256 _blocks) public onlyRole(adminControl.SERVICE_ADMIN()) { require(_blocks > 0); gracePeriodInBlocks = _blocks; } function updateLimits(uint128 _maxNodes, uint256 _maxPaymentPeriods) public onlyRole(adminControl.SERVICE_ADMIN()) { maxNodes = _maxNodes; maxPaymentPeriods = _maxPaymentPeriods; } function updateRewardPerBlock(uint256 _numerator, uint256 _denominator) public onlyRole(adminControl.SERVICE_ADMIN()) { require(_denominator != 0); rewardPerBlockNumerator = _numerator; rewardPerBlockDenominator = _denominator; } function updateRewardPerBlockNew(uint256 _numerator, uint256 _denominator, uint256 _effectiveBlock) public onlyRole(adminControl.SERVICE_ADMIN()) { require(_denominator != 0); rewardPerBlockNumeratorNew = _numerator; rewardPerBlockDenominatorNew = _denominator; rewardPerBlockNewEffectiveBlock = _effectiveBlock != 0 ? _effectiveBlock : block.number; } function addNFTBonusContract(address _contract) public onlyRole(adminControl.SERVICE_ADMIN()) { strongNFTBonus = StrongNFTBonusInterface(_contract); } }
// 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.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; } }
// 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; interface StrongNFTBonusInterface { function getBonus(address _entity, uint128 _nodeId, uint256 _fromBlock, uint256 _toBlock) external view returns (uint256); }
// 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); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "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":[{"internalType":"address","name":"_contract","type":"address"}],"name":"addNFTBonusContract","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":"strongNFTBonus","outputs":[{"internalType":"contract StrongNFTBonusInterface","name":"","type":"address"}],"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
608060405234801561001057600080fd5b50613c73806100206000396000f3fe60806040526004361061036a5760003560e01c80639548f1e6116101c6578063d48ba486116100f7578063e877db1a11610095578063f28b039e1161006f578063f28b039e14610d66578063f3368f9014610d7b578063f3fef3a314610da5578063fed0a20e14610dde5761036a565b8063e877db1a14610d1f578063eb2f481714610d49578063ed5998da14610d515761036a565b8063da7169b3116100d1578063da7169b314610ca7578063dc0bbf0814610ce0578063ddf0185f14610cf5578063e195232e14610d0a5761036a565b8063d48ba48614610bc2578063d4aadbc614610c75578063d9df77de14610c925761036a565b8063b6b55f2511610164578063c415b95c1161013e578063c415b95c14610aff578063c5a2928b14610b14578063c8b81e1514610b47578063d2c35ce814610b8f5761036a565b8063b6b55f2514610aab578063c2b2fdca14610ad5578063c3d5864f14610aea5761036a565b8063a77e2825116101a0578063a77e2825146109e7578063aa5c3ab414610a36578063ae749c4214610a4b578063b0e8a45d14610a755761036a565b80639548f1e6146109a8578063965d61b9146109bd57806399e6f700146109d25761036a565b806339941fa4116102a05780637a0b92551161023e5780638123fdbb116102185780638123fdbb1461089757806387f48f4e1461094e5780638aa9a37f146109635780639162c594146109935761036a565b80637a0b9255146108255780637a5d5cf4146108585780637ba909281461086d5761036a565b80635c4f18fa1161027a5780635c4f18fa14610762578063623ef910146107a45780636c52ec10146107ce5780636f300155146108105761036a565b806339941fa4146106bb5780633bb58b67146106ef578063555d3e63146107315761036a565b80631ce7aff91161030d57806326665562116102e757806326665562146105cb578063268e5e4f1461060d578063326f10731461064f57806334dce6b3146106885761036a565b80631ce7aff9146104f05780631d851bbd14610560578063255ebc8d146105755761036a565b80630f694584116103495780630f694584146103ed5780630fe48b3614610413578063198858981461042857806319a1f5ae1461043d5761036a565b8062a469171461036f57806309a07fd2146103965780630a8d1be2146103bd575b600080fd5b6103946004803603604081101561038557600080fd5b50803590602001351515610df3565b005b3480156103a257600080fd5b506103ab610f72565b60408051918252519081900360200190f35b3480156103c957600080fd5b50610394600480360360408110156103e057600080fd5b5080359060200135610f78565b6103946004803603602081101561040357600080fd5b50356001600160801b03166110d7565b34801561041f57600080fd5b506103ab6113e0565b34801561043457600080fd5b506103ab6113e6565b34801561044957600080fd5b506103ab6004803603602081101561046057600080fd5b81019060208101813564010000000081111561047b57600080fd5b82018360208201111561048d57600080fd5b803590602001918460018302840111640100000000831117156104af57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506113ec945050505050565b3480156104fc57600080fd5b50610394600480360361014081101561051457600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e081013590610100810135906101200135611409565b34801561056c57600080fd5b506103ab6114d1565b34801561058157600080fd5b506105b76004803603604081101561059857600080fd5b5080356001600160a01b031690602001356001600160801b03166114d7565b604080519115158252519081900360200190f35b3480156105d757600080fd5b506105b7600480360360408110156105ee57600080fd5b5080356001600160a01b031690602001356001600160801b0316611589565b34801561061957600080fd5b506103ab6004803603604081101561063057600080fd5b5080356001600160a01b031690602001356001600160801b0316611600565b34801561065b57600080fd5b506103946004803603604081101561067257600080fd5b506001600160801b038135169060200135611672565b34801561069457600080fd5b506105b7600480360360208110156106ab57600080fd5b50356001600160a01b03166117e2565b6105b7600480360360608110156106d157600080fd5b506001600160801b0381351690602081013590604001351515611808565b3480156106fb57600080fd5b506103ab6004803603604081101561071257600080fd5b5080356001600160a01b031690602001356001600160801b0316611e22565b34801561073d57600080fd5b50610746611e2f565b604080516001600160a01b039092168252519081900360200190f35b34801561076e57600080fd5b506105b76004803603604081101561078557600080fd5b5080356001600160a01b031690602001356001600160801b0316611e3e565b3480156107b057600080fd5b50610394600480360360208110156107c757600080fd5b5035611e64565b3480156107da57600080fd5b506105b7600480360360408110156107f157600080fd5b5080356001600160a01b031690602001356001600160801b0316611fb3565b34801561081c57600080fd5b506103ab612048565b34801561083157600080fd5b506103946004803603602081101561084857600080fd5b50356001600160a01b031661204e565b34801561086457600080fd5b506103ab612143565b34801561087957600080fd5b506103946004803603602081101561089057600080fd5b5035612149565b3480156108a357600080fd5b506108d9600480360360408110156108ba57600080fd5b5080356001600160a01b031690602001356001600160801b03166122a5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156109135781810151838201526020016108fb565b50505050905090810190601f1680156109405780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561095a57600080fd5b506103ab61232f565b34801561096f57600080fd5b506103946004803603604081101561098657600080fd5b5080359060200135612335565b34801561099f57600080fd5b506103ab612494565b3480156109b457600080fd5b5061074661249a565b3480156109c957600080fd5b506107466124a9565b3480156109de57600080fd5b506103ab6124b8565b3480156109f357600080fd5b50610a1a60048036036020811015610a0a57600080fd5b50356001600160a01b03166124be565b604080516001600160801b039092168252519081900360200190f35b348015610a4257600080fd5b506103ab6124d9565b348015610a5757600080fd5b5061039460048036036020811015610a6e57600080fd5b50356124df565b348015610a8157600080fd5b5061039460048036036060811015610a9857600080fd5b508035906020810135906040013561262e565b348015610ab757600080fd5b5061039460048036036020811015610ace57600080fd5b50356127a1565b348015610ae157600080fd5b506103ab612991565b348015610af657600080fd5b506103ab612997565b348015610b0b57600080fd5b5061074661299d565b348015610b2057600080fd5b5061039460048036036020811015610b3757600080fd5b50356001600160a01b03166129ac565b348015610b5357600080fd5b506103ab60048036036060811015610b6a57600080fd5b506001600160a01b03813516906001600160801b036020820135169060400135612b18565b348015610b9b57600080fd5b5061039460048036036020811015610bb257600080fd5b50356001600160a01b0316612ddf565b348015610bce57600080fd5b506103ab60048036036020811015610be557600080fd5b810190602081018135640100000000811115610c0057600080fd5b820183602082011115610c1257600080fd5b80359060200191846001830284011164010000000083111715610c3457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612f5e945050505050565b61039460048036036020811015610c8b57600080fd5b5035612f7b565b348015610c9e57600080fd5b506103ab613116565b348015610cb357600080fd5b506103ab60048036036040811015610cca57600080fd5b506001600160a01b03813516906020013561311c565b348015610cec57600080fd5b506103ab613184565b348015610d0157600080fd5b50610a1a61318a565b348015610d1657600080fd5b50610746613199565b348015610d2b57600080fd5b5061039460048036036020811015610d4257600080fd5b50356131a8565b610394613304565b348015610d5d57600080fd5b506103ab61363a565b348015610d7257600080fd5b506103ab613640565b348015610d8757600080fd5b5061039460048036036020811015610d9e57600080fd5b5035613646565b348015610db157600080fd5b5061039460048036036040811015610dc857600080fd5b506001600160a01b038135169060200135613795565b348015610dea57600080fd5b506105b76139c6565b3460015b336000908152601760205260409020546001600160801b031661ffff821611610f6c576000610e2b338361ffff1687612b18565b90506000610e50600b54610e4a600a54856139d690919063ffffffff16565b90613a2f565b905080841015610e95576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b60408051630e6507e960e21b815261ffff85166004820152602481018890528615156044820152905130916339941fa491849160648082019260209290919082900301818588803b158015610ee957600080fd5b505af1158015610efd573d6000803e3d6000fd5b50505050506040513d6020811015610f1457600080fd5b5051610f56576040805162461bcd60e51b815260206004820152600c60248201526b18db185a5b4819985a5b195960a21b604482015290519081900360640190fd5b610f608482613a96565b93505050600101610df7565b50505050565b600a5481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fc457600080fd5b505afa158015610fd8573d6000803e3d6000fd5b505050506040513d6020811015610fee57600080fd5b50516000546001600160a01b03161580611084575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561105757600080fd5b505afa15801561106b573d6000803e3d6000fd5b505050506040513d602081101561108157600080fd5b50515b6110c1576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b816110cb57600080fd5b50600591909155600655565b60003330146110e657336110e8565b325b905060606110f682846122a5565b90506111028284611589565b611142576040805162461bcd60e51b815260206004820152600c60248201526b191bd95cdb9d08195e1a5cdd60a21b604482015290519081900360640190fd5b61114c8284611fb3565b15611189576040805162461bcd60e51b8152602060048201526008602482015267746f6f206c61746560c01b604482015290519081900360640190fd5b61119382846114d7565b156111d0576040805162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015290519081900360640190fd5b600e543414611214576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b6004546040516001600160a01b03909116903480156108fc02916000818181858888f1935050505015801561124d573d6000803e3d6000fd5b506112bc600f546015836040518082805190602001908083835b602083106112865780518252601f199092019160209182019101611267565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054929150613af39050565b6015826040518082805190602001908083835b602083106112ee5780518252601f1990920191602091820191016112cf565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902081905550816001600160a01b03167fd8722907e22bdf7371f82757663f42769580522cf1fc9af2c0740ac3135e9d508460016015856040518082805190602001908083835b602083106113855780518252601f199092019160209182019101611366565b51815160001960209485036101000a01908116901991909116179052920194855250604080519485900382018520546001600160801b03909716855294151590840152505080820192909252519081900360600190a2505050565b600f5481565b60065481565b805160208183018101805160168252928201919093012091525481565b600254600160a01b900460ff1615611454576040805162461bcd60e51b8152602060048201526009602482015268696e697420646f6e6560b81b604482015290519081900360640190fd5b600180546001600160a01b039b8c166001600160a01b0319918216179091556002805460059a909a55600698909855600c96909655600d94909455600e92909255600a91909155600b91909155600f55601380546001600160801b031916606417905560ff60a01b1993909416919093161716600160a01b179055565b60095481565b60008060156114e685856122a5565b6040518082805190602001908083835b602083106115155780518252601f1990920191602091820191016114f6565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054601454600f5491945060009350611564925061155d91906139d6565b4390613af3565b90508061157c600f5484613af390919063ffffffff16565b1015925050505b92915050565b600080601561159885856122a5565b6040518082805190602001908083835b602083106115c75780518252601f1990920191602091820191016115a8565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549290921195945050505050565b6000601561160e84846122a5565b6040518082805190602001908083835b6020831061163d5780518252601f19909201916020918201910161161e565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205495945050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116be57600080fd5b505afa1580156116d2573d6000803e3d6000fd5b505050506040513d60208110156116e857600080fd5b50516000546001600160a01b0316158061177e575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561175157600080fd5b505afa158015611765573d6000803e3d6000fd5b505050506040513d602081101561177b57600080fd5b50515b6117bb576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50601380546001600160801b0319166001600160801b039390931692909217909155601455565b60006117ef826001611589565b80156115835750611801826001611fb3565b1592915050565b6000803330148061182357506018546001600160a01b031633145b61182d573361182f565b325b9050606061183d82876122a5565b905060006016826040518082805190602001908083835b602083106118735780518252601f199092019160209182019101611854565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054151591506119109050576015826040518082805190602001908083835b602083106118db5780518252601f1990920191602091820191016118bc565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205491506119729050565b6016826040518082805190602001908083835b602083106119425780518252601f199092019160209182019101611923565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150505b905060006015836040518082805190602001908083835b602083106119a85780518252601f199092019160209182019101611989565b51815160001960209485036101000a019081169019919091161790529201948552506040519384900301909220549250505081611a1c576040805162461bcd60e51b815260206004820152600d60248201526c1b995d995c8818db185a5b5959609a1b604482015290519081900360640190fd5b43871115611a61576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c696420626c6f636b60981b604482015290519081900360640190fd5b818711611aa0576040805162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015290519081900360640190fd5b600e5415611af357600f54611ab6908290613af3565b8710611af3576040805162461bcd60e51b81526020600482015260076024820152667061792066656560c81b604482015290519081900360640190fd5b6000611b00858a8a612b18565b905060008111611b43576040805162461bcd60e51b81526020600482015260096024820152681b9bc81c995dd85c9960ba1b604482015290519081900360640190fd5b6000611b60600b54610e4a600a54856139d690919063ffffffff16565b905080341015611ba5576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b6004546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015611bde573d6000803e3d6000fd5b508715611cdc576001546002546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b158015611c3e57600080fd5b505af1158015611c52573d6000803e3d6000fd5b505050506040513d6020811015611c6857600080fd5b5050600254604080516330d6a97560e01b81526001600160a01b03898116600483015260248201869052915191909216916330d6a97591604480830192600092919082900301818387803b158015611cbf57600080fd5b505af1158015611cd3573d6000803e3d6000fd5b50505050611d5f565b6001546040805163a9059cbb60e01b81526001600160a01b038981166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611d3257600080fd5b505af1158015611d46573d6000803e3d6000fd5b505050506040513d6020811015611d5c57600080fd5b50505b601054611d6c9083613a96565b601081905550886016866040518082805190602001908083835b60208310611da55780518252601f199092019160209182019101611d86565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185209590955586845293516001600160a01b038b16947fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a948290030192509050a2600196505050505050505b9392505050565b6000611e1b838343612b18565b6000546001600160a01b031681565b6000611e4a8383611fb3565b158015611e1b5750611e5c83836114d7565b159392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015611eb057600080fd5b505afa158015611ec4573d6000803e3d6000fd5b505050506040513d6020811015611eda57600080fd5b50516000546001600160a01b03161580611f70575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015611f4357600080fd5b505afa158015611f57573d6000803e3d6000fd5b505050506040513d6020811015611f6d57600080fd5b50515b611fad576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600d55565b6000806015611fc285856122a5565b6040518082805190602001908083835b60208310611ff15780518252601f199092019160209182019101611fd2565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054601254600f5491945061203e93509150612038908490613af3565b90613af3565b4311949350505050565b600c5481565b600080546001600160a01b031615806120e3575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156120b657600080fd5b505afa1580156120ca573d6000803e3d6000fd5b505050506040513d60208110156120e057600080fd5b50515b612120576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b60075481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561219557600080fd5b505afa1580156121a9573d6000803e3d6000fd5b505050506040513d60208110156121bf57600080fd5b50516000546001600160a01b03161580612255575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561222857600080fd5b505afa15801561223c573d6000803e3d6000fd5b505050506040513d602081101561225257600080fd5b50515b612292576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6000821161229f57600080fd5b50601255565b606060006001600160801b0383166122e1576001600160a01b0384166000908152601760205260409020546001600160801b03166001016122e3565b825b6040805160609690961b6bffffffffffffffffffffffff1916602087015260809190911b6001600160801b03191660348601528051808603602401815260449095019052509192915050565b600b5481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561238157600080fd5b505afa158015612395573d6000803e3d6000fd5b505050506040513d60208110156123ab57600080fd5b50516000546001600160a01b03161580612441575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561241457600080fd5b505afa158015612428573d6000803e3d6000fd5b505050506040513d602081101561243e57600080fd5b50515b61247e576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b8161248857600080fd5b50600a91909155600b55565b600e5481565b6018546001600160a01b031681565b6001546001600160a01b031681565b60055481565b6017602052600090815260409020546001600160801b031681565b60105481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561252b57600080fd5b505afa15801561253f573d6000803e3d6000fd5b505050506040513d602081101561255557600080fd5b50516000546001600160a01b031615806125eb575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156125be57600080fd5b505afa1580156125d2573d6000803e3d6000fd5b505050506040513d60208110156125e857600080fd5b50515b612628576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600c55565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561267a57600080fd5b505afa15801561268e573d6000803e3d6000fd5b505050506040513d60208110156126a457600080fd5b50516000546001600160a01b0316158061273a575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561270d57600080fd5b505afa158015612721573d6000803e3d6000fd5b505050506040513d602081101561273757600080fd5b50515b612777576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b8261278157600080fd5b60078490556008839055816127965743612798565b815b60095550505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127ed57600080fd5b505afa158015612801573d6000803e3d6000fd5b505050506040513d602081101561281757600080fd5b50516000546001600160a01b031615806128ad575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561288057600080fd5b505afa158015612894573d6000803e3d6000fd5b505050506040513d60208110156128aa57600080fd5b50515b6128ea576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b600082116128f757600080fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561295157600080fd5b505af1158015612965573d6000803e3d6000fd5b505050506040513d602081101561297b57600080fd5b505060105461298a9083613af3565b6010555050565b60115481565b60125481565b6004546001600160a01b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129f857600080fd5b505afa158015612a0c573d6000803e3d6000fd5b505050506040513d6020811015612a2257600080fd5b50516000546001600160a01b03161580612ab8575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015612a8b57600080fd5b505afa158015612a9f573d6000803e3d6000fd5b505050506040513d6020811015612ab557600080fd5b50515b612af5576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50601880546001600160a01b0319166001600160a01b0392909216919091179055565b60006060612b2685856122a5565b905060006016826040518082805190602001908083835b60208310612b5c5780518252601f199092019160209182019101612b3d565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205415159150612bf99050576015826040518082805190602001908083835b60208310612bc45780518252601f199092019160209182019101612ba5565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150612c5b9050565b6016826040518082805190602001908083835b60208310612c2b5780518252601f199092019160209182019101612c0c565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150505b905043841115612c7057600092505050611e1b565b80612c8057600092505050611e1b565b80841015612c9357600092505050611e1b565b612c9b613bfe565b612ca88260095487613b4d565b905060008060065411612cbc576000612ce0565b612ce0600654610e4a60055485600060028110612cd557fe5b6020020151906139d6565b905060008060085411612cf4576000612d0d565b612d0d600854610e4a60075486600160028110612cd557fe5b6018549091506000906001600160a01b0316612d2a576000612dc1565b6018546040805163b07d9cbb60e01b81526001600160a01b038d811660048301526001600160801b038d16602483015260448201899052606482018c90529151919092169163b07d9cbb916084808301926020929190829003018186803b158015612d9457600080fd5b505afa158015612da8573d6000803e3d6000fd5b505050506040513d6020811015612dbe57600080fd5b50515b9050612dd1816120388585613af3565b9a9950505050505050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e2b57600080fd5b505afa158015612e3f573d6000803e3d6000fd5b505050506040513d6020811015612e5557600080fd5b50516000546001600160a01b03161580612eeb575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015612ebe57600080fd5b505afa158015612ed2573d6000803e3d6000fd5b505050506040513d6020811015612ee857600080fd5b50515b612f28576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6001600160a01b038216612f3b57600080fd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055565b805160208183018101805160158252928201919093012091525481565b60008111612fc0576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c69642076616c756560981b604482015290519081900360640190fd5b600e54612fcd90826139d6565b341461300e576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b60015b336000908152601760205260409020546001600160801b031661ffff8216116130cf57613042338261ffff16611e3e565b61304b576130c7565b306001600160a01b0316630f694584600e54836040518363ffffffff1660e01b8152600401808261ffff1681526020019150506000604051808303818588803b15801561309757600080fd5b505af11580156130ab573d6000803e3d6000fd5b50505050506130c4600183613a9690919063ffffffff16565b91505b600101613011565b508015613113576040805162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a590818dbdd5b9d609a1b604482015290519081900360640190fd5b50565b600d5481565b60008060015b6001600160a01b0385166000908152601760205260409020546001600160801b039081169082161161317c5761317261316b8683600088116131645743613166565b875b612b18565b8390613af3565b9150600101613122565b509392505050565b60035481565b6013546001600160801b031681565b6002546001600160a01b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156131f457600080fd5b505afa158015613208573d6000803e3d6000fd5b505050506040513d602081101561321e57600080fd5b50516000546001600160a01b031615806132b4575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561328757600080fd5b505afa15801561329b573d6000803e3d6000fd5b505050506040513d60208110156132b157600080fd5b50515b6132f1576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b600082116132fe57600080fd5b50600f55565b601354336000908152601760205260409020546001600160801b03918216911610613366576040805162461bcd60e51b815260206004820152600d60248201526c1b1a5b5a5d081c995858da1959609a1b604482015290519081900360640190fd5b600c5434146133aa576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b336000818152601760205260409020546001600160801b0316600101906060906133d490836122a5565b6003549091506133e5906001613af3565b600381905550436015826040518082805190602001908083835b6020831061341e5780518252601f1990920191602091820191016133ff565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842094909455505082514392601692859290918291908401908083835b602083106134835780518252601f199092019160209182019101613464565b51815160001960209485036101000a0190811690199190911617905292019485525060408051948590038201852095909555336000908152601790915293842080546001600160801b03808216600101166001600160801b031990911617905550506004546001600160a01b0316913480156108fc02929091818181858888f19350505050158015613519573d6000803e3d6000fd5b5060015460048054600d54604080516323b872dd60e01b815233948101949094526001600160a01b0392831660248501526044840191909152519216916323b872dd916064808201926020929091908290030181600087803b15801561357e57600080fd5b505af1158015613592573d6000803e3d6000fd5b505050506040513d60208110156135a857600080fd5b5050600f54604051825133927fd8722907e22bdf7371f82757663f42769580522cf1fc9af2c0740ac3135e9d5092869260009261360f929091601591899181906020840190808383602083106112865780518252601f199092019160209182019101611267565b604080516001600160801b039094168452911515602084015282820152519081900360600190a25050565b60085481565b60145481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561369257600080fd5b505afa1580156136a6573d6000803e3d6000fd5b505050506040513d60208110156136bc57600080fd5b50516000546001600160a01b03161580613752575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561372557600080fd5b505afa158015613739573d6000803e3d6000fd5b505050506040513d602081101561374f57600080fd5b50515b61378f576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600e55565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137e157600080fd5b505afa1580156137f5573d6000803e3d6000fd5b505050506040513d602081101561380b57600080fd5b50516000546001600160a01b031615806138a1575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561387457600080fd5b505afa158015613888573d6000803e3d6000fd5b505050506040513d602081101561389e57600080fd5b50515b6138de576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b600082116138eb57600080fd5b81601054101561392f576040805162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b604482015290519081900360640190fd5b6001546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561398557600080fd5b505af1158015613999573d6000803e3d6000fd5b505050506040513d60208110156139af57600080fd5b50506010546139be9083613a96565b601055505050565b600254600160a01b900460ff1681565b6000826139e557506000611583565b828202828482816139f257fe5b0414611e1b5760405162461bcd60e51b8152600401808060200182810382526021815260200180613c1d6021913960400191505060405180910390fd5b6000808211613a85576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613a8e57fe5b049392505050565b600082821115613aed576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611e1b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b613b55613bfe565b818410613b7657506040805180820190915260008082526020820152611e1b565b8282111580613b83575082155b15613bae576040805180820190915280613b9d8487613a96565b815260200160008152509050611e1b565b828410613bda57604080518082019091526000815260208101613bd18487613a96565b90529050611e1b565b6040805180820190915280613bef8587613a96565b8152602001613bd18486613a96565b6040518060400160405280600290602082028036833750919291505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220152ecbfb0f8928f0e1ca6ceda8cb433dcdbb0215e6e1f155c92da2ea871bedde64736f6c634300060c0033
Deployed Bytecode
0x60806040526004361061036a5760003560e01c80639548f1e6116101c6578063d48ba486116100f7578063e877db1a11610095578063f28b039e1161006f578063f28b039e14610d66578063f3368f9014610d7b578063f3fef3a314610da5578063fed0a20e14610dde5761036a565b8063e877db1a14610d1f578063eb2f481714610d49578063ed5998da14610d515761036a565b8063da7169b3116100d1578063da7169b314610ca7578063dc0bbf0814610ce0578063ddf0185f14610cf5578063e195232e14610d0a5761036a565b8063d48ba48614610bc2578063d4aadbc614610c75578063d9df77de14610c925761036a565b8063b6b55f2511610164578063c415b95c1161013e578063c415b95c14610aff578063c5a2928b14610b14578063c8b81e1514610b47578063d2c35ce814610b8f5761036a565b8063b6b55f2514610aab578063c2b2fdca14610ad5578063c3d5864f14610aea5761036a565b8063a77e2825116101a0578063a77e2825146109e7578063aa5c3ab414610a36578063ae749c4214610a4b578063b0e8a45d14610a755761036a565b80639548f1e6146109a8578063965d61b9146109bd57806399e6f700146109d25761036a565b806339941fa4116102a05780637a0b92551161023e5780638123fdbb116102185780638123fdbb1461089757806387f48f4e1461094e5780638aa9a37f146109635780639162c594146109935761036a565b80637a0b9255146108255780637a5d5cf4146108585780637ba909281461086d5761036a565b80635c4f18fa1161027a5780635c4f18fa14610762578063623ef910146107a45780636c52ec10146107ce5780636f300155146108105761036a565b806339941fa4146106bb5780633bb58b67146106ef578063555d3e63146107315761036a565b80631ce7aff91161030d57806326665562116102e757806326665562146105cb578063268e5e4f1461060d578063326f10731461064f57806334dce6b3146106885761036a565b80631ce7aff9146104f05780631d851bbd14610560578063255ebc8d146105755761036a565b80630f694584116103495780630f694584146103ed5780630fe48b3614610413578063198858981461042857806319a1f5ae1461043d5761036a565b8062a469171461036f57806309a07fd2146103965780630a8d1be2146103bd575b600080fd5b6103946004803603604081101561038557600080fd5b50803590602001351515610df3565b005b3480156103a257600080fd5b506103ab610f72565b60408051918252519081900360200190f35b3480156103c957600080fd5b50610394600480360360408110156103e057600080fd5b5080359060200135610f78565b6103946004803603602081101561040357600080fd5b50356001600160801b03166110d7565b34801561041f57600080fd5b506103ab6113e0565b34801561043457600080fd5b506103ab6113e6565b34801561044957600080fd5b506103ab6004803603602081101561046057600080fd5b81019060208101813564010000000081111561047b57600080fd5b82018360208201111561048d57600080fd5b803590602001918460018302840111640100000000831117156104af57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506113ec945050505050565b3480156104fc57600080fd5b50610394600480360361014081101561051457600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060808101359060a08101359060c08101359060e081013590610100810135906101200135611409565b34801561056c57600080fd5b506103ab6114d1565b34801561058157600080fd5b506105b76004803603604081101561059857600080fd5b5080356001600160a01b031690602001356001600160801b03166114d7565b604080519115158252519081900360200190f35b3480156105d757600080fd5b506105b7600480360360408110156105ee57600080fd5b5080356001600160a01b031690602001356001600160801b0316611589565b34801561061957600080fd5b506103ab6004803603604081101561063057600080fd5b5080356001600160a01b031690602001356001600160801b0316611600565b34801561065b57600080fd5b506103946004803603604081101561067257600080fd5b506001600160801b038135169060200135611672565b34801561069457600080fd5b506105b7600480360360208110156106ab57600080fd5b50356001600160a01b03166117e2565b6105b7600480360360608110156106d157600080fd5b506001600160801b0381351690602081013590604001351515611808565b3480156106fb57600080fd5b506103ab6004803603604081101561071257600080fd5b5080356001600160a01b031690602001356001600160801b0316611e22565b34801561073d57600080fd5b50610746611e2f565b604080516001600160a01b039092168252519081900360200190f35b34801561076e57600080fd5b506105b76004803603604081101561078557600080fd5b5080356001600160a01b031690602001356001600160801b0316611e3e565b3480156107b057600080fd5b50610394600480360360208110156107c757600080fd5b5035611e64565b3480156107da57600080fd5b506105b7600480360360408110156107f157600080fd5b5080356001600160a01b031690602001356001600160801b0316611fb3565b34801561081c57600080fd5b506103ab612048565b34801561083157600080fd5b506103946004803603602081101561084857600080fd5b50356001600160a01b031661204e565b34801561086457600080fd5b506103ab612143565b34801561087957600080fd5b506103946004803603602081101561089057600080fd5b5035612149565b3480156108a357600080fd5b506108d9600480360360408110156108ba57600080fd5b5080356001600160a01b031690602001356001600160801b03166122a5565b6040805160208082528351818301528351919283929083019185019080838360005b838110156109135781810151838201526020016108fb565b50505050905090810190601f1680156109405780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561095a57600080fd5b506103ab61232f565b34801561096f57600080fd5b506103946004803603604081101561098657600080fd5b5080359060200135612335565b34801561099f57600080fd5b506103ab612494565b3480156109b457600080fd5b5061074661249a565b3480156109c957600080fd5b506107466124a9565b3480156109de57600080fd5b506103ab6124b8565b3480156109f357600080fd5b50610a1a60048036036020811015610a0a57600080fd5b50356001600160a01b03166124be565b604080516001600160801b039092168252519081900360200190f35b348015610a4257600080fd5b506103ab6124d9565b348015610a5757600080fd5b5061039460048036036020811015610a6e57600080fd5b50356124df565b348015610a8157600080fd5b5061039460048036036060811015610a9857600080fd5b508035906020810135906040013561262e565b348015610ab757600080fd5b5061039460048036036020811015610ace57600080fd5b50356127a1565b348015610ae157600080fd5b506103ab612991565b348015610af657600080fd5b506103ab612997565b348015610b0b57600080fd5b5061074661299d565b348015610b2057600080fd5b5061039460048036036020811015610b3757600080fd5b50356001600160a01b03166129ac565b348015610b5357600080fd5b506103ab60048036036060811015610b6a57600080fd5b506001600160a01b03813516906001600160801b036020820135169060400135612b18565b348015610b9b57600080fd5b5061039460048036036020811015610bb257600080fd5b50356001600160a01b0316612ddf565b348015610bce57600080fd5b506103ab60048036036020811015610be557600080fd5b810190602081018135640100000000811115610c0057600080fd5b820183602082011115610c1257600080fd5b80359060200191846001830284011164010000000083111715610c3457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612f5e945050505050565b61039460048036036020811015610c8b57600080fd5b5035612f7b565b348015610c9e57600080fd5b506103ab613116565b348015610cb357600080fd5b506103ab60048036036040811015610cca57600080fd5b506001600160a01b03813516906020013561311c565b348015610cec57600080fd5b506103ab613184565b348015610d0157600080fd5b50610a1a61318a565b348015610d1657600080fd5b50610746613199565b348015610d2b57600080fd5b5061039460048036036020811015610d4257600080fd5b50356131a8565b610394613304565b348015610d5d57600080fd5b506103ab61363a565b348015610d7257600080fd5b506103ab613640565b348015610d8757600080fd5b5061039460048036036020811015610d9e57600080fd5b5035613646565b348015610db157600080fd5b5061039460048036036040811015610dc857600080fd5b506001600160a01b038135169060200135613795565b348015610dea57600080fd5b506105b76139c6565b3460015b336000908152601760205260409020546001600160801b031661ffff821611610f6c576000610e2b338361ffff1687612b18565b90506000610e50600b54610e4a600a54856139d690919063ffffffff16565b90613a2f565b905080841015610e95576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b60408051630e6507e960e21b815261ffff85166004820152602481018890528615156044820152905130916339941fa491849160648082019260209290919082900301818588803b158015610ee957600080fd5b505af1158015610efd573d6000803e3d6000fd5b50505050506040513d6020811015610f1457600080fd5b5051610f56576040805162461bcd60e51b815260206004820152600c60248201526b18db185a5b4819985a5b195960a21b604482015290519081900360640190fd5b610f608482613a96565b93505050600101610df7565b50505050565b600a5481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fc457600080fd5b505afa158015610fd8573d6000803e3d6000fd5b505050506040513d6020811015610fee57600080fd5b50516000546001600160a01b03161580611084575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561105757600080fd5b505afa15801561106b573d6000803e3d6000fd5b505050506040513d602081101561108157600080fd5b50515b6110c1576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b816110cb57600080fd5b50600591909155600655565b60003330146110e657336110e8565b325b905060606110f682846122a5565b90506111028284611589565b611142576040805162461bcd60e51b815260206004820152600c60248201526b191bd95cdb9d08195e1a5cdd60a21b604482015290519081900360640190fd5b61114c8284611fb3565b15611189576040805162461bcd60e51b8152602060048201526008602482015267746f6f206c61746560c01b604482015290519081900360640190fd5b61119382846114d7565b156111d0576040805162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015290519081900360640190fd5b600e543414611214576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b6004546040516001600160a01b03909116903480156108fc02916000818181858888f1935050505015801561124d573d6000803e3d6000fd5b506112bc600f546015836040518082805190602001908083835b602083106112865780518252601f199092019160209182019101611267565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054929150613af39050565b6015826040518082805190602001908083835b602083106112ee5780518252601f1990920191602091820191016112cf565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902081905550816001600160a01b03167fd8722907e22bdf7371f82757663f42769580522cf1fc9af2c0740ac3135e9d508460016015856040518082805190602001908083835b602083106113855780518252601f199092019160209182019101611366565b51815160001960209485036101000a01908116901991909116179052920194855250604080519485900382018520546001600160801b03909716855294151590840152505080820192909252519081900360600190a2505050565b600f5481565b60065481565b805160208183018101805160168252928201919093012091525481565b600254600160a01b900460ff1615611454576040805162461bcd60e51b8152602060048201526009602482015268696e697420646f6e6560b81b604482015290519081900360640190fd5b600180546001600160a01b039b8c166001600160a01b0319918216179091556002805460059a909a55600698909855600c96909655600d94909455600e92909255600a91909155600b91909155600f55601380546001600160801b031916606417905560ff60a01b1993909416919093161716600160a01b179055565b60095481565b60008060156114e685856122a5565b6040518082805190602001908083835b602083106115155780518252601f1990920191602091820191016114f6565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054601454600f5491945060009350611564925061155d91906139d6565b4390613af3565b90508061157c600f5484613af390919063ffffffff16565b1015925050505b92915050565b600080601561159885856122a5565b6040518082805190602001908083835b602083106115c75780518252601f1990920191602091820191016115a8565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549290921195945050505050565b6000601561160e84846122a5565b6040518082805190602001908083835b6020831061163d5780518252601f19909201916020918201910161161e565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205495945050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156116be57600080fd5b505afa1580156116d2573d6000803e3d6000fd5b505050506040513d60208110156116e857600080fd5b50516000546001600160a01b0316158061177e575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561175157600080fd5b505afa158015611765573d6000803e3d6000fd5b505050506040513d602081101561177b57600080fd5b50515b6117bb576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50601380546001600160801b0319166001600160801b039390931692909217909155601455565b60006117ef826001611589565b80156115835750611801826001611fb3565b1592915050565b6000803330148061182357506018546001600160a01b031633145b61182d573361182f565b325b9050606061183d82876122a5565b905060006016826040518082805190602001908083835b602083106118735780518252601f199092019160209182019101611854565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054151591506119109050576015826040518082805190602001908083835b602083106118db5780518252601f1990920191602091820191016118bc565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205491506119729050565b6016826040518082805190602001908083835b602083106119425780518252601f199092019160209182019101611923565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150505b905060006015836040518082805190602001908083835b602083106119a85780518252601f199092019160209182019101611989565b51815160001960209485036101000a019081169019919091161790529201948552506040519384900301909220549250505081611a1c576040805162461bcd60e51b815260206004820152600d60248201526c1b995d995c8818db185a5b5959609a1b604482015290519081900360640190fd5b43871115611a61576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c696420626c6f636b60981b604482015290519081900360640190fd5b818711611aa0576040805162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015290519081900360640190fd5b600e5415611af357600f54611ab6908290613af3565b8710611af3576040805162461bcd60e51b81526020600482015260076024820152667061792066656560c81b604482015290519081900360640190fd5b6000611b00858a8a612b18565b905060008111611b43576040805162461bcd60e51b81526020600482015260096024820152681b9bc81c995dd85c9960ba1b604482015290519081900360640190fd5b6000611b60600b54610e4a600a54856139d690919063ffffffff16565b905080341015611ba5576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b6004546040516001600160a01b03909116903480156108fc02916000818181858888f19350505050158015611bde573d6000803e3d6000fd5b508715611cdc576001546002546040805163095ea7b360e01b81526001600160a01b039283166004820152602481018690529051919092169163095ea7b39160448083019260209291908290030181600087803b158015611c3e57600080fd5b505af1158015611c52573d6000803e3d6000fd5b505050506040513d6020811015611c6857600080fd5b5050600254604080516330d6a97560e01b81526001600160a01b03898116600483015260248201869052915191909216916330d6a97591604480830192600092919082900301818387803b158015611cbf57600080fd5b505af1158015611cd3573d6000803e3d6000fd5b50505050611d5f565b6001546040805163a9059cbb60e01b81526001600160a01b038981166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b158015611d3257600080fd5b505af1158015611d46573d6000803e3d6000fd5b505050506040513d6020811015611d5c57600080fd5b50505b601054611d6c9083613a96565b601081905550886016866040518082805190602001908083835b60208310611da55780518252601f199092019160209182019101611d86565b51815160209384036101000a60001901801990921691161790529201948552506040805194859003820185209590955586845293516001600160a01b038b16947fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a948290030192509050a2600196505050505050505b9392505050565b6000611e1b838343612b18565b6000546001600160a01b031681565b6000611e4a8383611fb3565b158015611e1b5750611e5c83836114d7565b159392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015611eb057600080fd5b505afa158015611ec4573d6000803e3d6000fd5b505050506040513d6020811015611eda57600080fd5b50516000546001600160a01b03161580611f70575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015611f4357600080fd5b505afa158015611f57573d6000803e3d6000fd5b505050506040513d6020811015611f6d57600080fd5b50515b611fad576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600d55565b6000806015611fc285856122a5565b6040518082805190602001908083835b60208310611ff15780518252601f199092019160209182019101611fd2565b51815160209384036101000a6000190180199092169116179052920194855250604051938490030190922054601254600f5491945061203e93509150612038908490613af3565b90613af3565b4311949350505050565b600c5481565b600080546001600160a01b031615806120e3575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156120b657600080fd5b505afa1580156120ca573d6000803e3d6000fd5b505050506040513d60208110156120e057600080fd5b50515b612120576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b60075481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561219557600080fd5b505afa1580156121a9573d6000803e3d6000fd5b505050506040513d60208110156121bf57600080fd5b50516000546001600160a01b03161580612255575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561222857600080fd5b505afa15801561223c573d6000803e3d6000fd5b505050506040513d602081101561225257600080fd5b50515b612292576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6000821161229f57600080fd5b50601255565b606060006001600160801b0383166122e1576001600160a01b0384166000908152601760205260409020546001600160801b03166001016122e3565b825b6040805160609690961b6bffffffffffffffffffffffff1916602087015260809190911b6001600160801b03191660348601528051808603602401815260449095019052509192915050565b600b5481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561238157600080fd5b505afa158015612395573d6000803e3d6000fd5b505050506040513d60208110156123ab57600080fd5b50516000546001600160a01b03161580612441575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561241457600080fd5b505afa158015612428573d6000803e3d6000fd5b505050506040513d602081101561243e57600080fd5b50515b61247e576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b8161248857600080fd5b50600a91909155600b55565b600e5481565b6018546001600160a01b031681565b6001546001600160a01b031681565b60055481565b6017602052600090815260409020546001600160801b031681565b60105481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561252b57600080fd5b505afa15801561253f573d6000803e3d6000fd5b505050506040513d602081101561255557600080fd5b50516000546001600160a01b031615806125eb575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b1580156125be57600080fd5b505afa1580156125d2573d6000803e3d6000fd5b505050506040513d60208110156125e857600080fd5b50515b612628576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600c55565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561267a57600080fd5b505afa15801561268e573d6000803e3d6000fd5b505050506040513d60208110156126a457600080fd5b50516000546001600160a01b0316158061273a575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561270d57600080fd5b505afa158015612721573d6000803e3d6000fd5b505050506040513d602081101561273757600080fd5b50515b612777576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b8261278157600080fd5b60078490556008839055816127965743612798565b815b60095550505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156127ed57600080fd5b505afa158015612801573d6000803e3d6000fd5b505050506040513d602081101561281757600080fd5b50516000546001600160a01b031615806128ad575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561288057600080fd5b505afa158015612894573d6000803e3d6000fd5b505050506040513d60208110156128aa57600080fd5b50515b6128ea576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b600082116128f757600080fd5b600154604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561295157600080fd5b505af1158015612965573d6000803e3d6000fd5b505050506040513d602081101561297b57600080fd5b505060105461298a9083613af3565b6010555050565b60115481565b60125481565b6004546001600160a01b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129f857600080fd5b505afa158015612a0c573d6000803e3d6000fd5b505050506040513d6020811015612a2257600080fd5b50516000546001600160a01b03161580612ab8575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015612a8b57600080fd5b505afa158015612a9f573d6000803e3d6000fd5b505050506040513d6020811015612ab557600080fd5b50515b612af5576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50601880546001600160a01b0319166001600160a01b0392909216919091179055565b60006060612b2685856122a5565b905060006016826040518082805190602001908083835b60208310612b5c5780518252601f199092019160209182019101612b3d565b51815160209384036101000a600019018019909216911617905292019485525060405193849003019092205415159150612bf99050576015826040518082805190602001908083835b60208310612bc45780518252601f199092019160209182019101612ba5565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150612c5b9050565b6016826040518082805190602001908083835b60208310612c2b5780518252601f199092019160209182019101612c0c565b51815160209384036101000a60001901801990921691161790529201948552506040519384900301909220549150505b905043841115612c7057600092505050611e1b565b80612c8057600092505050611e1b565b80841015612c9357600092505050611e1b565b612c9b613bfe565b612ca88260095487613b4d565b905060008060065411612cbc576000612ce0565b612ce0600654610e4a60055485600060028110612cd557fe5b6020020151906139d6565b905060008060085411612cf4576000612d0d565b612d0d600854610e4a60075486600160028110612cd557fe5b6018549091506000906001600160a01b0316612d2a576000612dc1565b6018546040805163b07d9cbb60e01b81526001600160a01b038d811660048301526001600160801b038d16602483015260448201899052606482018c90529151919092169163b07d9cbb916084808301926020929190829003018186803b158015612d9457600080fd5b505afa158015612da8573d6000803e3d6000fd5b505050506040513d6020811015612dbe57600080fd5b50515b9050612dd1816120388585613af3565b9a9950505050505050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015612e2b57600080fd5b505afa158015612e3f573d6000803e3d6000fd5b505050506040513d6020811015612e5557600080fd5b50516000546001600160a01b03161580612eeb575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b158015612ebe57600080fd5b505afa158015612ed2573d6000803e3d6000fd5b505050506040513d6020811015612ee857600080fd5b50515b612f28576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b6001600160a01b038216612f3b57600080fd5b50600480546001600160a01b0319166001600160a01b0392909216919091179055565b805160208183018101805160158252928201919093012091525481565b60008111612fc0576040805162461bcd60e51b815260206004820152600d60248201526c696e76616c69642076616c756560981b604482015290519081900360640190fd5b600e54612fcd90826139d6565b341461300e576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b60015b336000908152601760205260409020546001600160801b031661ffff8216116130cf57613042338261ffff16611e3e565b61304b576130c7565b306001600160a01b0316630f694584600e54836040518363ffffffff1660e01b8152600401808261ffff1681526020019150506000604051808303818588803b15801561309757600080fd5b505af11580156130ab573d6000803e3d6000fd5b50505050506130c4600183613a9690919063ffffffff16565b91505b600101613011565b508015613113576040805162461bcd60e51b815260206004820152600d60248201526c1a5b9d985b1a590818dbdd5b9d609a1b604482015290519081900360640190fd5b50565b600d5481565b60008060015b6001600160a01b0385166000908152601760205260409020546001600160801b039081169082161161317c5761317261316b8683600088116131645743613166565b875b612b18565b8390613af3565b9150600101613122565b509392505050565b60035481565b6013546001600160801b031681565b6002546001600160a01b031681565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156131f457600080fd5b505afa158015613208573d6000803e3d6000fd5b505050506040513d602081101561321e57600080fd5b50516000546001600160a01b031615806132b4575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561328757600080fd5b505afa15801561329b573d6000803e3d6000fd5b505050506040513d60208110156132b157600080fd5b50515b6132f1576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b600082116132fe57600080fd5b50600f55565b601354336000908152601760205260409020546001600160801b03918216911610613366576040805162461bcd60e51b815260206004820152600d60248201526c1b1a5b5a5d081c995858da1959609a1b604482015290519081900360640190fd5b600c5434146133aa576040805162461bcd60e51b815260206004820152600b60248201526a696e76616c69642066656560a81b604482015290519081900360640190fd5b336000818152601760205260409020546001600160801b0316600101906060906133d490836122a5565b6003549091506133e5906001613af3565b600381905550436015826040518082805190602001908083835b6020831061341e5780518252601f1990920191602091820191016133ff565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101842094909455505082514392601692859290918291908401908083835b602083106134835780518252601f199092019160209182019101613464565b51815160001960209485036101000a0190811690199190911617905292019485525060408051948590038201852095909555336000908152601790915293842080546001600160801b03808216600101166001600160801b031990911617905550506004546001600160a01b0316913480156108fc02929091818181858888f19350505050158015613519573d6000803e3d6000fd5b5060015460048054600d54604080516323b872dd60e01b815233948101949094526001600160a01b0392831660248501526044840191909152519216916323b872dd916064808201926020929091908290030181600087803b15801561357e57600080fd5b505af1158015613592573d6000803e3d6000fd5b505050506040513d60208110156135a857600080fd5b5050600f54604051825133927fd8722907e22bdf7371f82757663f42769580522cf1fc9af2c0740ac3135e9d5092869260009261360f929091601591899181906020840190808383602083106112865780518252601f199092019160209182019101611267565b604080516001600160801b039094168452911515602084015282820152519081900360600190a25050565b60085481565b60145481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561369257600080fd5b505afa1580156136a6573d6000803e3d6000fd5b505050506040513d60208110156136bc57600080fd5b50516000546001600160a01b03161580613752575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561372557600080fd5b505afa158015613739573d6000803e3d6000fd5b505050506040513d602081101561374f57600080fd5b50515b61378f576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b50600e55565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137e157600080fd5b505afa1580156137f5573d6000803e3d6000fd5b505050506040513d602081101561380b57600080fd5b50516000546001600160a01b031615806138a1575060005460408051634f4bdc7b60e11b815260ff8416600482015233602482015290516001600160a01b0390921691639e97b8f691604480820192602092909190829003018186803b15801561387457600080fd5b505afa158015613888573d6000803e3d6000fd5b505050506040513d602081101561389e57600080fd5b50515b6138de576040805162461bcd60e51b81526020600482015260096024820152686e6f2061636365737360b81b604482015290519081900360640190fd5b600082116138eb57600080fd5b81601054101561392f576040805162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b604482015290519081900360640190fd5b6001546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561398557600080fd5b505af1158015613999573d6000803e3d6000fd5b505050506040513d60208110156139af57600080fd5b50506010546139be9083613a96565b601055505050565b600254600160a01b900460ff1681565b6000826139e557506000611583565b828202828482816139f257fe5b0414611e1b5760405162461bcd60e51b8152600401808060200182810382526021815260200180613c1d6021913960400191505060405180910390fd5b6000808211613a85576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381613a8e57fe5b049392505050565b600082821115613aed576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015611e1b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b613b55613bfe565b818410613b7657506040805180820190915260008082526020820152611e1b565b8282111580613b83575082155b15613bae576040805180820190915280613b9d8487613a96565b815260200160008152509050611e1b565b828410613bda57604080518082019091526000815260208101613bd18487613a96565b90529050611e1b565b6040805180820190915280613bef8587613a96565b8152602001613bd18486613a96565b6040518060400160405280600290602082028036833750919291505056fe536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220152ecbfb0f8928f0e1ca6ceda8cb433dcdbb0215e6e1f155c92da2ea871bedde64736f6c634300060c0033
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.