More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 16778259 | 628 days ago | IN | 0 ETH | 0.14560399 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NodePackV7
Compiler Version
v0.8.9+commit.e5eed63a
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.8.9; import "./lib/AdminAccess.sol"; import "./interfaces/IERC20.sol"; import "./interfaces/INodePackV3.sol"; import "./interfaces/IStrongPool.sol"; import "./interfaces/IStrongNFTPackBonus.sol"; import "./lib/InternalCalls.sol"; import "./lib/SbMath.sol"; contract NodePackV7 is AdminAccess, INodePackV3, InternalCalls { uint constant public PACK_TYPE_NODE_REWARD_LIFETIME = 0; uint constant public PACK_TYPE_NODE_REWARD_PER_SECOND = 1; uint constant public PACK_TYPE_FEE_STRONG = 2; uint constant public PACK_TYPE_FEE_CREATE = 3; uint constant public PACK_TYPE_FEE_RECURRING = 4; uint constant public PACK_TYPE_FEE_CLAIMING_NUMERATOR = 5; uint constant public PACK_TYPE_FEE_CLAIMING_DENOMINATOR = 6; uint constant public PACK_TYPE_RECURRING_CYCLE_SECONDS = 7; uint constant public PACK_TYPE_GRACE_PERIOD_SECONDS = 8; uint constant public PACK_TYPE_PAY_CYCLES_LIMIT = 9; uint constant public PACK_TYPE_NODES_LIMIT = 10; event Created(address indexed entity, uint packType, uint nodesCount, bool usedCredit, uint timestamp, address migratedFrom); event AddedNodes(address indexed entity, uint packType, uint nodesCount, uint totalNodesCount, bool usedCredit, uint timestamp, address migratedFrom); event MigratedNodes(address indexed entity, uint packType, uint nodesCount, uint lastPaidAt, uint rewardsDue, uint totalClaimed, address migratedFrom, uint timestamp); event MaturedNodes(address indexed entity, uint packType, uint maturedCount); event Paid(address indexed entity, uint packType, uint timestamp); event Claimed(address indexed entity, uint packType, uint reward); event SetNodeFeeCollector(address payable collector); event SetFeeCollector(address payable collector); event SetTakeStrongBips(uint bips); event SetNFTBonusContract(address strongNFTBonus); event SetServiceContractEnabled(address service, bool enabled); event SetPackTypeActive(uint packType, bool active); event SetPackTypeSetting(uint packType, uint settingId, uint value); event SetPackTypeHasSettings(uint packType, bool hasSettings); IERC20 public strongToken; IStrongNFTPackBonus public strongNFTBonus; uint public totalNodes; uint public totalMaturedNodes; uint public totalPacks; uint public totalPackTypes; uint public takeStrongBips; address payable public claimFeeCollector; address payable public nodeFeeCollector; mapping(address => uint) public entityNodeCount; mapping(address => uint) public entityCreditUsed; mapping(bytes => uint) public entityPackCreatedAt; mapping(bytes => uint) public entityPackLastPaidAt; mapping(bytes => uint) public entityPackLastClaimedAt; mapping(bytes => uint) public entityPackTotalNodeCount; mapping(bytes => uint) public entityPackMaturedNodeCount; mapping(bytes => uint) public entityPackRewardDue; mapping(bytes => uint) public entityPackClaimedTotal; mapping(bytes => uint) public entityPackClaimedMatured; mapping(uint => bool) public packTypeActive; mapping(uint => bool) public packTypeHasSettings; mapping(uint => mapping(uint => uint)) public packTypeSettings; mapping(address => bool) private serviceContractEnabled; function init( IERC20 _strongToken, IStrongNFTPackBonus _strongNFTBonus, address payable _nodeFeeCollector, address payable _claimFeeCollector ) external onlyRole(adminControl.SUPER_ADMIN()) { require(_claimFeeCollector != address(0), "no address"); strongToken = _strongToken; strongNFTBonus = _strongNFTBonus; nodeFeeCollector = _nodeFeeCollector; claimFeeCollector = _claimFeeCollector; InternalCalls.init(); } // // Getters // ------------------------------------------------------------------------------------------------------------------- function canPackBePaid(address _entity, uint _packType) public view returns (bool) { return doesPackExist(_entity, _packType) && !hasPackExpired(_entity, _packType) && !hasMaxPayments(_entity, _packType); } function doesPackExist(address _entity, uint _packType) public view returns (bool) { return entityPackLastPaidAt[getPackId(_entity, _packType)] > 0; } function isPackPastDue(address _entity, uint _packType) public view returns (bool) { bytes memory id = getPackId(_entity, _packType); uint lastPaidAt = entityPackLastPaidAt[id]; return block.timestamp > (lastPaidAt + getRecurringPaymentCycle(_packType)); } function hasMaxPayments(address _entity, uint _packType) public view returns (bool) { bytes memory id = getPackId(_entity, _packType); uint lastPaidAt = entityPackLastPaidAt[id]; uint recurringPaymentCycle = getRecurringPaymentCycle(_packType); uint limit = block.timestamp + recurringPaymentCycle * getPayCyclesLimit(_packType); return lastPaidAt + recurringPaymentCycle >= limit; } function hasPackExpired(address _entity, uint _packType) public view returns (bool) { bytes memory id = getPackId(_entity, _packType); uint lastPaidAt = entityPackLastPaidAt[id]; if (lastPaidAt == 0) return true; return block.timestamp > (lastPaidAt + getRecurringPaymentCycle(_packType) + getGracePeriod(_packType)); } function getClaimingFee(address _entity, uint _packType, uint _timestamp) public view returns (uint) { return getRewardAt(_entity, _packType, _timestamp, true) * getClaimingFeeNumerator(_packType) / getClaimingFeeDenominator(_packType); } function getPacksClaimingFee(address _entity, uint _timestamp) external view returns (uint) { uint fee = 0; for (uint packType = 1; packType <= totalPackTypes; packType++) { fee = fee + getClaimingFee(_entity, packType, _timestamp); } return fee; } function getPackId(address _entity, uint _packType) public pure returns (bytes memory) { uint id = _packType != 0 ? _packType : 1; return abi.encodePacked(_entity, uint32(id), uint64(1)); } function getEntityPackTotalNodeCount(address _entity, uint _packType) external view returns (uint) { return entityPackTotalNodeCount[getPackId(_entity, _packType)]; } function getEntityPackMaturedNodeCount(address _entity, uint _packType) external view returns (uint) { return entityPackMaturedNodeCount[getPackId(_entity, _packType)]; } function getEntityPackActiveNodeCount(address _entity, uint _packType) public view returns (uint) { bytes memory id = getPackId(_entity, _packType); return entityPackTotalNodeCount[id] - entityPackMaturedNodeCount[id]; } function getEntityPackLifetimeRewards(address _entity, uint _packType) public view returns (uint) { return getNodeRewardLifetime(_packType) * entityPackTotalNodeCount[getPackId(_entity, _packType)]; } function getEntityPackClaimedMaturedRewards(address _entity, uint _packType) public view returns (uint) { return entityPackClaimedMatured[getPackId(_entity, _packType)]; } function getEntityPackClaimedTotalRewards(address _entity, uint _packType) public view returns (uint) { return entityPackClaimedTotal[getPackId(_entity, _packType)]; } function getEntityPackAccruedTotalRewards(address _entity, uint _packType) public view returns (uint) { return entityPackClaimedTotal[getPackId(_entity, _packType)] + getRewardAt(_entity, _packType, block.timestamp, true); } function getPackLastPaidAt(address _entity, uint _packType) external view returns (uint) { return entityPackLastPaidAt[getPackId(_entity, _packType)]; } function getNodeCreateFee(address _entity, uint _packType) public view returns (uint) { uint fee = getCreatingFeeInWei(_packType); uint lastPaidAt = entityPackLastPaidAt[getPackId(_entity, _packType)]; if (lastPaidAt == 0) return fee; if (isPackPastDue(_entity, _packType)) return fee; if (hasPackExpired(_entity, _packType)) return 0; uint payCycleSeconds = getRecurringPaymentCycle(_packType); uint dueInSeconds = lastPaidAt + payCycleSeconds - block.timestamp; return dueInSeconds * fee / payCycleSeconds; } function getRecurringFee(address _entity, uint _packType) public view returns (uint) { return getRecurringFeeInWei(_packType) * getEntityPackActiveNodeCount(_entity, _packType); } function getPacksRecurringFee(address _entity) external view returns (uint) { uint fee = 0; for (uint packType = 1; packType <= totalPackTypes; packType++) { if (canPackBePaid(_entity, packType)) fee = fee + getRecurringFee(_entity, packType); } return fee; } function getReward(address _entity, uint _packType) external view returns (uint) { return getRewardAt(_entity, _packType, block.timestamp, true); } function getRewardAt(address _entity, uint _packType, uint _timestamp, bool _addBonus) public view returns (uint) { bytes memory id = getPackId(_entity, _packType); uint lastClaimedAt = entityPackLastClaimedAt[id]; uint registeredAt = entityPackCreatedAt[id]; if (!doesPackExist(_entity, _packType)) return 0; if (hasPackExpired(_entity, _packType)) return 0; if (_timestamp > block.timestamp) return 0; if (_timestamp < lastClaimedAt) return 0; if (_timestamp <= registeredAt) return 0; uint secondsPassed = lastClaimedAt > 0 ? _timestamp - lastClaimedAt : _timestamp - registeredAt; uint maxReward = getEntityPackLifetimeRewards(_entity, _packType); uint reward = secondsPassed * getNodeRewardPerSecond(_packType) * getEntityPackActiveNodeCount(_entity, _packType); uint bonus = _addBonus ? getBonusAt(_entity, _packType, _timestamp) : 0; uint totalReward = reward + bonus + entityPackRewardDue[id]; if (entityPackClaimedTotal[id] >= maxReward) { return 0; } if ((entityPackClaimedTotal[id] + totalReward) >= maxReward) { totalReward = maxReward - entityPackClaimedTotal[id]; } return totalReward; } function getBonusAt(address _entity, uint _packType, uint _timestamp) public view returns (uint) { if (address(strongNFTBonus) == address(0)) return 0; bytes memory id = getPackId(_entity, _packType); uint lastClaimedAt = entityPackLastClaimedAt[id] != 0 ? entityPackLastClaimedAt[id] : entityPackCreatedAt[id]; return strongNFTBonus.getBonus(_entity, _packType, lastClaimedAt, _timestamp); } function getEntityRewards(address _entity, uint _timestamp) public view returns (uint) { uint reward = 0; for (uint packType = 1; packType <= totalPackTypes; packType++) { reward = reward + getRewardAt(_entity, packType, _timestamp > 0 ? _timestamp : block.timestamp, true); } return reward; } function getEntityCreditAvailable(address _entity, uint _timestamp) public view returns (uint) { return getEntityRewards(_entity, _timestamp) - entityCreditUsed[_entity]; } function getRewardBalance() external view returns (uint) { return strongToken.balanceOf(address(this)); } // // Actions // ------------------------------------------------------------------------------------------------------------------- function create(uint _packType, uint _nodeCount, bool _useCredit) external payable { uint fee = getNodeCreateFee(msg.sender, _packType) * _nodeCount; uint strongFee = getStrongFeeInWei(_packType) * _nodeCount; uint packTypeLimit = getNodesLimit(_packType); uint timestamp = block.timestamp; bytes memory id = getPackId(msg.sender, _packType); require(packTypeActive[_packType], "invalid type"); require(packTypeLimit == 0 || (entityPackTotalNodeCount[id] + _nodeCount) <= packTypeLimit, "over limit"); require(_nodeCount >= 1, "invalid node count"); require(msg.value >= fee, "invalid fee"); if (address(strongNFTBonus) != address(0)) { strongNFTBonus.setEntityPackBonusSaved(msg.sender, _packType); } totalNodes += _nodeCount; entityNodeCount[msg.sender] += _nodeCount; if (entityPackTotalNodeCount[id] == 0) { entityPackCreatedAt[id] = timestamp; entityPackLastPaidAt[id] = timestamp; entityPackTotalNodeCount[id] += _nodeCount; totalPacks += 1; emit Created(msg.sender, _packType, _nodeCount, _useCredit, block.timestamp, address(0)); } else { require(!hasPackExpired(msg.sender, _packType), "pack expired"); updatePackState(msg.sender, _packType, true); entityPackTotalNodeCount[id] += _nodeCount; emit AddedNodes(msg.sender, _packType, _nodeCount, entityPackTotalNodeCount[id], _useCredit, block.timestamp, address(0)); } if (_useCredit) { require(getEntityCreditAvailable(msg.sender, block.timestamp) >= strongFee, "not enough"); entityCreditUsed[msg.sender] += strongFee; } else { uint takeStrong = strongFee * takeStrongBips / 10000; if (takeStrong > 0) { require(strongToken.transferFrom(msg.sender, nodeFeeCollector, takeStrong), "transfer failed"); } if (strongFee > takeStrong) { require(strongToken.transferFrom(msg.sender, address(this), strongFee - takeStrong), "transfer failed"); } } sendValue(nodeFeeCollector, msg.value); } function claim(uint _packType, uint _timestamp, address _toStrongPool) public payable returns (uint) { address entity = msg.sender == address(strongNFTBonus) ? tx.origin : msg.sender; bytes memory id = getPackId(entity, _packType); uint lastClaimedAt = entityPackLastClaimedAt[id] != 0 ? entityPackLastClaimedAt[id] : entityPackCreatedAt[id]; require(doesPackExist(entity, _packType), "doesnt exist"); require(!hasPackExpired(entity, _packType), "pack expired"); require(!isPackPastDue(entity, _packType), "past due"); require(_timestamp <= block.timestamp, "bad timestamp"); require(lastClaimedAt + 900 < _timestamp, "too soon"); uint reward = getRewardAt(entity, _packType, _timestamp, true); require(reward > 0, "no reward"); require(strongToken.balanceOf(address(this)) >= reward, "over balance"); uint fee = reward * getClaimingFeeNumerator(_packType) / getClaimingFeeDenominator(_packType); require(msg.value >= fee, "invalid fee"); entityPackLastClaimedAt[id] = _timestamp; entityPackClaimedTotal[id] += reward; entityPackRewardDue[id] = 0; emit Claimed(entity, _packType, reward); if (entityCreditUsed[msg.sender] > 0) { if (entityCreditUsed[msg.sender] > reward) { entityCreditUsed[msg.sender] = entityCreditUsed[msg.sender] - reward; reward = 0; } else { reward = reward - entityCreditUsed[msg.sender]; entityCreditUsed[msg.sender] = 0; } } updatePackState(msg.sender, _packType, false); if (address(strongNFTBonus) != address(0)) { strongNFTBonus.resetEntityPackBonusSaved(id); } if (reward > 0) { if (_toStrongPool != address(0)) IStrongPool(_toStrongPool).mineFor(entity, reward); else require(strongToken.transfer(entity, reward), "transfer failed"); } sendValue(claimFeeCollector, fee); if (isUserCall() && msg.value > fee) sendValue(payable(msg.sender), msg.value - fee); return fee; } function claimAll(uint _timestamp, address _toStrongPool) external payable makesInternalCalls { require(entityNodeCount[msg.sender] > 0, "no nodes"); uint valueLeft = msg.value; for (uint packType = 1; packType <= totalPackTypes; packType++) { uint reward = getRewardAt(msg.sender, packType, _timestamp, true); if (reward > 0) { require(valueLeft >= 0, "not enough"); uint paid = claim(packType, _timestamp, _toStrongPool); valueLeft = valueLeft - paid; } } if (valueLeft > 0) sendValue(payable(msg.sender), valueLeft); } function pay(uint _packType) public payable returns (uint) { require(canPackBePaid(msg.sender, _packType), "cant pay"); updatePackState(msg.sender, _packType, true); bytes memory id = getPackId(msg.sender, _packType); uint fee = getRecurringFeeInWei(_packType) * getEntityPackActiveNodeCount(msg.sender, _packType); require(msg.value >= fee, "invalid fee"); entityPackLastPaidAt[id] = entityPackLastPaidAt[id] + getRecurringPaymentCycle(_packType); emit Paid(msg.sender, _packType, entityPackLastPaidAt[id]); sendValue(nodeFeeCollector, fee); if (isUserCall() && msg.value > fee) sendValue(payable(msg.sender), msg.value - fee); return fee; } function payAll() external payable makesInternalCalls { require(entityNodeCount[msg.sender] > 0, "no packs"); uint valueLeft = msg.value; for (uint packType = 1; packType <= totalPackTypes; packType++) { if (!canPackBePaid(msg.sender, packType)) continue; require(valueLeft > 0, "not enough"); uint paid = pay(packType); valueLeft = valueLeft - paid; } if (valueLeft > 0) sendValue(payable(msg.sender), valueLeft); } // // Admin // ------------------------------------------------------------------------------------------------------------------- function deposit(uint _amount) external onlyRole(adminControl.SUPER_ADMIN()) { require(_amount > 0); require(strongToken.transferFrom(msg.sender, address(this), _amount), "transfer failed"); } function withdraw(address _destination, uint _amount) external onlyRole(adminControl.SUPER_ADMIN()) { require(_amount > 0); require(strongToken.balanceOf(address(this)) >= _amount, "over balance"); require(strongToken.transfer(_destination, _amount), "transfer failed"); } function approveStrongPool(IStrongPool _strongPool, uint _amount) external onlyRole(adminControl.SUPER_ADMIN()) { require(strongToken.approve(address(_strongPool), _amount), "approve failed"); } function setNodeFeeCollector(address payable _nodeFeeCollector) external onlyRole(adminControl.SUPER_ADMIN()) { require(_nodeFeeCollector != address(0)); nodeFeeCollector = _nodeFeeCollector; emit SetNodeFeeCollector(_nodeFeeCollector); } function setClaimFeeCollector(address payable _claimFeeCollector) external onlyRole(adminControl.SUPER_ADMIN()) { require(_claimFeeCollector != address(0)); claimFeeCollector = _claimFeeCollector; emit SetFeeCollector(_claimFeeCollector); } function setNFTBonusContract(address _contract) external onlyRole(adminControl.SERVICE_ADMIN()) { strongNFTBonus = IStrongNFTPackBonus(_contract); emit SetNFTBonusContract(_contract); } function setTakeStrongBips(uint _bips) external onlyRole(adminControl.SUPER_ADMIN()) { require(_bips <= 10000, "invalid value"); takeStrongBips = _bips; emit SetTakeStrongBips(_bips); } function updateEntityPackLastPaidAt(address _entity, uint _packType, uint _lastPaidAt) external onlyRole(adminControl.SERVICE_ADMIN()) { bytes memory id = getPackId(_entity, _packType); entityPackLastPaidAt[id] = _lastPaidAt; } // // Settings // ------------------------------------------------------------------------------------------------------------------- function getCustomSettingOrDefaultIfZero(uint _packType, uint _setting) internal view returns (uint) { return packTypeHasSettings[_packType] && packTypeSettings[_packType][_setting] > 0 ? packTypeSettings[_packType][_setting] : packTypeSettings[0][_setting]; } function getNodeRewardLifetime(uint _packType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_packType, PACK_TYPE_NODE_REWARD_LIFETIME); } function getNodeRewardPerSecond(uint _packType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_packType, PACK_TYPE_NODE_REWARD_PER_SECOND); } function getClaimingFeeNumerator(uint _packType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_packType, PACK_TYPE_FEE_CLAIMING_NUMERATOR); } function getClaimingFeeDenominator(uint _packType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_packType, PACK_TYPE_FEE_CLAIMING_DENOMINATOR); } function getCreatingFeeInWei(uint _packType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_packType, PACK_TYPE_FEE_CREATE); } function getRecurringFeeInWei(uint _packType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_packType, PACK_TYPE_FEE_RECURRING); } function getStrongFeeInWei(uint _packType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_packType, PACK_TYPE_FEE_STRONG); } function getRecurringPaymentCycle(uint _packType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_packType, PACK_TYPE_RECURRING_CYCLE_SECONDS); } function getGracePeriod(uint _packType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_packType, PACK_TYPE_GRACE_PERIOD_SECONDS); } function getPayCyclesLimit(uint _packType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_packType, PACK_TYPE_PAY_CYCLES_LIMIT); } function getNodesLimit(uint _packType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_packType, PACK_TYPE_NODES_LIMIT); } // ------------------------------------------------------------------------------------------------------------------- function setPackTypeActive(uint _packType, bool _active) external onlyRole(adminControl.SERVICE_ADMIN()) { // Pack type 0 is being used as a placeholder for the default settings for pack types that don't have custom ones, // So it shouldn't be activated and used to create nodes require(_packType > 0, "invalid type"); packTypeActive[_packType] = _active; if (totalPackTypes < _packType && _active) { totalPackTypes = _packType; } emit SetPackTypeActive(_packType, _active); } function setPackTypeHasSettings(uint _packType, bool _hasSettings) external onlyRole(adminControl.SERVICE_ADMIN()) { packTypeHasSettings[_packType] = _hasSettings; emit SetPackTypeHasSettings(_packType, _hasSettings); } function setPackTypeSetting(uint _packType, uint _settingId, uint _value) external onlyRole(adminControl.SERVICE_ADMIN()) { packTypeHasSettings[_packType] = true; packTypeSettings[_packType][_settingId] = _value; emit SetPackTypeSetting(_packType, _settingId, _value); } function setServiceContractEnabled(address _contract, bool _enabled) external onlyRole(adminControl.SERVICE_ADMIN()) { serviceContractEnabled[_contract] = _enabled; emit SetServiceContractEnabled(_contract, _enabled); } // ------------------------------------------------------------------------------------------------------------------- function sendValue(address payable recipient, uint amount) internal { require(address(this).balance >= amount, "insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success,) = recipient.call{value : amount}(""); require(success, "send failed"); } function updatePackState(address _entity, uint _packType) external { require(msg.sender == address(strongNFTBonus), "invalid sender"); updatePackState(_entity, _packType, true); } function updatePackState(address _entity, uint _packType, bool _saveRewardsDue) internal { bytes memory id = getPackId(_entity, _packType); uint rewardDue = getRewardAt(_entity, _packType, block.timestamp, true); uint accruedTotal = entityPackClaimedTotal[id] + rewardDue; uint nodeLifetimeReward = getNodeRewardLifetime(_packType); uint maturedNodesTotal = accruedTotal / nodeLifetimeReward; uint maturedNodesNew = maturedNodesTotal > entityPackMaturedNodeCount[id] ? maturedNodesTotal - entityPackMaturedNodeCount[id] : 0; if (_saveRewardsDue) { entityPackRewardDue[id] = rewardDue; entityPackLastClaimedAt[id] = block.timestamp; } if (maturedNodesNew > 0) { entityPackMaturedNodeCount[id] += maturedNodesNew; entityPackClaimedMatured[id] += maturedNodesNew * nodeLifetimeReward; totalMaturedNodes += maturedNodesNew; emit MaturedNodes(_entity, _packType, maturedNodesNew); } } // // Migration // ------------------------------------------------------------------------------------------------------------------- function migrateNodes(address _entity, uint _packType, uint _nodeCount, uint _lastPaidAt, uint _rewardsDue, uint _totalClaimed) external returns (bool) { require(serviceContractEnabled[msg.sender], "no service"); require(packTypeActive[_packType], "invalid type"); require(!doesPackExist(_entity, _packType) || !hasPackExpired(_entity, _packType), "pack expired"); bytes memory id = getPackId(_entity, _packType); totalNodes += _nodeCount; entityNodeCount[_entity] += _nodeCount; if (entityPackCreatedAt[id] == 0) { entityPackCreatedAt[id] = block.timestamp; entityPackLastPaidAt[id] = _lastPaidAt > 0 ? _lastPaidAt : block.timestamp; totalPacks += 1; emit Created(_entity, _packType, _nodeCount, false, block.timestamp, msg.sender); } else { updatePackState(_entity, _packType, true); if (_lastPaidAt > 0) { entityPackLastPaidAt[id] = ((entityPackLastPaidAt[id] * entityPackTotalNodeCount[id]) + (_lastPaidAt * _nodeCount)) / (entityPackTotalNodeCount[id] + _nodeCount); } emit AddedNodes(_entity, _packType, _nodeCount, entityPackTotalNodeCount[id], false, block.timestamp, msg.sender); } entityPackTotalNodeCount[id] += _nodeCount; entityPackClaimedTotal[id] += _totalClaimed; entityPackRewardDue[id] += _rewardsDue; if (entityPackTotalNodeCount[id] > _nodeCount) { updatePackState(_entity, _packType, true); } emit MigratedNodes(_entity, _packType, _nodeCount, _lastPaidAt, _rewardsDue, _totalClaimed, msg.sender, block.timestamp); return true; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; import "../interfaces/IAdminControl.sol"; abstract contract AdminAccess { IAdminControl public adminControl; modifier onlyRole(uint8 _role) { require(address(adminControl) == address(0) || adminControl.hasRole(_role, msg.sender), "no access"); _; } function addAdminControlContract(IAdminControl _contract) external onlyRole(0) { adminControl = _contract; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.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; interface INodePackV3 { function doesPackExist(address entity, uint packId) external view returns (bool); function hasPackExpired(address entity, uint packId) external view returns (bool); function claim(uint packId, uint timestamp, address toStrongPool) external payable returns (uint); // function getBonusAt(address _entity, uint _packType, uint _timestamp) external view returns (uint); function getPackId(address _entity, uint _packType) external pure returns (bytes memory); function getEntityPackTotalNodeCount(address _entity, uint _packType) external view returns (uint); function getEntityPackActiveNodeCount(address _entity, uint _packType) external view returns (uint); function migrateNodes(address _entity, uint _nodeType, uint _nodeCount, uint _lastPaidAt, uint _rewardsDue, uint _totalClaimed) external returns (bool); // function addPackRewardDue(address _entity, uint _packType, uint _rewardDue) external; function updatePackState(address _entity, uint _packType) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; interface IStrongPool { function mineFor(address miner, uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface IStrongNFTPackBonus { function getBonus(address _entity, uint _packType, uint _from, uint _to) external view returns (uint); function setEntityPackBonusSaved(address _entity, uint _packType) external; function resetEntityPackBonusSaved(bytes memory _packId) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; import "./Context.sol"; abstract contract InternalCalls is Context { uint private constant _NOT_MAKING_INTERNAL_CALLS = 1; uint private constant _MAKING_INTERNAL_CALLS = 2; uint private _internal_calls_status; modifier makesInternalCalls() { _internal_calls_status = _MAKING_INTERNAL_CALLS; _; _internal_calls_status = _NOT_MAKING_INTERNAL_CALLS; } function init() internal { _internal_calls_status = _NOT_MAKING_INTERNAL_CALLS; } function isInternalCall() internal view returns (bool) { return _internal_calls_status == _MAKING_INTERNAL_CALLS; } function isContractCall() internal view returns (bool) { return _msgSender() != tx.origin; } function isUserCall() internal view returns (bool) { return !isInternalCall() && !isContractCall(); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0; library SbMath { uint internal constant DECIMAL_PRECISION = 1e18; /* * Multiply two decimal numbers and use normal rounding rules: * -round product up if 19'th mantissa digit >= 5 * -round product down if 19'th mantissa digit < 5 * * Used only inside the exponentiation, _decPow(). */ function decMul(uint x, uint y) internal pure returns (uint decProd) { uint prod_xy = x * y; decProd = (prod_xy + (DECIMAL_PRECISION / 2)) / DECIMAL_PRECISION; } /* * _decPow: Exponentiation function for 18-digit decimal base, and integer exponent n. * * Uses the efficient "exponentiation by squaring" algorithm. O(log(n)) complexity. * * The exponent is capped to avoid reverting due to overflow. The cap 525600000 equals * "minutes in 1000 years": 60 * 24 * 365 * 1000 */ function _decPow(uint _base, uint _minutes) internal pure returns (uint) { if (_minutes > 525_600_000) _minutes = 525_600_000; // cap to avoid overflow if (_minutes == 0) return DECIMAL_PRECISION; uint y = DECIMAL_PRECISION; uint x = _base; uint n = _minutes; // Exponentiation-by-squaring while (n > 1) { if (n % 2 == 0) { x = decMul(x, x); n = n / 2; } else { // if (n % 2 != 0) y = decMul(x, y); x = decMul(x, x); n = (n - 1) / 2; } } return decMul(x, y); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; interface IAdminControl { function hasRole(uint8 _role, address _account) external view returns (bool); function SUPER_ADMIN() external view returns (uint8); function ADMIN() external view returns (uint8); function SERVICE_ADMIN() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"packType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nodesCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalNodesCount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"usedCredit","type":"bool"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"migratedFrom","type":"address"}],"name":"AddedNodes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"packType","type":"uint256"},{"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":"uint256","name":"packType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nodesCount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"usedCredit","type":"bool"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"migratedFrom","type":"address"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"packType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maturedCount","type":"uint256"}],"name":"MaturedNodes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"packType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nodesCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastPaidAt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardsDue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalClaimed","type":"uint256"},{"indexed":false,"internalType":"address","name":"migratedFrom","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"MigratedNodes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"packType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Paid","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable","name":"collector","type":"address"}],"name":"SetFeeCollector","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"strongNFTBonus","type":"address"}],"name":"SetNFTBonusContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable","name":"collector","type":"address"}],"name":"SetNodeFeeCollector","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"packType","type":"uint256"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"SetPackTypeActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"packType","type":"uint256"},{"indexed":false,"internalType":"bool","name":"hasSettings","type":"bool"}],"name":"SetPackTypeHasSettings","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"packType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"settingId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SetPackTypeSetting","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"service","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SetServiceContractEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"bips","type":"uint256"}],"name":"SetTakeStrongBips","type":"event"},{"inputs":[],"name":"PACK_TYPE_FEE_CLAIMING_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PACK_TYPE_FEE_CLAIMING_NUMERATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PACK_TYPE_FEE_CREATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PACK_TYPE_FEE_RECURRING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PACK_TYPE_FEE_STRONG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PACK_TYPE_GRACE_PERIOD_SECONDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PACK_TYPE_NODES_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PACK_TYPE_NODE_REWARD_LIFETIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PACK_TYPE_NODE_REWARD_PER_SECOND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PACK_TYPE_PAY_CYCLES_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PACK_TYPE_RECURRING_CYCLE_SECONDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IAdminControl","name":"_contract","type":"address"}],"name":"addAdminControlContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminControl","outputs":[{"internalType":"contract IAdminControl","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IStrongPool","name":"_strongPool","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"approveStrongPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"canPackBePaid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"address","name":"_toStrongPool","type":"address"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"address","name":"_toStrongPool","type":"address"}],"name":"claimAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimFeeCollector","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"},{"internalType":"uint256","name":"_nodeCount","type":"uint256"},{"internalType":"bool","name":"_useCredit","type":"bool"}],"name":"create","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"doesPackExist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"entityCreditUsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"entityNodeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityPackClaimedMatured","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityPackClaimedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityPackCreatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityPackLastClaimedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityPackLastPaidAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityPackMaturedNodeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityPackRewardDue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityPackTotalNodeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getBonusAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getClaimingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getClaimingFeeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getClaimingFeeNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getCreatingFeeInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getEntityCreditAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getEntityPackAccruedTotalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getEntityPackActiveNodeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getEntityPackClaimedMaturedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getEntityPackClaimedTotalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getEntityPackLifetimeRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getEntityPackMaturedNodeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getEntityPackTotalNodeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getEntityRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getGracePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getNodeCreateFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getNodeRewardLifetime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getNodeRewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getNodesLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getPackId","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getPackLastPaidAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getPacksClaimingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"}],"name":"getPacksRecurringFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getPayCyclesLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getRecurringFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getRecurringFeeInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getRecurringPaymentCycle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"bool","name":"_addBonus","type":"bool"}],"name":"getRewardAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getStrongFeeInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"hasMaxPayments","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"hasPackExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_strongToken","type":"address"},{"internalType":"contract IStrongNFTPackBonus","name":"_strongNFTBonus","type":"address"},{"internalType":"address payable","name":"_nodeFeeCollector","type":"address"},{"internalType":"address payable","name":"_claimFeeCollector","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"isPackPastDue","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"},{"internalType":"uint256","name":"_nodeCount","type":"uint256"},{"internalType":"uint256","name":"_lastPaidAt","type":"uint256"},{"internalType":"uint256","name":"_rewardsDue","type":"uint256"},{"internalType":"uint256","name":"_totalClaimed","type":"uint256"}],"name":"migrateNodes","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nodeFeeCollector","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"packTypeActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"packTypeHasSettings","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"packTypeSettings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"pay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"payAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_claimFeeCollector","type":"address"}],"name":"setClaimFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setNFTBonusContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_nodeFeeCollector","type":"address"}],"name":"setNodeFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"},{"internalType":"bool","name":"_active","type":"bool"}],"name":"setPackTypeActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"},{"internalType":"bool","name":"_hasSettings","type":"bool"}],"name":"setPackTypeHasSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"},{"internalType":"uint256","name":"_settingId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setPackTypeSetting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"},{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"setServiceContractEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bips","type":"uint256"}],"name":"setTakeStrongBips","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strongNFTBonus","outputs":[{"internalType":"contract IStrongNFTPackBonus","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strongToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"takeStrongBips","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMaturedNodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPackTypes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPacks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"},{"internalType":"uint256","name":"_lastPaidAt","type":"uint256"}],"name":"updateEntityPackLastPaidAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"updatePackState","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
608060405234801561001057600080fd5b5061502c806100206000396000f3fe6080604052600436106104ec5760003560e01c8063a77e28251161028c578063d3dfff001161015a578063f0b56d71116100cc578063f5c554ab11610085578063f5c554ab14610fd3578063f75998bb14610ff3578063f85550321461102b578063f91af5801461104b578063f999952a1461106b578063f9df21e71461108b57600080fd5b8063f0b56d7114610ee3578063f3fef3a314610f1b578063f474c8ce14610f3b578063f4def5bf14610f5b578063f4ec7b1d14610f93578063f5474cb014610fb357600080fd5b8063e2ca3c3a1161011e578063e2ca3c3a14610e46578063e562cdb014610e66578063e84dc3ba14610e7b578063e97e1b9014610e90578063eaffeddc14610eb0578063ed5e3f1614610ed057600080fd5b8063d3dfff0014610db1578063d4cab99214610dd1578063dad20ec914610df1578063dc2e86e914610e06578063de20d47a14610e2657600080fd5b8063b48d198f116101fe578063c186c91f116101b7578063c186c91f14610cd8578063c290d69114610d10578063c548201114610d23578063c94dcd6114610d43578063c99a585514610d63578063d2d7b21414610d9b57600080fd5b8063b48d198f14610c20578063b48f042814610c40578063b6b55f2514610c6d578063bb77c82b14610c8d578063bbbf0f6614610ca2578063bef7348714610cc257600080fd5b8063ad2cbefa11610250578063ad2cbefa14610b5e578063ad4361a514610b73578063ad82ba1d14610b93578063af604e8514610bcb578063b391d74714610beb578063b448422614610c0057600080fd5b8063a77e282514610abe578063a8b6c6f814610aeb578063aadea3f314610b0b578063aaf2d9fa14610b2b578063ac44ff3114610b4b57600080fd5b80635b27e15b116103c957806384baff501161033b5780639548f1e6116102f45780639548f1e6146109f05780639592d42414610a1057806395e614d314610a26578063965d61b914610a5e5780639e81e13514610a7e578063a052058114610a9e57600080fd5b806384baff50146109035780638c299dad1461093b5780638cf52bf1146109505780638eda065f1461098057806392488d07146109a05780639528d778146109c057600080fd5b80636fdd1ff11161038d5780636fdd1ff11461086e5780637281df121461088e57806378602972146108a45780637a0b9255146108b95780637fdfbeb6146108d957806381bd10d6146108ee57600080fd5b80635b27e15b146107e65780635cc32e76146108065780635e42b4551461081957806363e82daf1461082e57806367df6abc1461084e57600080fd5b80633d1987f0116104625780635493d23b116104265780635493d23b1461072657806355079ddd1461075e578063555d3e631461077e57806357f559df1461079e5780635806beaf146107be57806359a609b9146107c657600080fd5b80633d1987f0146106915780634608482d146106a657806346baac3a146106c65780634df78d5f146106e65780635016182c1461070657600080fd5b80631f52283b116104b45780631f52283b146105ce578063315c8425146105ee578063323b59951461060e578063342ec83d1461062457806335090cc91461065157806336c52b3b1461067157600080fd5b806306552ff3146104f157806306836485146105135780630eae4af714610548578063103b75f71461058057806311d7096d146105ae575b600080fd5b3480156104fd57600080fd5b5061051161050c366004614a19565b6110ab565b005b34801561051f57600080fd5b5061053361052e366004614a75565b611286565b60405190151581526020015b60405180910390f35b34801561055457600080fd5b50600954610568906001600160a01b031681565b6040516001600160a01b03909116815260200161053f565b34801561058c57600080fd5b506105a061059b366004614aa1565b6112c1565b60405190815260200161053f565b3480156105ba57600080fd5b506105a06105c9366004614aa1565b6112ce565b3480156105da57600080fd5b506105336105e9366004614aba565b6112db565b3480156105fa57600080fd5b50610511610609366004614b06565b611754565b34801561061a57600080fd5b506105a060075481565b34801561063057600080fd5b506105a061063f366004614b32565b600c6020526000908152604090205481565b34801561065d57600080fd5b506105a061066c366004614b5d565b6118fc565b34801561067d57600080fd5b506105a061068c366004614b9c565b611b16565b34801561069d57600080fd5b506105a0600181565b3480156106b257600080fd5b506105a06106c1366004614aa1565b611b55565b3480156106d257600080fd5b506105336106e1366004614a75565b611b62565b3480156106f257600080fd5b50610511610701366004614b32565b611b96565b34801561071257600080fd5b50610511610721366004614a75565b611d21565b34801561073257600080fd5b506105a0610741366004614be7565b805160208183018101805160138252928201919093012091525481565b34801561076a57600080fd5b506105a0610779366004614a75565b611d7c565b34801561078a57600080fd5b50600054610568906001600160a01b031681565b3480156107aa57600080fd5b506105116107b9366004614b32565b611dcd565b610511611f63565b3480156107d257600080fd5b506105a06107e1366004614a75565b612051565b3480156107f257600080fd5b50610511610801366004614b9c565b612083565b610511610814366004614c98565b6121ee565b34801561082557600080fd5b506105a0612819565b34801561083a57600080fd5b506105a0610849366004614a75565b61289a565b34801561085a57600080fd5b506105a0610869366004614aa1565b61295c565b34801561087a57600080fd5b50610511610889366004614aa1565b612969565b34801561089a57600080fd5b506105a060065481565b3480156108b057600080fd5b506105a0600981565b3480156108c557600080fd5b506105116108d4366004614b32565b612b15565b3480156108e557600080fd5b506105a0600881565b3480156108fa57600080fd5b506105a0600381565b34801561090f57600080fd5b506105a061091e366004614be7565b805160208183018101805160118252928201919093012091525481565b34801561094757600080fd5b506105a0600581565b34801561095c57600080fd5b5061053361096b366004614aa1565b60156020526000908152604090205460ff1681565b34801561098c57600080fd5b506105a061099b366004614a75565b612bea565b3480156109ac57600080fd5b506105116109bb366004614cd1565b612c17565b3480156109cc57600080fd5b506105336109db366004614aa1565b60166020526000908152604090205460ff1681565b3480156109fc57600080fd5b50600354610568906001600160a01b031681565b348015610a1c57600080fd5b506105a060045481565b348015610a3257600080fd5b506105a0610a41366004614be7565b805160208183018101805160148252928201919093012091525481565b348015610a6a57600080fd5b50600254610568906001600160a01b031681565b348015610a8a57600080fd5b506105a0610a99366004614a75565b612da7565b348015610aaa57600080fd5b506105a0610ab9366004614aa1565b612de8565b348015610aca57600080fd5b506105a0610ad9366004614b32565b600b6020526000908152604090205481565b348015610af757600080fd5b50610533610b06366004614a75565b612df5565b348015610b1757600080fd5b506105a0610b26366004614aa1565b612e6c565b348015610b3757600080fd5b506105a0610b46366004614a75565b612e79565b6105a0610b59366004614d01565b612e87565b348015610b6a57600080fd5b506105a0600681565b348015610b7f57600080fd5b506105a0610b8e366004614a75565b6134de565b348015610b9f57600080fd5b506105a0610bae366004614be7565b805160208183018101805160128252928201919093012091525481565b348015610bd757600080fd5b50610533610be6366004614a75565b613516565b348015610bf757600080fd5b506105a0600481565b348015610c0c57600080fd5b506105a0610c1b366004614a75565b61355b565b348015610c2c57600080fd5b50610511610c3b366004614cd1565b61357a565b348015610c4c57600080fd5b50610c60610c5b366004614a75565b613739565b60405161053f9190614d5f565b348015610c7957600080fd5b50610511610c88366004614aa1565b6137a2565b348015610c9957600080fd5b506105a0600281565b348015610cae57600080fd5b506105a0610cbd366004614aa1565b61398a565b348015610cce57600080fd5b506105a060055481565b348015610ce457600080fd5b506105a0610cf3366004614d92565b601760209081526000928352604080842090915290825290205481565b6105a0610d1e366004614aa1565b613997565b348015610d2f57600080fd5b506105a0610d3e366004614aa1565b613b2a565b348015610d4f57600080fd5b506105a0610d5e366004614a75565b613b37565b348015610d6f57600080fd5b506105a0610d7e366004614be7565b8051602081830181018051600e8252928201919093012091525481565b348015610da757600080fd5b506105a060085481565b348015610dbd57600080fd5b506105a0610dcc366004614a75565b613b45565b348015610ddd57600080fd5b506105a0610dec366004614b32565b613b53565b348015610dfd57600080fd5b506105a0600781565b348015610e1257600080fd5b50610511610e21366004614a75565b613ba1565b348015610e3257600080fd5b506105a0610e41366004614aa1565b613d9e565b348015610e5257600080fd5b50610511610e61366004614db4565b613dab565b348015610e7257600080fd5b506105a0600a81565b348015610e8757600080fd5b506105a0600081565b348015610e9c57600080fd5b506105a0610eab366004614a75565b613f3c565b348015610ebc57600080fd5b506105a0610ecb366004614aa1565b613f4a565b610511610ede366004614de2565b613f57565b348015610eef57600080fd5b506105a0610efe366004614be7565b805160208183018101805160108252928201919093012091525481565b348015610f2757600080fd5b50610511610f36366004614a75565b614011565b348015610f4757600080fd5b506105a0610f56366004614a75565b6142ad565b348015610f6757600080fd5b506105a0610f76366004614be7565b8051602081830181018051600f8252928201919093012091525481565b348015610f9f57600080fd5b506105a0610fae366004614a75565b6142bc565b348015610fbf57600080fd5b506105a0610fce366004614aa1565b614313565b348015610fdf57600080fd5b50600a54610568906001600160a01b031681565b348015610fff57600080fd5b506105a061100e366004614be7565b8051602081830181018051600d8252928201919093012091525481565b34801561103757600080fd5b506105a0611046366004614b9c565b614320565b34801561105757600080fd5b50610511611066366004614b32565b614454565b34801561107757600080fd5b506105a0611086366004614a75565b6145ea565b34801561109757600080fd5b506105336110a6366004614a75565b61461d565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110f757600080fd5b505afa15801561110b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112f9190614e07565b6000546001600160a01b031615806111c45750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906111749084903390600401614e2a565b60206040518083038186803b15801561118c57600080fd5b505afa1580156111a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c49190614e46565b6111e95760405162461bcd60e51b81526004016111e090614e63565b60405180910390fd5b6001600160a01b03821661122c5760405162461bcd60e51b815260206004820152600a6024820152696e6f206164647265737360b01b60448201526064016111e0565b600280546001600160a01b038088166001600160a01b03199283161790925560038054878416908316179055600a8054868416908316179055600980549285169290911691909117905561127f60018055565b5050505050565b60006112928383611b62565b80156112a557506112a38383612df5565b155b80156112b857506112b6838361461d565b155b90505b92915050565b60006112bb826001614695565b60006112bb82600a614695565b3360009081526018602052604081205460ff166113275760405162461bcd60e51b815260206004820152600a6024820152696e6f207365727669636560b01b60448201526064016111e0565b60008681526015602052604090205460ff166113555760405162461bcd60e51b81526004016111e090614e86565b61135f8787611b62565b158061137257506113708787612df5565b155b61138e5760405162461bcd60e51b81526004016111e090614eac565b600061139a8888613739565b905085600460008282546113ae9190614ee8565b90915550506001600160a01b0388166000908152600b6020526040812080548892906113db908490614ee8565b9091555050604051600d906113f1908390614f00565b908152602001604051809103902054600014156114cd5742600d826040516114199190614f00565b90815260405190819003602001902055846114345742611436565b845b600e826040516114469190614f00565b90815260200160405180910390208190555060016006600082825461146b9190614ee8565b9091555050604080518881526020810188905260008183015242606082015233608082015290516001600160a01b038a16917fa51b747dfa9bebb8d1d32fba407825193ab4533268532b9b8601085eca446450919081900360a00190a261160f565b6114d988886001614720565b841561159057856010826040516114f09190614f00565b9081526020016040518091039020546115099190614ee8565b6115138787614f1c565b6010836040516115239190614f00565b908152602001604051809103902054600e846040516115429190614f00565b90815260200160405180910390205461155b9190614f1c565b6115659190614ee8565b61156f9190614f3b565b600e8260405161157f9190614f00565b908152604051908190036020019020555b876001600160a01b03167f3a16c3cce042ab54f3069c61db28dea0ee4db01215ed281f1c74ead0649a8f8c88886010856040516115cd9190614f00565b9081526040805160209281900383018120549481529182019290925290810191909152600060608201524260808201523360a082015260c00160405180910390a25b856010826040516116209190614f00565b9081526020016040518091039020600082825461163d9190614ee8565b92505081905550826013826040516116559190614f00565b908152602001604051809103902060008282546116729190614ee8565b925050819055508360128260405161168a9190614f00565b908152602001604051809103902060008282546116a79190614ee8565b92505081905550856010826040516116bf9190614f00565b90815260200160405180910390205411156116e0576116e088886001614720565b604080518881526020810188905290810186905260608101859052608081018490523360a08201524260c08201526001600160a01b038916907fd8f4bf8fb11c8090d7f689f2a0e8dd1189efa76268dcd7eed6de149743140e629060e00160405180910390a2506001979650505050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117a057600080fd5b505afa1580156117b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d89190614e07565b6000546001600160a01b0316158061186d5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f69061181d9084903390600401614e2a565b60206040518083038186803b15801561183557600080fd5b505afa158015611849573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186d9190614e46565b6118895760405162461bcd60e51b81526004016111e090614e63565b6000848152601660209081526040808320805460ff191660011790556017825280832086845282529182902084905581518681529081018590529081018390527f4dbbf86191ecd1e5615130609e3eda93820194f1c492d041ead416095959986b9060600160405180910390a150505050565b6000806119098686613739565b90506000600f8260405161191d9190614f00565b90815260200160405180910390205490506000600d836040516119409190614f00565b908152602001604051809103902054905061195b8888611b62565b61196b5760009350505050611b0e565b6119758888612df5565b156119865760009350505050611b0e565b4286111561199a5760009350505050611b0e565b818610156119ae5760009350505050611b0e565b8086116119c15760009350505050611b0e565b60008083116119d9576119d48288614f5d565b6119e3565b6119e38388614f5d565b905060006119f18a8a6145ea565b905060006119ff8b8b6142bc565b611a088b6112c1565b611a129085614f1c565b611a1c9190614f1c565b9050600088611a2c576000611a37565b611a378c8c8c614320565b90506000601288604051611a4b9190614f00565b90815260405190819003602001902054611a658385614ee8565b611a6f9190614ee8565b905083601389604051611a829190614f00565b90815260200160405180910390205410611aa757600098505050505050505050611b0e565b838160138a604051611ab99190614f00565b908152602001604051809103902054611ad29190614ee8565b10611b0457601388604051611ae79190614f00565b90815260200160405180910390205484611b019190614f5d565b90505b9750505050505050505b949350505050565b6000611b2183614313565b611b2a84613d9e565b611b3786868660016118fc565b611b419190614f1c565b611b4b9190614f3b565b90505b9392505050565b60006112bb826003614695565b600080600e611b718585613739565b604051611b7e9190614f00565b90815260200160405180910390205411905092915050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015611be257600080fd5b505afa158015611bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1a9190614e07565b6000546001600160a01b03161580611caf5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611c5f9084903390600401614e2a565b60206040518083038186803b158015611c7757600080fd5b505afa158015611c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611caf9190614e46565b611ccb5760405162461bcd60e51b81526004016111e090614e63565b600380546001600160a01b0319166001600160a01b0384169081179091556040519081527fa30ea3596e6b0bf63d799ca3146166f9b51a9eb996ce58e022ef806c13e17ff0906020015b60405180910390a15050565b6003546001600160a01b03163314611d6c5760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21039b2b73232b960911b60448201526064016111e0565b611d7882826001614720565b5050565b60008060015b6007548111611dc557611da7858260008711611d9e5742611da0565b865b60016118fc565b611db19083614ee8565b915080611dbd81614f74565b915050611d82565b509392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1957600080fd5b505afa158015611e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e519190614e07565b6000546001600160a01b03161580611ee65750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611e969084903390600401614e2a565b60206040518083038186803b158015611eae57600080fd5b505afa158015611ec2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee69190614e46565b611f025760405162461bcd60e51b81526004016111e090614e63565b6001600160a01b038216611f1557600080fd5b600980546001600160a01b0319166001600160a01b0384169081179091556040519081527fd649da8f6092116f86ea4e5139de0b75ad371d823918d16368ba3ff09a5cbc9f90602001611d15565b6002600155336000908152600b6020526040902054611faf5760405162461bcd60e51b81526020600482015260086024820152676e6f207061636b7360c01b60448201526064016111e0565b3460015b600754811161203957611fc63382611286565b611fcf57612027565b6000821161200c5760405162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b60448201526064016111e0565b600061201782613997565b90506120238184614f5d565b9250505b8061203181614f74565b915050611fb3565b50801561204a5761204a338261490c565b5060018055565b6000601461205f8484613739565b60405161206c9190614f00565b908152602001604051809103902054905092915050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120cf57600080fd5b505afa1580156120e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121079190614e07565b6000546001600160a01b0316158061219c5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f69061214c9084903390600401614e2a565b60206040518083038186803b15801561216457600080fd5b505afa158015612178573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219c9190614e46565b6121b85760405162461bcd60e51b81526004016111e090614e63565b60006121c48585613739565b905082600e826040516121d79190614f00565b908152604051908190036020019020555050505050565b6000826121fb338661289a565b6122059190614f1c565b90506000836122138661398a565b61221d9190614f1c565b9050600061222a866112ce565b90504260006122393389613739565b60008981526015602052604090205490915060ff1661226a5760405162461bcd60e51b81526004016111e090614e86565b8215806122a0575082876010836040516122849190614f00565b90815260200160405180910390205461229d9190614ee8565b11155b6122d95760405162461bcd60e51b815260206004820152600a6024820152691bdd995c881b1a5b5a5d60b21b60448201526064016111e0565b600187101561231f5760405162461bcd60e51b81526020600482015260126024820152711a5b9d985b1a59081b9bd9194818dbdd5b9d60721b60448201526064016111e0565b8434101561233f5760405162461bcd60e51b81526004016111e090614f8f565b6003546001600160a01b0316156123b5576003546040516367b4613560e01b8152336004820152602481018a90526001600160a01b03909116906367b4613590604401600060405180830381600087803b15801561239c57600080fd5b505af11580156123b0573d6000803e3d6000fd5b505050505b86600460008282546123c79190614ee8565b9091555050336000908152600b6020526040812080548992906123eb908490614ee8565b9091555050604051601090612401908390614f00565b908152602001604051809103902054600014156125015781600d826040516124299190614f00565b90815260200160405180910390208190555081600e8260405161244c9190614f00565b9081526020016040518091039020819055508660108260405161246f9190614f00565b9081526020016040518091039020600082825461248c9190614ee8565b925050819055506001600660008282546124a69190614ee8565b909155505060408051898152602081018990528715158183015242606082015260006080820152905133917fa51b747dfa9bebb8d1d32fba407825193ab4533268532b9b8601085eca446450919081900360a00190a26125ea565b61250b3389612df5565b156125285760405162461bcd60e51b81526004016111e090614eac565b61253433896001614720565b866010826040516125459190614f00565b908152602001604051809103902060008282546125629190614ee8565b92505081905550336001600160a01b03167f3a16c3cce042ab54f3069c61db28dea0ee4db01215ed281f1c74ead0649a8f8c89896010856040516125a69190614f00565b90815260408051602092819003830181205494815291820192909252908101919091528815156060820152426080820152600060a082015260c00160405180910390a25b851561266057836125fb3342612bea565b10156126365760405162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b60448201526064016111e0565b336000908152600c602052604081208054869290612655908490614ee8565b909155506127f99050565b6000612710600854866126739190614f1c565b61267d9190614f3b565b9050801561272f57600254600a546040516323b872dd60e01b81523360048201526001600160a01b039182166024820152604481018490529116906323b872dd90606401602060405180830381600087803b1580156126db57600080fd5b505af11580156126ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127139190614e46565b61272f5760405162461bcd60e51b81526004016111e090614fb4565b808511156127f7576002546001600160a01b03166323b872dd3330612754858a614f5d565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b1580156127a357600080fd5b505af11580156127b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127db9190614e46565b6127f75760405162461bcd60e51b81526004016111e090614fb4565b505b600a5461280f906001600160a01b03163461490c565b5050505050505050565b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561285d57600080fd5b505afa158015612871573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128959190614fdd565b905090565b6000806128a683611b55565b90506000600e6128b68686613739565b6040516128c39190614f00565b908152602001604051809103902054905080600014156128e5575090506112bb565b6128ef8585613516565b156128fc575090506112bb565b6129068585612df5565b15612916576000925050506112bb565b600061292185612e6c565b90506000426129308385614ee8565b61293a9190614f5d565b9050816129478583614f1c565b6129519190614f3b565b979650505050505050565b60006112bb826000614695565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129b557600080fd5b505afa1580156129c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ed9190614e07565b6000546001600160a01b03161580612a825750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690612a329084903390600401614e2a565b60206040518083038186803b158015612a4a57600080fd5b505afa158015612a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a829190614e46565b612a9e5760405162461bcd60e51b81526004016111e090614e63565b612710821115612ae05760405162461bcd60e51b815260206004820152600d60248201526c696e76616c69642076616c756560981b60448201526064016111e0565b60088290556040518281527f774b9fb928c71ca72bafa8771a63e9d00ea63b021cfd8cdc2ce4f003094c5d5890602001611d15565b600080546001600160a01b03161580612bab5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690612b5b9084903390600401614e2a565b60206040518083038186803b158015612b7357600080fd5b505afa158015612b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bab9190614e46565b612bc75760405162461bcd60e51b81526004016111e090614e63565b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166000908152600c6020526040812054612c0d8484611d7c565b6112b89190614f5d565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c6357600080fd5b505afa158015612c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9b9190614e07565b6000546001600160a01b03161580612d305750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690612ce09084903390600401614e2a565b60206040518083038186803b158015612cf857600080fd5b505afa158015612d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d309190614e46565b612d4c5760405162461bcd60e51b81526004016111e090614e63565b600083815260166020908152604091829020805460ff19168515159081179091558251868152918201527f754a64d46ab9a313f3f3cbae897a6b9d8d703593379a9ffe0035ace48dceeb6691015b60405180910390a1505050565b6000612db683834260016118fc565b6013612dc28585613739565b604051612dcf9190614f00565b9081526020016040518091039020546112b89190614ee8565b60006112bb826009614695565b600080612e028484613739565b90506000600e82604051612e169190614f00565b90815260200160405180910390205490508060001415612e3b576001925050506112bb565b612e4484613b2a565b612e4d85612e6c565b612e579083614ee8565b612e619190614ee8565b421195945050505050565b60006112bb826007614695565b6000601361205f8484613739565b60035460009081906001600160a01b03163314612ea45733612ea6565b325b90506000612eb48287613739565b90506000600f82604051612ec89190614f00565b90815260200160405180910390205460001415612f0357600d82604051612eef9190614f00565b908152602001604051809103902054612f23565b600f82604051612f139190614f00565b9081526020016040518091039020545b9050612f2f8388611b62565b612f6a5760405162461bcd60e51b815260206004820152600c60248201526b191bd95cdb9d08195e1a5cdd60a21b60448201526064016111e0565b612f748388612df5565b15612f915760405162461bcd60e51b81526004016111e090614eac565b612f9b8388613516565b15612fd35760405162461bcd60e51b8152602060048201526008602482015267706173742064756560c01b60448201526064016111e0565b428611156130135760405162461bcd60e51b815260206004820152600d60248201526c06261642074696d657374616d7609c1b60448201526064016111e0565b8561302082610384614ee8565b106130585760405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b60448201526064016111e0565b600061306784898960016118fc565b9050600081116130a55760405162461bcd60e51b81526020600482015260096024820152681b9bc81c995dd85c9960ba1b60448201526064016111e0565b6002546040516370a0823160e01b815230600482015282916001600160a01b0316906370a082319060240160206040518083038186803b1580156130e857600080fd5b505afa1580156130fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131209190614fdd565b101561315d5760405162461bcd60e51b815260206004820152600c60248201526b6f7665722062616c616e636560a01b60448201526064016111e0565b600061316889614313565b6131718a613d9e565b61317b9084614f1c565b6131859190614f3b565b9050803410156131a75760405162461bcd60e51b81526004016111e090614f8f565b87600f856040516131b89190614f00565b908152602001604051809103902081905550816013856040516131db9190614f00565b908152602001604051809103902060008282546131f89190614ee8565b9250508190555060006012856040516132119190614f00565b9081526040805160209281900383018120939093558b83529082018490526001600160a01b038716917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a910160405180910390a2336000908152600c6020526040902054156132f357336000908152600c60205260409020548210156132c657336000908152600c60205260409020546132ac908390614f5d565b336000908152600c602052604081209190915591506132f3565b336000908152600c60205260409020546132e09083614f5d565b336000908152600c602052604081205591505b6132ff338a6000614720565b6003546001600160a01b0316156133735760035460405163f4888a2160e01b81526001600160a01b039091169063f4888a2190613340908790600401614d5f565b600060405180830381600087803b15801561335a57600080fd5b505af115801561336e573d6000803e3d6000fd5b505050505b8115613491576001600160a01b038716156133ef576040516330d6a97560e01b81526001600160a01b038681166004830152602482018490528816906330d6a97590604401600060405180830381600087803b1580156133d257600080fd5b505af11580156133e6573d6000803e3d6000fd5b50505050613491565b60025460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018590529091169063a9059cbb90604401602060405180830381600087803b15801561343d57600080fd5b505af1158015613451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134759190614e46565b6134915760405162461bcd60e51b81526004016111e090614fb4565b6009546134a7906001600160a01b03168261490c565b6134af6149e4565b80156134ba57508034115b156134d2576134d2336134cd8334614f5d565b61490c565b98975050505050505050565b60008060015b6007548111611dc5576134f8858286611b16565b6135029083614ee8565b91508061350e81614f74565b9150506134e4565b6000806135238484613739565b90506000600e826040516135379190614f00565b908152602001604051809103902054905061355184612e6c565b612e619082614ee8565b600061356783836142bc565b61357083613f4a565b6112b89190614f1c565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156135c657600080fd5b505afa1580156135da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135fe9190614e07565b6000546001600160a01b031615806136935750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906136439084903390600401614e2a565b60206040518083038186803b15801561365b57600080fd5b505afa15801561366f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136939190614e46565b6136af5760405162461bcd60e51b81526004016111e090614e63565b600083116136cf5760405162461bcd60e51b81526004016111e090614e86565b6000838152601560205260409020805460ff1916831515179055600754831180156136f75750815b156137025760078390555b6040805184815283151560208201527f6f5d3c00ffa60404dde260f3251925e7a1b0e75603ddf7a1b15002e90e8ff9e09101612d9a565b606060008261374957600161374b565b825b604080516bffffffffffffffffffffffff19606088901b1660208201526001600160e01b031960e084901b166034820152600160c01b60388201529192500160405160208183030381529060405291505092915050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137ee57600080fd5b505afa158015613802573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138269190614e07565b6000546001600160a01b031615806138bb5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f69061386b9084903390600401614e2a565b60206040518083038186803b15801561388357600080fd5b505afa158015613897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138bb9190614e46565b6138d75760405162461bcd60e51b81526004016111e090614e63565b600082116138e457600080fd5b6002546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401602060405180830381600087803b15801561393657600080fd5b505af115801561394a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396e9190614e46565b611d785760405162461bcd60e51b81526004016111e090614fb4565b60006112bb826002614695565b60006139a33383611286565b6139da5760405162461bcd60e51b815260206004820152600860248201526763616e742070617960c01b60448201526064016111e0565b6139e633836001614720565b60006139f23384613739565b90506000613a0033856142bc565b613a0985613f4a565b613a139190614f1c565b905080341015613a355760405162461bcd60e51b81526004016111e090614f8f565b613a3e84612e6c565b600e83604051613a4e9190614f00565b908152602001604051809103902054613a679190614ee8565b600e83604051613a779190614f00565b908152602001604051809103902081905550336001600160a01b03167fdf9a51129930649214df58f542322c245372c6f2fa6fc3c9b40d927c597cd23085600e85604051613ac59190614f00565b90815260405190819003602001812054613ae6928252602082015260400190565b60405180910390a2600a54613b04906001600160a01b03168261490c565b613b0c6149e4565b8015613b1757508034115b15611b4e57611b4e336134cd8334614f5d565b60006112bb826008614695565b6000601161205f8484613739565b6000600e61205f8484613739565b60008060015b6007548111613b9a57613b6c8482611286565b15613b8857613b7b848261355b565b613b859083614ee8565b91505b80613b9281614f74565b915050613b59565b5092915050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015613bed57600080fd5b505afa158015613c01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c259190614e07565b6000546001600160a01b03161580613cba5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690613c6a9084903390600401614e2a565b60206040518083038186803b158015613c8257600080fd5b505afa158015613c96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cba9190614e46565b613cd65760405162461bcd60e51b81526004016111e090614e63565b60025460405163095ea7b360e01b81526001600160a01b038581166004830152602482018590529091169063095ea7b390604401602060405180830381600087803b158015613d2457600080fd5b505af1158015613d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d5c9190614e46565b613d995760405162461bcd60e51b815260206004820152600e60248201526d185c1c1c9bdd994819985a5b195960921b60448201526064016111e0565b505050565b60006112bb826005614695565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015613df757600080fd5b505afa158015613e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e2f9190614e07565b6000546001600160a01b03161580613ec45750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690613e749084903390600401614e2a565b60206040518083038186803b158015613e8c57600080fd5b505afa158015613ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ec49190614e46565b613ee05760405162461bcd60e51b81526004016111e090614e63565b6001600160a01b038316600081815260186020908152604091829020805460ff19168615159081179091558251938452908301527fea782fa1fcb250a935b6bf028374e06a580a12523d2befc1c2254a3cd3ef37809101612d9a565b6000601061205f8484613739565b60006112bb826004614695565b6002600155336000908152600b6020526040902054613fa35760405162461bcd60e51b81526020600482015260086024820152676e6f206e6f64657360c01b60448201526064016111e0565b3460015b6007548111613ff7576000613fbf33838760016118fc565b90508015613fe4576000613fd4838787612e87565b9050613fe08185614f5d565b9350505b5080613fef81614f74565b915050613fa7565b50801561400857614008338261490c565b50506001805550565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561405d57600080fd5b505afa158015614071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140959190614e07565b6000546001600160a01b0316158061412a5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906140da9084903390600401614e2a565b60206040518083038186803b1580156140f257600080fd5b505afa158015614106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412a9190614e46565b6141465760405162461bcd60e51b81526004016111e090614e63565b6000821161415357600080fd5b6002546040516370a0823160e01b815230600482015283916001600160a01b0316906370a082319060240160206040518083038186803b15801561419657600080fd5b505afa1580156141aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141ce9190614fdd565b101561420b5760405162461bcd60e51b815260206004820152600c60248201526b6f7665722062616c616e636560a01b60448201526064016111e0565b60025460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb90604401602060405180830381600087803b15801561425957600080fd5b505af115801561426d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142919190614e46565b613d995760405162461bcd60e51b81526004016111e090614fb4565b60006112b883834260016118fc565b6000806142c98484613739565b90506011816040516142db9190614f00565b9081526020016040518091039020546010826040516142fa9190614f00565b908152602001604051809103902054611b0e9190614f5d565b60006112bb826006614695565b6003546000906001600160a01b031661433b57506000611b4e565b60006143478585613739565b90506000600f8260405161435b9190614f00565b9081526020016040518091039020546000141561439657600d826040516143829190614f00565b9081526020016040518091039020546143b6565b600f826040516143a69190614f00565b9081526020016040518091039020545b600354604051634ac21a6960e11b81526001600160a01b03898116600483015260248201899052604482018490526064820188905292935091169063958434d29060840160206040518083038186803b15801561441257600080fd5b505afa158015614426573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061444a9190614fdd565b9695505050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156144a057600080fd5b505afa1580156144b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144d89190614e07565b6000546001600160a01b0316158061456d5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f69061451d9084903390600401614e2a565b60206040518083038186803b15801561453557600080fd5b505afa158015614549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061456d9190614e46565b6145895760405162461bcd60e51b81526004016111e090614e63565b6001600160a01b03821661459c57600080fd5b600a80546001600160a01b0319166001600160a01b0384169081179091556040519081527f6fc8e7a1c2484c662808b4ca8010d816b18923abab6769fa48a21eb5ccf6e07c90602001611d15565b600060106145f88484613739565b6040516146059190614f00565b9081526020016040518091039020546135708361295c565b60008061462a8484613739565b90506000600e8260405161463e9190614f00565b9081526020016040518091039020549050600061465a85612e6c565b9050600061466786612de8565b6146719083614f1c565b61467b9042614ee8565b9050806146888385614ee8565b1015979650505050505050565b60008281526016602052604081205460ff1680156146cb5750600083815260176020908152604080832085845290915290205415155b6147025760008281527fd840e16649f6b9a295d95876f4633d3a6b10b55e8162971cf78afd886d5ec89b60205260409020546112b8565b50600091825260176020908152604080842092845291905290205490565b600061472c8484613739565b9050600061473d85854260016118fc565b90506000816013846040516147529190614f00565b90815260200160405180910390205461476b9190614ee8565b905060006147788661295c565b905060006147868284614f3b565b9050600060118660405161479a9190614f00565b90815260200160405180910390205482116147b65760006147e0565b6011866040516147c69190614f00565b908152602001604051809103902054826147e09190614f5d565b9050861561482d57846012876040516147f99190614f00565b90815260200160405180910390208190555042600f8760405161481c9190614f00565b908152604051908190036020019020555b801561490157806011876040516148449190614f00565b908152602001604051809103902060008282546148619190614ee8565b9091555061487190508382614f1c565b6014876040516148819190614f00565b9081526020016040518091039020600082825461489e9190614ee8565b9250508190555080600560008282546148b79190614ee8565b909155505060408051898152602081018390526001600160a01b038b16917fd1ad6f13ecf90412417f16481b7455bda8aa6ec0133a68cdab069f9b7bd623f9910160405180910390a25b505050505050505050565b804710156149535760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064016111e0565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146149a0576040519150601f19603f3d011682016040523d82523d6000602084013e6149a5565b606091505b5050905080613d995760405162461bcd60e51b815260206004820152600b60248201526a1cd95b990819985a5b195960aa1b60448201526064016111e0565b60006149f260015460021490565b15801561289557505033321490565b6001600160a01b0381168114614a1657600080fd5b50565b60008060008060808587031215614a2f57600080fd5b8435614a3a81614a01565b93506020850135614a4a81614a01565b92506040850135614a5a81614a01565b91506060850135614a6a81614a01565b939692955090935050565b60008060408385031215614a8857600080fd5b8235614a9381614a01565b946020939093013593505050565b600060208284031215614ab357600080fd5b5035919050565b60008060008060008060c08789031215614ad357600080fd5b8635614ade81614a01565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b600080600060608486031215614b1b57600080fd5b505081359360208301359350604090920135919050565b600060208284031215614b4457600080fd5b8135611b4e81614a01565b8015158114614a1657600080fd5b60008060008060808587031215614b7357600080fd5b8435614b7e81614a01565b935060208501359250604085013591506060850135614a6a81614b4f565b600080600060608486031215614bb157600080fd5b8335614bbc81614a01565b95602085013595506040909401359392505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215614bf957600080fd5b813567ffffffffffffffff80821115614c1157600080fd5b818401915084601f830112614c2557600080fd5b813581811115614c3757614c37614bd1565b604051601f8201601f19908116603f01168101908382118183101715614c5f57614c5f614bd1565b81604052828152876020848701011115614c7857600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080600060608486031215614cad57600080fd5b83359250602084013591506040840135614cc681614b4f565b809150509250925092565b60008060408385031215614ce457600080fd5b823591506020830135614cf681614b4f565b809150509250929050565b600080600060608486031215614d1657600080fd5b83359250602084013591506040840135614cc681614a01565b60005b83811015614d4a578181015183820152602001614d32565b83811115614d59576000848401525b50505050565b6020815260008251806020840152614d7e816040850160208701614d2f565b601f01601f19169190910160400192915050565b60008060408385031215614da557600080fd5b50508035926020909101359150565b60008060408385031215614dc757600080fd5b8235614dd281614a01565b91506020830135614cf681614b4f565b60008060408385031215614df557600080fd5b823591506020830135614cf681614a01565b600060208284031215614e1957600080fd5b815160ff81168114611b4e57600080fd5b60ff9290921682526001600160a01b0316602082015260400190565b600060208284031215614e5857600080fd5b8151611b4e81614b4f565b6020808252600990820152686e6f2061636365737360b81b604082015260600190565b6020808252600c908201526b696e76616c6964207479706560a01b604082015260600190565b6020808252600c908201526b1c1858dac8195e1c1a5c995960a21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115614efb57614efb614ed2565b500190565b60008251614f12818460208701614d2f565b9190910192915050565b6000816000190483118215151615614f3657614f36614ed2565b500290565b600082614f5857634e487b7160e01b600052601260045260246000fd5b500490565b600082821015614f6f57614f6f614ed2565b500390565b6000600019821415614f8857614f88614ed2565b5060010190565b6020808252600b908201526a696e76616c69642066656560a81b604082015260600190565b6020808252600f908201526e1d1c985b9cd9995c8819985a5b1959608a1b604082015260600190565b600060208284031215614fef57600080fd5b505191905056fea2646970667358221220a04dad56b0511814e364dfe137621aa7069c77a80a5cec9eb0407e00444e8b9164736f6c63430008090033
Deployed Bytecode
0x6080604052600436106104ec5760003560e01c8063a77e28251161028c578063d3dfff001161015a578063f0b56d71116100cc578063f5c554ab11610085578063f5c554ab14610fd3578063f75998bb14610ff3578063f85550321461102b578063f91af5801461104b578063f999952a1461106b578063f9df21e71461108b57600080fd5b8063f0b56d7114610ee3578063f3fef3a314610f1b578063f474c8ce14610f3b578063f4def5bf14610f5b578063f4ec7b1d14610f93578063f5474cb014610fb357600080fd5b8063e2ca3c3a1161011e578063e2ca3c3a14610e46578063e562cdb014610e66578063e84dc3ba14610e7b578063e97e1b9014610e90578063eaffeddc14610eb0578063ed5e3f1614610ed057600080fd5b8063d3dfff0014610db1578063d4cab99214610dd1578063dad20ec914610df1578063dc2e86e914610e06578063de20d47a14610e2657600080fd5b8063b48d198f116101fe578063c186c91f116101b7578063c186c91f14610cd8578063c290d69114610d10578063c548201114610d23578063c94dcd6114610d43578063c99a585514610d63578063d2d7b21414610d9b57600080fd5b8063b48d198f14610c20578063b48f042814610c40578063b6b55f2514610c6d578063bb77c82b14610c8d578063bbbf0f6614610ca2578063bef7348714610cc257600080fd5b8063ad2cbefa11610250578063ad2cbefa14610b5e578063ad4361a514610b73578063ad82ba1d14610b93578063af604e8514610bcb578063b391d74714610beb578063b448422614610c0057600080fd5b8063a77e282514610abe578063a8b6c6f814610aeb578063aadea3f314610b0b578063aaf2d9fa14610b2b578063ac44ff3114610b4b57600080fd5b80635b27e15b116103c957806384baff501161033b5780639548f1e6116102f45780639548f1e6146109f05780639592d42414610a1057806395e614d314610a26578063965d61b914610a5e5780639e81e13514610a7e578063a052058114610a9e57600080fd5b806384baff50146109035780638c299dad1461093b5780638cf52bf1146109505780638eda065f1461098057806392488d07146109a05780639528d778146109c057600080fd5b80636fdd1ff11161038d5780636fdd1ff11461086e5780637281df121461088e57806378602972146108a45780637a0b9255146108b95780637fdfbeb6146108d957806381bd10d6146108ee57600080fd5b80635b27e15b146107e65780635cc32e76146108065780635e42b4551461081957806363e82daf1461082e57806367df6abc1461084e57600080fd5b80633d1987f0116104625780635493d23b116104265780635493d23b1461072657806355079ddd1461075e578063555d3e631461077e57806357f559df1461079e5780635806beaf146107be57806359a609b9146107c657600080fd5b80633d1987f0146106915780634608482d146106a657806346baac3a146106c65780634df78d5f146106e65780635016182c1461070657600080fd5b80631f52283b116104b45780631f52283b146105ce578063315c8425146105ee578063323b59951461060e578063342ec83d1461062457806335090cc91461065157806336c52b3b1461067157600080fd5b806306552ff3146104f157806306836485146105135780630eae4af714610548578063103b75f71461058057806311d7096d146105ae575b600080fd5b3480156104fd57600080fd5b5061051161050c366004614a19565b6110ab565b005b34801561051f57600080fd5b5061053361052e366004614a75565b611286565b60405190151581526020015b60405180910390f35b34801561055457600080fd5b50600954610568906001600160a01b031681565b6040516001600160a01b03909116815260200161053f565b34801561058c57600080fd5b506105a061059b366004614aa1565b6112c1565b60405190815260200161053f565b3480156105ba57600080fd5b506105a06105c9366004614aa1565b6112ce565b3480156105da57600080fd5b506105336105e9366004614aba565b6112db565b3480156105fa57600080fd5b50610511610609366004614b06565b611754565b34801561061a57600080fd5b506105a060075481565b34801561063057600080fd5b506105a061063f366004614b32565b600c6020526000908152604090205481565b34801561065d57600080fd5b506105a061066c366004614b5d565b6118fc565b34801561067d57600080fd5b506105a061068c366004614b9c565b611b16565b34801561069d57600080fd5b506105a0600181565b3480156106b257600080fd5b506105a06106c1366004614aa1565b611b55565b3480156106d257600080fd5b506105336106e1366004614a75565b611b62565b3480156106f257600080fd5b50610511610701366004614b32565b611b96565b34801561071257600080fd5b50610511610721366004614a75565b611d21565b34801561073257600080fd5b506105a0610741366004614be7565b805160208183018101805160138252928201919093012091525481565b34801561076a57600080fd5b506105a0610779366004614a75565b611d7c565b34801561078a57600080fd5b50600054610568906001600160a01b031681565b3480156107aa57600080fd5b506105116107b9366004614b32565b611dcd565b610511611f63565b3480156107d257600080fd5b506105a06107e1366004614a75565b612051565b3480156107f257600080fd5b50610511610801366004614b9c565b612083565b610511610814366004614c98565b6121ee565b34801561082557600080fd5b506105a0612819565b34801561083a57600080fd5b506105a0610849366004614a75565b61289a565b34801561085a57600080fd5b506105a0610869366004614aa1565b61295c565b34801561087a57600080fd5b50610511610889366004614aa1565b612969565b34801561089a57600080fd5b506105a060065481565b3480156108b057600080fd5b506105a0600981565b3480156108c557600080fd5b506105116108d4366004614b32565b612b15565b3480156108e557600080fd5b506105a0600881565b3480156108fa57600080fd5b506105a0600381565b34801561090f57600080fd5b506105a061091e366004614be7565b805160208183018101805160118252928201919093012091525481565b34801561094757600080fd5b506105a0600581565b34801561095c57600080fd5b5061053361096b366004614aa1565b60156020526000908152604090205460ff1681565b34801561098c57600080fd5b506105a061099b366004614a75565b612bea565b3480156109ac57600080fd5b506105116109bb366004614cd1565b612c17565b3480156109cc57600080fd5b506105336109db366004614aa1565b60166020526000908152604090205460ff1681565b3480156109fc57600080fd5b50600354610568906001600160a01b031681565b348015610a1c57600080fd5b506105a060045481565b348015610a3257600080fd5b506105a0610a41366004614be7565b805160208183018101805160148252928201919093012091525481565b348015610a6a57600080fd5b50600254610568906001600160a01b031681565b348015610a8a57600080fd5b506105a0610a99366004614a75565b612da7565b348015610aaa57600080fd5b506105a0610ab9366004614aa1565b612de8565b348015610aca57600080fd5b506105a0610ad9366004614b32565b600b6020526000908152604090205481565b348015610af757600080fd5b50610533610b06366004614a75565b612df5565b348015610b1757600080fd5b506105a0610b26366004614aa1565b612e6c565b348015610b3757600080fd5b506105a0610b46366004614a75565b612e79565b6105a0610b59366004614d01565b612e87565b348015610b6a57600080fd5b506105a0600681565b348015610b7f57600080fd5b506105a0610b8e366004614a75565b6134de565b348015610b9f57600080fd5b506105a0610bae366004614be7565b805160208183018101805160128252928201919093012091525481565b348015610bd757600080fd5b50610533610be6366004614a75565b613516565b348015610bf757600080fd5b506105a0600481565b348015610c0c57600080fd5b506105a0610c1b366004614a75565b61355b565b348015610c2c57600080fd5b50610511610c3b366004614cd1565b61357a565b348015610c4c57600080fd5b50610c60610c5b366004614a75565b613739565b60405161053f9190614d5f565b348015610c7957600080fd5b50610511610c88366004614aa1565b6137a2565b348015610c9957600080fd5b506105a0600281565b348015610cae57600080fd5b506105a0610cbd366004614aa1565b61398a565b348015610cce57600080fd5b506105a060055481565b348015610ce457600080fd5b506105a0610cf3366004614d92565b601760209081526000928352604080842090915290825290205481565b6105a0610d1e366004614aa1565b613997565b348015610d2f57600080fd5b506105a0610d3e366004614aa1565b613b2a565b348015610d4f57600080fd5b506105a0610d5e366004614a75565b613b37565b348015610d6f57600080fd5b506105a0610d7e366004614be7565b8051602081830181018051600e8252928201919093012091525481565b348015610da757600080fd5b506105a060085481565b348015610dbd57600080fd5b506105a0610dcc366004614a75565b613b45565b348015610ddd57600080fd5b506105a0610dec366004614b32565b613b53565b348015610dfd57600080fd5b506105a0600781565b348015610e1257600080fd5b50610511610e21366004614a75565b613ba1565b348015610e3257600080fd5b506105a0610e41366004614aa1565b613d9e565b348015610e5257600080fd5b50610511610e61366004614db4565b613dab565b348015610e7257600080fd5b506105a0600a81565b348015610e8757600080fd5b506105a0600081565b348015610e9c57600080fd5b506105a0610eab366004614a75565b613f3c565b348015610ebc57600080fd5b506105a0610ecb366004614aa1565b613f4a565b610511610ede366004614de2565b613f57565b348015610eef57600080fd5b506105a0610efe366004614be7565b805160208183018101805160108252928201919093012091525481565b348015610f2757600080fd5b50610511610f36366004614a75565b614011565b348015610f4757600080fd5b506105a0610f56366004614a75565b6142ad565b348015610f6757600080fd5b506105a0610f76366004614be7565b8051602081830181018051600f8252928201919093012091525481565b348015610f9f57600080fd5b506105a0610fae366004614a75565b6142bc565b348015610fbf57600080fd5b506105a0610fce366004614aa1565b614313565b348015610fdf57600080fd5b50600a54610568906001600160a01b031681565b348015610fff57600080fd5b506105a061100e366004614be7565b8051602081830181018051600d8252928201919093012091525481565b34801561103757600080fd5b506105a0611046366004614b9c565b614320565b34801561105757600080fd5b50610511611066366004614b32565b614454565b34801561107757600080fd5b506105a0611086366004614a75565b6145ea565b34801561109757600080fd5b506105336110a6366004614a75565b61461d565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156110f757600080fd5b505afa15801561110b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061112f9190614e07565b6000546001600160a01b031615806111c45750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906111749084903390600401614e2a565b60206040518083038186803b15801561118c57600080fd5b505afa1580156111a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c49190614e46565b6111e95760405162461bcd60e51b81526004016111e090614e63565b60405180910390fd5b6001600160a01b03821661122c5760405162461bcd60e51b815260206004820152600a6024820152696e6f206164647265737360b01b60448201526064016111e0565b600280546001600160a01b038088166001600160a01b03199283161790925560038054878416908316179055600a8054868416908316179055600980549285169290911691909117905561127f60018055565b5050505050565b60006112928383611b62565b80156112a557506112a38383612df5565b155b80156112b857506112b6838361461d565b155b90505b92915050565b60006112bb826001614695565b60006112bb82600a614695565b3360009081526018602052604081205460ff166113275760405162461bcd60e51b815260206004820152600a6024820152696e6f207365727669636560b01b60448201526064016111e0565b60008681526015602052604090205460ff166113555760405162461bcd60e51b81526004016111e090614e86565b61135f8787611b62565b158061137257506113708787612df5565b155b61138e5760405162461bcd60e51b81526004016111e090614eac565b600061139a8888613739565b905085600460008282546113ae9190614ee8565b90915550506001600160a01b0388166000908152600b6020526040812080548892906113db908490614ee8565b9091555050604051600d906113f1908390614f00565b908152602001604051809103902054600014156114cd5742600d826040516114199190614f00565b90815260405190819003602001902055846114345742611436565b845b600e826040516114469190614f00565b90815260200160405180910390208190555060016006600082825461146b9190614ee8565b9091555050604080518881526020810188905260008183015242606082015233608082015290516001600160a01b038a16917fa51b747dfa9bebb8d1d32fba407825193ab4533268532b9b8601085eca446450919081900360a00190a261160f565b6114d988886001614720565b841561159057856010826040516114f09190614f00565b9081526020016040518091039020546115099190614ee8565b6115138787614f1c565b6010836040516115239190614f00565b908152602001604051809103902054600e846040516115429190614f00565b90815260200160405180910390205461155b9190614f1c565b6115659190614ee8565b61156f9190614f3b565b600e8260405161157f9190614f00565b908152604051908190036020019020555b876001600160a01b03167f3a16c3cce042ab54f3069c61db28dea0ee4db01215ed281f1c74ead0649a8f8c88886010856040516115cd9190614f00565b9081526040805160209281900383018120549481529182019290925290810191909152600060608201524260808201523360a082015260c00160405180910390a25b856010826040516116209190614f00565b9081526020016040518091039020600082825461163d9190614ee8565b92505081905550826013826040516116559190614f00565b908152602001604051809103902060008282546116729190614ee8565b925050819055508360128260405161168a9190614f00565b908152602001604051809103902060008282546116a79190614ee8565b92505081905550856010826040516116bf9190614f00565b90815260200160405180910390205411156116e0576116e088886001614720565b604080518881526020810188905290810186905260608101859052608081018490523360a08201524260c08201526001600160a01b038916907fd8f4bf8fb11c8090d7f689f2a0e8dd1189efa76268dcd7eed6de149743140e629060e00160405180910390a2506001979650505050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156117a057600080fd5b505afa1580156117b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d89190614e07565b6000546001600160a01b0316158061186d5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f69061181d9084903390600401614e2a565b60206040518083038186803b15801561183557600080fd5b505afa158015611849573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186d9190614e46565b6118895760405162461bcd60e51b81526004016111e090614e63565b6000848152601660209081526040808320805460ff191660011790556017825280832086845282529182902084905581518681529081018590529081018390527f4dbbf86191ecd1e5615130609e3eda93820194f1c492d041ead416095959986b9060600160405180910390a150505050565b6000806119098686613739565b90506000600f8260405161191d9190614f00565b90815260200160405180910390205490506000600d836040516119409190614f00565b908152602001604051809103902054905061195b8888611b62565b61196b5760009350505050611b0e565b6119758888612df5565b156119865760009350505050611b0e565b4286111561199a5760009350505050611b0e565b818610156119ae5760009350505050611b0e565b8086116119c15760009350505050611b0e565b60008083116119d9576119d48288614f5d565b6119e3565b6119e38388614f5d565b905060006119f18a8a6145ea565b905060006119ff8b8b6142bc565b611a088b6112c1565b611a129085614f1c565b611a1c9190614f1c565b9050600088611a2c576000611a37565b611a378c8c8c614320565b90506000601288604051611a4b9190614f00565b90815260405190819003602001902054611a658385614ee8565b611a6f9190614ee8565b905083601389604051611a829190614f00565b90815260200160405180910390205410611aa757600098505050505050505050611b0e565b838160138a604051611ab99190614f00565b908152602001604051809103902054611ad29190614ee8565b10611b0457601388604051611ae79190614f00565b90815260200160405180910390205484611b019190614f5d565b90505b9750505050505050505b949350505050565b6000611b2183614313565b611b2a84613d9e565b611b3786868660016118fc565b611b419190614f1c565b611b4b9190614f3b565b90505b9392505050565b60006112bb826003614695565b600080600e611b718585613739565b604051611b7e9190614f00565b90815260200160405180910390205411905092915050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015611be257600080fd5b505afa158015611bf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c1a9190614e07565b6000546001600160a01b03161580611caf5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611c5f9084903390600401614e2a565b60206040518083038186803b158015611c7757600080fd5b505afa158015611c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611caf9190614e46565b611ccb5760405162461bcd60e51b81526004016111e090614e63565b600380546001600160a01b0319166001600160a01b0384169081179091556040519081527fa30ea3596e6b0bf63d799ca3146166f9b51a9eb996ce58e022ef806c13e17ff0906020015b60405180910390a15050565b6003546001600160a01b03163314611d6c5760405162461bcd60e51b815260206004820152600e60248201526d34b73b30b634b21039b2b73232b960911b60448201526064016111e0565b611d7882826001614720565b5050565b60008060015b6007548111611dc557611da7858260008711611d9e5742611da0565b865b60016118fc565b611db19083614ee8565b915080611dbd81614f74565b915050611d82565b509392505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1957600080fd5b505afa158015611e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e519190614e07565b6000546001600160a01b03161580611ee65750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611e969084903390600401614e2a565b60206040518083038186803b158015611eae57600080fd5b505afa158015611ec2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ee69190614e46565b611f025760405162461bcd60e51b81526004016111e090614e63565b6001600160a01b038216611f1557600080fd5b600980546001600160a01b0319166001600160a01b0384169081179091556040519081527fd649da8f6092116f86ea4e5139de0b75ad371d823918d16368ba3ff09a5cbc9f90602001611d15565b6002600155336000908152600b6020526040902054611faf5760405162461bcd60e51b81526020600482015260086024820152676e6f207061636b7360c01b60448201526064016111e0565b3460015b600754811161203957611fc63382611286565b611fcf57612027565b6000821161200c5760405162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b60448201526064016111e0565b600061201782613997565b90506120238184614f5d565b9250505b8061203181614f74565b915050611fb3565b50801561204a5761204a338261490c565b5060018055565b6000601461205f8484613739565b60405161206c9190614f00565b908152602001604051809103902054905092915050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120cf57600080fd5b505afa1580156120e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121079190614e07565b6000546001600160a01b0316158061219c5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f69061214c9084903390600401614e2a565b60206040518083038186803b15801561216457600080fd5b505afa158015612178573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219c9190614e46565b6121b85760405162461bcd60e51b81526004016111e090614e63565b60006121c48585613739565b905082600e826040516121d79190614f00565b908152604051908190036020019020555050505050565b6000826121fb338661289a565b6122059190614f1c565b90506000836122138661398a565b61221d9190614f1c565b9050600061222a866112ce565b90504260006122393389613739565b60008981526015602052604090205490915060ff1661226a5760405162461bcd60e51b81526004016111e090614e86565b8215806122a0575082876010836040516122849190614f00565b90815260200160405180910390205461229d9190614ee8565b11155b6122d95760405162461bcd60e51b815260206004820152600a6024820152691bdd995c881b1a5b5a5d60b21b60448201526064016111e0565b600187101561231f5760405162461bcd60e51b81526020600482015260126024820152711a5b9d985b1a59081b9bd9194818dbdd5b9d60721b60448201526064016111e0565b8434101561233f5760405162461bcd60e51b81526004016111e090614f8f565b6003546001600160a01b0316156123b5576003546040516367b4613560e01b8152336004820152602481018a90526001600160a01b03909116906367b4613590604401600060405180830381600087803b15801561239c57600080fd5b505af11580156123b0573d6000803e3d6000fd5b505050505b86600460008282546123c79190614ee8565b9091555050336000908152600b6020526040812080548992906123eb908490614ee8565b9091555050604051601090612401908390614f00565b908152602001604051809103902054600014156125015781600d826040516124299190614f00565b90815260200160405180910390208190555081600e8260405161244c9190614f00565b9081526020016040518091039020819055508660108260405161246f9190614f00565b9081526020016040518091039020600082825461248c9190614ee8565b925050819055506001600660008282546124a69190614ee8565b909155505060408051898152602081018990528715158183015242606082015260006080820152905133917fa51b747dfa9bebb8d1d32fba407825193ab4533268532b9b8601085eca446450919081900360a00190a26125ea565b61250b3389612df5565b156125285760405162461bcd60e51b81526004016111e090614eac565b61253433896001614720565b866010826040516125459190614f00565b908152602001604051809103902060008282546125629190614ee8565b92505081905550336001600160a01b03167f3a16c3cce042ab54f3069c61db28dea0ee4db01215ed281f1c74ead0649a8f8c89896010856040516125a69190614f00565b90815260408051602092819003830181205494815291820192909252908101919091528815156060820152426080820152600060a082015260c00160405180910390a25b851561266057836125fb3342612bea565b10156126365760405162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b60448201526064016111e0565b336000908152600c602052604081208054869290612655908490614ee8565b909155506127f99050565b6000612710600854866126739190614f1c565b61267d9190614f3b565b9050801561272f57600254600a546040516323b872dd60e01b81523360048201526001600160a01b039182166024820152604481018490529116906323b872dd90606401602060405180830381600087803b1580156126db57600080fd5b505af11580156126ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127139190614e46565b61272f5760405162461bcd60e51b81526004016111e090614fb4565b808511156127f7576002546001600160a01b03166323b872dd3330612754858a614f5d565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b1580156127a357600080fd5b505af11580156127b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127db9190614e46565b6127f75760405162461bcd60e51b81526004016111e090614fb4565b505b600a5461280f906001600160a01b03163461490c565b5050505050505050565b6002546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561285d57600080fd5b505afa158015612871573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128959190614fdd565b905090565b6000806128a683611b55565b90506000600e6128b68686613739565b6040516128c39190614f00565b908152602001604051809103902054905080600014156128e5575090506112bb565b6128ef8585613516565b156128fc575090506112bb565b6129068585612df5565b15612916576000925050506112bb565b600061292185612e6c565b90506000426129308385614ee8565b61293a9190614f5d565b9050816129478583614f1c565b6129519190614f3b565b979650505050505050565b60006112bb826000614695565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156129b557600080fd5b505afa1580156129c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129ed9190614e07565b6000546001600160a01b03161580612a825750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690612a329084903390600401614e2a565b60206040518083038186803b158015612a4a57600080fd5b505afa158015612a5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a829190614e46565b612a9e5760405162461bcd60e51b81526004016111e090614e63565b612710821115612ae05760405162461bcd60e51b815260206004820152600d60248201526c696e76616c69642076616c756560981b60448201526064016111e0565b60088290556040518281527f774b9fb928c71ca72bafa8771a63e9d00ea63b021cfd8cdc2ce4f003094c5d5890602001611d15565b600080546001600160a01b03161580612bab5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690612b5b9084903390600401614e2a565b60206040518083038186803b158015612b7357600080fd5b505afa158015612b87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bab9190614e46565b612bc75760405162461bcd60e51b81526004016111e090614e63565b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0382166000908152600c6020526040812054612c0d8484611d7c565b6112b89190614f5d565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015612c6357600080fd5b505afa158015612c77573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9b9190614e07565b6000546001600160a01b03161580612d305750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690612ce09084903390600401614e2a565b60206040518083038186803b158015612cf857600080fd5b505afa158015612d0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d309190614e46565b612d4c5760405162461bcd60e51b81526004016111e090614e63565b600083815260166020908152604091829020805460ff19168515159081179091558251868152918201527f754a64d46ab9a313f3f3cbae897a6b9d8d703593379a9ffe0035ace48dceeb6691015b60405180910390a1505050565b6000612db683834260016118fc565b6013612dc28585613739565b604051612dcf9190614f00565b9081526020016040518091039020546112b89190614ee8565b60006112bb826009614695565b600080612e028484613739565b90506000600e82604051612e169190614f00565b90815260200160405180910390205490508060001415612e3b576001925050506112bb565b612e4484613b2a565b612e4d85612e6c565b612e579083614ee8565b612e619190614ee8565b421195945050505050565b60006112bb826007614695565b6000601361205f8484613739565b60035460009081906001600160a01b03163314612ea45733612ea6565b325b90506000612eb48287613739565b90506000600f82604051612ec89190614f00565b90815260200160405180910390205460001415612f0357600d82604051612eef9190614f00565b908152602001604051809103902054612f23565b600f82604051612f139190614f00565b9081526020016040518091039020545b9050612f2f8388611b62565b612f6a5760405162461bcd60e51b815260206004820152600c60248201526b191bd95cdb9d08195e1a5cdd60a21b60448201526064016111e0565b612f748388612df5565b15612f915760405162461bcd60e51b81526004016111e090614eac565b612f9b8388613516565b15612fd35760405162461bcd60e51b8152602060048201526008602482015267706173742064756560c01b60448201526064016111e0565b428611156130135760405162461bcd60e51b815260206004820152600d60248201526c06261642074696d657374616d7609c1b60448201526064016111e0565b8561302082610384614ee8565b106130585760405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b60448201526064016111e0565b600061306784898960016118fc565b9050600081116130a55760405162461bcd60e51b81526020600482015260096024820152681b9bc81c995dd85c9960ba1b60448201526064016111e0565b6002546040516370a0823160e01b815230600482015282916001600160a01b0316906370a082319060240160206040518083038186803b1580156130e857600080fd5b505afa1580156130fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131209190614fdd565b101561315d5760405162461bcd60e51b815260206004820152600c60248201526b6f7665722062616c616e636560a01b60448201526064016111e0565b600061316889614313565b6131718a613d9e565b61317b9084614f1c565b6131859190614f3b565b9050803410156131a75760405162461bcd60e51b81526004016111e090614f8f565b87600f856040516131b89190614f00565b908152602001604051809103902081905550816013856040516131db9190614f00565b908152602001604051809103902060008282546131f89190614ee8565b9250508190555060006012856040516132119190614f00565b9081526040805160209281900383018120939093558b83529082018490526001600160a01b038716917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a910160405180910390a2336000908152600c6020526040902054156132f357336000908152600c60205260409020548210156132c657336000908152600c60205260409020546132ac908390614f5d565b336000908152600c602052604081209190915591506132f3565b336000908152600c60205260409020546132e09083614f5d565b336000908152600c602052604081205591505b6132ff338a6000614720565b6003546001600160a01b0316156133735760035460405163f4888a2160e01b81526001600160a01b039091169063f4888a2190613340908790600401614d5f565b600060405180830381600087803b15801561335a57600080fd5b505af115801561336e573d6000803e3d6000fd5b505050505b8115613491576001600160a01b038716156133ef576040516330d6a97560e01b81526001600160a01b038681166004830152602482018490528816906330d6a97590604401600060405180830381600087803b1580156133d257600080fd5b505af11580156133e6573d6000803e3d6000fd5b50505050613491565b60025460405163a9059cbb60e01b81526001600160a01b038781166004830152602482018590529091169063a9059cbb90604401602060405180830381600087803b15801561343d57600080fd5b505af1158015613451573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134759190614e46565b6134915760405162461bcd60e51b81526004016111e090614fb4565b6009546134a7906001600160a01b03168261490c565b6134af6149e4565b80156134ba57508034115b156134d2576134d2336134cd8334614f5d565b61490c565b98975050505050505050565b60008060015b6007548111611dc5576134f8858286611b16565b6135029083614ee8565b91508061350e81614f74565b9150506134e4565b6000806135238484613739565b90506000600e826040516135379190614f00565b908152602001604051809103902054905061355184612e6c565b612e619082614ee8565b600061356783836142bc565b61357083613f4a565b6112b89190614f1c565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156135c657600080fd5b505afa1580156135da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135fe9190614e07565b6000546001600160a01b031615806136935750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906136439084903390600401614e2a565b60206040518083038186803b15801561365b57600080fd5b505afa15801561366f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136939190614e46565b6136af5760405162461bcd60e51b81526004016111e090614e63565b600083116136cf5760405162461bcd60e51b81526004016111e090614e86565b6000838152601560205260409020805460ff1916831515179055600754831180156136f75750815b156137025760078390555b6040805184815283151560208201527f6f5d3c00ffa60404dde260f3251925e7a1b0e75603ddf7a1b15002e90e8ff9e09101612d9a565b606060008261374957600161374b565b825b604080516bffffffffffffffffffffffff19606088901b1660208201526001600160e01b031960e084901b166034820152600160c01b60388201529192500160405160208183030381529060405291505092915050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156137ee57600080fd5b505afa158015613802573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138269190614e07565b6000546001600160a01b031615806138bb5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f69061386b9084903390600401614e2a565b60206040518083038186803b15801561388357600080fd5b505afa158015613897573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138bb9190614e46565b6138d75760405162461bcd60e51b81526004016111e090614e63565b600082116138e457600080fd5b6002546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401602060405180830381600087803b15801561393657600080fd5b505af115801561394a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061396e9190614e46565b611d785760405162461bcd60e51b81526004016111e090614fb4565b60006112bb826002614695565b60006139a33383611286565b6139da5760405162461bcd60e51b815260206004820152600860248201526763616e742070617960c01b60448201526064016111e0565b6139e633836001614720565b60006139f23384613739565b90506000613a0033856142bc565b613a0985613f4a565b613a139190614f1c565b905080341015613a355760405162461bcd60e51b81526004016111e090614f8f565b613a3e84612e6c565b600e83604051613a4e9190614f00565b908152602001604051809103902054613a679190614ee8565b600e83604051613a779190614f00565b908152602001604051809103902081905550336001600160a01b03167fdf9a51129930649214df58f542322c245372c6f2fa6fc3c9b40d927c597cd23085600e85604051613ac59190614f00565b90815260405190819003602001812054613ae6928252602082015260400190565b60405180910390a2600a54613b04906001600160a01b03168261490c565b613b0c6149e4565b8015613b1757508034115b15611b4e57611b4e336134cd8334614f5d565b60006112bb826008614695565b6000601161205f8484613739565b6000600e61205f8484613739565b60008060015b6007548111613b9a57613b6c8482611286565b15613b8857613b7b848261355b565b613b859083614ee8565b91505b80613b9281614f74565b915050613b59565b5092915050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015613bed57600080fd5b505afa158015613c01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c259190614e07565b6000546001600160a01b03161580613cba5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690613c6a9084903390600401614e2a565b60206040518083038186803b158015613c8257600080fd5b505afa158015613c96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cba9190614e46565b613cd65760405162461bcd60e51b81526004016111e090614e63565b60025460405163095ea7b360e01b81526001600160a01b038581166004830152602482018590529091169063095ea7b390604401602060405180830381600087803b158015613d2457600080fd5b505af1158015613d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d5c9190614e46565b613d995760405162461bcd60e51b815260206004820152600e60248201526d185c1c1c9bdd994819985a5b195960921b60448201526064016111e0565b505050565b60006112bb826005614695565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015613df757600080fd5b505afa158015613e0b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e2f9190614e07565b6000546001600160a01b03161580613ec45750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690613e749084903390600401614e2a565b60206040518083038186803b158015613e8c57600080fd5b505afa158015613ea0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ec49190614e46565b613ee05760405162461bcd60e51b81526004016111e090614e63565b6001600160a01b038316600081815260186020908152604091829020805460ff19168615159081179091558251938452908301527fea782fa1fcb250a935b6bf028374e06a580a12523d2befc1c2254a3cd3ef37809101612d9a565b6000601061205f8484613739565b60006112bb826004614695565b6002600155336000908152600b6020526040902054613fa35760405162461bcd60e51b81526020600482015260086024820152676e6f206e6f64657360c01b60448201526064016111e0565b3460015b6007548111613ff7576000613fbf33838760016118fc565b90508015613fe4576000613fd4838787612e87565b9050613fe08185614f5d565b9350505b5080613fef81614f74565b915050613fa7565b50801561400857614008338261490c565b50506001805550565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561405d57600080fd5b505afa158015614071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140959190614e07565b6000546001600160a01b0316158061412a5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906140da9084903390600401614e2a565b60206040518083038186803b1580156140f257600080fd5b505afa158015614106573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061412a9190614e46565b6141465760405162461bcd60e51b81526004016111e090614e63565b6000821161415357600080fd5b6002546040516370a0823160e01b815230600482015283916001600160a01b0316906370a082319060240160206040518083038186803b15801561419657600080fd5b505afa1580156141aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141ce9190614fdd565b101561420b5760405162461bcd60e51b815260206004820152600c60248201526b6f7665722062616c616e636560a01b60448201526064016111e0565b60025460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb90604401602060405180830381600087803b15801561425957600080fd5b505af115801561426d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142919190614e46565b613d995760405162461bcd60e51b81526004016111e090614fb4565b60006112b883834260016118fc565b6000806142c98484613739565b90506011816040516142db9190614f00565b9081526020016040518091039020546010826040516142fa9190614f00565b908152602001604051809103902054611b0e9190614f5d565b60006112bb826006614695565b6003546000906001600160a01b031661433b57506000611b4e565b60006143478585613739565b90506000600f8260405161435b9190614f00565b9081526020016040518091039020546000141561439657600d826040516143829190614f00565b9081526020016040518091039020546143b6565b600f826040516143a69190614f00565b9081526020016040518091039020545b600354604051634ac21a6960e11b81526001600160a01b03898116600483015260248201899052604482018490526064820188905292935091169063958434d29060840160206040518083038186803b15801561441257600080fd5b505afa158015614426573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061444a9190614fdd565b9695505050505050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156144a057600080fd5b505afa1580156144b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144d89190614e07565b6000546001600160a01b0316158061456d5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f69061451d9084903390600401614e2a565b60206040518083038186803b15801561453557600080fd5b505afa158015614549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061456d9190614e46565b6145895760405162461bcd60e51b81526004016111e090614e63565b6001600160a01b03821661459c57600080fd5b600a80546001600160a01b0319166001600160a01b0384169081179091556040519081527f6fc8e7a1c2484c662808b4ca8010d816b18923abab6769fa48a21eb5ccf6e07c90602001611d15565b600060106145f88484613739565b6040516146059190614f00565b9081526020016040518091039020546135708361295c565b60008061462a8484613739565b90506000600e8260405161463e9190614f00565b9081526020016040518091039020549050600061465a85612e6c565b9050600061466786612de8565b6146719083614f1c565b61467b9042614ee8565b9050806146888385614ee8565b1015979650505050505050565b60008281526016602052604081205460ff1680156146cb5750600083815260176020908152604080832085845290915290205415155b6147025760008281527fd840e16649f6b9a295d95876f4633d3a6b10b55e8162971cf78afd886d5ec89b60205260409020546112b8565b50600091825260176020908152604080842092845291905290205490565b600061472c8484613739565b9050600061473d85854260016118fc565b90506000816013846040516147529190614f00565b90815260200160405180910390205461476b9190614ee8565b905060006147788661295c565b905060006147868284614f3b565b9050600060118660405161479a9190614f00565b90815260200160405180910390205482116147b65760006147e0565b6011866040516147c69190614f00565b908152602001604051809103902054826147e09190614f5d565b9050861561482d57846012876040516147f99190614f00565b90815260200160405180910390208190555042600f8760405161481c9190614f00565b908152604051908190036020019020555b801561490157806011876040516148449190614f00565b908152602001604051809103902060008282546148619190614ee8565b9091555061487190508382614f1c565b6014876040516148819190614f00565b9081526020016040518091039020600082825461489e9190614ee8565b9250508190555080600560008282546148b79190614ee8565b909155505060408051898152602081018390526001600160a01b038b16917fd1ad6f13ecf90412417f16481b7455bda8aa6ec0133a68cdab069f9b7bd623f9910160405180910390a25b505050505050505050565b804710156149535760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b60448201526064016111e0565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146149a0576040519150601f19603f3d011682016040523d82523d6000602084013e6149a5565b606091505b5050905080613d995760405162461bcd60e51b815260206004820152600b60248201526a1cd95b990819985a5b195960aa1b60448201526064016111e0565b60006149f260015460021490565b15801561289557505033321490565b6001600160a01b0381168114614a1657600080fd5b50565b60008060008060808587031215614a2f57600080fd5b8435614a3a81614a01565b93506020850135614a4a81614a01565b92506040850135614a5a81614a01565b91506060850135614a6a81614a01565b939692955090935050565b60008060408385031215614a8857600080fd5b8235614a9381614a01565b946020939093013593505050565b600060208284031215614ab357600080fd5b5035919050565b60008060008060008060c08789031215614ad357600080fd5b8635614ade81614a01565b9860208801359850604088013597606081013597506080810135965060a00135945092505050565b600080600060608486031215614b1b57600080fd5b505081359360208301359350604090920135919050565b600060208284031215614b4457600080fd5b8135611b4e81614a01565b8015158114614a1657600080fd5b60008060008060808587031215614b7357600080fd5b8435614b7e81614a01565b935060208501359250604085013591506060850135614a6a81614b4f565b600080600060608486031215614bb157600080fd5b8335614bbc81614a01565b95602085013595506040909401359392505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215614bf957600080fd5b813567ffffffffffffffff80821115614c1157600080fd5b818401915084601f830112614c2557600080fd5b813581811115614c3757614c37614bd1565b604051601f8201601f19908116603f01168101908382118183101715614c5f57614c5f614bd1565b81604052828152876020848701011115614c7857600080fd5b826020860160208301376000928101602001929092525095945050505050565b600080600060608486031215614cad57600080fd5b83359250602084013591506040840135614cc681614b4f565b809150509250925092565b60008060408385031215614ce457600080fd5b823591506020830135614cf681614b4f565b809150509250929050565b600080600060608486031215614d1657600080fd5b83359250602084013591506040840135614cc681614a01565b60005b83811015614d4a578181015183820152602001614d32565b83811115614d59576000848401525b50505050565b6020815260008251806020840152614d7e816040850160208701614d2f565b601f01601f19169190910160400192915050565b60008060408385031215614da557600080fd5b50508035926020909101359150565b60008060408385031215614dc757600080fd5b8235614dd281614a01565b91506020830135614cf681614b4f565b60008060408385031215614df557600080fd5b823591506020830135614cf681614a01565b600060208284031215614e1957600080fd5b815160ff81168114611b4e57600080fd5b60ff9290921682526001600160a01b0316602082015260400190565b600060208284031215614e5857600080fd5b8151611b4e81614b4f565b6020808252600990820152686e6f2061636365737360b81b604082015260600190565b6020808252600c908201526b696e76616c6964207479706560a01b604082015260600190565b6020808252600c908201526b1c1858dac8195e1c1a5c995960a21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115614efb57614efb614ed2565b500190565b60008251614f12818460208701614d2f565b9190910192915050565b6000816000190483118215151615614f3657614f36614ed2565b500290565b600082614f5857634e487b7160e01b600052601260045260246000fd5b500490565b600082821015614f6f57614f6f614ed2565b500390565b6000600019821415614f8857614f88614ed2565b5060010190565b6020808252600b908201526a696e76616c69642066656560a81b604082015260600190565b6020808252600f908201526e1d1c985b9cd9995c8819985a5b1959608a1b604082015260600190565b600060208284031215614fef57600080fd5b505191905056fea2646970667358221220a04dad56b0511814e364dfe137621aa7069c77a80a5cec9eb0407e00444e8b9164736f6c63430008090033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $3,485.87 | 0.0022578 | $7.87 |
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.