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 | 13538649 | 1118 days ago | IN | 0 ETH | 0.7391188 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StrongNFTBonusV7
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: Unlicensed pragma solidity 0.6.12; pragma experimental ABIEncoderV2; import "./interfaces/ServiceInterface.sol"; import "./interfaces/IERC1155Preset.sol"; import "./interfaces/StrongNFTBonusLegacyInterface.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; import "@openzeppelin/contracts/GSN/Context.sol"; import "@openzeppelin/contracts/token/ERC1155/ERC1155Receiver.sol"; contract StrongNFTBonusV7 is Context { using SafeMath for uint256; event Staked(address indexed sender, uint256 tokenId, uint128 nodeId, uint256 block); event Unstaked(address indexed sender, uint256 tokenId, uint128 nodeId, uint256 block); ServiceInterface public CService; IERC1155Preset public CERC1155; StrongNFTBonusLegacyInterface public CStrongNFTBonus; bool public initDone; address public serviceAdmin; address public superAdmin; string[] public nftBonusNames; mapping(string => uint256) public nftBonusLowerBound; mapping(string => uint256) public nftBonusUpperBound; mapping(string => uint256) public nftBonusValue; mapping(string => uint256) public nftBonusEffectiveBlock; mapping(uint256 => address) public nftIdStakedToEntity; mapping(uint256 => uint128) public nftIdStakedToNodeId; mapping(uint256 => uint256) public nftIdStakedAtBlock; mapping(address => mapping(uint128 => uint256)) public entityNodeStakedNftId; mapping(bytes4 => bool) private _supportedInterfaces; mapping(string => uint8) public nftBonusNodesLimit; mapping(uint256 => uint8) public nftIdStakedToNodesCount; mapping(uint128 => uint256) public nodeIdStakedAtBlock; mapping(address => uint256[]) public entityStakedNftIds; mapping(address => mapping(uint128 => uint256)) public entityNodeStakedAtBlock; mapping(address => bool) private serviceContracts; mapping(address => mapping(address => mapping(uint128 => uint256))) public entityServiceNodeStakedNftId; mapping(address => mapping(address => mapping(uint128 => uint256))) public entityServiceNodeStakedAtBlock; event StakedToNode(address indexed sender, uint256 tokenId, uint128 nodeId, uint256 block, address serviceContract); event UnstakedFromNode(address indexed sender, uint256 tokenId, uint128 nodeId, uint256 block, address serviceContract); function init(address serviceContract, address nftContract, address strongNFTBonusContract, address serviceAdminAddress, address superAdminAddress) public { require(initDone == false, "init done"); _registerInterface(0x01ffc9a7); _registerInterface( ERC1155Receiver(0).onERC1155Received.selector ^ ERC1155Receiver(0).onERC1155BatchReceived.selector ); serviceAdmin = serviceAdminAddress; superAdmin = superAdminAddress; CService = ServiceInterface(serviceContract); CERC1155 = IERC1155Preset(nftContract); CStrongNFTBonus = StrongNFTBonusLegacyInterface(strongNFTBonusContract); initDone = true; } // // Getters // ------------------------------------------------------------------------------------------------------------------- function isNftStaked(uint256 _nftId) public view returns (bool) { return nftIdStakedToNodeId[_nftId] != 0 || nftIdStakedToNodesCount[_nftId] > 0; } function isNftStakedLegacy(uint256 _nftId) public view returns (bool) { return CStrongNFTBonus.isNftStaked(_nftId); } function getStakedNftId(address _entity, uint128 _nodeId, address _serviceContract) public view returns (uint256) { uint256 stakedNftId = isEthereumNode(_serviceContract) ? entityNodeStakedNftId[_entity][_nodeId] : 0; uint256 stakedNftIdNew = entityServiceNodeStakedNftId[_entity][_serviceContract][_nodeId]; uint256 stakedNftIdLegacy = CStrongNFTBonus.getStakedNftId(_entity, _nodeId); return stakedNftIdNew != 0 ? stakedNftIdNew : (stakedNftId != 0 ? stakedNftId : stakedNftIdLegacy); } function getStakedNftIds(address _entity) public view returns (uint256[] memory) { return entityStakedNftIds[_entity]; } function getNftBonusNames() public view returns (string[] memory) { return nftBonusNames; } function getNftNodesLeft(uint256 _nftId) public view returns (uint256) { return nftBonusNodesLimit[getNftBonusName(_nftId)] - nftIdStakedToNodesCount[_nftId]; } function getNftBonusName(uint256 _nftId) public view returns (string memory) { for (uint8 i = 0; i < nftBonusNames.length; i++) { if (_nftId >= nftBonusLowerBound[nftBonusNames[i]] && _nftId <= nftBonusUpperBound[nftBonusNames[i]]) { return nftBonusNames[i]; } } return ""; } function getBonus(address _entity, uint128 _nodeId, uint256 _fromBlock, uint256 _toBlock) public view returns (uint256) { address serviceContract = _msgSender(); require(serviceContracts[serviceContract], "service doesnt exist"); uint256 nftId = getStakedNftId(_entity, _nodeId, serviceContract); string memory bonusName = getNftBonusName(nftId); if (keccak256(abi.encode(bonusName)) == keccak256(abi.encode(""))) return 0; uint256 stakedAtBlock = entityServiceNodeStakedAtBlock[_entity][serviceContract][_nodeId] > 0 ? entityServiceNodeStakedAtBlock[_entity][serviceContract][_nodeId] : (entityNodeStakedAtBlock[_entity][_nodeId] > 0 ? entityNodeStakedAtBlock[_entity][_nodeId] : nftIdStakedAtBlock[nftId]); uint256 effectiveBlock = nftBonusEffectiveBlock[bonusName]; uint256 startFromBlock = stakedAtBlock > _fromBlock ? stakedAtBlock : _fromBlock; if (startFromBlock < effectiveBlock) { startFromBlock = effectiveBlock; } if (stakedAtBlock == 0 && keccak256(abi.encode(bonusName)) == keccak256(abi.encode("BRONZE"))) { return CStrongNFTBonus.getBonus(_entity, _nodeId, startFromBlock, _toBlock); } if (nftId == 0) return 0; if (stakedAtBlock == 0) return 0; if (effectiveBlock == 0) return 0; if (startFromBlock >= _toBlock) return 0; if (CERC1155.balanceOf(address(this), nftId) == 0) return 0; return _toBlock.sub(startFromBlock).mul(nftBonusValue[bonusName]); } function isNftStaked(uint256 _nftId, uint128 _nodeId, address _serviceContract) public view returns (bool) { return (isEthereumNode(_serviceContract) && entityNodeStakedNftId[_msgSender()][_nodeId] == _nftId) || entityServiceNodeStakedNftId[_msgSender()][_serviceContract][_nodeId] == _nftId; } function isEthereumNode(address _serviceContract) public view returns (bool) { return _serviceContract == address(CService); } // // Staking // ------------------------------------------------------------------------------------------------------------------- function stakeNFT(uint256 _nftId, uint128 _nodeId, address _serviceContract) public payable { string memory bonusName = getNftBonusName(_nftId); require(keccak256(abi.encode(bonusName)) != keccak256(abi.encode("")), "not eligible"); require(CERC1155.balanceOf(_msgSender(), _nftId) != 0 || (CERC1155.balanceOf(address(this), _nftId) != 0 && nftIdStakedToEntity[_nftId] == _msgSender()), "not enough"); require(nftIdStakedToNodesCount[_nftId] < nftBonusNodesLimit[bonusName], "over limit"); require(serviceContracts[_serviceContract], "service doesnt exist"); require(ServiceInterface(_serviceContract).doesNodeExist(_msgSender(), _nodeId), "node doesnt exist"); require(getStakedNftId(_msgSender(), _nodeId, _serviceContract) == 0, "already staked"); entityServiceNodeStakedNftId[_msgSender()][_serviceContract][_nodeId] = _nftId; nftIdStakedToEntity[_nftId] = _msgSender(); entityServiceNodeStakedAtBlock[_msgSender()][_serviceContract][_nodeId] = block.number; nftIdStakedToNodesCount[_nftId] += 1; bool alreadyExists = false; for (uint8 i = 0; i < entityStakedNftIds[_msgSender()].length; i++) { if (entityStakedNftIds[_msgSender()][i] == _nftId) { alreadyExists = true; break; } } if (!alreadyExists) { entityStakedNftIds[_msgSender()].push(_nftId); } if (CERC1155.balanceOf(address(this), _nftId) == 0) { CERC1155.safeTransferFrom(_msgSender(), address(this), _nftId, 1, bytes("")); } emit StakedToNode(_msgSender(), _nftId, _nodeId, block.number, _serviceContract); } function unStakeNFT(uint256 _nftId, uint128 _nodeId, uint256 _blockNumber, address _serviceContract) public payable { require(isNftStaked(_nftId, _nodeId, _serviceContract), "wrong node"); require(nftIdStakedToEntity[_nftId] != address(0), "not staked"); require(nftIdStakedToEntity[_nftId] == _msgSender(), "not staker"); require(serviceContracts[_serviceContract], "service doesnt exist"); if (!ServiceInterface(_serviceContract).hasNodeExpired(_msgSender(), _nodeId)) { ServiceInterface(_serviceContract).claim{value : msg.value}(_nodeId, _blockNumber, false); } entityServiceNodeStakedNftId[_msgSender()][_serviceContract][_nodeId] = 0; nftIdStakedToNodeId[_nftId] = 0; if (isEthereumNode(_serviceContract)) { entityNodeStakedNftId[_msgSender()][_nodeId] = 0; } if (nftIdStakedToNodesCount[_nftId] > 0) { nftIdStakedToNodesCount[_nftId] -= 1; } if (nftIdStakedToNodesCount[_nftId] == 0) { nftIdStakedToEntity[_nftId] = address(0); for (uint8 i = 0; i < entityStakedNftIds[_msgSender()].length; i++) { if (entityStakedNftIds[_msgSender()][i] == _nftId) { _deleteIndex(entityStakedNftIds[_msgSender()], i); break; } } CERC1155.safeTransferFrom(address(this), _msgSender(), _nftId, 1, bytes("")); } emit UnstakedFromNode(_msgSender(), _nftId, _nodeId, _blockNumber, _serviceContract); } // // Admin // ------------------------------------------------------------------------------------------------------------------- function updateBonus(string memory _name, uint256 _lowerBound, uint256 _upperBound, uint256 _value, uint256 _block, uint8 _nodesLimit) public { require(_msgSender() == serviceAdmin || _msgSender() == superAdmin, "not admin"); bool alreadyExists = false; for (uint8 i = 0; i < nftBonusNames.length; i++) { if (keccak256(abi.encode(nftBonusNames[i])) == keccak256(abi.encode(_name))) { alreadyExists = true; } } if (!alreadyExists) { nftBonusNames.push(_name); } nftBonusLowerBound[_name] = _lowerBound; nftBonusUpperBound[_name] = _upperBound; nftBonusValue[_name] = _value; nftBonusEffectiveBlock[_name] = _block != 0 ? _block : block.number; nftBonusNodesLimit[_name] = _nodesLimit; } function updateContracts(address _nftContract) public { require(_msgSender() == superAdmin, "not admin"); CERC1155 = IERC1155Preset(_nftContract); } function addServiceContract(address _contract) public { require(_msgSender() == superAdmin, "not admin"); serviceContracts[_contract] = true; } function removeServiceContract(address _contract) public { require(_msgSender() == superAdmin, "not admin"); serviceContracts[_contract] = false; } function updateServiceAdmin(address newServiceAdmin) public { require(_msgSender() == superAdmin, "not admin"); serviceAdmin = newServiceAdmin; } function updateEntityNodeStakedAtBlock(address _entity, uint128 _nodeId, uint256 _block) public { require(_msgSender() == serviceAdmin || _msgSender() == superAdmin, "not admin"); entityNodeStakedAtBlock[_entity][_nodeId] = _block; } function updateEntityServiceNodeStakedAtBlock(address _entity, uint128 _nodeId, address _serviceContract, uint256 _block) public { require(_msgSender() == serviceAdmin || _msgSender() == superAdmin, "not admin"); entityServiceNodeStakedAtBlock[_entity][_serviceContract][_nodeId] = _block; } function fixData( address _serviceContract, address _entity, uint128 _nodeId, uint256 _nftId, uint256 _block, uint8 _count, bool _updateLegacy, bool _updateNew ) public { require(_msgSender() == serviceAdmin || _msgSender() == superAdmin, "not admin"); nftIdStakedToEntity[_nftId] = _entity; nftIdStakedToNodesCount[_nftId] = _count; if (_updateLegacy) { nftIdStakedToNodeId[_nftId] = _nodeId; entityNodeStakedNftId[_entity][_nodeId] = _nftId; } if (_updateNew) { entityServiceNodeStakedNftId[_entity][_serviceContract][_nodeId] = _nftId; entityServiceNodeStakedAtBlock[_entity][_serviceContract][_nodeId] = _block; } } function fixOverrides(address _entity, uint256 _secondNftId, uint256 _originalNftId, uint128 _nodeId, uint256 _originalBlock) public { require(_msgSender() == serviceAdmin || _msgSender() == superAdmin, "not admin"); address serviceContract = address(CService); bool secondNftStillStaked = entityServiceNodeStakedNftId[_entity][serviceContract][_nodeId] == _secondNftId; if (secondNftStillStaked) { nftIdStakedToNodeId[_secondNftId] = 0; entityNodeStakedNftId[_entity][_nodeId] = 0; if (nftIdStakedToNodesCount[_secondNftId] > 0) { nftIdStakedToNodesCount[_secondNftId] -= 1; } if (nftIdStakedToNodesCount[_secondNftId] == 0) { nftIdStakedToEntity[_secondNftId] = address(0); for (uint8 i = 0; i < entityStakedNftIds[_entity].length; i++) { if (entityStakedNftIds[_entity][i] == _secondNftId) { _deleteIndex(entityStakedNftIds[_entity], i); break; } } CERC1155.safeTransferFrom(address(this), _entity, _secondNftId, 1, bytes("")); } emit UnstakedFromNode(_entity, _secondNftId, _nodeId, block.number, serviceContract); } entityServiceNodeStakedNftId[_entity][serviceContract][_nodeId] = _originalNftId; entityServiceNodeStakedAtBlock[_entity][serviceContract][_nodeId] = _originalBlock; } // // ERC1155 support // ------------------------------------------------------------------------------------------------------------------- function onERC1155Received(address, address, uint256, uint256, bytes memory) public virtual returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived(address, address, uint256[] memory, uint256[] memory, bytes memory) public virtual returns (bytes4) { return this.onERC1155BatchReceived.selector; } function supportsInterface(bytes4 interfaceId) public view returns (bool) { return _supportedInterfaces[interfaceId]; } function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } function _deleteIndex(uint256[] storage array, uint256 index) internal { uint256 lastIndex = array.length.sub(1); uint256 lastEntry = array[lastIndex]; if (index == lastIndex) { array.pop(); } else { array[index] = lastEntry; array.pop(); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.12; interface ServiceInterface { function traunch(address) external view returns(uint256); function claimingFeeNumerator() external view returns(uint256); function claimingFeeDenominator() external view returns(uint256); function doesNodeExist(address entity, uint128 nodeId) external view returns (bool); function getNodeId(address entity, uint128 nodeId) external view returns (bytes memory); function getReward(address entity, uint128 nodeId) external view returns (uint256); function getRewardByBlock(address entity, uint128 nodeId, uint256 blockNumber) external view returns (uint256); function getTraunch(address entity) external view returns (uint256); function hasNodeExpired(address _entity, uint128 _nodeId) external view returns (bool); function isEntityActive(address entity) external view returns (bool); function claim(uint128 nodeId, uint256 blockNumber, bool toStrongPool) external payable; }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155Preset { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch(address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom(address from, address to, uint256 id, uint256 amount, bytes calldata data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom(address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) external; /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); /** * @dev Creates `amount` new tokens for `to`, of token type `id`. * * See {ERC1155-_mint}. * * Requirements: * * - the caller must have the `MINTER_ROLE`. */ function mint(address to, uint256 id, uint256 amount, bytes memory data) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] variant of {mint}. */ function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) external; function getOwnerIdByIndex(address owner, uint256 index) external view returns (uint256); function getOwnerIdIndex(address owner, uint256 id) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface StrongNFTBonusLegacyInterface { function getBonus(address _entity, uint128 _nodeId, uint256 _fromBlock, uint256 _toBlock) external view returns (uint256); function getStakedNftId(address _entity, uint128 _nodeId) external view returns (uint256); function isNftStaked(uint256 _nftId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../utils/Context.sol";
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./IERC1155Receiver.sol"; import "../../introspection/ERC165.sol"; /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { constructor() internal { _registerInterface( ERC1155Receiver(address(0)).onERC1155Received.selector ^ ERC1155Receiver(address(0)).onERC1155BatchReceived.selector ); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.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 payable) { 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 <0.8.0; import "../../introspection/IERC165.sol"; /** * _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns(bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns(bytes4); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"nodeId","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"nodeId","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"address","name":"serviceContract","type":"address"}],"name":"StakedToNode","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"nodeId","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"}],"name":"Unstaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"nodeId","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"block","type":"uint256"},{"indexed":false,"internalType":"address","name":"serviceContract","type":"address"}],"name":"UnstakedFromNode","type":"event"},{"inputs":[],"name":"CERC1155","outputs":[{"internalType":"contract IERC1155Preset","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CService","outputs":[{"internalType":"contract ServiceInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CStrongNFTBonus","outputs":[{"internalType":"contract StrongNFTBonusLegacyInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"addServiceContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint128","name":"","type":"uint128"}],"name":"entityNodeStakedAtBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint128","name":"","type":"uint128"}],"name":"entityNodeStakedNftId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint128","name":"","type":"uint128"}],"name":"entityServiceNodeStakedAtBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint128","name":"","type":"uint128"}],"name":"entityServiceNodeStakedNftId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"entityStakedNftIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_serviceContract","type":"address"},{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint256","name":"_block","type":"uint256"},{"internalType":"uint8","name":"_count","type":"uint8"},{"internalType":"bool","name":"_updateLegacy","type":"bool"},{"internalType":"bool","name":"_updateNew","type":"bool"}],"name":"fixData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_secondNftId","type":"uint256"},{"internalType":"uint256","name":"_originalNftId","type":"uint256"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"uint256","name":"_originalBlock","type":"uint256"}],"name":"fixOverrides","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"uint256","name":"_fromBlock","type":"uint256"},{"internalType":"uint256","name":"_toBlock","type":"uint256"}],"name":"getBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"getNftBonusName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNftBonusNames","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"getNftNodesLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"address","name":"_serviceContract","type":"address"}],"name":"getStakedNftId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"}],"name":"getStakedNftIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"serviceContract","type":"address"},{"internalType":"address","name":"nftContract","type":"address"},{"internalType":"address","name":"strongNFTBonusContract","type":"address"},{"internalType":"address","name":"serviceAdminAddress","type":"address"},{"internalType":"address","name":"superAdminAddress","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initDone","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_serviceContract","type":"address"}],"name":"isEthereumNode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"address","name":"_serviceContract","type":"address"}],"name":"isNftStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"isNftStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"}],"name":"isNftStakedLegacy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"nftBonusEffectiveBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"nftBonusLowerBound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftBonusNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"nftBonusNodesLimit","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"nftBonusUpperBound","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"nftBonusValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftIdStakedAtBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftIdStakedToEntity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftIdStakedToNodeId","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftIdStakedToNodesCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"","type":"uint128"}],"name":"nodeIdStakedAtBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"removeServiceContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"serviceAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"address","name":"_serviceContract","type":"address"}],"name":"stakeNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"superAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"uint256","name":"_blockNumber","type":"uint256"},{"internalType":"address","name":"_serviceContract","type":"address"}],"name":"unStakeNFT","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_lowerBound","type":"uint256"},{"internalType":"uint256","name":"_upperBound","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_block","type":"uint256"},{"internalType":"uint8","name":"_nodesLimit","type":"uint8"}],"name":"updateBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftContract","type":"address"}],"name":"updateContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"updateEntityNodeStakedAtBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint128","name":"_nodeId","type":"uint128"},{"internalType":"address","name":"_serviceContract","type":"address"},{"internalType":"uint256","name":"_block","type":"uint256"}],"name":"updateEntityServiceNodeStakedAtBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newServiceAdmin","type":"address"}],"name":"updateServiceAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b5061392a806100206000396000f3fe6080604052600436106102885760003560e01c80639171ce711161015a578063c2c9b3c1116100c1578063da998dca1161007a578063da998dca146107e7578063ea6df596146107fc578063f23a6e611461081c578063f304e01d1461083c578063fc7ea8d11461085c578063fed0a20e1461087157610288565b8063c2c9b3c114610718578063c712d34a14610738578063cb4dd51e1461075a578063ccff148f1461077a578063d4a8c0821461079a578063d60444ff146107ba57610288565b8063ac3a760111610113578063ac3a760114610656578063ad553eef14610676578063b07d9cbb14610696578063b64ac8e4146106b6578063bc197c81146106d6578063c153dc0b1461070357610288565b80639171ce71146105965780639954a804146105b65780639f4808da146105d6578063a68b62e5146105f6578063a8306cf214610616578063a8936d591461063657610288565b8063359ef75b116101fe578063674edb72116101b7578063674edb72146104c957806368b087e8146104e957806372ab973f146105165780637760c6c71461053657806378592e7414610556578063916db6eb1461057657610288565b8063359ef75b1461041457806339e3aea214610434578063559b12fe146104475780635ab9daf0146104745780635ed44191146104945780636441d379146104b457610288565b80631f8e027b116102505780631f8e027b1461035f578063279958a91461037f57806329575f6a1461039f5780633183685b146103c157806331e410a8146103e1578063328f7233146103f457610288565b806301ffc9a71461028d578063048cde02146102c357806304dc6ada146102e55780631134aafe1461031257806313f9348414610332575b600080fd5b34801561029957600080fd5b506102ad6102a83660046130e9565b610886565b6040516102ba91906134a1565b60405180910390f35b3480156102cf57600080fd5b506102e36102de366004612f82565b6108a9565b005b3480156102f157600080fd5b50610305610300366004613111565b610950565b6040516102ba9190613816565b34801561031e57600080fd5b506102ad61032d366004613209565b61096d565b34801561033e57600080fd5b5061035261034d3660046131d9565b610a18565b6040516102ba91906134c1565b34801561036b57600080fd5b506102ad61037a3660046131d9565b610b76565b34801561038b57600080fd5b506102e361039a366004612c97565b610bfd565b3480156103ab57600080fd5b506103b4610c59565b6040516102ba9190613345565b3480156103cd57600080fd5b506103056103dc3660046131d9565b610c68565b6102e36103ef366004613209565b610c7a565b34801561040057600080fd5b506102ad61040f3660046131d9565b6112b9565b34801561042057600080fd5b506102e361042f366004612cb2565b6112f1565b6102e3610442366004613246565b6113a9565b34801561045357600080fd5b50610467610462366004612c97565b611824565b6040516102ba919061345d565b34801561048057600080fd5b5061035261048f3660046131d9565b611890565b3480156104a057600080fd5b506103056104af366004613052565b611936565b3480156104c057600080fd5b506103b4611964565b3480156104d557600080fd5b506103056104e4366004613111565b611973565b3480156104f557600080fd5b50610509610504366004613111565b611990565b6040516102ba919061384c565b34801561052257600080fd5b506103056105313660046131be565b6119b0565b34801561054257600080fd5b506102e3610551366004612c97565b6119c2565b34801561056257600080fd5b506103056105713660046131d9565b611a20565b34801561058257600080fd5b50610305610591366004612f0f565b611a6b565b3480156105a257600080fd5b506102e36105b1366004612fcf565b611a88565b3480156105c257600080fd5b506103056105d1366004612f0f565b611b17565b3480156105e257600080fd5b506103b46105f13660046131d9565b611b34565b34801561060257600080fd5b50610305610611366004612f43565b611b4f565b34801561062257600080fd5b506102ad610631366004612c97565b611c70565b34801561064257600080fd5b50610305610651366004613111565b611c84565b34801561066257600080fd5b50610305610671366004612dc5565b611ca1565b34801561068257600080fd5b506102e3610691366004612c97565b611cc4565b3480156106a257600080fd5b506103056106b136600461300f565b611d20565b3480156106c257600080fd5b506102e36106d1366004612c97565b612126565b3480156106e257600080fd5b506106f66106f1366004612d1b565b612181565b6040516102ba91906134ac565b34801561070f57600080fd5b506103b4612192565b34801561072457600080fd5b50610305610733366004613111565b6121a1565b34801561074457600080fd5b5061074d6121be565b6040516102ba91906133fd565b34801561076657600080fd5b506102e3610775366004613144565b612296565b34801561078657600080fd5b506102e3610795366004612e0f565b61249e565b3480156107a657600080fd5b506103056107b5366004612dc5565b6125fa565b3480156107c657600080fd5b506107da6107d53660046131d9565b61261d565b6040516102ba91906137df565b3480156107f357600080fd5b506103b4612638565b34801561080857600080fd5b506102e361081736600461307c565b612647565b34801561082857600080fd5b506106f6610837366004612eaa565b612950565b34801561084857600080fd5b506105096108573660046131d9565b612961565b34801561086857600080fd5b506103b4612976565b34801561087d57600080fd5b506102ad612985565b6001600160e01b031981166000908152600e602052604090205460ff165b919050565b6003546001600160a01b03166108bd612995565b6001600160a01b031614806108ec57506004546001600160a01b03166108e1612995565b6001600160a01b0316145b6109115760405162461bcd60e51b815260040161090890613794565b60405180910390fd5b6001600160a01b0393841660009081526016602090815260408083209490961682529283528481206001600160801b0390941681529290915291902055565b805160208183018101805160078252928201919093012091525481565b600061097882611c70565b80156109be575083600d600061098c612995565b6001600160a01b03168152602080820192909252604090810160009081206001600160801b0388168252909252902054145b80610a10575083601560006109d1612995565b6001600160a01b0390811682526020808301939093526040918201600090812091871681529083528181206001600160801b0388168252909252902054145b949350505050565b606060005b60055460ff82161015610b6057600660058260ff1681548110610a3c57fe5b90600052602060002001604051610a5391906132d5565b9081526020016040518091039020548310158015610aa85750600760058260ff1681548110610a7e57fe5b90600052602060002001604051610a9591906132d5565b9081526020016040518091039020548311155b15610b585760058160ff1681548110610abd57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610b4b5780601f10610b2057610100808354040283529160200191610b4b565b820191906000526020600020905b815481529060010190602001808311610b2e57829003601f168201915b50505050509150506108a4565b600101610a1d565b5050604080516020810190915260008152919050565b60025460405163328f723360e01b81526000916001600160a01b03169063328f723390610ba7908590600401613816565b60206040518083038186803b158015610bbf57600080fd5b505afa158015610bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf791906130cd565b92915050565b6004546001600160a01b0316610c11612995565b6001600160a01b031614610c375760405162461bcd60e51b815260040161090890613794565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031681565b600c6020526000908152604090205481565b6060610c8584610a18565b9050604051602001610c9690613783565b6040516020818303038152906040528051906020012081604051602001610cbd91906134c1565b604051602081830303815290604052805190602001201415610cf15760405162461bcd60e51b81526004016109089061366f565b6001546001600160a01b031662fdd58e610d09612995565b866040518363ffffffff1660e01b8152600401610d279291906133b5565b60206040518083038186803b158015610d3f57600080fd5b505afa158015610d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7791906131f1565b151580610e2e5750600154604051627eeac760e11b81526001600160a01b039091169062fdd58e90610daf90309088906004016133b5565b60206040518083038186803b158015610dc757600080fd5b505afa158015610ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dff91906131f1565b15801590610e2e5750610e10612995565b6000858152600a60205260409020546001600160a01b039081169116145b610e4a5760405162461bcd60e51b815260040161090890613608565b600f81604051610e5a91906132b9565b9081526040805160209281900383019020546000878152601090935291205460ff918216911610610e9d5760405162461bcd60e51b81526004016109089061355e565b6001600160a01b03821660009081526014602052604090205460ff16610ed55760405162461bcd60e51b815260040161090890613695565b816001600160a01b03166326665562610eec612995565b856040518363ffffffff1660e01b8152600401610f0a929190613393565b60206040518083038186803b158015610f2257600080fd5b505afa158015610f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5a91906130cd565b610f765760405162461bcd60e51b8152600401610908906135dd565b610f88610f81612995565b8484611b4f565b15610fa55760405162461bcd60e51b8152600401610908906137b7565b8360156000610fb2612995565b6001600160a01b0390811682526020808301939093526040918201600090812091871681529083528181206001600160801b0388168252909252902055610ff7612995565b6000858152600a6020526040812080546001600160a01b0319166001600160a01b0393909316929092179091554390601690611031612995565b6001600160a01b0390811682526020808301939093526040918201600090812091871681529083528181206001600160801b038816825283528181209390935586835260109091528120805460ff8082166001011660ff19909116179055805b6012600061109d612995565b6001600160a01b0316815260208101919091526040016000205460ff8216101561111e5785601260006110ce612995565b6001600160a01b03166001600160a01b031681526020019081526020016000208260ff16815481106110fc57fe5b90600052602060002001541415611116576001915061111e565b600101611091565b508061115f5760126000611130612995565b6001600160a01b0316815260208082019290925260400160009081208054600181018255908252919020018590555b600154604051627eeac760e11b81526001600160a01b039091169062fdd58e9061118f90309089906004016133b5565b60206040518083038186803b1580156111a757600080fd5b505afa1580156111bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111df91906131f1565b611264576001546001600160a01b031663f242432a6111fc612995565b604080516020810182526000815290516001600160e01b031960e085901b168152611231929130918b91600191600401613359565b600060405180830381600087803b15801561124b57600080fd5b505af115801561125f573d6000803e3d6000fd5b505050505b61126c612995565b6001600160a01b03167f2091db4757417ee6930004b3e4755720fdcb20ee7613e053f8effd4d173d3749868643876040516112aa949392919061381f565b60405180910390a25050505050565b6000818152600b60205260408120546001600160801b0316151580610bf757505060009081526010602052604090205460ff16151590565b600254600160a01b900460ff161561131b5760405162461bcd60e51b81526004016109089061362c565b61132b6301ffc9a760e01b612999565b61133b630271189760e51b612999565b600380546001600160a01b03199081166001600160a01b039485161790915560048054821692841692909217909155600080548216958316959095179094556001805485169382169390931790925560028054600160a01b9416919092161760ff60a01b1916919091179055565b6113b484848361096d565b6113d05760405162461bcd60e51b815260040161090890613582565b6000848152600a60205260409020546001600160a01b03166114045760405162461bcd60e51b81526004016109089061371e565b61140c612995565b6000858152600a60205260409020546001600160a01b039081169116146114455760405162461bcd60e51b8152600401610908906136fa565b6001600160a01b03811660009081526014602052604090205460ff1661147d5760405162461bcd60e51b815260040161090890613695565b806001600160a01b0316636c52ec10611494612995565b856040518363ffffffff1660e01b81526004016114b2929190613393565b60206040518083038186803b1580156114ca57600080fd5b505afa1580156114de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150291906130cd565b61156c57604051630e6507e960e21b81526001600160a01b038216906339941fa490349061153990879087906000906004016137f3565b6000604051808303818588803b15801561155257600080fd5b505af1158015611566573d6000803e3d6000fd5b50505050505b60006015600061157a612995565b6001600160a01b0390811682526020808301939093526040918201600090812091861681529083528181206001600160801b0388168252835281812093909355868352600b909152902080546001600160801b03191690556115db81611c70565b1561161f576000600d60006115ee612995565b6001600160a01b03168152602080820192909252604090810160009081206001600160801b03881682529092529020555b60008481526010602052604090205460ff161561165b576000848152601060205260409020805460ff19811660ff918216600019019091161790555b60008481526010602052604090205460ff166117d0576000848152600a6020526040812080546001600160a01b03191690555b6012600061169a612995565b6001600160a01b0316815260208101919091526040016000205460ff8216101561174f5784601260006116cb612995565b6001600160a01b03166001600160a01b031681526020019081526020016000208260ff16815481106116f957fe5b906000526020600020015414156117475761174260126000611719612995565b6001600160a01b03166001600160a01b031681526020019081526020016000208260ff166129e8565b61174f565b60010161168e565b506001546001600160a01b031663f242432a3061176a612995565b876001604051806020016040528060008152506040518663ffffffff1660e01b815260040161179d959493929190613359565b600060405180830381600087803b1580156117b757600080fd5b505af11580156117cb573d6000803e3d6000fd5b505050505b6117d8612995565b6001600160a01b03167f71d135e12a0a354469f06fae55d676e28a84fec8b3a2e61f0a5a0f3208e3b6ac85858585604051611816949392919061381f565b60405180910390a250505050565b6001600160a01b03811660009081526012602090815260409182902080548351818402810184019094528084526060939283018282801561188457602002820191906000526020600020905b815481526020019060010190808311611870575b50505050509050919050565b6005818154811061189d57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529350909183018282801561192e5780601f106119035761010080835404028352916020019161192e565b820191906000526020600020905b81548152906001019060200180831161191157829003601f168201915b505050505081565b6012602052816000526040600020818154811061194f57fe5b90600052602060002001600091509150505481565b6001546001600160a01b031681565b805160208183018101805160088252928201919093012091525481565b8051602081830181018051600f8252928201919093012091525460ff1681565b60116020526000908152604090205481565b6004546001600160a01b03166119d6612995565b6001600160a01b0316146119fc5760405162461bcd60e51b815260040161090890613794565b6001600160a01b03166000908152601460205260409020805460ff19166001179055565b60008181526010602052604081205460ff16600f611a3d84610a18565b604051611a4a91906132b9565b9081526040519081900360200190205460ff90811691909103169050919050565b601360209081526000928352604080842090915290825290205481565b6003546001600160a01b0316611a9c612995565b6001600160a01b03161480611acb57506004546001600160a01b0316611ac0612995565b6001600160a01b0316145b611ae75760405162461bcd60e51b815260040161090890613794565b6001600160a01b0390921660009081526013602090815260408083206001600160801b0390941683529290522055565b600d60209081526000928352604080842090915290825290205481565b600a602052600090815260409020546001600160a01b031681565b600080611b5b83611c70565b611b66576000611b94565b6001600160a01b0385166000908152600d602090815260408083206001600160801b03881684529091529020545b6001600160a01b038087166000908152601560209081526040808320888516845282528083206001600160801b038a168452909152808220546002549151630d06322560e21b81529495509391921690633418c89490611bfa908a908a90600401613393565b60206040518083038186803b158015611c1257600080fd5b505afa158015611c26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4a91906131f1565b905081611c635782611c5c5780611c5e565b825b611c65565b815b979650505050505050565b6000546001600160a01b0390811691161490565b805160208183018101805160068252928201919093012091525481565b601560209081526000938452604080852082529284528284209052825290205481565b6004546001600160a01b0316611cd8612995565b6001600160a01b031614611cfe5760405162461bcd60e51b815260040161090890613794565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600080611d2b612995565b6001600160a01b03811660009081526014602052604090205490915060ff16611d665760405162461bcd60e51b815260040161090890613695565b6000611d73878784611b4f565b90506060611d8082610a18565b9050604051602001611d9190613783565b6040516020818303038152906040528051906020012081604051602001611db891906134c1565b604051602081830303815290604052805190602001201415611de05760009350505050610a10565b6001600160a01b03808916600090815260166020908152604080832093871683529281528282206001600160801b038b168352905290812054611e95576001600160a01b03891660009081526013602090815260408083206001600160801b038c168452909152902054611e62576000838152600c6020526040902054611e90565b6001600160a01b03891660009081526013602090815260408083206001600160801b038c1684529091529020545b611ecd565b6001600160a01b03808a16600090815260166020908152604080832093881683529281528282206001600160801b038c168352905220545b90506000600983604051611ee191906132b9565b90815260200160405180910390205490506000888311611f015788611f03565b825b905081811015611f105750805b82158015611f675750604051602001611f289061364f565b6040516020818303038152906040528051906020012084604051602001611f4f91906134c1565b60405160208183030381529060405280519060200120145b15611fff5760025460405163b07d9cbb60e01b81526001600160a01b039091169063b07d9cbb90611fa2908e908e9086908e906004016133ce565b60206040518083038186803b158015611fba57600080fd5b505afa158015611fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff291906131f1565b9650505050505050610a10565b846120135760009650505050505050610a10565b826120275760009650505050505050610a10565b8161203b5760009650505050505050610a10565b8781106120515760009650505050505050610a10565b600154604051627eeac760e11b81526001600160a01b039091169062fdd58e9061208190309089906004016133b5565b60206040518083038186803b15801561209957600080fd5b505afa1580156120ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d191906131f1565b6120e45760009650505050505050610a10565b6121176008856040516120f791906132b9565b908152604051908190036020019020546121118a84612a84565b90612aac565b9b9a5050505050505050505050565b6004546001600160a01b031661213a612995565b6001600160a01b0316146121605760405162461bcd60e51b815260040161090890613794565b6001600160a01b03166000908152601460205260409020805460ff19169055565b63bc197c8160e01b95945050505050565b6002546001600160a01b031681565b805160208183018101805160098252928201919093012091525481565b60606005805480602002602001604051908101604052809291908181526020016000905b8282101561228d5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156122795780601f1061224e57610100808354040283529160200191612279565b820191906000526020600020905b81548152906001019060200180831161225c57829003601f168201915b5050505050815260200190600101906121e2565b50505050905090565b6003546001600160a01b03166122aa612995565b6001600160a01b031614806122d957506004546001600160a01b03166122ce612995565b6001600160a01b0316145b6122f55760405162461bcd60e51b815260040161090890613794565b6000805b60055460ff82161015612380578760405160200161231791906134c1565b6040516020818303038152906040528051906020012060058260ff168154811061233d57fe5b9060005260206000200160405160200161235791906134d4565b60405160208183030381529060405280519060200120141561237857600191505b6001016122f9565b50806123cb576005805460018101825560009190915287516123c9917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0019060208a0190612aed565b505b856006886040516123dc91906132b9565b908152602001604051809103902081905550846007886040516123ff91906132b9565b9081526020016040518091039020819055508360088860405161242291906132b9565b908152604051908190036020019020558261243d574361243f565b825b60098860405161244f91906132b9565b90815260200160405180910390208190555081600f8860405161247291906132b9565b908152604051908190036020019020805460ff9290921660ff1990921691909117905550505050505050565b6003546001600160a01b03166124b2612995565b6001600160a01b031614806124e157506004546001600160a01b03166124d6612995565b6001600160a01b0316145b6124fd5760405162461bcd60e51b815260040161090890613794565b6000858152600a6020908152604080832080546001600160a01b0319166001600160a01b038c1617905560109091529020805460ff191660ff8516179055811561258d576000858152600b6020908152604080832080546001600160801b0319166001600160801b038b169081179091556001600160a01b038b168452600d835281842090845290915290208590555b80156125f0576001600160a01b038088166000818152601560209081526040808320948d168084529482528083206001600160801b038c168085529083528184208b90559383526016825280832094835293815283822092825291909152208490555b5050505050505050565b601660209081526000938452604080852082529284528284209052825290205481565b600b602052600090815260409020546001600160801b031681565b6003546001600160a01b031681565b6003546001600160a01b031661265b612995565b6001600160a01b0316148061268a57506004546001600160a01b031661267f612995565b6001600160a01b0316145b6126a65760405162461bcd60e51b815260040161090890613794565b600080546001600160a01b038781168352601560209081526040808520929093168085529181528284206001600160801b03871685529052912054851480156128e9576000868152600b6020908152604080832080546001600160801b03191690556001600160a01b038a168352600d82528083206001600160801b03881684528252808320839055888352601090915290205460ff1615612767576000868152601060205260409020805460ff19811660ff918216600019019091161790555b60008681526010602052604090205460ff166128a1576000868152600a6020526040812080546001600160a01b03191690555b6001600160a01b03881660009081526012602052604090205460ff8216101561282a576001600160a01b0388166000908152601260205260409020805488919060ff84169081106127e757fe5b90600052602060002001541415612822576001600160a01b038816600090815260126020526040902061281d9060ff83166129e8565b61282a565b60010161279a565b506001805460408051602081018252600081529051637921219560e11b81526001600160a01b039092169263f242432a9261286e9230928d928d9290600401613359565b600060405180830381600087803b15801561288857600080fd5b505af115801561289c573d6000803e3d6000fd5b505050505b866001600160a01b03167f71d135e12a0a354469f06fae55d676e28a84fec8b3a2e61f0a5a0f3208e3b6ac878643866040516128e0949392919061381f565b60405180910390a25b506001600160a01b039586166000818152601560209081526040808320949099168083529381528882206001600160801b03909616808352958152888220969096559081526016855286812091815290845285812092815291909252929092209190915550565b63f23a6e6160e01b95945050505050565b60106020526000908152604090205460ff1681565b6000546001600160a01b031681565b600254600160a01b900460ff1681565b3390565b6001600160e01b031980821614156129c35760405162461bcd60e51b8152600401610908906135a6565b6001600160e01b0319166000908152600e60205260409020805460ff19166001179055565b81546000906129f8906001612a84565b90506000838281548110612a0857fe5b9060005260206000200154905081831415612a425783805480612a2757fe5b60019003818190600052602060002001600090559055612a7e565b80848481548110612a4f57fe5b906000526020600020018190555083805480612a6757fe5b600190038181906000526020600020016000905590555b50505050565b600082821115612aa65760405162461bcd60e51b8152600401610908906136c3565b50900390565b600082612abb57506000610bf7565b82820282848281612ac857fe5b0414612ae65760405162461bcd60e51b815260040161090890613742565b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612b2e57805160ff1916838001178555612b5b565b82800160010185558215612b5b579182015b82811115612b5b578251825591602001919060010190612b40565b50612b67929150612b6b565b5090565b5b80821115612b675760008155600101612b6c565b80356001600160a01b0381168114610bf757600080fd5b600082601f830112612ba7578081fd5b813567ffffffffffffffff811115612bbd578182fd5b6020808202612bcd82820161385a565b83815293508184018583018287018401881015612be957600080fd5b600092505b84831015612c0c578035825260019290920191908301908301612bee565b505050505092915050565b600082601f830112612c27578081fd5b813567ffffffffffffffff811115612c3d578182fd5b612c50601f8201601f191660200161385a565b9150808252836020828501011115612c6757600080fd5b8060208401602084013760009082016020015292915050565b80356001600160801b0381168114610bf757600080fd5b600060208284031215612ca8578081fd5b612ae68383612b80565b600080600080600060a08688031215612cc9578081fd5b612cd38787612b80565b9450612ce28760208801612b80565b9350612cf18760408801612b80565b9250612d008760608801612b80565b9150612d0f8760808801612b80565b90509295509295909350565b600080600080600060a08688031215612d32578081fd5b8535612d3d816138b9565b94506020860135612d4d816138b9565b9350604086013567ffffffffffffffff80821115612d69578283fd5b612d7589838a01612b97565b94506060880135915080821115612d8a578283fd5b612d9689838a01612b97565b93506080880135915080821115612dab578283fd5b50612db888828901612c17565b9150509295509295909350565b600080600060608486031215612dd9578283fd5b8335612de4816138b9565b92506020840135612df4816138b9565b91506040840135612e04816138df565b809150509250925092565b600080600080600080600080610100898b031215612e2b578283fd5b8835612e36816138b9565b97506020890135612e46816138b9565b96506040890135612e56816138df565b9550606089013594506080890135935060a089013560ff81168114612e79578384fd5b925060c0890135612e89816138d1565b915060e0890135612e99816138d1565b809150509295985092959890939650565b600080600080600060a08688031215612ec1578081fd5b612ecb8787612b80565b9450612eda8760208801612b80565b93506040860135925060608601359150608086013567ffffffffffffffff811115612f03578182fd5b612db888828901612c17565b60008060408385031215612f21578182fd5b612f2b8484612b80565b9150612f3a8460208501612c80565b90509250929050565b600080600060608486031215612f57578081fd5b8335612f62816138b9565b92506020840135612f72816138df565b91506040840135612e04816138b9565b60008060008060808587031215612f97578182fd5b612fa18686612b80565b9350612fb08660208701612c80565b9250612fbf8660408701612b80565b9396929550929360600135925050565b600080600060608486031215612fe3578081fd5b8335612fee816138b9565b92506020840135612ffe816138df565b929592945050506040919091013590565b60008060008060808587031215613024578182fd5b61302e8686612b80565b935061303d8660208701612c80565b93969395505050506040820135916060013590565b60008060408385031215613064578182fd5b61306e8484612b80565b946020939093013593505050565b600080600080600060a08688031215613093578283fd5b853561309e816138b9565b9450602086013593506040860135925060608601356130bc816138df565b949793965091946080013592915050565b6000602082840312156130de578081fd5b8151612ae6816138d1565b6000602082840312156130fa578081fd5b81356001600160e01b031981168114612ae6578182fd5b600060208284031215613122578081fd5b813567ffffffffffffffff811115613138578182fd5b610a1084828501612c17565b60008060008060008060c0878903121561315c578384fd5b863567ffffffffffffffff811115613172578485fd5b61317e89828a01612c17565b9650506020870135945060408701359350606087013592506080870135915060a087013560ff811681146131b0578182fd5b809150509295509295509295565b6000602082840312156131cf578081fd5b612ae68383612c80565b6000602082840312156131ea578081fd5b5035919050565b600060208284031215613202578081fd5b5051919050565b60008060006060848603121561321d578081fd5b8335925061322e8560208601612c80565b915061323d8560408601612b80565b90509250925092565b6000806000806080858703121561325b578182fd5b8435935061326c8660208701612c80565b9250604085013591506132828660608701612b80565b905092959194509250565b600081518084526132a581602086016020860161388d565b601f01601f19169290920160200192915050565b600082516132cb81846020870161388d565b9190910192915050565b60008083546001808216600081146132f4576001811461330b5761333a565b60ff198316865260028304607f168601935061333a565b600283048786526020808720875b838110156133325781548a820152908501908201613319565b505050860193505b509195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611c659083018461328d565b6001600160a01b039290921682526001600160801b0316602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039490941684526001600160801b039290921660208401526040830152606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561345057603f1988860301845261343e85835161328d565b94509285019290850190600101613422565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561349557835183529284019291840191600101613479565b50909695505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b600060208252612ae6602083018461328d565b600060208083018184528285546001808216600081146134fb576001811461351957613551565b60028304607f16855260ff1983166040890152606088019350613551565b600283048086526135298a613881565b885b828110156135475781548b82016040015290840190880161352b565b8a01604001955050505b5091979650505050505050565b6020808252600a90820152691bdd995c881b1a5b5a5d60b21b604082015260600190565b6020808252600a908201526977726f6e67206e6f646560b01b604082015260600190565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6020808252601190820152701b9bd91948191bd95cdb9d08195e1a5cdd607a1b604082015260600190565b6020808252600a90820152690dcdee840cadcdeeaced60b31b604082015260600190565b602080825260099082015268696e697420646f6e6560b81b604082015260600190565b60208082526006908201526542524f4e5a4560d01b604082015260600190565b6020808252600c908201526b6e6f7420656c696769626c6560a01b604082015260600190565b6020808252601490820152731cd95c9d9a58d948191bd95cdb9d08195e1a5cdd60621b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252600a90820152693737ba1039ba30b5b2b960b11b604082015260600190565b6020808252600a90820152691b9bdd081cdd185ad95960b21b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260009082015260400190565b6020808252600990820152683737ba1030b236b4b760b91b604082015260600190565b6020808252600e908201526d185b1c9958591e481cdd185ad95960921b604082015260600190565b6001600160801b0391909116815260200190565b6001600160801b0393909316835260208301919091521515604082015260600190565b90815260200190565b9384526001600160801b0392909216602084015260408301526001600160a01b0316606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561387957600080fd5b604052919050565b60009081526020902090565b60005b838110156138a8578181015183820152602001613890565b83811115612a7e5750506000910152565b6001600160a01b03811681146138ce57600080fd5b50565b80151581146138ce57600080fd5b6001600160801b03811681146138ce57600080fdfea26469706673582212205664422864c57c13cee24cca7dfb3226fdeeaf3ee3bdc157cc00ec55ed58781e64736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106102885760003560e01c80639171ce711161015a578063c2c9b3c1116100c1578063da998dca1161007a578063da998dca146107e7578063ea6df596146107fc578063f23a6e611461081c578063f304e01d1461083c578063fc7ea8d11461085c578063fed0a20e1461087157610288565b8063c2c9b3c114610718578063c712d34a14610738578063cb4dd51e1461075a578063ccff148f1461077a578063d4a8c0821461079a578063d60444ff146107ba57610288565b8063ac3a760111610113578063ac3a760114610656578063ad553eef14610676578063b07d9cbb14610696578063b64ac8e4146106b6578063bc197c81146106d6578063c153dc0b1461070357610288565b80639171ce71146105965780639954a804146105b65780639f4808da146105d6578063a68b62e5146105f6578063a8306cf214610616578063a8936d591461063657610288565b8063359ef75b116101fe578063674edb72116101b7578063674edb72146104c957806368b087e8146104e957806372ab973f146105165780637760c6c71461053657806378592e7414610556578063916db6eb1461057657610288565b8063359ef75b1461041457806339e3aea214610434578063559b12fe146104475780635ab9daf0146104745780635ed44191146104945780636441d379146104b457610288565b80631f8e027b116102505780631f8e027b1461035f578063279958a91461037f57806329575f6a1461039f5780633183685b146103c157806331e410a8146103e1578063328f7233146103f457610288565b806301ffc9a71461028d578063048cde02146102c357806304dc6ada146102e55780631134aafe1461031257806313f9348414610332575b600080fd5b34801561029957600080fd5b506102ad6102a83660046130e9565b610886565b6040516102ba91906134a1565b60405180910390f35b3480156102cf57600080fd5b506102e36102de366004612f82565b6108a9565b005b3480156102f157600080fd5b50610305610300366004613111565b610950565b6040516102ba9190613816565b34801561031e57600080fd5b506102ad61032d366004613209565b61096d565b34801561033e57600080fd5b5061035261034d3660046131d9565b610a18565b6040516102ba91906134c1565b34801561036b57600080fd5b506102ad61037a3660046131d9565b610b76565b34801561038b57600080fd5b506102e361039a366004612c97565b610bfd565b3480156103ab57600080fd5b506103b4610c59565b6040516102ba9190613345565b3480156103cd57600080fd5b506103056103dc3660046131d9565b610c68565b6102e36103ef366004613209565b610c7a565b34801561040057600080fd5b506102ad61040f3660046131d9565b6112b9565b34801561042057600080fd5b506102e361042f366004612cb2565b6112f1565b6102e3610442366004613246565b6113a9565b34801561045357600080fd5b50610467610462366004612c97565b611824565b6040516102ba919061345d565b34801561048057600080fd5b5061035261048f3660046131d9565b611890565b3480156104a057600080fd5b506103056104af366004613052565b611936565b3480156104c057600080fd5b506103b4611964565b3480156104d557600080fd5b506103056104e4366004613111565b611973565b3480156104f557600080fd5b50610509610504366004613111565b611990565b6040516102ba919061384c565b34801561052257600080fd5b506103056105313660046131be565b6119b0565b34801561054257600080fd5b506102e3610551366004612c97565b6119c2565b34801561056257600080fd5b506103056105713660046131d9565b611a20565b34801561058257600080fd5b50610305610591366004612f0f565b611a6b565b3480156105a257600080fd5b506102e36105b1366004612fcf565b611a88565b3480156105c257600080fd5b506103056105d1366004612f0f565b611b17565b3480156105e257600080fd5b506103b46105f13660046131d9565b611b34565b34801561060257600080fd5b50610305610611366004612f43565b611b4f565b34801561062257600080fd5b506102ad610631366004612c97565b611c70565b34801561064257600080fd5b50610305610651366004613111565b611c84565b34801561066257600080fd5b50610305610671366004612dc5565b611ca1565b34801561068257600080fd5b506102e3610691366004612c97565b611cc4565b3480156106a257600080fd5b506103056106b136600461300f565b611d20565b3480156106c257600080fd5b506102e36106d1366004612c97565b612126565b3480156106e257600080fd5b506106f66106f1366004612d1b565b612181565b6040516102ba91906134ac565b34801561070f57600080fd5b506103b4612192565b34801561072457600080fd5b50610305610733366004613111565b6121a1565b34801561074457600080fd5b5061074d6121be565b6040516102ba91906133fd565b34801561076657600080fd5b506102e3610775366004613144565b612296565b34801561078657600080fd5b506102e3610795366004612e0f565b61249e565b3480156107a657600080fd5b506103056107b5366004612dc5565b6125fa565b3480156107c657600080fd5b506107da6107d53660046131d9565b61261d565b6040516102ba91906137df565b3480156107f357600080fd5b506103b4612638565b34801561080857600080fd5b506102e361081736600461307c565b612647565b34801561082857600080fd5b506106f6610837366004612eaa565b612950565b34801561084857600080fd5b506105096108573660046131d9565b612961565b34801561086857600080fd5b506103b4612976565b34801561087d57600080fd5b506102ad612985565b6001600160e01b031981166000908152600e602052604090205460ff165b919050565b6003546001600160a01b03166108bd612995565b6001600160a01b031614806108ec57506004546001600160a01b03166108e1612995565b6001600160a01b0316145b6109115760405162461bcd60e51b815260040161090890613794565b60405180910390fd5b6001600160a01b0393841660009081526016602090815260408083209490961682529283528481206001600160801b0390941681529290915291902055565b805160208183018101805160078252928201919093012091525481565b600061097882611c70565b80156109be575083600d600061098c612995565b6001600160a01b03168152602080820192909252604090810160009081206001600160801b0388168252909252902054145b80610a10575083601560006109d1612995565b6001600160a01b0390811682526020808301939093526040918201600090812091871681529083528181206001600160801b0388168252909252902054145b949350505050565b606060005b60055460ff82161015610b6057600660058260ff1681548110610a3c57fe5b90600052602060002001604051610a5391906132d5565b9081526020016040518091039020548310158015610aa85750600760058260ff1681548110610a7e57fe5b90600052602060002001604051610a9591906132d5565b9081526020016040518091039020548311155b15610b585760058160ff1681548110610abd57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610b4b5780601f10610b2057610100808354040283529160200191610b4b565b820191906000526020600020905b815481529060010190602001808311610b2e57829003601f168201915b50505050509150506108a4565b600101610a1d565b5050604080516020810190915260008152919050565b60025460405163328f723360e01b81526000916001600160a01b03169063328f723390610ba7908590600401613816565b60206040518083038186803b158015610bbf57600080fd5b505afa158015610bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf791906130cd565b92915050565b6004546001600160a01b0316610c11612995565b6001600160a01b031614610c375760405162461bcd60e51b815260040161090890613794565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6004546001600160a01b031681565b600c6020526000908152604090205481565b6060610c8584610a18565b9050604051602001610c9690613783565b6040516020818303038152906040528051906020012081604051602001610cbd91906134c1565b604051602081830303815290604052805190602001201415610cf15760405162461bcd60e51b81526004016109089061366f565b6001546001600160a01b031662fdd58e610d09612995565b866040518363ffffffff1660e01b8152600401610d279291906133b5565b60206040518083038186803b158015610d3f57600080fd5b505afa158015610d53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7791906131f1565b151580610e2e5750600154604051627eeac760e11b81526001600160a01b039091169062fdd58e90610daf90309088906004016133b5565b60206040518083038186803b158015610dc757600080fd5b505afa158015610ddb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dff91906131f1565b15801590610e2e5750610e10612995565b6000858152600a60205260409020546001600160a01b039081169116145b610e4a5760405162461bcd60e51b815260040161090890613608565b600f81604051610e5a91906132b9565b9081526040805160209281900383019020546000878152601090935291205460ff918216911610610e9d5760405162461bcd60e51b81526004016109089061355e565b6001600160a01b03821660009081526014602052604090205460ff16610ed55760405162461bcd60e51b815260040161090890613695565b816001600160a01b03166326665562610eec612995565b856040518363ffffffff1660e01b8152600401610f0a929190613393565b60206040518083038186803b158015610f2257600080fd5b505afa158015610f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5a91906130cd565b610f765760405162461bcd60e51b8152600401610908906135dd565b610f88610f81612995565b8484611b4f565b15610fa55760405162461bcd60e51b8152600401610908906137b7565b8360156000610fb2612995565b6001600160a01b0390811682526020808301939093526040918201600090812091871681529083528181206001600160801b0388168252909252902055610ff7612995565b6000858152600a6020526040812080546001600160a01b0319166001600160a01b0393909316929092179091554390601690611031612995565b6001600160a01b0390811682526020808301939093526040918201600090812091871681529083528181206001600160801b038816825283528181209390935586835260109091528120805460ff8082166001011660ff19909116179055805b6012600061109d612995565b6001600160a01b0316815260208101919091526040016000205460ff8216101561111e5785601260006110ce612995565b6001600160a01b03166001600160a01b031681526020019081526020016000208260ff16815481106110fc57fe5b90600052602060002001541415611116576001915061111e565b600101611091565b508061115f5760126000611130612995565b6001600160a01b0316815260208082019290925260400160009081208054600181018255908252919020018590555b600154604051627eeac760e11b81526001600160a01b039091169062fdd58e9061118f90309089906004016133b5565b60206040518083038186803b1580156111a757600080fd5b505afa1580156111bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111df91906131f1565b611264576001546001600160a01b031663f242432a6111fc612995565b604080516020810182526000815290516001600160e01b031960e085901b168152611231929130918b91600191600401613359565b600060405180830381600087803b15801561124b57600080fd5b505af115801561125f573d6000803e3d6000fd5b505050505b61126c612995565b6001600160a01b03167f2091db4757417ee6930004b3e4755720fdcb20ee7613e053f8effd4d173d3749868643876040516112aa949392919061381f565b60405180910390a25050505050565b6000818152600b60205260408120546001600160801b0316151580610bf757505060009081526010602052604090205460ff16151590565b600254600160a01b900460ff161561131b5760405162461bcd60e51b81526004016109089061362c565b61132b6301ffc9a760e01b612999565b61133b630271189760e51b612999565b600380546001600160a01b03199081166001600160a01b039485161790915560048054821692841692909217909155600080548216958316959095179094556001805485169382169390931790925560028054600160a01b9416919092161760ff60a01b1916919091179055565b6113b484848361096d565b6113d05760405162461bcd60e51b815260040161090890613582565b6000848152600a60205260409020546001600160a01b03166114045760405162461bcd60e51b81526004016109089061371e565b61140c612995565b6000858152600a60205260409020546001600160a01b039081169116146114455760405162461bcd60e51b8152600401610908906136fa565b6001600160a01b03811660009081526014602052604090205460ff1661147d5760405162461bcd60e51b815260040161090890613695565b806001600160a01b0316636c52ec10611494612995565b856040518363ffffffff1660e01b81526004016114b2929190613393565b60206040518083038186803b1580156114ca57600080fd5b505afa1580156114de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150291906130cd565b61156c57604051630e6507e960e21b81526001600160a01b038216906339941fa490349061153990879087906000906004016137f3565b6000604051808303818588803b15801561155257600080fd5b505af1158015611566573d6000803e3d6000fd5b50505050505b60006015600061157a612995565b6001600160a01b0390811682526020808301939093526040918201600090812091861681529083528181206001600160801b0388168252835281812093909355868352600b909152902080546001600160801b03191690556115db81611c70565b1561161f576000600d60006115ee612995565b6001600160a01b03168152602080820192909252604090810160009081206001600160801b03881682529092529020555b60008481526010602052604090205460ff161561165b576000848152601060205260409020805460ff19811660ff918216600019019091161790555b60008481526010602052604090205460ff166117d0576000848152600a6020526040812080546001600160a01b03191690555b6012600061169a612995565b6001600160a01b0316815260208101919091526040016000205460ff8216101561174f5784601260006116cb612995565b6001600160a01b03166001600160a01b031681526020019081526020016000208260ff16815481106116f957fe5b906000526020600020015414156117475761174260126000611719612995565b6001600160a01b03166001600160a01b031681526020019081526020016000208260ff166129e8565b61174f565b60010161168e565b506001546001600160a01b031663f242432a3061176a612995565b876001604051806020016040528060008152506040518663ffffffff1660e01b815260040161179d959493929190613359565b600060405180830381600087803b1580156117b757600080fd5b505af11580156117cb573d6000803e3d6000fd5b505050505b6117d8612995565b6001600160a01b03167f71d135e12a0a354469f06fae55d676e28a84fec8b3a2e61f0a5a0f3208e3b6ac85858585604051611816949392919061381f565b60405180910390a250505050565b6001600160a01b03811660009081526012602090815260409182902080548351818402810184019094528084526060939283018282801561188457602002820191906000526020600020905b815481526020019060010190808311611870575b50505050509050919050565b6005818154811061189d57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529350909183018282801561192e5780601f106119035761010080835404028352916020019161192e565b820191906000526020600020905b81548152906001019060200180831161191157829003601f168201915b505050505081565b6012602052816000526040600020818154811061194f57fe5b90600052602060002001600091509150505481565b6001546001600160a01b031681565b805160208183018101805160088252928201919093012091525481565b8051602081830181018051600f8252928201919093012091525460ff1681565b60116020526000908152604090205481565b6004546001600160a01b03166119d6612995565b6001600160a01b0316146119fc5760405162461bcd60e51b815260040161090890613794565b6001600160a01b03166000908152601460205260409020805460ff19166001179055565b60008181526010602052604081205460ff16600f611a3d84610a18565b604051611a4a91906132b9565b9081526040519081900360200190205460ff90811691909103169050919050565b601360209081526000928352604080842090915290825290205481565b6003546001600160a01b0316611a9c612995565b6001600160a01b03161480611acb57506004546001600160a01b0316611ac0612995565b6001600160a01b0316145b611ae75760405162461bcd60e51b815260040161090890613794565b6001600160a01b0390921660009081526013602090815260408083206001600160801b0390941683529290522055565b600d60209081526000928352604080842090915290825290205481565b600a602052600090815260409020546001600160a01b031681565b600080611b5b83611c70565b611b66576000611b94565b6001600160a01b0385166000908152600d602090815260408083206001600160801b03881684529091529020545b6001600160a01b038087166000908152601560209081526040808320888516845282528083206001600160801b038a168452909152808220546002549151630d06322560e21b81529495509391921690633418c89490611bfa908a908a90600401613393565b60206040518083038186803b158015611c1257600080fd5b505afa158015611c26573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c4a91906131f1565b905081611c635782611c5c5780611c5e565b825b611c65565b815b979650505050505050565b6000546001600160a01b0390811691161490565b805160208183018101805160068252928201919093012091525481565b601560209081526000938452604080852082529284528284209052825290205481565b6004546001600160a01b0316611cd8612995565b6001600160a01b031614611cfe5760405162461bcd60e51b815260040161090890613794565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600080611d2b612995565b6001600160a01b03811660009081526014602052604090205490915060ff16611d665760405162461bcd60e51b815260040161090890613695565b6000611d73878784611b4f565b90506060611d8082610a18565b9050604051602001611d9190613783565b6040516020818303038152906040528051906020012081604051602001611db891906134c1565b604051602081830303815290604052805190602001201415611de05760009350505050610a10565b6001600160a01b03808916600090815260166020908152604080832093871683529281528282206001600160801b038b168352905290812054611e95576001600160a01b03891660009081526013602090815260408083206001600160801b038c168452909152902054611e62576000838152600c6020526040902054611e90565b6001600160a01b03891660009081526013602090815260408083206001600160801b038c1684529091529020545b611ecd565b6001600160a01b03808a16600090815260166020908152604080832093881683529281528282206001600160801b038c168352905220545b90506000600983604051611ee191906132b9565b90815260200160405180910390205490506000888311611f015788611f03565b825b905081811015611f105750805b82158015611f675750604051602001611f289061364f565b6040516020818303038152906040528051906020012084604051602001611f4f91906134c1565b60405160208183030381529060405280519060200120145b15611fff5760025460405163b07d9cbb60e01b81526001600160a01b039091169063b07d9cbb90611fa2908e908e9086908e906004016133ce565b60206040518083038186803b158015611fba57600080fd5b505afa158015611fce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff291906131f1565b9650505050505050610a10565b846120135760009650505050505050610a10565b826120275760009650505050505050610a10565b8161203b5760009650505050505050610a10565b8781106120515760009650505050505050610a10565b600154604051627eeac760e11b81526001600160a01b039091169062fdd58e9061208190309089906004016133b5565b60206040518083038186803b15801561209957600080fd5b505afa1580156120ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120d191906131f1565b6120e45760009650505050505050610a10565b6121176008856040516120f791906132b9565b908152604051908190036020019020546121118a84612a84565b90612aac565b9b9a5050505050505050505050565b6004546001600160a01b031661213a612995565b6001600160a01b0316146121605760405162461bcd60e51b815260040161090890613794565b6001600160a01b03166000908152601460205260409020805460ff19169055565b63bc197c8160e01b95945050505050565b6002546001600160a01b031681565b805160208183018101805160098252928201919093012091525481565b60606005805480602002602001604051908101604052809291908181526020016000905b8282101561228d5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156122795780601f1061224e57610100808354040283529160200191612279565b820191906000526020600020905b81548152906001019060200180831161225c57829003601f168201915b5050505050815260200190600101906121e2565b50505050905090565b6003546001600160a01b03166122aa612995565b6001600160a01b031614806122d957506004546001600160a01b03166122ce612995565b6001600160a01b0316145b6122f55760405162461bcd60e51b815260040161090890613794565b6000805b60055460ff82161015612380578760405160200161231791906134c1565b6040516020818303038152906040528051906020012060058260ff168154811061233d57fe5b9060005260206000200160405160200161235791906134d4565b60405160208183030381529060405280519060200120141561237857600191505b6001016122f9565b50806123cb576005805460018101825560009190915287516123c9917f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0019060208a0190612aed565b505b856006886040516123dc91906132b9565b908152602001604051809103902081905550846007886040516123ff91906132b9565b9081526020016040518091039020819055508360088860405161242291906132b9565b908152604051908190036020019020558261243d574361243f565b825b60098860405161244f91906132b9565b90815260200160405180910390208190555081600f8860405161247291906132b9565b908152604051908190036020019020805460ff9290921660ff1990921691909117905550505050505050565b6003546001600160a01b03166124b2612995565b6001600160a01b031614806124e157506004546001600160a01b03166124d6612995565b6001600160a01b0316145b6124fd5760405162461bcd60e51b815260040161090890613794565b6000858152600a6020908152604080832080546001600160a01b0319166001600160a01b038c1617905560109091529020805460ff191660ff8516179055811561258d576000858152600b6020908152604080832080546001600160801b0319166001600160801b038b169081179091556001600160a01b038b168452600d835281842090845290915290208590555b80156125f0576001600160a01b038088166000818152601560209081526040808320948d168084529482528083206001600160801b038c168085529083528184208b90559383526016825280832094835293815283822092825291909152208490555b5050505050505050565b601660209081526000938452604080852082529284528284209052825290205481565b600b602052600090815260409020546001600160801b031681565b6003546001600160a01b031681565b6003546001600160a01b031661265b612995565b6001600160a01b0316148061268a57506004546001600160a01b031661267f612995565b6001600160a01b0316145b6126a65760405162461bcd60e51b815260040161090890613794565b600080546001600160a01b038781168352601560209081526040808520929093168085529181528284206001600160801b03871685529052912054851480156128e9576000868152600b6020908152604080832080546001600160801b03191690556001600160a01b038a168352600d82528083206001600160801b03881684528252808320839055888352601090915290205460ff1615612767576000868152601060205260409020805460ff19811660ff918216600019019091161790555b60008681526010602052604090205460ff166128a1576000868152600a6020526040812080546001600160a01b03191690555b6001600160a01b03881660009081526012602052604090205460ff8216101561282a576001600160a01b0388166000908152601260205260409020805488919060ff84169081106127e757fe5b90600052602060002001541415612822576001600160a01b038816600090815260126020526040902061281d9060ff83166129e8565b61282a565b60010161279a565b506001805460408051602081018252600081529051637921219560e11b81526001600160a01b039092169263f242432a9261286e9230928d928d9290600401613359565b600060405180830381600087803b15801561288857600080fd5b505af115801561289c573d6000803e3d6000fd5b505050505b866001600160a01b03167f71d135e12a0a354469f06fae55d676e28a84fec8b3a2e61f0a5a0f3208e3b6ac878643866040516128e0949392919061381f565b60405180910390a25b506001600160a01b039586166000818152601560209081526040808320949099168083529381528882206001600160801b03909616808352958152888220969096559081526016855286812091815290845285812092815291909252929092209190915550565b63f23a6e6160e01b95945050505050565b60106020526000908152604090205460ff1681565b6000546001600160a01b031681565b600254600160a01b900460ff1681565b3390565b6001600160e01b031980821614156129c35760405162461bcd60e51b8152600401610908906135a6565b6001600160e01b0319166000908152600e60205260409020805460ff19166001179055565b81546000906129f8906001612a84565b90506000838281548110612a0857fe5b9060005260206000200154905081831415612a425783805480612a2757fe5b60019003818190600052602060002001600090559055612a7e565b80848481548110612a4f57fe5b906000526020600020018190555083805480612a6757fe5b600190038181906000526020600020016000905590555b50505050565b600082821115612aa65760405162461bcd60e51b8152600401610908906136c3565b50900390565b600082612abb57506000610bf7565b82820282848281612ac857fe5b0414612ae65760405162461bcd60e51b815260040161090890613742565b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612b2e57805160ff1916838001178555612b5b565b82800160010185558215612b5b579182015b82811115612b5b578251825591602001919060010190612b40565b50612b67929150612b6b565b5090565b5b80821115612b675760008155600101612b6c565b80356001600160a01b0381168114610bf757600080fd5b600082601f830112612ba7578081fd5b813567ffffffffffffffff811115612bbd578182fd5b6020808202612bcd82820161385a565b83815293508184018583018287018401881015612be957600080fd5b600092505b84831015612c0c578035825260019290920191908301908301612bee565b505050505092915050565b600082601f830112612c27578081fd5b813567ffffffffffffffff811115612c3d578182fd5b612c50601f8201601f191660200161385a565b9150808252836020828501011115612c6757600080fd5b8060208401602084013760009082016020015292915050565b80356001600160801b0381168114610bf757600080fd5b600060208284031215612ca8578081fd5b612ae68383612b80565b600080600080600060a08688031215612cc9578081fd5b612cd38787612b80565b9450612ce28760208801612b80565b9350612cf18760408801612b80565b9250612d008760608801612b80565b9150612d0f8760808801612b80565b90509295509295909350565b600080600080600060a08688031215612d32578081fd5b8535612d3d816138b9565b94506020860135612d4d816138b9565b9350604086013567ffffffffffffffff80821115612d69578283fd5b612d7589838a01612b97565b94506060880135915080821115612d8a578283fd5b612d9689838a01612b97565b93506080880135915080821115612dab578283fd5b50612db888828901612c17565b9150509295509295909350565b600080600060608486031215612dd9578283fd5b8335612de4816138b9565b92506020840135612df4816138b9565b91506040840135612e04816138df565b809150509250925092565b600080600080600080600080610100898b031215612e2b578283fd5b8835612e36816138b9565b97506020890135612e46816138b9565b96506040890135612e56816138df565b9550606089013594506080890135935060a089013560ff81168114612e79578384fd5b925060c0890135612e89816138d1565b915060e0890135612e99816138d1565b809150509295985092959890939650565b600080600080600060a08688031215612ec1578081fd5b612ecb8787612b80565b9450612eda8760208801612b80565b93506040860135925060608601359150608086013567ffffffffffffffff811115612f03578182fd5b612db888828901612c17565b60008060408385031215612f21578182fd5b612f2b8484612b80565b9150612f3a8460208501612c80565b90509250929050565b600080600060608486031215612f57578081fd5b8335612f62816138b9565b92506020840135612f72816138df565b91506040840135612e04816138b9565b60008060008060808587031215612f97578182fd5b612fa18686612b80565b9350612fb08660208701612c80565b9250612fbf8660408701612b80565b9396929550929360600135925050565b600080600060608486031215612fe3578081fd5b8335612fee816138b9565b92506020840135612ffe816138df565b929592945050506040919091013590565b60008060008060808587031215613024578182fd5b61302e8686612b80565b935061303d8660208701612c80565b93969395505050506040820135916060013590565b60008060408385031215613064578182fd5b61306e8484612b80565b946020939093013593505050565b600080600080600060a08688031215613093578283fd5b853561309e816138b9565b9450602086013593506040860135925060608601356130bc816138df565b949793965091946080013592915050565b6000602082840312156130de578081fd5b8151612ae6816138d1565b6000602082840312156130fa578081fd5b81356001600160e01b031981168114612ae6578182fd5b600060208284031215613122578081fd5b813567ffffffffffffffff811115613138578182fd5b610a1084828501612c17565b60008060008060008060c0878903121561315c578384fd5b863567ffffffffffffffff811115613172578485fd5b61317e89828a01612c17565b9650506020870135945060408701359350606087013592506080870135915060a087013560ff811681146131b0578182fd5b809150509295509295509295565b6000602082840312156131cf578081fd5b612ae68383612c80565b6000602082840312156131ea578081fd5b5035919050565b600060208284031215613202578081fd5b5051919050565b60008060006060848603121561321d578081fd5b8335925061322e8560208601612c80565b915061323d8560408601612b80565b90509250925092565b6000806000806080858703121561325b578182fd5b8435935061326c8660208701612c80565b9250604085013591506132828660608701612b80565b905092959194509250565b600081518084526132a581602086016020860161388d565b601f01601f19169290920160200192915050565b600082516132cb81846020870161388d565b9190910192915050565b60008083546001808216600081146132f4576001811461330b5761333a565b60ff198316865260028304607f168601935061333a565b600283048786526020808720875b838110156133325781548a820152908501908201613319565b505050860193505b509195945050505050565b6001600160a01b0391909116815260200190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611c659083018461328d565b6001600160a01b039290921682526001600160801b0316602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039490941684526001600160801b039290921660208401526040830152606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561345057603f1988860301845261343e85835161328d565b94509285019290850190600101613422565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561349557835183529284019291840191600101613479565b50909695505050505050565b901515815260200190565b6001600160e01b031991909116815260200190565b600060208252612ae6602083018461328d565b600060208083018184528285546001808216600081146134fb576001811461351957613551565b60028304607f16855260ff1983166040890152606088019350613551565b600283048086526135298a613881565b885b828110156135475781548b82016040015290840190880161352b565b8a01604001955050505b5091979650505050505050565b6020808252600a90820152691bdd995c881b1a5b5a5d60b21b604082015260600190565b6020808252600a908201526977726f6e67206e6f646560b01b604082015260600190565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6020808252601190820152701b9bd91948191bd95cdb9d08195e1a5cdd607a1b604082015260600190565b6020808252600a90820152690dcdee840cadcdeeaced60b31b604082015260600190565b602080825260099082015268696e697420646f6e6560b81b604082015260600190565b60208082526006908201526542524f4e5a4560d01b604082015260600190565b6020808252600c908201526b6e6f7420656c696769626c6560a01b604082015260600190565b6020808252601490820152731cd95c9d9a58d948191bd95cdb9d08195e1a5cdd60621b604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b6020808252600a90820152693737ba1039ba30b5b2b960b11b604082015260600190565b6020808252600a90820152691b9bdd081cdd185ad95960b21b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260009082015260400190565b6020808252600990820152683737ba1030b236b4b760b91b604082015260600190565b6020808252600e908201526d185b1c9958591e481cdd185ad95960921b604082015260600190565b6001600160801b0391909116815260200190565b6001600160801b0393909316835260208301919091521515604082015260600190565b90815260200190565b9384526001600160801b0392909216602084015260408301526001600160a01b0316606082015260800190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561387957600080fd5b604052919050565b60009081526020902090565b60005b838110156138a8578181015183820152602001613890565b83811115612a7e5750506000910152565b6001600160a01b03811681146138ce57600080fd5b50565b80151581146138ce57600080fd5b6001600160801b03811681146138ce57600080fdfea26469706673582212205664422864c57c13cee24cca7dfb3226fdeeaf3ee3bdc157cc00ec55ed58781e64736f6c634300060c0033
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.