Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 13753855 | 1084 days ago | IN | 0 ETH | 0.76248504 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MultiNodeV1
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 "./interfaces/IERC20.sol"; import "./interfaces/IMultiNode.sol"; import "./interfaces/IStrongPool.sol"; import "./interfaces/IStrongNFTBonus.sol"; import "./lib/InternalCalls.sol"; import "./lib/MultiNodeSettings.sol"; import "./lib/SbMath.sol"; contract MultiNodeV1 is IMultiNode, InternalCalls, MultiNodeSettings { uint private constant _SECONDS_IN_ONE_MINUTE = 60; IERC20 public strongToken; IStrongNFTBonus public strongNFTBonus; uint public totalNodes; uint public nodesLimit; uint public takeStrongBips; address payable public feeCollector; mapping(address => bool) private serviceContractEnabled; mapping(address => uint) public entityNodeCount; mapping(address => uint) public entityCreditUsed; mapping(address => mapping(uint => uint)) public entityNodeTypeCount; mapping(bytes => uint) public entityNodeType; mapping(bytes => uint) public entityNodeCreatedAt; mapping(bytes => uint) public entityNodeLastPaidAt; mapping(bytes => uint) public entityNodeLastClaimedAt; // Events event Created(address indexed entity, uint nodeType, uint nodeId, bool usedCredit, uint timestamp); event Paid(address indexed entity, uint nodeType, uint nodeId, uint timestamp); event Claimed(address indexed entity, uint nodeId, uint reward); event MigratedFromService(address indexed service, address indexed entity, uint nodeType, uint nodeId, uint lastPaidAt); event SetFeeCollector(address payable collector); event SetNFTBonusContract(address strongNFTBonus); event SetNodesLimit(uint limit); event SetServiceContractEnabled(address service, bool enabled); event SetTakeStrongBips(uint bips); function init( IERC20 _strongToken, IStrongNFTBonus _strongNFTBonus, address payable _feeCollector ) external onlyRole(adminControl.SUPER_ADMIN()) { require(_feeCollector != address(0), "no address"); strongToken = _strongToken; strongNFTBonus = _strongNFTBonus; feeCollector = _feeCollector; InternalCalls.init(); } // // Getters // ------------------------------------------------------------------------------------------------------------------- function getRewardBalance() external view returns (uint) { return strongToken.balanceOf(address(this)); } function calcDecayedReward(uint _baseRate, uint _decayFactor, uint _minutesPassed) public pure returns (uint) { uint power = SbMath._decPow(_decayFactor, _minutesPassed); uint cumulativeFraction = SbMath.DECIMAL_PRECISION - power; return _baseRate * cumulativeFraction / SbMath.DECIMAL_PRECISION; } function canNodeBePaid(address _entity, uint _nodeId) public view returns (bool) { return doesNodeExist(_entity, _nodeId) && !hasNodeExpired(_entity, _nodeId) && !hasMaxPayments(_entity, _nodeId); } function doesNodeExist(address _entity, uint _nodeId) public view returns (bool) { return entityNodeLastPaidAt[getNodeId(_entity, _nodeId)] > 0; } function isNodePastDue(address _entity, uint _nodeId) public view returns (bool) { bytes memory id = getNodeId(_entity, _nodeId); uint nodeType = entityNodeType[id]; uint lastPaidAt = entityNodeLastPaidAt[id]; return block.timestamp > (lastPaidAt + getRecurringPaymentCycle(nodeType)); } function hasNodeExpired(address _entity, uint _nodeId) public view returns (bool) { bytes memory id = getNodeId(_entity, _nodeId); uint nodeType = entityNodeType[id]; uint lastPaidAt = entityNodeLastPaidAt[id]; if (lastPaidAt == 0) return true; return block.timestamp > (lastPaidAt + getRecurringPaymentCycle(nodeType) + getGracePeriod(nodeType)); } function hasMaxPayments(address _entity, uint _nodeId) public view returns (bool) { bytes memory id = getNodeId(_entity, _nodeId); uint nodeType = entityNodeType[id]; uint lastPaidAt = entityNodeLastPaidAt[id]; uint recurringPaymentCycle = getRecurringPaymentCycle(nodeType); uint limit = block.timestamp + recurringPaymentCycle * getPayCyclesLimit(nodeType); return lastPaidAt + recurringPaymentCycle >= limit; } function getNodeId(address _entity, uint _nodeId) public view returns (bytes memory) { uint id = _nodeId != 0 ? _nodeId : entityNodeCount[_entity] + 1; return abi.encodePacked(_entity, id); } function getNodeType(address _entity, uint _nodeId) public view returns (uint) { return entityNodeType[getNodeId(_entity, _nodeId)]; } function getNodeRecurringFee(address _entity, uint _nodeId) external view returns (uint) { return getRecurringFeeInWei(entityNodeType[getNodeId(_entity, _nodeId)]); } function getNodeClaimingFee(address _entity, uint _nodeId, uint _timestamp) external view returns (uint) { uint nodeType = entityNodeType[getNodeId(_entity, _nodeId)]; uint reward = getRewardAt(_entity, _nodeId, _timestamp); return reward * getClaimingFeeNumerator(nodeType) / getClaimingFeeDenominator(nodeType); } function getNodePaidOn(address _entity, uint _nodeId) external view returns (uint) { return entityNodeLastPaidAt[getNodeId(_entity, _nodeId)]; } function getNodeReward(address _entity, uint _nodeId) external view returns (uint) { return getRewardAt(_entity, _nodeId, block.timestamp); } function getRewardAt(address _entity, uint _nodeId, uint _timestamp) public view returns (uint) { bytes memory id = getNodeId(_entity, _nodeId); uint nodeType = entityNodeType[id]; uint lastClaimedAt = entityNodeLastClaimedAt[id] != 0 ? entityNodeLastClaimedAt[id] : entityNodeCreatedAt[id]; uint registeredAt = entityNodeCreatedAt[id]; if (!doesNodeExist(_entity, _nodeId)) return 0; if (hasNodeExpired(_entity, _nodeId)) return 0; if (_timestamp > block.timestamp) return 0; if (_timestamp <= lastClaimedAt) return 0; uint minutesTotal = (_timestamp - registeredAt) / _SECONDS_IN_ONE_MINUTE; uint reward = calcDecayedReward( getRewardBaseRate(nodeType), getRewardDecayFactor(nodeType), minutesTotal ); if (lastClaimedAt > 0) { uint minutesToLastClaim = (lastClaimedAt - registeredAt) / _SECONDS_IN_ONE_MINUTE; uint rewardAtLastClaim = calcDecayedReward(getRewardBaseRate(nodeType), getRewardDecayFactor(nodeType), minutesToLastClaim); reward = reward - rewardAtLastClaim; } uint bonus = getNftBonusAt(_entity, _nodeId, _timestamp); return reward + bonus; } function getNftBonusAt(address _entity, uint _nodeId, uint _timestamp) public view returns (uint) { if (address(strongNFTBonus) == address(0)) return 0; bytes memory id = getNodeId(_entity, _nodeId); uint nodeType = entityNodeType[id]; uint lastClaimedAt = entityNodeLastClaimedAt[id] != 0 ? entityNodeLastClaimedAt[id] : entityNodeCreatedAt[id]; string memory bonusName = strongNFTBonus.getStakedNftBonusName(_entity, uint128(_nodeId), address(this)); if (keccak256(abi.encode(bonusName)) == keccak256(abi.encode(""))) return 0; uint bonusValue = getNftBonusValue(nodeType, bonusName); return bonusValue > 0 ? strongNFTBonus.getBonusValue(_entity, uint128(_nodeId), lastClaimedAt, _timestamp, bonusValue) : 0; } function getEntityRewards(address _entity, uint _timestamp) public view returns (uint) { uint reward = 0; for (uint nodeId = 1; nodeId <= entityNodeCount[_entity]; nodeId++) { reward = reward + getRewardAt(_entity, nodeId, _timestamp > 0 ? _timestamp : block.timestamp); } return reward; } function getEntityCreditAvailable(address _entity, uint _timestamp) public view returns (uint) { return getEntityRewards(_entity, _timestamp) - entityCreditUsed[_entity]; } function getNodesRecurringFee(address _entity, uint _fromNode, uint _toNode) external view returns (uint) { uint fee = 0; uint fromNode = _fromNode > 0 ? _fromNode : 1; uint toNode = _toNode > 0 ? _toNode : entityNodeCount[_entity]; for (uint nodeId = fromNode; nodeId <= toNode; nodeId++) { if (canNodeBePaid(_entity, nodeId)) fee = fee + getRecurringFeeInWei(getNodeType(_entity, nodeId)); } return fee; } function getNodesClaimingFee(address _entity, uint _timestamp, uint _fromNode, uint _toNode) external view returns (uint) { uint fee = 0; uint fromNode = _fromNode > 0 ? _fromNode : 1; uint toNode = _toNode > 0 ? _toNode : entityNodeCount[_entity]; for (uint nodeId = fromNode; nodeId <= toNode; nodeId++) { uint reward = getRewardAt(_entity, nodeId, _timestamp > 0 ? _timestamp : block.timestamp); if (reward > 0) { uint nodeType = getNodeType(_entity, nodeId); fee = fee + reward * getClaimingFeeNumerator(nodeType) / getClaimingFeeDenominator(nodeType); } } return fee; } // // Actions // ------------------------------------------------------------------------------------------------------------------- function createNode(uint _nodeType, bool _useCredit) external payable { uint fee = getCreatingFeeInWei(_nodeType); uint strongFee = getStrongFeeInWei(_nodeType); uint nodeTypeLimit = getNodesLimit(_nodeType); require(nodeTypeActive[_nodeType], "invalid type"); require(nodesLimit == 0 || entityNodeCount[msg.sender] < nodesLimit, "over limit"); require(nodeTypeLimit == 0 || entityNodeTypeCount[msg.sender][_nodeType] < nodeTypeLimit, "over limit"); require(msg.value >= fee, "invalid fee"); uint nodeId = entityNodeCount[msg.sender] + 1; bytes memory id = getNodeId(msg.sender, nodeId); totalNodes = totalNodes + 1; entityNodeType[id] = _nodeType; entityNodeCreatedAt[id] = block.timestamp; entityNodeLastPaidAt[id] = block.timestamp; entityNodeCount[msg.sender] = entityNodeCount[msg.sender] + 1; entityNodeTypeCount[msg.sender][_nodeType] = entityNodeTypeCount[msg.sender][_nodeType] + 1; emit Created(msg.sender, _nodeType, nodeId, _useCredit, block.timestamp); if (_useCredit) { require(getEntityCreditAvailable(msg.sender, block.timestamp) >= strongFee, "not enough"); entityCreditUsed[msg.sender] = entityCreditUsed[msg.sender] + strongFee; } else { uint takeStrong = strongFee * takeStrongBips / 10000; require(strongToken.transferFrom(msg.sender, feeCollector, takeStrong), "transfer failed"); if (strongFee > takeStrong) { require(strongToken.transferFrom(msg.sender, address(this), strongFee - takeStrong), "transfer failed"); } } sendValue(feeCollector, fee); if (msg.value > fee) sendValue(payable(msg.sender), msg.value - fee); } function claim(uint _nodeId, uint _timestamp, address _toStrongPool) public payable returns (uint) { address entity = msg.sender == address(strongNFTBonus) ? tx.origin : msg.sender; bytes memory id = getNodeId(entity, _nodeId); uint nodeType = entityNodeType[id]; uint lastClaimedAt = entityNodeLastClaimedAt[id] != 0 ? entityNodeLastClaimedAt[id] : entityNodeCreatedAt[id]; require(doesNodeExist(entity, _nodeId), "doesnt exist"); require(!hasNodeExpired(entity, _nodeId), "node expired"); require(!isNodePastDue(entity, _nodeId), "past due"); require(_timestamp <= block.timestamp, "bad timestamp"); require(lastClaimedAt + 900 < _timestamp, "too soon"); uint reward = getRewardAt(entity, _nodeId, _timestamp); require(reward > 0, "no reward"); require(strongToken.balanceOf(address(this)) >= reward, "over balance"); uint fee = reward * getClaimingFeeNumerator(nodeType) / getClaimingFeeDenominator(nodeType); require(msg.value >= fee, "invalid fee"); entityNodeLastClaimedAt[id] = _timestamp; emit Claimed(entity, _nodeId, 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; } } if (reward > 0) { if (_toStrongPool != address(0)) IStrongPool(_toStrongPool).mineFor(entity, reward); else require(strongToken.transfer(entity, reward), "transfer failed"); } sendValue(feeCollector, fee); if (isUserCall() && msg.value > fee) sendValue(payable(msg.sender), msg.value - fee); return fee; } function claimAll(uint _timestamp, address _toStrongPool, uint _fromNode, uint _toNode) external payable makesInternalCalls { require(entityNodeCount[msg.sender] > 0, "no nodes"); uint valueLeft = msg.value; uint fromNode = _fromNode > 0 ? _fromNode : 1; uint toNode = _toNode > 0 ? _toNode : entityNodeCount[msg.sender]; for (uint nodeId = fromNode; nodeId <= toNode; nodeId++) { uint reward = getRewardAt(msg.sender, nodeId, _timestamp); if (reward > 0) { require(valueLeft > 0, "not enough"); uint paid = claim(nodeId, _timestamp, _toStrongPool); valueLeft = valueLeft - paid; } } if (valueLeft > 0) sendValue(payable(msg.sender), valueLeft); } function pay(uint _nodeId) public payable returns (uint) { bytes memory id = getNodeId(msg.sender, _nodeId); uint nodeType = entityNodeType[id]; uint fee = getRecurringFeeInWei(nodeType); require(canNodeBePaid(msg.sender, _nodeId), "cant pay"); require(msg.value >= fee, "invalid fee"); entityNodeLastPaidAt[id] = entityNodeLastPaidAt[id] + getRecurringPaymentCycle(nodeType); emit Paid(msg.sender, nodeType, _nodeId, entityNodeLastPaidAt[id]); sendValue(feeCollector, fee); if (isUserCall() && msg.value > fee) sendValue(payable(msg.sender), msg.value - fee); return fee; } function payAll(uint _fromNode, uint _toNode) external payable makesInternalCalls { require(entityNodeCount[msg.sender] > 0, "no nodes"); uint valueLeft = msg.value; uint fromNode = _fromNode > 0 ? _fromNode : 1; uint toNode = _toNode > 0 ? _toNode : entityNodeCount[msg.sender]; for (uint nodeId = fromNode; nodeId <= toNode; nodeId++) { if (!canNodeBePaid(msg.sender, nodeId)) continue; require(valueLeft > 0, "not enough"); uint paid = pay(nodeId); valueLeft = valueLeft - paid; } if (valueLeft > 0) sendValue(payable(msg.sender), valueLeft); } function migrateNode(address _entity, uint _nodeType, uint _lastPaidAt) external returns (uint) { require(serviceContractEnabled[msg.sender], "no service"); require(nodeTypeActive[_nodeType], "invalid type"); uint nodeId = entityNodeCount[_entity] + 1; bytes memory id = getNodeId(_entity, nodeId); totalNodes = totalNodes + 1; entityNodeType[id] = _nodeType; entityNodeCreatedAt[id] = _lastPaidAt; entityNodeLastPaidAt[id] = _lastPaidAt; entityNodeCount[_entity] = entityNodeCount[_entity] + 1; entityNodeTypeCount[_entity][_nodeType] = entityNodeTypeCount[_entity][_nodeType] + 1; emit MigratedFromService(msg.sender, _entity, _nodeType, nodeId, _lastPaidAt); return nodeId; } // // 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 setFeeCollector(address payable _feeCollector) external onlyRole(adminControl.SUPER_ADMIN()) { require(_feeCollector != address(0)); feeCollector = _feeCollector; emit SetFeeCollector(_feeCollector); } function setNFTBonusContract(address _contract) external onlyRole(adminControl.SERVICE_ADMIN()) { strongNFTBonus = IStrongNFTBonus(_contract); emit SetNFTBonusContract(_contract); } function setNodesLimit(uint _limit) external onlyRole(adminControl.SERVICE_ADMIN()) { nodesLimit = _limit; emit SetNodesLimit(_limit); } function setServiceContractEnabled(address _contract, bool _enabled) external onlyRole(adminControl.SERVICE_ADMIN()) { serviceContractEnabled[_contract] = _enabled; emit SetServiceContractEnabled(_contract, _enabled); } function setTakeStrongBips(uint _bips) external onlyRole(adminControl.SUPER_ADMIN()) { require(_bips <= 10000, "invalid value"); takeStrongBips = _bips; emit SetTakeStrongBips(_bips); } function sendValue(address payable recipient, uint256 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"); } }
// 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 IMultiNode { function doesNodeExist(address entity, uint nodeId) external view returns (bool); function hasNodeExpired(address entity, uint nodeId) external view returns (bool); function claim(uint nodeId, uint timestamp, address toStrongPool) external payable returns (uint); }
// 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.6.0; interface IStrongNFTBonus { function getBonus(address _entity, uint128 _nodeId, uint256 _from, uint256 _to) external view returns (uint256); function getBonusValue(address _entity, uint128 _nodeId, uint256 _from, uint256 _to, uint256 _bonusValue) external view returns (uint256); function getStakedNftBonusName(address _entity, uint128 _nodeId, address _serviceContract) external view returns (string memory); function migrateNFT(address _entity, uint128 _fromNodeId, uint128 _toNodeId, address _toServiceContract) 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.6.0; import "./AdminAccess.sol"; contract MultiNodeSettings is AdminAccess { uint constant public NODE_TYPE_REWARD_BASE_RATE = 0; uint constant public NODE_TYPE_REWARD_DECAY_FACTOR = 1; uint constant public NODE_TYPE_FEE_STRONG = 2; uint constant public NODE_TYPE_FEE_CREATE = 3; uint constant public NODE_TYPE_FEE_RECURRING = 4; uint constant public NODE_TYPE_FEE_CLAIMING_NUMERATOR = 5; uint constant public NODE_TYPE_FEE_CLAIMING_DENOMINATOR = 6; uint constant public NODE_TYPE_RECURRING_CYCLE_SECONDS = 7; uint constant public NODE_TYPE_GRACE_PERIOD_SECONDS = 8; uint constant public NODE_TYPE_PAY_CYCLES_LIMIT = 9; uint constant public NODE_TYPE_NODES_LIMIT = 10; mapping(uint => bool) public nodeTypeActive; mapping(uint => bool) public nodeTypeHasSettings; mapping(uint => mapping(uint => uint)) public nodeTypeSettings; mapping(uint => mapping(string => uint)) public nodeTypeNFTBonus; // Events event SetNodeTypeActive(uint nodeType, bool active); event SetNodeTypeSetting(uint nodeType, uint settingId, uint value); event SetNodeTypeHasSettings(uint nodeType, bool hasSettings); event SetNodeTypeNFTBonus(uint nodeType, string bonusName, uint value); // // Getters // ------------------------------------------------------------------------------------------------------------------- function getRewardBaseRate(uint _nodeType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_nodeType, NODE_TYPE_REWARD_BASE_RATE); } function getRewardDecayFactor(uint _nodeType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_nodeType, NODE_TYPE_REWARD_DECAY_FACTOR); } function getClaimingFeeNumerator(uint _nodeType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_nodeType, NODE_TYPE_FEE_CLAIMING_NUMERATOR); } function getClaimingFeeDenominator(uint _nodeType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_nodeType, NODE_TYPE_FEE_CLAIMING_DENOMINATOR); } function getCreatingFeeInWei(uint _nodeType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_nodeType, NODE_TYPE_FEE_CREATE); } function getRecurringFeeInWei(uint _nodeType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_nodeType, NODE_TYPE_FEE_RECURRING); } function getStrongFeeInWei(uint _nodeType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_nodeType, NODE_TYPE_FEE_STRONG); } function getRecurringPaymentCycle(uint _nodeType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_nodeType, NODE_TYPE_RECURRING_CYCLE_SECONDS); } function getGracePeriod(uint _nodeType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_nodeType, NODE_TYPE_GRACE_PERIOD_SECONDS); } function getPayCyclesLimit(uint _nodeType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_nodeType, NODE_TYPE_PAY_CYCLES_LIMIT); } function getNodesLimit(uint _nodeType) public view returns (uint) { return getCustomSettingOrDefaultIfZero(_nodeType, NODE_TYPE_NODES_LIMIT); } function getNftBonusValue(uint _nodeType, string memory _bonusName) public view returns (uint) { return nodeTypeNFTBonus[_nodeType][_bonusName] > 0 ? nodeTypeNFTBonus[_nodeType][_bonusName] : nodeTypeNFTBonus[0][_bonusName]; } // // Setters // ------------------------------------------------------------------------------------------------------------------- function setNodeTypeActive(uint _nodeType, bool _active) external onlyRole(adminControl.SERVICE_ADMIN()) { // Node type 0 is being used as a placeholder for the default settings for node types that don't have custom ones, // So it shouldn't be activated and used to create nodes require(_nodeType > 0, "invalid type"); nodeTypeActive[_nodeType] = _active; emit SetNodeTypeActive(_nodeType, _active); } function setNodeTypeHasSettings(uint _nodeType, bool _hasSettings) external onlyRole(adminControl.SERVICE_ADMIN()) { nodeTypeHasSettings[_nodeType] = _hasSettings; emit SetNodeTypeHasSettings(_nodeType, _hasSettings); } function setNodeTypeSetting(uint _nodeType, uint _settingId, uint _value) external onlyRole(adminControl.SERVICE_ADMIN()) { nodeTypeHasSettings[_nodeType] = true; nodeTypeSettings[_nodeType][_settingId] = _value; emit SetNodeTypeSetting(_nodeType, _settingId, _value); } function setNodeTypeNFTBonus(uint _nodeType, string memory _bonusName, uint _value) external onlyRole(adminControl.SERVICE_ADMIN()) { nodeTypeNFTBonus[_nodeType][_bonusName] = _value; emit SetNodeTypeNFTBonus(_nodeType, _bonusName, _value); } // ------------------------------------------------------------------------------------------------------------------- function getCustomSettingOrDefaultIfZero(uint _nodeType, uint _setting) internal view returns (uint) { return nodeTypeHasSettings[_nodeType] && nodeTypeSettings[_nodeType][_setting] > 0 ? nodeTypeSettings[_nodeType][_setting] : nodeTypeSettings[0][_setting]; } }
// 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; /* * @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; } }
// 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; 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); }
{ "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":"nodeId","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":"nodeType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nodeId","type":"uint256"},{"indexed":false,"internalType":"bool","name":"usedCredit","type":"bool"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Created","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"service","type":"address"},{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"nodeType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nodeId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastPaidAt","type":"uint256"}],"name":"MigratedFromService","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"nodeType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nodeId","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":"uint256","name":"nodeType","type":"uint256"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"SetNodeTypeActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"nodeType","type":"uint256"},{"indexed":false,"internalType":"bool","name":"hasSettings","type":"bool"}],"name":"SetNodeTypeHasSettings","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"nodeType","type":"uint256"},{"indexed":false,"internalType":"string","name":"bonusName","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SetNodeTypeNFTBonus","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"nodeType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"settingId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SetNodeTypeSetting","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"limit","type":"uint256"}],"name":"SetNodesLimit","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":"NODE_TYPE_FEE_CLAIMING_DENOMINATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NODE_TYPE_FEE_CLAIMING_NUMERATOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NODE_TYPE_FEE_CREATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NODE_TYPE_FEE_RECURRING","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NODE_TYPE_FEE_STRONG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NODE_TYPE_GRACE_PERIOD_SECONDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NODE_TYPE_NODES_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NODE_TYPE_PAY_CYCLES_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NODE_TYPE_RECURRING_CYCLE_SECONDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NODE_TYPE_REWARD_BASE_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NODE_TYPE_REWARD_DECAY_FACTOR","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":"uint256","name":"_baseRate","type":"uint256"},{"internalType":"uint256","name":"_decayFactor","type":"uint256"},{"internalType":"uint256","name":"_minutesPassed","type":"uint256"}],"name":"calcDecayedReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"canNodeBePaid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeId","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"},{"internalType":"uint256","name":"_fromNode","type":"uint256"},{"internalType":"uint256","name":"_toNode","type":"uint256"}],"name":"claimAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"bool","name":"_useCredit","type":"bool"}],"name":"createNode","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":"_nodeId","type":"uint256"}],"name":"doesNodeExist","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":"entityNodeCreatedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityNodeLastClaimedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityNodeLastPaidAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityNodeType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"entityNodeTypeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getClaimingFeeDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getClaimingFeeNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","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":"_timestamp","type":"uint256"}],"name":"getEntityRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getGracePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getNftBonusAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"string","name":"_bonusName","type":"string"}],"name":"getNftBonusValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"getNodeClaimingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"getNodeId","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"getNodePaidOn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"getNodeRecurringFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"getNodeReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"getNodeType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"_fromNode","type":"uint256"},{"internalType":"uint256","name":"_toNode","type":"uint256"}],"name":"getNodesClaimingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getNodesLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_fromNode","type":"uint256"},{"internalType":"uint256","name":"_toNode","type":"uint256"}],"name":"getNodesRecurringFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getPayCyclesLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getRecurringFeeInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getRecurringPaymentCycle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"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":"_nodeType","type":"uint256"}],"name":"getRewardBaseRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getRewardDecayFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"}],"name":"getStrongFeeInWei","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"hasMaxPayments","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"hasNodeExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_strongToken","type":"address"},{"internalType":"contract IStrongNFTBonus","name":"_strongNFTBonus","type":"address"},{"internalType":"address payable","name":"_feeCollector","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"isNodePastDue","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"uint256","name":"_lastPaidAt","type":"uint256"}],"name":"migrateNode","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypeActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypeHasSettings","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"name":"nodeTypeNFTBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeTypeSettings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodesLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeId","type":"uint256"}],"name":"pay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromNode","type":"uint256"},{"internalType":"uint256","name":"_toNode","type":"uint256"}],"name":"payAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_feeCollector","type":"address"}],"name":"setFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setNFTBonusContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"bool","name":"_active","type":"bool"}],"name":"setNodeTypeActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"bool","name":"_hasSettings","type":"bool"}],"name":"setNodeTypeHasSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"string","name":"_bonusName","type":"string"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setNodeTypeNFTBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeType","type":"uint256"},{"internalType":"uint256","name":"_settingId","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setNodeTypeSetting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNodesLimit","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 IStrongNFTBonus","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":"totalNodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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
608060405234801561001057600080fd5b50614bac806100206000396000f3fe6080604052600436106104735760003560e01c80639548f1e61161024a578063d1c25be311610139578063e94d59dc116100b6578063f3fef3a31161007a578063f3fef3a314610e3d578063f5474cb014610e5d578063f9df21e714610e7d578063fade29de14610e9d578063fefe2f5814610ebd57600080fd5b8063e94d59dc14610d9b578063ea97bba614610dbb578063eaace4cc14610df3578063eaffeddc14610e08578063f232ee3714610e2857600080fd5b8063de20d47a116100fd578063de20d47a14610cfb578063e0b5485914610d1b578063e2ca3c3a14610d2e578063e5f4f66714610d4e578063e79ae18b14610d6357600080fd5b8063d1c25be314610c4d578063d2d7b21414610c6d578063d7feb2fe14610c83578063dc2e86e914610cbb578063dd811fff14610cdb57600080fd5b8063ac44ff31116101c7578063c290d6911161018b578063c290d69114610bc5578063c415b95c14610bd8578063c548201114610bf8578063c741643714610c18578063c8f064ec14610c3857600080fd5b8063ac44ff3114610b3f578063afc9a71b14610b52578063b6b55f2514610b65578063b7fef4ce14610b85578063bbbf0f6614610ba557600080fd5b8063a42dce801161020e578063a42dce8014610a92578063a5ea985d14610ab2578063a77e282514610ad2578063aa81ce3e14610aff578063aadea3f314610b1f57600080fd5b80639548f1e6146109fc5780639592d42414610a1c578063965d61b914610a325780639daf08c014610a52578063a052058114610a7257600080fd5b806350d0eed01161036657806373d70677116102e35780638ccf7f23116102a75780638ccf7f231461094c5780638ecddc051461097c5780638eda065f1461099c5780639145e391146109bc578063939c6bfb146109dc57600080fd5b806373d706771461087c57806378a760661461089c5780637a0b9255146108d457806381e79c0c146108f4578063855f261e1461091457600080fd5b8063572887b01161032a578063572887b0146107e75780635e42b4551461080757806361a3aa8e1461081c57806363a441021461083c5780636fdd1ff11461085c57600080fd5b806350d0eed01461071a578063528402791461072f57806353663f7b1461074f57806355079ddd1461078f578063555d3e63146107af57600080fd5b806331ed56f9116103f45780634de740ba116103b85780634de740ba1461065c5780634df78d5f1461067c5780634ff634221461069c5780634ffbcc0c146106e55780635041ae2b1461070557600080fd5b806331ed56f9146105c5578063342ec83d146105da5780633bc16d701461060757806341e666911461061c5780634608482d1461063c57600080fd5b8063184b95591161043b578063184b95591461054557806319ba32631461056757806321d2ab8a146105875780632749bf4f1461059c57806327bee747146105af57600080fd5b806301bd2f8114610478578063030fca67146104c35780630c056e41146104e35780630c931cd01461051057806311d7096d14610525575b600080fd5b34801561048457600080fd5b506104b0610493366004614473565b600f60209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b3480156104cf57600080fd5b506104b06104de36600461449f565b610ed2565b3480156104ef57600080fd5b506105036104fe366004614473565b610f63565b6040516104ba919061452c565b34801561051c57600080fd5b506104b0600181565b34801561053157600080fd5b506104b061054036600461453f565b610fd9565b34801561055157600080fd5b50610565610560366004614558565b610fe6565b005b34801561057357600080fd5b506104b061058236600461453f565b6111b6565b34801561059357600080fd5b506104b0600881565b6105656105aa3660046145a3565b6111c3565b3480156105bb57600080fd5b506104b060095481565b3480156105d157600080fd5b506104b0600081565b3480156105e657600080fd5b506104b06105f53660046145e0565b600e6020526000908152604090205481565b34801561061357600080fd5b506104b0600a81565b34801561062857600080fd5b506104b06106373660046145fd565b6112d0565b34801561064857600080fd5b506104b061065736600461453f565b61131c565b34801561066857600080fd5b50610565610677366004614637565b611329565b34801561068857600080fd5b506105656106973660046145e0565b6114bb565b3480156106a857600080fd5b506104b06106b7366004614734565b6005602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b3480156106f157600080fd5b506105656107003660046145fd565b611648565b34801561071157600080fd5b506104b0600681565b34801561072657600080fd5b506104b0600781565b34801561073b57600080fd5b5061056561074a36600461453f565b6117f3565b34801561075b57600080fd5b5061077f61076a36600461453f565b60036020526000908152604090205460ff1681565b60405190151581526020016104ba565b34801561079b57600080fd5b506104b06107aa366004614473565b61195f565b3480156107bb57600080fd5b506001546107cf906001600160a01b031681565b6040516001600160a01b0390911681526020016104ba565b3480156107f357600080fd5b506104b061080236600461453f565b6119c3565b34801561081357600080fd5b506104b06119d0565b34801561082857600080fd5b50610565610837366004614637565b611a51565b34801561084857600080fd5b5061056561085736600461477b565b611bfa565b34801561086857600080fd5b5061056561087736600461453f565b611d98565b34801561088857600080fd5b506104b061089736600461449f565b611f46565b3480156108a857600080fd5b506104b06108b73660046147cb565b805160208183018101805160108252928201919093012091525481565b3480156108e057600080fd5b506105656108ef3660046145e0565b61213e565b34801561090057600080fd5b506104b061090f366004614473565b612215565b34801561092057600080fd5b506104b061092f3660046147cb565b805160208183018101805160138252928201919093012091525481565b34801561095857600080fd5b5061077f61096736600461453f565b60026020526000908152604090205460ff1681565b34801561098857600080fd5b506104b061099736600461449f565b612247565b3480156109a857600080fd5b506104b06109b7366004614473565b612414565b3480156109c857600080fd5b506104b06109d736600461449f565b612441565b3480156109e857600080fd5b506104b06109f7366004614473565b612499565b348015610a0857600080fd5b506007546107cf906001600160a01b031681565b348015610a2857600080fd5b506104b060085481565b348015610a3e57600080fd5b506006546107cf906001600160a01b031681565b348015610a5e57600080fd5b5061077f610a6d366004614473565b6124a6565b348015610a7e57600080fd5b506104b0610a8d36600461453f565b6124da565b348015610a9e57600080fd5b50610565610aad3660046145e0565b6124e7565b348015610abe57600080fd5b506104b0610acd366004614473565b61267f565b348015610ade57600080fd5b506104b0610aed3660046145e0565b600d6020526000908152604090205481565b348015610b0b57600080fd5b5061077f610b1a366004614473565b6126b1565b348015610b2b57600080fd5b506104b0610b3a36600461453f565b6126e9565b6104b0610b4d366004614814565b6126f6565b610565610b60366004614637565b612cb5565b348015610b7157600080fd5b50610565610b8036600461453f565b613160565b348015610b9157600080fd5b506104b0610ba0366004614473565b61334e565b348015610bb157600080fd5b506104b0610bc036600461453f565b61335c565b6104b0610bd336600461453f565b613369565b348015610be457600080fd5b50600b546107cf906001600160a01b031681565b348015610c0457600080fd5b506104b0610c1336600461453f565b613512565b348015610c2457600080fd5b5061077f610c33366004614473565b61351f565b348015610c4457600080fd5b506104b0600481565b348015610c5957600080fd5b5061077f610c68366004614473565b613593565b348015610c7957600080fd5b506104b0600a5481565b348015610c8f57600080fd5b506104b0610c9e3660046147cb565b805160208183018101805160128252928201919093012091525481565b348015610cc757600080fd5b50610565610cd6366004614473565b613623565b348015610ce757600080fd5b506104b0610cf636600461449f565b613822565b348015610d0757600080fd5b506104b0610d1636600461453f565b613aa2565b610565610d29366004614842565b613aaf565b348015610d3a57600080fd5b50610565610d49366004614864565b613bb5565b348015610d5a57600080fd5b506104b0600281565b348015610d6f57600080fd5b506104b0610d7e3660046147cb565b805160208183018101805160118252928201919093012091525481565b348015610da757600080fd5b506104b0610db6366004614734565b613d48565b348015610dc757600080fd5b506104b0610dd6366004614842565b600460209081526000928352604080842090915290825290205481565b348015610dff57600080fd5b506104b0600381565b348015610e1457600080fd5b506104b0610e2336600461453f565b613de5565b348015610e3457600080fd5b506104b0600981565b348015610e4957600080fd5b50610565610e58366004614473565b613df2565b348015610e6957600080fd5b506104b0610e7836600461453f565b614090565b348015610e8957600080fd5b5061077f610e98366004614473565b61409d565b348015610ea957600080fd5b506104b0610eb8366004614892565b614139565b348015610ec957600080fd5b506104b0600581565b6000808084610ee2576001610ee4565b845b90506000808511610f0d576001600160a01b0387166000908152600d6020526040902054610f0f565b845b9050815b818111610f5557610f2488826126b1565b15610f4357610f36610e238983612215565b610f4090856148e3565b93505b80610f4d816148fb565b915050610f13565b5091925050505b9392505050565b6060600082610f95576001600160a01b0384166000908152600d6020526040902054610f909060016148e3565b610f97565b825b6040516bffffffffffffffffffffffff19606087901b166020820152603481018290529091506054016040516020818303038152906040529150505b92915050565b6000610fd382600a614206565b600160009054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561103457600080fd5b505afa158015611048573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106c9190614916565b6001546001600160a01b031615806111015750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906110b19084903390600401614939565b60206040518083038186803b1580156110c957600080fd5b505afa1580156110dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111019190614955565b6111265760405162461bcd60e51b815260040161111d90614972565b60405180910390fd5b6001600160a01b0382166111695760405162461bcd60e51b815260206004820152600a6024820152696e6f206164647265737360b01b604482015260640161111d565b600680546001600160a01b038087166001600160a01b03199283161790925560078054868416908316179055600b8054928516929091169190911790556111b06001600055565b50505050565b6000610fd3826001614206565b60026000908155338152600d602052604090205461120e5760405162461bcd60e51b81526020600482015260086024820152676e6f206e6f64657360c01b604482015260640161111d565b3460008361121d57600161121f565b835b9050600080841161123f57336000908152600d6020526040902054611241565b835b9050815b8181116112b157600061125933838b612247565b9050801561129e57600085116112815760405162461bcd60e51b815260040161111d90614995565b600061128e838b8b6126f6565b905061129a81876149b9565b9550505b50806112a9816148fb565b915050611245565b5082156112c2576112c23384614291565b505060016000555050505050565b6000806112dd8484614369565b905060006112f382670de0b6b3a76400006149b9565b9050670de0b6b3a764000061130882886149d0565b6113129190614a05565b9695505050505050565b6000610fd3826003614206565b600160009054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561137757600080fd5b505afa15801561138b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113af9190614916565b6001546001600160a01b031615806114445750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906113f49084903390600401614939565b60206040518083038186803b15801561140c57600080fd5b505afa158015611420573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114449190614955565b6114605760405162461bcd60e51b815260040161111d90614972565b600083815260036020908152604091829020805460ff19168515159081179091558251868152918201527f43310f1a48ae0abe7aa4426ad65f06014365dfb499aaeafa1678bba75ab032ff91015b60405180910390a1505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561150957600080fd5b505afa15801561151d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115419190614916565b6001546001600160a01b031615806115d65750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906115869084903390600401614939565b60206040518083038186803b15801561159e57600080fd5b505afa1580156115b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d69190614955565b6115f25760405162461bcd60e51b815260040161111d90614972565b600780546001600160a01b0319166001600160a01b0384169081179091556040519081527fa30ea3596e6b0bf63d799ca3146166f9b51a9eb996ce58e022ef806c13e17ff0906020015b60405180910390a15050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561169657600080fd5b505afa1580156116aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ce9190614916565b6001546001600160a01b031615806117635750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906117139084903390600401614939565b60206040518083038186803b15801561172b57600080fd5b505afa15801561173f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117639190614955565b61177f5760405162461bcd60e51b815260040161111d90614972565b6000848152600360209081526040808320805460ff191660011790556004825280832086845282529182902084905581518681529081018590529081018390527fb769bc1108ca077938f2f70329b1f983427891545696672e587358c37bb0187e906060015b60405180910390a150505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561184157600080fd5b505afa158015611855573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118799190614916565b6001546001600160a01b0316158061190e5750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906118be9084903390600401614939565b60206040518083038186803b1580156118d657600080fd5b505afa1580156118ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190e9190614955565b61192a5760405162461bcd60e51b815260040161111d90614972565b60098290556040518281527ff060ec4074aa2bff6c27e525b53730a571906fbb232158fb0010de0618b7dcec9060200161163c565b60008060015b6001600160a01b0385166000908152600d602052604090205481116119bb5761199d8582600087116119975742612247565b86612247565b6119a790836148e3565b9150806119b3816148fb565b915050611965565b509392505050565b6000610fd3826000614206565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015611a1457600080fd5b505afa158015611a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4c9190614a19565b905090565b600160009054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a9f57600080fd5b505afa158015611ab3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad79190614916565b6001546001600160a01b03161580611b6c5750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611b1c9084903390600401614939565b60206040518083038186803b158015611b3457600080fd5b505afa158015611b48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6c9190614955565b611b885760405162461bcd60e51b815260040161111d90614972565b60008311611ba85760405162461bcd60e51b815260040161111d90614a32565b600083815260026020908152604091829020805460ff19168515159081179091558251868152918201527f64b2c7c9023bdf999ad30ed3c65e970a3c40cee2783eba919fd23b7ff1d3618191016114ae565b600160009054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c4857600080fd5b505afa158015611c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c809190614916565b6001546001600160a01b03161580611d155750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611cc59084903390600401614939565b60206040518083038186803b158015611cdd57600080fd5b505afa158015611cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d159190614955565b611d315760405162461bcd60e51b815260040161111d90614972565b816005600086815260200190815260200160002084604051611d539190614a58565b9081526020016040518091039020819055507f054372fb4b28a093b83067aab525d4f07b8be4c06115990935f2c52e6d2258d48484846040516117e593929190614a74565b600160009054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611de657600080fd5b505afa158015611dfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1e9190614916565b6001546001600160a01b03161580611eb35750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611e639084903390600401614939565b60206040518083038186803b158015611e7b57600080fd5b505afa158015611e8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb39190614955565b611ecf5760405162461bcd60e51b815260040161111d90614972565b612710821115611f115760405162461bcd60e51b815260206004820152600d60248201526c696e76616c69642076616c756560981b604482015260640161111d565b600a8290556040518281527f774b9fb928c71ca72bafa8771a63e9d00ea63b021cfd8cdc2ce4f003094c5d589060200161163c565b336000908152600c602052604081205460ff16611f925760405162461bcd60e51b815260206004820152600a6024820152696e6f207365727669636560b01b604482015260640161111d565b60008381526002602052604090205460ff16611fc05760405162461bcd60e51b815260040161111d90614a32565b6001600160a01b0384166000908152600d6020526040812054611fe49060016148e3565b90506000611ff28683610f63565b9050600854600161200391906148e3565b6008556040518590601090612019908490614a58565b9081526020016040518091039020819055508360118260405161203c9190614a58565b9081526020016040518091039020819055508360128260405161205f9190614a58565b9081526040805160209281900383019020929092556001600160a01b0388166000908152600d90915220546120959060016148e3565b6001600160a01b0387166000908152600d6020908152604080832093909355600f8152828220888352905220546120cd9060016148e3565b6001600160a01b0387166000818152600f602090815260408083208a845282529182902093909355805188815292830185905282018690529033907f8d0c41be72ed32afe2338178b0bca6812741dbe490039b1fc3b9d1635914d04f9060600160405180910390a350949350505050565b6001546000906001600160a01b031615806121d65750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906121869084903390600401614939565b60206040518083038186803b15801561219e57600080fd5b505afa1580156121b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d69190614955565b6121f25760405162461bcd60e51b815260040161111d90614972565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b600060106122238484610f63565b6040516122309190614a58565b908152602001604051809103902054905092915050565b6000806122548585610f63565b905060006010826040516122689190614a58565b9081526020016040518091039020549050600060138360405161228b9190614a58565b908152602001604051809103902054600014156122c6576011836040516122b29190614a58565b9081526020016040518091039020546122e6565b6013836040516122d69190614a58565b9081526020016040518091039020545b905060006011846040516122fa9190614a58565b908152602001604051809103902054905061231588886124a6565b612326576000945050505050610f5c565b6123308888613593565b15612342576000945050505050610f5c565b42861115612357576000945050505050610f5c565b81861161236b576000945050505050610f5c565b6000603c61237983896149b9565b6123839190614a05565b905060006123a2612393866119c3565b61239c876111b6565b846112d0565b905083156123ec576000603c6123b885876149b9565b6123c29190614a05565b905060006123db6123d2886119c3565b61239c896111b6565b90506123e781846149b9565b925050505b60006123f98b8b8b613822565b905061240581836148e3565b9b9a5050505050505050505050565b6001600160a01b0382166000908152600e6020526040812054612437848461195f565b610f5c91906149b9565b60008060106124508686610f63565b60405161245d9190614a58565b9081526020016040518091039020549050600061247b868686612247565b905061248682614090565b61248f83613aa2565b61130890836149d0565b6000610f5c838342612247565b60008060126124b58585610f63565b6040516124c29190614a58565b90815260200160405180910390205411905092915050565b6000610fd3826009614206565b600160009054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561253557600080fd5b505afa158015612549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256d9190614916565b6001546001600160a01b031615806126025750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906125b29084903390600401614939565b60206040518083038186803b1580156125ca57600080fd5b505afa1580156125de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126029190614955565b61261e5760405162461bcd60e51b815260040161111d90614972565b6001600160a01b03821661263157600080fd5b600b80546001600160a01b0319166001600160a01b0384169081179091556040519081527fd649da8f6092116f86ea4e5139de0b75ad371d823918d16368ba3ff09a5cbc9f9060200161163c565b6000610f5c60106126908585610f63565b60405161269d9190614a58565b908152602001604051809103902054613de5565b60006126bd83836124a6565b80156126d057506126ce8383613593565b155b8015610f5c57506126e1838361409d565b159392505050565b6000610fd3826007614206565b60075460009081906001600160a01b031633146127135733612715565b325b905060006127238287610f63565b905060006010826040516127379190614a58565b9081526020016040518091039020549050600060138360405161275a9190614a58565b90815260200160405180910390205460001415612795576011836040516127819190614a58565b9081526020016040518091039020546127b5565b6013836040516127a59190614a58565b9081526020016040518091039020545b90506127c184896124a6565b6127fc5760405162461bcd60e51b815260206004820152600c60248201526b191bd95cdb9d08195e1a5cdd60a21b604482015260640161111d565b6128068489613593565b156128425760405162461bcd60e51b815260206004820152600c60248201526b1b9bd91948195e1c1a5c995960a21b604482015260640161111d565b61284c848961351f565b156128845760405162461bcd60e51b8152602060048201526008602482015267706173742064756560c01b604482015260640161111d565b428711156128c45760405162461bcd60e51b815260206004820152600d60248201526c06261642074696d657374616d7609c1b604482015260640161111d565b866128d1826103846148e3565b106129095760405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015260640161111d565b6000612916858a8a612247565b9050600081116129545760405162461bcd60e51b81526020600482015260096024820152681b9bc81c995dd85c9960ba1b604482015260640161111d565b6006546040516370a0823160e01b815230600482015282916001600160a01b0316906370a082319060240160206040518083038186803b15801561299757600080fd5b505afa1580156129ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cf9190614a19565b1015612a0c5760405162461bcd60e51b815260206004820152600c60248201526b6f7665722062616c616e636560a01b604482015260640161111d565b6000612a1784614090565b612a2085613aa2565b612a2a90846149d0565b612a349190614a05565b905080341015612a565760405162461bcd60e51b815260040161111d90614a9d565b88601386604051612a679190614a58565b9081526040805160209281900383018120939093558c83529082018490526001600160a01b038816917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a910160405180910390a2336000908152600e602052604090205415612b4957336000908152600e6020526040902054821015612b1c57336000908152600e6020526040902054612b029083906149b9565b336000908152600e60205260408120919091559150612b49565b336000908152600e6020526040902054612b3690836149b9565b336000908152600e602052604081205591505b8115612c67576001600160a01b03881615612bc5576040516330d6a97560e01b81526001600160a01b038781166004830152602482018490528916906330d6a97590604401600060405180830381600087803b158015612ba857600080fd5b505af1158015612bbc573d6000803e3d6000fd5b50505050612c67565b60065460405163a9059cbb60e01b81526001600160a01b038881166004830152602482018590529091169063a9059cbb90604401602060405180830381600087803b158015612c1357600080fd5b505af1158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4b9190614955565b612c675760405162461bcd60e51b815260040161111d90614ac2565b600b54612c7d906001600160a01b031682614291565b612c8561440e565b8015612c9057508034115b15612ca857612ca833612ca383346149b9565b614291565b9998505050505050505050565b6000612cc08361131c565b90506000612ccd8461335c565b90506000612cda85610fd9565b60008681526002602052604090205490915060ff16612d0b5760405162461bcd60e51b815260040161111d90614a32565b6009541580612d2a5750600954336000908152600d6020526040902054105b612d635760405162461bcd60e51b815260206004820152600a6024820152691bdd995c881b1a5b5a5d60b21b604482015260640161111d565b801580612d895750336000908152600f6020908152604080832088845290915290205481115b612dc25760405162461bcd60e51b815260206004820152600a6024820152691bdd995c881b1a5b5a5d60b21b604482015260640161111d565b82341015612de25760405162461bcd60e51b815260040161111d90614a9d565b336000908152600d6020526040812054612dfd9060016148e3565b90506000612e0b3383610f63565b90506008546001612e1c91906148e3565b6008556040518790601090612e32908490614a58565b90815260200160405180910390208190555042601182604051612e559190614a58565b90815260200160405180910390208190555042601282604051612e789190614a58565b908152604080516020928190038301902092909255336000908152600d9091522054612ea59060016148e3565b336000908152600d6020908152604080832093909355600f81528282208a835290522054612ed49060016148e3565b336000818152600f602090815260408083208c84528252918290209390935580518a815292830185905288151590830152426060830152907f450a067d57712752555ba8fac2ec18dd15718b07539357bc1578ee837ef1422a9060800160405180910390a28515612f985783612f4a3342612414565b1015612f685760405162461bcd60e51b815260040161111d90614995565b336000908152600e6020526040902054612f839085906148e3565b336000908152600e602052604090205561312b565b6000612710600a5486612fab91906149d0565b612fb59190614a05565b600654600b546040516323b872dd60e01b81523360048201526001600160a01b0391821660248201526044810184905292935016906323b872dd90606401602060405180830381600087803b15801561300d57600080fd5b505af1158015613021573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130459190614955565b6130615760405162461bcd60e51b815260040161111d90614ac2565b80851115613129576006546001600160a01b03166323b872dd3330613086858a6149b9565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b1580156130d557600080fd5b505af11580156130e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310d9190614955565b6131295760405162461bcd60e51b815260040161111d90614ac2565b505b600b54613141906001600160a01b031686614291565b843411156131575761315733612ca387346149b9565b50505050505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156131ae57600080fd5b505afa1580156131c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e69190614916565b6001546001600160a01b0316158061327b5750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f69061322b9084903390600401614939565b60206040518083038186803b15801561324357600080fd5b505afa158015613257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327b9190614955565b6132975760405162461bcd60e51b815260040161111d90614972565b600082116132a457600080fd5b6006546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401602060405180830381600087803b1580156132f657600080fd5b505af115801561330a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061332e9190614955565b61334a5760405162461bcd60e51b815260040161111d90614ac2565b5050565b600060126122238484610f63565b6000610fd3826002614206565b6000806133763384610f63565b9050600060108260405161338a9190614a58565b908152602001604051809103902054905060006133a682613de5565b90506133b233866126b1565b6133e95760405162461bcd60e51b815260206004820152600860248201526763616e742070617960c01b604482015260640161111d565b803410156134095760405162461bcd60e51b815260040161111d90614a9d565b613412826126e9565b6012846040516134229190614a58565b90815260200160405180910390205461343b91906148e3565b60128460405161344b9190614a58565b908152602001604051809103902081905550336001600160a01b03167f1ff60751a354563b8db02f735046d6cecdd1ec33b27b453a7925da806b529adb838760128760405161349a9190614a58565b908152604051908190036020018120546134c69392919283526020830191909152604082015260600190565b60405180910390a2600b546134e4906001600160a01b031682614291565b6134ec61440e565b80156134f757508034115b1561350a5761350a33612ca383346149b9565b949350505050565b6000610fd3826008614206565b60008061352c8484610f63565b905060006010826040516135409190614a58565b908152602001604051809103902054905060006012836040516135639190614a58565b908152602001604051809103902054905061357d826126e9565b61358790826148e3565b42119695505050505050565b6000806135a08484610f63565b905060006010826040516135b49190614a58565b908152602001604051809103902054905060006012836040516135d79190614a58565b908152602001604051809103902054905080600014156135fd5760019350505050610fd3565b61360682613512565b61360f836126e9565b61361990836148e3565b61358791906148e3565b600160009054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561367157600080fd5b505afa158015613685573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136a99190614916565b6001546001600160a01b0316158061373e5750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906136ee9084903390600401614939565b60206040518083038186803b15801561370657600080fd5b505afa15801561371a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373e9190614955565b61375a5760405162461bcd60e51b815260040161111d90614972565b60065460405163095ea7b360e01b81526001600160a01b038581166004830152602482018590529091169063095ea7b390604401602060405180830381600087803b1580156137a857600080fd5b505af11580156137bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e09190614955565b61381d5760405162461bcd60e51b815260206004820152600e60248201526d185c1c1c9bdd994819985a5b195960921b604482015260640161111d565b505050565b6007546000906001600160a01b031661383d57506000610f5c565b60006138498585610f63565b9050600060108260405161385d9190614a58565b908152602001604051809103902054905060006013836040516138809190614a58565b908152602001604051809103902054600014156138bb576011836040516138a79190614a58565b9081526020016040518091039020546138db565b6013836040516138cb9190614a58565b9081526020016040518091039020545b6007546040516394d14a9b60e01b81526001600160a01b038a811660048301526001600160801b038a166024830152306044830152929350600092909116906394d14a9b9060640160006040518083038186803b15801561393b57600080fd5b505afa15801561394f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526139779190810190614aeb565b905060405160200161399490602080825260009082015260400190565b60405160208183030381529060405280519060200120816040516020016139bb919061452c565b6040516020818303038152906040528051906020012014156139e4576000945050505050610f5c565b60006139f08483613d48565b905060008111613a01576000612ca8565b600754604051632034eb5160e01b81526001600160a01b038b811660048301526001600160801b038b16602483015260448201869052606482018a90526084820184905290911690632034eb519060a40160206040518083038186803b158015613a6a57600080fd5b505afa158015613a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca89190614a19565b6000610fd3826005614206565b60026000908155338152600d6020526040902054613afa5760405162461bcd60e51b81526020600482015260086024820152676e6f206e6f64657360c01b604482015260640161111d565b34600083613b09576001613b0b565b835b90506000808411613b2b57336000908152600d6020526040902054613b2d565b835b9050815b818111613b9857613b4233826126b1565b613b4b57613b86565b60008411613b6b5760405162461bcd60e51b815260040161111d90614995565b6000613b7682613369565b9050613b8281866149b9565b9450505b80613b90816148fb565b915050613b31565b508215613ba957613ba93384614291565b50506001600055505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015613c0357600080fd5b505afa158015613c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c3b9190614916565b6001546001600160a01b03161580613cd05750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690613c809084903390600401614939565b60206040518083038186803b158015613c9857600080fd5b505afa158015613cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd09190614955565b613cec5760405162461bcd60e51b815260040161111d90614972565b6001600160a01b0383166000818152600c6020908152604091829020805460ff19168615159081179091558251938452908301527fea782fa1fcb250a935b6bf028374e06a580a12523d2befc1c2254a3cd3ef378091016114ae565b6000828152600560205260408082209051829190613d67908590614a58565b90815260200160405180910390205411613dc8576000805260056020526040517f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc90613db4908490614a58565b908152602001604051809103902054610f5c565b600083815260056020526040908190209051612230908490614a58565b6000610fd3826004614206565b600160009054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015613e4057600080fd5b505afa158015613e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e789190614916565b6001546001600160a01b03161580613f0d5750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690613ebd9084903390600401614939565b60206040518083038186803b158015613ed557600080fd5b505afa158015613ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f0d9190614955565b613f295760405162461bcd60e51b815260040161111d90614972565b60008211613f3657600080fd5b6006546040516370a0823160e01b815230600482015283916001600160a01b0316906370a082319060240160206040518083038186803b158015613f7957600080fd5b505afa158015613f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fb19190614a19565b1015613fee5760405162461bcd60e51b815260206004820152600c60248201526b6f7665722062616c616e636560a01b604482015260640161111d565b60065460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb90604401602060405180830381600087803b15801561403c57600080fd5b505af1158015614050573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140749190614955565b61381d5760405162461bcd60e51b815260040161111d90614ac2565b6000610fd3826006614206565b6000806140aa8484610f63565b905060006010826040516140be9190614a58565b908152602001604051809103902054905060006012836040516140e19190614a58565b908152602001604051809103902054905060006140fd836126e9565b9050600061410a846124da565b61411490836149d0565b61411e90426148e3565b90508061412b83856148e3565b101598975050505050505050565b600080808461414957600161414b565b845b90506000808511614174576001600160a01b0388166000908152600d6020526040902054614176565b845b9050815b8181116141f957600061419c8a8360008c116141965742612247565b8b612247565b905080156141e65760006141b08b84612215565b90506141bb81614090565b6141c482613aa2565b6141ce90846149d0565b6141d89190614a05565b6141e290876148e3565b9550505b50806141f1816148fb565b91505061417a565b5091979650505050505050565b60008281526003602052604081205460ff16801561423c5750600083815260046020908152604080832085845290915290205415155b6142735760008281527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec6020526040902054610f5c565b50600091825260046020908152604080842092845291905290205490565b804710156142d85760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015260640161111d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114614325576040519150601f19603f3d011682016040523d82523d6000602084013e61432a565b606091505b505090508061381d5760405162461bcd60e51b815260206004820152600b60248201526a1cd95b990819985a5b195960aa1b604482015260640161111d565b6000631f54050082111561437f57631f54050091505b816143935750670de0b6b3a7640000610fd3565b670de0b6b3a764000083835b6001811115614404576143b3600282614b62565b6143d5576143c18283614424565b91506143ce600282614a05565b905061439f565b6143df8284614424565b92506143eb8283614424565b915060026143fa6001836149b9565b6143ce9190614a05565b6113128284614424565b60008054600214158015611a4c57505033321490565b60008061443183856149d0565b9050670de0b6b3a7640000614447600282614a05565b61445190836148e3565b61350a9190614a05565b6001600160a01b038116811461447057600080fd5b50565b6000806040838503121561448657600080fd5b82356144918161445b565b946020939093013593505050565b6000806000606084860312156144b457600080fd5b83356144bf8161445b565b95602085013595506040909401359392505050565b60005b838110156144ef5781810151838201526020016144d7565b838111156111b05750506000910152565b600081518084526145188160208601602086016144d4565b601f01601f19169290920160200192915050565b602081526000610f5c6020830184614500565b60006020828403121561455157600080fd5b5035919050565b60008060006060848603121561456d57600080fd5b83356145788161445b565b925060208401356145888161445b565b915060408401356145988161445b565b809150509250925092565b600080600080608085870312156145b957600080fd5b8435935060208501356145cb8161445b565b93969395505050506040820135916060013590565b6000602082840312156145f257600080fd5b8135610f5c8161445b565b60008060006060848603121561461257600080fd5b505081359360208301359350604090920135919050565b801515811461447057600080fd5b6000806040838503121561464a57600080fd5b82359150602083013561465c81614629565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156146a6576146a6614667565b604052919050565b600067ffffffffffffffff8211156146c8576146c8614667565b50601f01601f191660200190565b60006146e96146e4846146ae565b61467d565b90508281528383830111156146fd57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261472557600080fd5b610f5c838335602085016146d6565b6000806040838503121561474757600080fd5b82359150602083013567ffffffffffffffff81111561476557600080fd5b61477185828601614714565b9150509250929050565b60008060006060848603121561479057600080fd5b83359250602084013567ffffffffffffffff8111156147ae57600080fd5b6147ba86828701614714565b925050604084013590509250925092565b6000602082840312156147dd57600080fd5b813567ffffffffffffffff8111156147f457600080fd5b8201601f8101841361480557600080fd5b61350a848235602084016146d6565b60008060006060848603121561482957600080fd5b833592506020840135915060408401356145988161445b565b6000806040838503121561485557600080fd5b50508035926020909101359150565b6000806040838503121561487757600080fd5b82356148828161445b565b9150602083013561465c81614629565b600080600080608085870312156148a857600080fd5b84356148b38161445b565b966020860135965060408601359560600135945092505050565b634e487b7160e01b600052601160045260246000fd5b600082198211156148f6576148f66148cd565b500190565b600060001982141561490f5761490f6148cd565b5060010190565b60006020828403121561492857600080fd5b815160ff81168114610f5c57600080fd5b60ff9290921682526001600160a01b0316602082015260400190565b60006020828403121561496757600080fd5b8151610f5c81614629565b6020808252600990820152686e6f2061636365737360b81b604082015260600190565b6020808252600a90820152690dcdee840cadcdeeaced60b31b604082015260600190565b6000828210156149cb576149cb6148cd565b500390565b60008160001904831182151516156149ea576149ea6148cd565b500290565b634e487b7160e01b600052601260045260246000fd5b600082614a1457614a146149ef565b500490565b600060208284031215614a2b57600080fd5b5051919050565b6020808252600c908201526b696e76616c6964207479706560a01b604082015260600190565b60008251614a6a8184602087016144d4565b9190910192915050565b838152606060208201526000614a8d6060830185614500565b9050826040830152949350505050565b6020808252600b908201526a696e76616c69642066656560a81b604082015260600190565b6020808252600f908201526e1d1c985b9cd9995c8819985a5b1959608a1b604082015260600190565b600060208284031215614afd57600080fd5b815167ffffffffffffffff811115614b1457600080fd5b8201601f81018413614b2557600080fd5b8051614b336146e4826146ae565b818152856020838501011115614b4857600080fd5b614b598260208301602086016144d4565b95945050505050565b600082614b7157614b716149ef565b50069056fea2646970667358221220662d7693eb2c1b3ce9a09517e47d2f8f56fd000bd795ecc54a12abd0cb63dd0564736f6c63430008090033
Deployed Bytecode
0x6080604052600436106104735760003560e01c80639548f1e61161024a578063d1c25be311610139578063e94d59dc116100b6578063f3fef3a31161007a578063f3fef3a314610e3d578063f5474cb014610e5d578063f9df21e714610e7d578063fade29de14610e9d578063fefe2f5814610ebd57600080fd5b8063e94d59dc14610d9b578063ea97bba614610dbb578063eaace4cc14610df3578063eaffeddc14610e08578063f232ee3714610e2857600080fd5b8063de20d47a116100fd578063de20d47a14610cfb578063e0b5485914610d1b578063e2ca3c3a14610d2e578063e5f4f66714610d4e578063e79ae18b14610d6357600080fd5b8063d1c25be314610c4d578063d2d7b21414610c6d578063d7feb2fe14610c83578063dc2e86e914610cbb578063dd811fff14610cdb57600080fd5b8063ac44ff31116101c7578063c290d6911161018b578063c290d69114610bc5578063c415b95c14610bd8578063c548201114610bf8578063c741643714610c18578063c8f064ec14610c3857600080fd5b8063ac44ff3114610b3f578063afc9a71b14610b52578063b6b55f2514610b65578063b7fef4ce14610b85578063bbbf0f6614610ba557600080fd5b8063a42dce801161020e578063a42dce8014610a92578063a5ea985d14610ab2578063a77e282514610ad2578063aa81ce3e14610aff578063aadea3f314610b1f57600080fd5b80639548f1e6146109fc5780639592d42414610a1c578063965d61b914610a325780639daf08c014610a52578063a052058114610a7257600080fd5b806350d0eed01161036657806373d70677116102e35780638ccf7f23116102a75780638ccf7f231461094c5780638ecddc051461097c5780638eda065f1461099c5780639145e391146109bc578063939c6bfb146109dc57600080fd5b806373d706771461087c57806378a760661461089c5780637a0b9255146108d457806381e79c0c146108f4578063855f261e1461091457600080fd5b8063572887b01161032a578063572887b0146107e75780635e42b4551461080757806361a3aa8e1461081c57806363a441021461083c5780636fdd1ff11461085c57600080fd5b806350d0eed01461071a578063528402791461072f57806353663f7b1461074f57806355079ddd1461078f578063555d3e63146107af57600080fd5b806331ed56f9116103f45780634de740ba116103b85780634de740ba1461065c5780634df78d5f1461067c5780634ff634221461069c5780634ffbcc0c146106e55780635041ae2b1461070557600080fd5b806331ed56f9146105c5578063342ec83d146105da5780633bc16d701461060757806341e666911461061c5780634608482d1461063c57600080fd5b8063184b95591161043b578063184b95591461054557806319ba32631461056757806321d2ab8a146105875780632749bf4f1461059c57806327bee747146105af57600080fd5b806301bd2f8114610478578063030fca67146104c35780630c056e41146104e35780630c931cd01461051057806311d7096d14610525575b600080fd5b34801561048457600080fd5b506104b0610493366004614473565b600f60209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b3480156104cf57600080fd5b506104b06104de36600461449f565b610ed2565b3480156104ef57600080fd5b506105036104fe366004614473565b610f63565b6040516104ba919061452c565b34801561051c57600080fd5b506104b0600181565b34801561053157600080fd5b506104b061054036600461453f565b610fd9565b34801561055157600080fd5b50610565610560366004614558565b610fe6565b005b34801561057357600080fd5b506104b061058236600461453f565b6111b6565b34801561059357600080fd5b506104b0600881565b6105656105aa3660046145a3565b6111c3565b3480156105bb57600080fd5b506104b060095481565b3480156105d157600080fd5b506104b0600081565b3480156105e657600080fd5b506104b06105f53660046145e0565b600e6020526000908152604090205481565b34801561061357600080fd5b506104b0600a81565b34801561062857600080fd5b506104b06106373660046145fd565b6112d0565b34801561064857600080fd5b506104b061065736600461453f565b61131c565b34801561066857600080fd5b50610565610677366004614637565b611329565b34801561068857600080fd5b506105656106973660046145e0565b6114bb565b3480156106a857600080fd5b506104b06106b7366004614734565b6005602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b3480156106f157600080fd5b506105656107003660046145fd565b611648565b34801561071157600080fd5b506104b0600681565b34801561072657600080fd5b506104b0600781565b34801561073b57600080fd5b5061056561074a36600461453f565b6117f3565b34801561075b57600080fd5b5061077f61076a36600461453f565b60036020526000908152604090205460ff1681565b60405190151581526020016104ba565b34801561079b57600080fd5b506104b06107aa366004614473565b61195f565b3480156107bb57600080fd5b506001546107cf906001600160a01b031681565b6040516001600160a01b0390911681526020016104ba565b3480156107f357600080fd5b506104b061080236600461453f565b6119c3565b34801561081357600080fd5b506104b06119d0565b34801561082857600080fd5b50610565610837366004614637565b611a51565b34801561084857600080fd5b5061056561085736600461477b565b611bfa565b34801561086857600080fd5b5061056561087736600461453f565b611d98565b34801561088857600080fd5b506104b061089736600461449f565b611f46565b3480156108a857600080fd5b506104b06108b73660046147cb565b805160208183018101805160108252928201919093012091525481565b3480156108e057600080fd5b506105656108ef3660046145e0565b61213e565b34801561090057600080fd5b506104b061090f366004614473565b612215565b34801561092057600080fd5b506104b061092f3660046147cb565b805160208183018101805160138252928201919093012091525481565b34801561095857600080fd5b5061077f61096736600461453f565b60026020526000908152604090205460ff1681565b34801561098857600080fd5b506104b061099736600461449f565b612247565b3480156109a857600080fd5b506104b06109b7366004614473565b612414565b3480156109c857600080fd5b506104b06109d736600461449f565b612441565b3480156109e857600080fd5b506104b06109f7366004614473565b612499565b348015610a0857600080fd5b506007546107cf906001600160a01b031681565b348015610a2857600080fd5b506104b060085481565b348015610a3e57600080fd5b506006546107cf906001600160a01b031681565b348015610a5e57600080fd5b5061077f610a6d366004614473565b6124a6565b348015610a7e57600080fd5b506104b0610a8d36600461453f565b6124da565b348015610a9e57600080fd5b50610565610aad3660046145e0565b6124e7565b348015610abe57600080fd5b506104b0610acd366004614473565b61267f565b348015610ade57600080fd5b506104b0610aed3660046145e0565b600d6020526000908152604090205481565b348015610b0b57600080fd5b5061077f610b1a366004614473565b6126b1565b348015610b2b57600080fd5b506104b0610b3a36600461453f565b6126e9565b6104b0610b4d366004614814565b6126f6565b610565610b60366004614637565b612cb5565b348015610b7157600080fd5b50610565610b8036600461453f565b613160565b348015610b9157600080fd5b506104b0610ba0366004614473565b61334e565b348015610bb157600080fd5b506104b0610bc036600461453f565b61335c565b6104b0610bd336600461453f565b613369565b348015610be457600080fd5b50600b546107cf906001600160a01b031681565b348015610c0457600080fd5b506104b0610c1336600461453f565b613512565b348015610c2457600080fd5b5061077f610c33366004614473565b61351f565b348015610c4457600080fd5b506104b0600481565b348015610c5957600080fd5b5061077f610c68366004614473565b613593565b348015610c7957600080fd5b506104b0600a5481565b348015610c8f57600080fd5b506104b0610c9e3660046147cb565b805160208183018101805160128252928201919093012091525481565b348015610cc757600080fd5b50610565610cd6366004614473565b613623565b348015610ce757600080fd5b506104b0610cf636600461449f565b613822565b348015610d0757600080fd5b506104b0610d1636600461453f565b613aa2565b610565610d29366004614842565b613aaf565b348015610d3a57600080fd5b50610565610d49366004614864565b613bb5565b348015610d5a57600080fd5b506104b0600281565b348015610d6f57600080fd5b506104b0610d7e3660046147cb565b805160208183018101805160118252928201919093012091525481565b348015610da757600080fd5b506104b0610db6366004614734565b613d48565b348015610dc757600080fd5b506104b0610dd6366004614842565b600460209081526000928352604080842090915290825290205481565b348015610dff57600080fd5b506104b0600381565b348015610e1457600080fd5b506104b0610e2336600461453f565b613de5565b348015610e3457600080fd5b506104b0600981565b348015610e4957600080fd5b50610565610e58366004614473565b613df2565b348015610e6957600080fd5b506104b0610e7836600461453f565b614090565b348015610e8957600080fd5b5061077f610e98366004614473565b61409d565b348015610ea957600080fd5b506104b0610eb8366004614892565b614139565b348015610ec957600080fd5b506104b0600581565b6000808084610ee2576001610ee4565b845b90506000808511610f0d576001600160a01b0387166000908152600d6020526040902054610f0f565b845b9050815b818111610f5557610f2488826126b1565b15610f4357610f36610e238983612215565b610f4090856148e3565b93505b80610f4d816148fb565b915050610f13565b5091925050505b9392505050565b6060600082610f95576001600160a01b0384166000908152600d6020526040902054610f909060016148e3565b610f97565b825b6040516bffffffffffffffffffffffff19606087901b166020820152603481018290529091506054016040516020818303038152906040529150505b92915050565b6000610fd382600a614206565b600160009054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561103457600080fd5b505afa158015611048573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061106c9190614916565b6001546001600160a01b031615806111015750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906110b19084903390600401614939565b60206040518083038186803b1580156110c957600080fd5b505afa1580156110dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111019190614955565b6111265760405162461bcd60e51b815260040161111d90614972565b60405180910390fd5b6001600160a01b0382166111695760405162461bcd60e51b815260206004820152600a6024820152696e6f206164647265737360b01b604482015260640161111d565b600680546001600160a01b038087166001600160a01b03199283161790925560078054868416908316179055600b8054928516929091169190911790556111b06001600055565b50505050565b6000610fd3826001614206565b60026000908155338152600d602052604090205461120e5760405162461bcd60e51b81526020600482015260086024820152676e6f206e6f64657360c01b604482015260640161111d565b3460008361121d57600161121f565b835b9050600080841161123f57336000908152600d6020526040902054611241565b835b9050815b8181116112b157600061125933838b612247565b9050801561129e57600085116112815760405162461bcd60e51b815260040161111d90614995565b600061128e838b8b6126f6565b905061129a81876149b9565b9550505b50806112a9816148fb565b915050611245565b5082156112c2576112c23384614291565b505060016000555050505050565b6000806112dd8484614369565b905060006112f382670de0b6b3a76400006149b9565b9050670de0b6b3a764000061130882886149d0565b6113129190614a05565b9695505050505050565b6000610fd3826003614206565b600160009054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561137757600080fd5b505afa15801561138b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113af9190614916565b6001546001600160a01b031615806114445750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906113f49084903390600401614939565b60206040518083038186803b15801561140c57600080fd5b505afa158015611420573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114449190614955565b6114605760405162461bcd60e51b815260040161111d90614972565b600083815260036020908152604091829020805460ff19168515159081179091558251868152918201527f43310f1a48ae0abe7aa4426ad65f06014365dfb499aaeafa1678bba75ab032ff91015b60405180910390a1505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561150957600080fd5b505afa15801561151d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115419190614916565b6001546001600160a01b031615806115d65750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906115869084903390600401614939565b60206040518083038186803b15801561159e57600080fd5b505afa1580156115b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d69190614955565b6115f25760405162461bcd60e51b815260040161111d90614972565b600780546001600160a01b0319166001600160a01b0384169081179091556040519081527fa30ea3596e6b0bf63d799ca3146166f9b51a9eb996ce58e022ef806c13e17ff0906020015b60405180910390a15050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561169657600080fd5b505afa1580156116aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ce9190614916565b6001546001600160a01b031615806117635750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906117139084903390600401614939565b60206040518083038186803b15801561172b57600080fd5b505afa15801561173f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117639190614955565b61177f5760405162461bcd60e51b815260040161111d90614972565b6000848152600360209081526040808320805460ff191660011790556004825280832086845282529182902084905581518681529081018590529081018390527fb769bc1108ca077938f2f70329b1f983427891545696672e587358c37bb0187e906060015b60405180910390a150505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561184157600080fd5b505afa158015611855573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118799190614916565b6001546001600160a01b0316158061190e5750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906118be9084903390600401614939565b60206040518083038186803b1580156118d657600080fd5b505afa1580156118ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190e9190614955565b61192a5760405162461bcd60e51b815260040161111d90614972565b60098290556040518281527ff060ec4074aa2bff6c27e525b53730a571906fbb232158fb0010de0618b7dcec9060200161163c565b60008060015b6001600160a01b0385166000908152600d602052604090205481116119bb5761199d8582600087116119975742612247565b86612247565b6119a790836148e3565b9150806119b3816148fb565b915050611965565b509392505050565b6000610fd3826000614206565b6006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015611a1457600080fd5b505afa158015611a28573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a4c9190614a19565b905090565b600160009054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015611a9f57600080fd5b505afa158015611ab3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad79190614916565b6001546001600160a01b03161580611b6c5750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611b1c9084903390600401614939565b60206040518083038186803b158015611b3457600080fd5b505afa158015611b48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6c9190614955565b611b885760405162461bcd60e51b815260040161111d90614972565b60008311611ba85760405162461bcd60e51b815260040161111d90614a32565b600083815260026020908152604091829020805460ff19168515159081179091558251868152918201527f64b2c7c9023bdf999ad30ed3c65e970a3c40cee2783eba919fd23b7ff1d3618191016114ae565b600160009054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015611c4857600080fd5b505afa158015611c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c809190614916565b6001546001600160a01b03161580611d155750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611cc59084903390600401614939565b60206040518083038186803b158015611cdd57600080fd5b505afa158015611cf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d159190614955565b611d315760405162461bcd60e51b815260040161111d90614972565b816005600086815260200190815260200160002084604051611d539190614a58565b9081526020016040518091039020819055507f054372fb4b28a093b83067aab525d4f07b8be4c06115990935f2c52e6d2258d48484846040516117e593929190614a74565b600160009054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611de657600080fd5b505afa158015611dfa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1e9190614916565b6001546001600160a01b03161580611eb35750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611e639084903390600401614939565b60206040518083038186803b158015611e7b57600080fd5b505afa158015611e8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eb39190614955565b611ecf5760405162461bcd60e51b815260040161111d90614972565b612710821115611f115760405162461bcd60e51b815260206004820152600d60248201526c696e76616c69642076616c756560981b604482015260640161111d565b600a8290556040518281527f774b9fb928c71ca72bafa8771a63e9d00ea63b021cfd8cdc2ce4f003094c5d589060200161163c565b336000908152600c602052604081205460ff16611f925760405162461bcd60e51b815260206004820152600a6024820152696e6f207365727669636560b01b604482015260640161111d565b60008381526002602052604090205460ff16611fc05760405162461bcd60e51b815260040161111d90614a32565b6001600160a01b0384166000908152600d6020526040812054611fe49060016148e3565b90506000611ff28683610f63565b9050600854600161200391906148e3565b6008556040518590601090612019908490614a58565b9081526020016040518091039020819055508360118260405161203c9190614a58565b9081526020016040518091039020819055508360128260405161205f9190614a58565b9081526040805160209281900383019020929092556001600160a01b0388166000908152600d90915220546120959060016148e3565b6001600160a01b0387166000908152600d6020908152604080832093909355600f8152828220888352905220546120cd9060016148e3565b6001600160a01b0387166000818152600f602090815260408083208a845282529182902093909355805188815292830185905282018690529033907f8d0c41be72ed32afe2338178b0bca6812741dbe490039b1fc3b9d1635914d04f9060600160405180910390a350949350505050565b6001546000906001600160a01b031615806121d65750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906121869084903390600401614939565b60206040518083038186803b15801561219e57600080fd5b505afa1580156121b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121d69190614955565b6121f25760405162461bcd60e51b815260040161111d90614972565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b600060106122238484610f63565b6040516122309190614a58565b908152602001604051809103902054905092915050565b6000806122548585610f63565b905060006010826040516122689190614a58565b9081526020016040518091039020549050600060138360405161228b9190614a58565b908152602001604051809103902054600014156122c6576011836040516122b29190614a58565b9081526020016040518091039020546122e6565b6013836040516122d69190614a58565b9081526020016040518091039020545b905060006011846040516122fa9190614a58565b908152602001604051809103902054905061231588886124a6565b612326576000945050505050610f5c565b6123308888613593565b15612342576000945050505050610f5c565b42861115612357576000945050505050610f5c565b81861161236b576000945050505050610f5c565b6000603c61237983896149b9565b6123839190614a05565b905060006123a2612393866119c3565b61239c876111b6565b846112d0565b905083156123ec576000603c6123b885876149b9565b6123c29190614a05565b905060006123db6123d2886119c3565b61239c896111b6565b90506123e781846149b9565b925050505b60006123f98b8b8b613822565b905061240581836148e3565b9b9a5050505050505050505050565b6001600160a01b0382166000908152600e6020526040812054612437848461195f565b610f5c91906149b9565b60008060106124508686610f63565b60405161245d9190614a58565b9081526020016040518091039020549050600061247b868686612247565b905061248682614090565b61248f83613aa2565b61130890836149d0565b6000610f5c838342612247565b60008060126124b58585610f63565b6040516124c29190614a58565b90815260200160405180910390205411905092915050565b6000610fd3826009614206565b600160009054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561253557600080fd5b505afa158015612549573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061256d9190614916565b6001546001600160a01b031615806126025750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906125b29084903390600401614939565b60206040518083038186803b1580156125ca57600080fd5b505afa1580156125de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126029190614955565b61261e5760405162461bcd60e51b815260040161111d90614972565b6001600160a01b03821661263157600080fd5b600b80546001600160a01b0319166001600160a01b0384169081179091556040519081527fd649da8f6092116f86ea4e5139de0b75ad371d823918d16368ba3ff09a5cbc9f9060200161163c565b6000610f5c60106126908585610f63565b60405161269d9190614a58565b908152602001604051809103902054613de5565b60006126bd83836124a6565b80156126d057506126ce8383613593565b155b8015610f5c57506126e1838361409d565b159392505050565b6000610fd3826007614206565b60075460009081906001600160a01b031633146127135733612715565b325b905060006127238287610f63565b905060006010826040516127379190614a58565b9081526020016040518091039020549050600060138360405161275a9190614a58565b90815260200160405180910390205460001415612795576011836040516127819190614a58565b9081526020016040518091039020546127b5565b6013836040516127a59190614a58565b9081526020016040518091039020545b90506127c184896124a6565b6127fc5760405162461bcd60e51b815260206004820152600c60248201526b191bd95cdb9d08195e1a5cdd60a21b604482015260640161111d565b6128068489613593565b156128425760405162461bcd60e51b815260206004820152600c60248201526b1b9bd91948195e1c1a5c995960a21b604482015260640161111d565b61284c848961351f565b156128845760405162461bcd60e51b8152602060048201526008602482015267706173742064756560c01b604482015260640161111d565b428711156128c45760405162461bcd60e51b815260206004820152600d60248201526c06261642074696d657374616d7609c1b604482015260640161111d565b866128d1826103846148e3565b106129095760405162461bcd60e51b81526020600482015260086024820152673a37b79039b7b7b760c11b604482015260640161111d565b6000612916858a8a612247565b9050600081116129545760405162461bcd60e51b81526020600482015260096024820152681b9bc81c995dd85c9960ba1b604482015260640161111d565b6006546040516370a0823160e01b815230600482015282916001600160a01b0316906370a082319060240160206040518083038186803b15801561299757600080fd5b505afa1580156129ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129cf9190614a19565b1015612a0c5760405162461bcd60e51b815260206004820152600c60248201526b6f7665722062616c616e636560a01b604482015260640161111d565b6000612a1784614090565b612a2085613aa2565b612a2a90846149d0565b612a349190614a05565b905080341015612a565760405162461bcd60e51b815260040161111d90614a9d565b88601386604051612a679190614a58565b9081526040805160209281900383018120939093558c83529082018490526001600160a01b038816917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a910160405180910390a2336000908152600e602052604090205415612b4957336000908152600e6020526040902054821015612b1c57336000908152600e6020526040902054612b029083906149b9565b336000908152600e60205260408120919091559150612b49565b336000908152600e6020526040902054612b3690836149b9565b336000908152600e602052604081205591505b8115612c67576001600160a01b03881615612bc5576040516330d6a97560e01b81526001600160a01b038781166004830152602482018490528916906330d6a97590604401600060405180830381600087803b158015612ba857600080fd5b505af1158015612bbc573d6000803e3d6000fd5b50505050612c67565b60065460405163a9059cbb60e01b81526001600160a01b038881166004830152602482018590529091169063a9059cbb90604401602060405180830381600087803b158015612c1357600080fd5b505af1158015612c27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c4b9190614955565b612c675760405162461bcd60e51b815260040161111d90614ac2565b600b54612c7d906001600160a01b031682614291565b612c8561440e565b8015612c9057508034115b15612ca857612ca833612ca383346149b9565b614291565b9998505050505050505050565b6000612cc08361131c565b90506000612ccd8461335c565b90506000612cda85610fd9565b60008681526002602052604090205490915060ff16612d0b5760405162461bcd60e51b815260040161111d90614a32565b6009541580612d2a5750600954336000908152600d6020526040902054105b612d635760405162461bcd60e51b815260206004820152600a6024820152691bdd995c881b1a5b5a5d60b21b604482015260640161111d565b801580612d895750336000908152600f6020908152604080832088845290915290205481115b612dc25760405162461bcd60e51b815260206004820152600a6024820152691bdd995c881b1a5b5a5d60b21b604482015260640161111d565b82341015612de25760405162461bcd60e51b815260040161111d90614a9d565b336000908152600d6020526040812054612dfd9060016148e3565b90506000612e0b3383610f63565b90506008546001612e1c91906148e3565b6008556040518790601090612e32908490614a58565b90815260200160405180910390208190555042601182604051612e559190614a58565b90815260200160405180910390208190555042601282604051612e789190614a58565b908152604080516020928190038301902092909255336000908152600d9091522054612ea59060016148e3565b336000908152600d6020908152604080832093909355600f81528282208a835290522054612ed49060016148e3565b336000818152600f602090815260408083208c84528252918290209390935580518a815292830185905288151590830152426060830152907f450a067d57712752555ba8fac2ec18dd15718b07539357bc1578ee837ef1422a9060800160405180910390a28515612f985783612f4a3342612414565b1015612f685760405162461bcd60e51b815260040161111d90614995565b336000908152600e6020526040902054612f839085906148e3565b336000908152600e602052604090205561312b565b6000612710600a5486612fab91906149d0565b612fb59190614a05565b600654600b546040516323b872dd60e01b81523360048201526001600160a01b0391821660248201526044810184905292935016906323b872dd90606401602060405180830381600087803b15801561300d57600080fd5b505af1158015613021573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130459190614955565b6130615760405162461bcd60e51b815260040161111d90614ac2565b80851115613129576006546001600160a01b03166323b872dd3330613086858a6149b9565b6040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401602060405180830381600087803b1580156130d557600080fd5b505af11580156130e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061310d9190614955565b6131295760405162461bcd60e51b815260040161111d90614ac2565b505b600b54613141906001600160a01b031686614291565b843411156131575761315733612ca387346149b9565b50505050505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156131ae57600080fd5b505afa1580156131c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e69190614916565b6001546001600160a01b0316158061327b5750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f69061322b9084903390600401614939565b60206040518083038186803b15801561324357600080fd5b505afa158015613257573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061327b9190614955565b6132975760405162461bcd60e51b815260040161111d90614972565b600082116132a457600080fd5b6006546040516323b872dd60e01b8152336004820152306024820152604481018490526001600160a01b03909116906323b872dd90606401602060405180830381600087803b1580156132f657600080fd5b505af115801561330a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061332e9190614955565b61334a5760405162461bcd60e51b815260040161111d90614ac2565b5050565b600060126122238484610f63565b6000610fd3826002614206565b6000806133763384610f63565b9050600060108260405161338a9190614a58565b908152602001604051809103902054905060006133a682613de5565b90506133b233866126b1565b6133e95760405162461bcd60e51b815260206004820152600860248201526763616e742070617960c01b604482015260640161111d565b803410156134095760405162461bcd60e51b815260040161111d90614a9d565b613412826126e9565b6012846040516134229190614a58565b90815260200160405180910390205461343b91906148e3565b60128460405161344b9190614a58565b908152602001604051809103902081905550336001600160a01b03167f1ff60751a354563b8db02f735046d6cecdd1ec33b27b453a7925da806b529adb838760128760405161349a9190614a58565b908152604051908190036020018120546134c69392919283526020830191909152604082015260600190565b60405180910390a2600b546134e4906001600160a01b031682614291565b6134ec61440e565b80156134f757508034115b1561350a5761350a33612ca383346149b9565b949350505050565b6000610fd3826008614206565b60008061352c8484610f63565b905060006010826040516135409190614a58565b908152602001604051809103902054905060006012836040516135639190614a58565b908152602001604051809103902054905061357d826126e9565b61358790826148e3565b42119695505050505050565b6000806135a08484610f63565b905060006010826040516135b49190614a58565b908152602001604051809103902054905060006012836040516135d79190614a58565b908152602001604051809103902054905080600014156135fd5760019350505050610fd3565b61360682613512565b61360f836126e9565b61361990836148e3565b61358791906148e3565b600160009054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561367157600080fd5b505afa158015613685573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136a99190614916565b6001546001600160a01b0316158061373e5750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906136ee9084903390600401614939565b60206040518083038186803b15801561370657600080fd5b505afa15801561371a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061373e9190614955565b61375a5760405162461bcd60e51b815260040161111d90614972565b60065460405163095ea7b360e01b81526001600160a01b038581166004830152602482018590529091169063095ea7b390604401602060405180830381600087803b1580156137a857600080fd5b505af11580156137bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137e09190614955565b61381d5760405162461bcd60e51b815260206004820152600e60248201526d185c1c1c9bdd994819985a5b195960921b604482015260640161111d565b505050565b6007546000906001600160a01b031661383d57506000610f5c565b60006138498585610f63565b9050600060108260405161385d9190614a58565b908152602001604051809103902054905060006013836040516138809190614a58565b908152602001604051809103902054600014156138bb576011836040516138a79190614a58565b9081526020016040518091039020546138db565b6013836040516138cb9190614a58565b9081526020016040518091039020545b6007546040516394d14a9b60e01b81526001600160a01b038a811660048301526001600160801b038a166024830152306044830152929350600092909116906394d14a9b9060640160006040518083038186803b15801561393b57600080fd5b505afa15801561394f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526139779190810190614aeb565b905060405160200161399490602080825260009082015260400190565b60405160208183030381529060405280519060200120816040516020016139bb919061452c565b6040516020818303038152906040528051906020012014156139e4576000945050505050610f5c565b60006139f08483613d48565b905060008111613a01576000612ca8565b600754604051632034eb5160e01b81526001600160a01b038b811660048301526001600160801b038b16602483015260448201869052606482018a90526084820184905290911690632034eb519060a40160206040518083038186803b158015613a6a57600080fd5b505afa158015613a7e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ca89190614a19565b6000610fd3826005614206565b60026000908155338152600d6020526040902054613afa5760405162461bcd60e51b81526020600482015260086024820152676e6f206e6f64657360c01b604482015260640161111d565b34600083613b09576001613b0b565b835b90506000808411613b2b57336000908152600d6020526040902054613b2d565b835b9050815b818111613b9857613b4233826126b1565b613b4b57613b86565b60008411613b6b5760405162461bcd60e51b815260040161111d90614995565b6000613b7682613369565b9050613b8281866149b9565b9450505b80613b90816148fb565b915050613b31565b508215613ba957613ba93384614291565b50506001600055505050565b600160009054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b158015613c0357600080fd5b505afa158015613c17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613c3b9190614916565b6001546001600160a01b03161580613cd05750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690613c809084903390600401614939565b60206040518083038186803b158015613c9857600080fd5b505afa158015613cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613cd09190614955565b613cec5760405162461bcd60e51b815260040161111d90614972565b6001600160a01b0383166000818152600c6020908152604091829020805460ff19168615159081179091558251938452908301527fea782fa1fcb250a935b6bf028374e06a580a12523d2befc1c2254a3cd3ef378091016114ae565b6000828152600560205260408082209051829190613d67908590614a58565b90815260200160405180910390205411613dc8576000805260056020526040517f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc90613db4908490614a58565b908152602001604051809103902054610f5c565b600083815260056020526040908190209051612230908490614a58565b6000610fd3826004614206565b600160009054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015613e4057600080fd5b505afa158015613e54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e789190614916565b6001546001600160a01b03161580613f0d5750600154604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690613ebd9084903390600401614939565b60206040518083038186803b158015613ed557600080fd5b505afa158015613ee9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f0d9190614955565b613f295760405162461bcd60e51b815260040161111d90614972565b60008211613f3657600080fd5b6006546040516370a0823160e01b815230600482015283916001600160a01b0316906370a082319060240160206040518083038186803b158015613f7957600080fd5b505afa158015613f8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fb19190614a19565b1015613fee5760405162461bcd60e51b815260206004820152600c60248201526b6f7665722062616c616e636560a01b604482015260640161111d565b60065460405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529091169063a9059cbb90604401602060405180830381600087803b15801561403c57600080fd5b505af1158015614050573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140749190614955565b61381d5760405162461bcd60e51b815260040161111d90614ac2565b6000610fd3826006614206565b6000806140aa8484610f63565b905060006010826040516140be9190614a58565b908152602001604051809103902054905060006012836040516140e19190614a58565b908152602001604051809103902054905060006140fd836126e9565b9050600061410a846124da565b61411490836149d0565b61411e90426148e3565b90508061412b83856148e3565b101598975050505050505050565b600080808461414957600161414b565b845b90506000808511614174576001600160a01b0388166000908152600d6020526040902054614176565b845b9050815b8181116141f957600061419c8a8360008c116141965742612247565b8b612247565b905080156141e65760006141b08b84612215565b90506141bb81614090565b6141c482613aa2565b6141ce90846149d0565b6141d89190614a05565b6141e290876148e3565b9550505b50806141f1816148fb565b91505061417a565b5091979650505050505050565b60008281526003602052604081205460ff16801561423c5750600083815260046020908152604080832085845290915290205415155b6142735760008281527f17ef568e3e12ab5b9c7254a8d58478811de00f9e6eb34345acd53bf8fd09d3ec6020526040902054610f5c565b50600091825260046020908152604080842092845291905290205490565b804710156142d85760405162461bcd60e51b8152602060048201526014602482015273696e73756666696369656e742062616c616e636560601b604482015260640161111d565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114614325576040519150601f19603f3d011682016040523d82523d6000602084013e61432a565b606091505b505090508061381d5760405162461bcd60e51b815260206004820152600b60248201526a1cd95b990819985a5b195960aa1b604482015260640161111d565b6000631f54050082111561437f57631f54050091505b816143935750670de0b6b3a7640000610fd3565b670de0b6b3a764000083835b6001811115614404576143b3600282614b62565b6143d5576143c18283614424565b91506143ce600282614a05565b905061439f565b6143df8284614424565b92506143eb8283614424565b915060026143fa6001836149b9565b6143ce9190614a05565b6113128284614424565b60008054600214158015611a4c57505033321490565b60008061443183856149d0565b9050670de0b6b3a7640000614447600282614a05565b61445190836148e3565b61350a9190614a05565b6001600160a01b038116811461447057600080fd5b50565b6000806040838503121561448657600080fd5b82356144918161445b565b946020939093013593505050565b6000806000606084860312156144b457600080fd5b83356144bf8161445b565b95602085013595506040909401359392505050565b60005b838110156144ef5781810151838201526020016144d7565b838111156111b05750506000910152565b600081518084526145188160208601602086016144d4565b601f01601f19169290920160200192915050565b602081526000610f5c6020830184614500565b60006020828403121561455157600080fd5b5035919050565b60008060006060848603121561456d57600080fd5b83356145788161445b565b925060208401356145888161445b565b915060408401356145988161445b565b809150509250925092565b600080600080608085870312156145b957600080fd5b8435935060208501356145cb8161445b565b93969395505050506040820135916060013590565b6000602082840312156145f257600080fd5b8135610f5c8161445b565b60008060006060848603121561461257600080fd5b505081359360208301359350604090920135919050565b801515811461447057600080fd5b6000806040838503121561464a57600080fd5b82359150602083013561465c81614629565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156146a6576146a6614667565b604052919050565b600067ffffffffffffffff8211156146c8576146c8614667565b50601f01601f191660200190565b60006146e96146e4846146ae565b61467d565b90508281528383830111156146fd57600080fd5b828260208301376000602084830101529392505050565b600082601f83011261472557600080fd5b610f5c838335602085016146d6565b6000806040838503121561474757600080fd5b82359150602083013567ffffffffffffffff81111561476557600080fd5b61477185828601614714565b9150509250929050565b60008060006060848603121561479057600080fd5b83359250602084013567ffffffffffffffff8111156147ae57600080fd5b6147ba86828701614714565b925050604084013590509250925092565b6000602082840312156147dd57600080fd5b813567ffffffffffffffff8111156147f457600080fd5b8201601f8101841361480557600080fd5b61350a848235602084016146d6565b60008060006060848603121561482957600080fd5b833592506020840135915060408401356145988161445b565b6000806040838503121561485557600080fd5b50508035926020909101359150565b6000806040838503121561487757600080fd5b82356148828161445b565b9150602083013561465c81614629565b600080600080608085870312156148a857600080fd5b84356148b38161445b565b966020860135965060408601359560600135945092505050565b634e487b7160e01b600052601160045260246000fd5b600082198211156148f6576148f66148cd565b500190565b600060001982141561490f5761490f6148cd565b5060010190565b60006020828403121561492857600080fd5b815160ff81168114610f5c57600080fd5b60ff9290921682526001600160a01b0316602082015260400190565b60006020828403121561496757600080fd5b8151610f5c81614629565b6020808252600990820152686e6f2061636365737360b81b604082015260600190565b6020808252600a90820152690dcdee840cadcdeeaced60b31b604082015260600190565b6000828210156149cb576149cb6148cd565b500390565b60008160001904831182151516156149ea576149ea6148cd565b500290565b634e487b7160e01b600052601260045260246000fd5b600082614a1457614a146149ef565b500490565b600060208284031215614a2b57600080fd5b5051919050565b6020808252600c908201526b696e76616c6964207479706560a01b604082015260600190565b60008251614a6a8184602087016144d4565b9190910192915050565b838152606060208201526000614a8d6060830185614500565b9050826040830152949350505050565b6020808252600b908201526a696e76616c69642066656560a81b604082015260600190565b6020808252600f908201526e1d1c985b9cd9995c8819985a5b1959608a1b604082015260600190565b600060208284031215614afd57600080fd5b815167ffffffffffffffff811115614b1457600080fd5b8201601f81018413614b2557600080fd5b8051614b336146e4826146ae565b818152856020838501011115614b4857600080fd5b614b598260208301602086016144d4565b95945050505050565b600082614b7157614b716149ef565b50069056fea2646970667358221220662d7693eb2c1b3ce9a09517e47d2f8f56fd000bd795ecc54a12abd0cb63dd0564736f6c63430008090033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.