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 | 14968624 | 893 days ago | IN | 0 ETH | 0.23729718 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StrongNFTPackBonusV2
Compiler Version
v0.8.9+commit.e5eed63a
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: Unlicensed pragma solidity 0.8.9; import "./interfaces/IERC1155Preset.sol"; import "./interfaces/INodePackV3.sol"; import "./lib/SafeMath.sol"; import "./lib/ERC1155Receiver.sol"; import "./lib/AdminAccess.sol"; contract StrongNFTPackBonusV2 is AdminAccess { event Staked(address indexed entity, uint tokenId, uint packType, uint timestamp); event Unstaked(address indexed entity, uint tokenId, uint packType, uint timestamp); event SetPackTypeNFTBonus(uint packType, string bonusName, uint value); IERC1155Preset public CERC1155; INodePackV3 public nodePack; bool public initDone; mapping(bytes4 => bool) private _supportedInterfaces; string[] public nftBonusNames; mapping(string => uint) public nftBonusLowerBound; mapping(string => uint) public nftBonusUpperBound; mapping(string => uint) public nftBonusEffectiveAt; mapping(string => uint) public nftBonusNodesLimit; mapping(uint => mapping(string => uint)) public packTypeNFTBonus; mapping(uint => address) public nftIdStakedToEntity; mapping(uint => uint) public nftIdStakedToPackType; mapping(address => uint[]) public entityStakedNftIds; mapping(bytes => uint[]) public entityPackStakedNftIds; mapping(bytes => uint) public entityPackStakedAt; mapping(bytes => uint) public entityPackBonusSaved; function init(address _nftContract) external onlyRole(adminControl.SUPER_ADMIN()) { require(initDone == false, "init done"); _registerInterface(0x01ffc9a7); _registerInterface( ERC1155Receiver(address(0)).onERC1155Received.selector ^ ERC1155Receiver(address(0)).onERC1155BatchReceived.selector ); CERC1155 = IERC1155Preset(_nftContract); initDone = true; } // // Getters // ------------------------------------------------------------------------------------------------------------------- function isNftStaked(uint _nftId) public view returns (bool) { return nftIdStakedToPackType[_nftId] != 0; } function getStakedNftIds(address _entity) public view returns (uint[] memory) { return entityStakedNftIds[_entity]; } function getPackStakedNftIds(address _entity, uint _packType) public view returns (uint[] memory) { bytes memory id = nodePack.getPackId(_entity, _packType); return entityPackStakedNftIds[id]; } function getNftBonusNames() public view returns (string[] memory) { return nftBonusNames; } function getNftBonusNodesLimit(uint _nftId) public view returns (uint) { return nftBonusNodesLimit[getNftBonusName(_nftId)]; } function getNftBonusName(uint _nftId) public view returns (string memory) { for (uint i = 0; i < nftBonusNames.length; i++) { if (_nftId >= nftBonusLowerBound[nftBonusNames[i]] && _nftId <= nftBonusUpperBound[nftBonusNames[i]]) { return nftBonusNames[i]; } } return ""; } function getNftBonusValue(uint _packType, string memory _bonusName) public view returns (uint) { return packTypeNFTBonus[_packType][_bonusName] > 0 ? packTypeNFTBonus[_packType][_bonusName] : packTypeNFTBonus[0][_bonusName]; } function getBonus(address _entity, uint _packType, uint _from, uint _to) public view returns (uint) { uint[] memory nftIds = getPackStakedNftIds(_entity, _packType); if (nftIds.length == 0) return 0; bytes memory id = nodePack.getPackId(_entity, _packType); if (entityPackStakedAt[id] == 0) return 0; uint bonus = entityPackBonusSaved[id]; string memory bonusName = ""; uint startFrom = 0; uint nftNodeLimitCount = 0; uint boostedNodesCount = 0; uint entityPackTotalNodeCount = nodePack.getEntityPackActiveNodeCount(_entity, _packType); for (uint i = 0; i < nftIds.length; i++) { if (boostedNodesCount >= entityPackTotalNodeCount) break; bonusName = getNftBonusName(nftIds[i]); if (keccak256(abi.encode(bonusName)) == keccak256(abi.encode(""))) return 0; if (nftBonusEffectiveAt[bonusName] == 0) continue; if (CERC1155.balanceOf(address(this), nftIds[i]) == 0) continue; nftNodeLimitCount = getNftBonusNodesLimit(nftIds[i]); if (boostedNodesCount + nftNodeLimitCount > entityPackTotalNodeCount) { nftNodeLimitCount = entityPackTotalNodeCount - boostedNodesCount; } boostedNodesCount += nftNodeLimitCount; startFrom = entityPackStakedAt[id] > _from ? entityPackStakedAt[id] : _from; if (startFrom < nftBonusEffectiveAt[bonusName]) { startFrom = nftBonusEffectiveAt[bonusName]; } if (startFrom >= _to) continue; bonus += (_to - startFrom) * getNftBonusValue(_packType, bonusName) * nftNodeLimitCount; } return bonus; } // // Staking // ------------------------------------------------------------------------------------------------------------------- function stakeNFT(uint _nftId, uint _packType) public payable { string memory bonusName = getNftBonusName(_nftId); require(keccak256(abi.encode(bonusName)) != keccak256(abi.encode("")), "not eligible"); require(CERC1155.balanceOf(msg.sender, _nftId) != 0, "not enough"); require(nftIdStakedToEntity[_nftId] == address(0), "already staked"); require(nodePack.doesPackExist(msg.sender, _packType), "pack doesnt exist"); bytes memory id = nodePack.getPackId(msg.sender, _packType); entityPackBonusSaved[id] = getBonus(msg.sender, _packType, entityPackStakedAt[id], block.timestamp); nftIdStakedToPackType[_nftId] = _packType; nftIdStakedToEntity[_nftId] = msg.sender; entityPackStakedAt[id] = block.timestamp; entityStakedNftIds[msg.sender].push(_nftId); entityPackStakedNftIds[id].push(_nftId); CERC1155.safeTransferFrom(msg.sender, address(this), _nftId, 1, bytes("")); emit Staked(msg.sender, _nftId, _packType, block.timestamp); } function unStakeNFT(uint _nftId, uint _packType, uint _timestamp) public { require(nftIdStakedToEntity[_nftId] != address(0), "not staked"); require(nftIdStakedToEntity[_nftId] == msg.sender, "not staker"); require(nftIdStakedToPackType[_nftId] == _packType, "wrong pack"); nodePack.updatePackState(msg.sender, _packType); bytes memory id = nodePack.getPackId(msg.sender, _packType); nftIdStakedToPackType[_nftId] = 0; nftIdStakedToEntity[_nftId] = address(0); for (uint i = 0; i < entityStakedNftIds[msg.sender].length; i++) { if (entityStakedNftIds[msg.sender][i] == _nftId) { _deleteIndex(entityStakedNftIds[msg.sender], i); break; } } for (uint i = 0; i < entityPackStakedNftIds[id].length; i++) { if (entityPackStakedNftIds[id][i] == _nftId) { _deleteIndex(entityPackStakedNftIds[id], i); break; } } CERC1155.safeTransferFrom(address(this), msg.sender, _nftId, 1, bytes("")); emit Unstaked(msg.sender, _nftId, _packType, _timestamp); } // // Admin // ------------------------------------------------------------------------------------------------------------------- function updateBonus(string memory _name, uint _lowerBound, uint _upperBound, uint _effectiveAt, uint _nodesLimit) public onlyRole(adminControl.SERVICE_ADMIN()) { bool alreadyExists = false; for (uint 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; nftBonusEffectiveAt[_name] = _effectiveAt != 0 ? _effectiveAt : block.timestamp; nftBonusNodesLimit[_name] = _nodesLimit; } function setPackTypeNFTBonus(uint _packType, string memory _bonusName, uint _value) external onlyRole(adminControl.SERVICE_ADMIN()) { packTypeNFTBonus[_packType][_bonusName] = _value; emit SetPackTypeNFTBonus(_packType, _bonusName, _value); } function updateNftContract(address _nftContract) external onlyRole(adminControl.SUPER_ADMIN()) { CERC1155 = IERC1155Preset(_nftContract); } function updateNodePackContract(address _contract) external onlyRole(adminControl.SUPER_ADMIN()) { nodePack = INodePackV3(_contract); } function updateEntityPackStakedAt(address _entity, uint _packType, uint _timestamp) public onlyRole(adminControl.SERVICE_ADMIN()) { bytes memory id = nodePack.getPackId(_entity, _packType); entityPackStakedAt[id] = _timestamp; } function setEntityPackBonusSaved(address _entity, uint _packType) external { require(msg.sender == address(nodePack), "not allowed"); bytes memory id = nodePack.getPackId(_entity, _packType); entityPackBonusSaved[id] = getBonus(_entity, _packType, entityPackStakedAt[id], block.timestamp); entityPackStakedAt[id] = block.timestamp; } function resetEntityPackBonusSaved(bytes memory _packId) external { require(msg.sender == address(nodePack), "not allowed"); entityPackBonusSaved[_packId] = 0; } // // ERC1155 support // ------------------------------------------------------------------------------------------------------------------- function onERC1155Received(address, address, uint, uint, bytes memory) public virtual returns (bytes4) { return this.onERC1155Received.selector; } function onERC1155BatchReceived(address, address, uint[] memory, uint[] 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(uint[] storage array, uint index) internal { uint lastIndex = array.length - 1; uint lastEntry = array[lastIndex]; if (index == lastIndex) { array.pop(); } else { array[index] = lastEntry; array.pop(); } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; /** * @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.0; interface INodePackV3 { function doesPackExist(address entity, uint packId) external view returns (bool); function hasPackExpired(address entity, uint packId) external view returns (bool); function claim(uint packId, uint timestamp, address toStrongPool) external payable returns (uint); // function getBonusAt(address _entity, uint _packType, uint _timestamp) external view returns (uint); function getPackId(address _entity, uint _packType) external pure returns (bytes memory); function getEntityPackTotalNodeCount(address _entity, uint _packType) external view returns (uint); function getEntityPackActiveNodeCount(address _entity, uint _packType) external view returns (uint); function migrateNodes(address _entity, uint _nodeType, uint _nodeCount, uint _lastPaidAt, uint _rewardsDue, uint _totalClaimed) external returns (bool); // function addPackRewardDue(address _entity, uint _packType, uint _rewardDue) external; function updatePackState(address _entity, uint _packType) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; /** * @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.9; import "../interfaces/IERC1155Receiver.sol"; import "./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; import "../interfaces/IAdminControl.sol"; abstract contract AdminAccess { IAdminControl public adminControl; modifier onlyRole(uint8 _role) { require(address(adminControl) == address(0) || adminControl.hasRole(_role, msg.sender), "no access"); _; } function addAdminControlContract(IAdminControl _contract) external onlyRole(0) { adminControl = _contract; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <=0.8.9; import "./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.9; import "../interfaces/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.9; /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; interface IAdminControl { function hasRole(uint8 _role, address _account) external view returns (bool); function SUPER_ADMIN() external view returns (uint8); function ADMIN() external view returns (uint8); function SERVICE_ADMIN() external view returns (uint8); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"packType","type":"uint256"},{"indexed":false,"internalType":"string","name":"bonusName","type":"string"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"SetPackTypeNFTBonus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"packType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"entity","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"packType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"CERC1155","outputs":[{"internalType":"contract IERC1155Preset","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IAdminControl","name":"_contract","type":"address"}],"name":"addAdminControlContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminControl","outputs":[{"internalType":"contract IAdminControl","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityPackBonusSaved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"entityPackStakedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"entityPackStakedNftIds","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":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"},{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","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":"getNftBonusNodesLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"},{"internalType":"string","name":"_bonusName","type":"string"}],"name":"getNftBonusValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"getPackStakedNftIds","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":"_nftContract","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initDone","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":"string","name":"","type":"string"}],"name":"nftBonusEffectiveAt","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":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"nftBonusUpperBound","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":"nftIdStakedToPackType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nodePack","outputs":[{"internalType":"contract INodePackV3","name":"","type":"address"}],"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":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"name":"packTypeNFTBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_packId","type":"bytes"}],"name":"resetEntityPackBonusSaved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"setEntityPackBonusSaved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_packType","type":"uint256"},{"internalType":"string","name":"_bonusName","type":"string"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setPackTypeNFTBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nftId","type":"uint256"},{"internalType":"uint256","name":"_packType","type":"uint256"}],"name":"stakeNFT","outputs":[],"stateMutability":"payable","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":"uint256","name":"_packType","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"unStakeNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_lowerBound","type":"uint256"},{"internalType":"uint256","name":"_upperBound","type":"uint256"},{"internalType":"uint256","name":"_effectiveAt","type":"uint256"},{"internalType":"uint256","name":"_nodesLimit","type":"uint256"}],"name":"updateBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_entity","type":"address"},{"internalType":"uint256","name":"_packType","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"updateEntityPackStakedAt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_nftContract","type":"address"}],"name":"updateNftContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"updateNodePackContract","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613416806100206000396000f3fe6080604052600436106102255760003560e01c8063771194a711610123578063c712d34a116100ab578063ea463e7e1161006f578063ea463e7e14610797578063f16358a7146107b7578063f23a6e6114610800578063f4888a211461082c578063fed0a20e1461084c57600080fd5b8063c712d34a146106f5578063da39fe4414610717578063e8de1d0514610737578063e94d59dc14610757578063e9d7bd4c1461077757600080fd5b8063958434d2116100f2578063958434d2146105f55780639f4808da14610615578063a8936d591461064b578063bc197c8114610683578063c3326133146106c857600080fd5b8063771194a71461057557806378dba594146105955780637a0b9255146105b557806392e67c06146105d557600080fd5b8063559b12fe116101b157806360b5abe21161017557806360b5abe2146104bd5780636306cf38146104dd5780636441d379146104fd57806367b461351461051d57806368b087e81461053d57600080fd5b8063559b12fe146103f85780635806b6ae146104255780635ab9daf01461045d5780635ed441911461047d578063605c92781461049d57600080fd5b806324013560116101f8578063240135601461030e578063328f723314610346578063464cc0191461037557806351cecc80146103ad578063555d3e63146103c057600080fd5b806301ffc9a71461022a57806304dc6ada1461027957806313f93484146102bf57806319ab453c146102ec575b600080fd5b34801561023657600080fd5b50610264610245366004612a1a565b6001600160e01b03191660009081526003602052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561028557600080fd5b506102b1610294366004612b09565b805160208183018101805160068252928201919093012091525481565b604051908152602001610270565b3480156102cb57600080fd5b506102df6102da366004612b3e565b61086d565b6040516102709190612baf565b3480156102f857600080fd5b5061030c610307366004612bda565b6109db565b005b34801561031a57600080fd5b506102b1610329366004612b09565b805160208183018101805160078252928201919093012091525481565b34801561035257600080fd5b50610264610361366004612b3e565b6000908152600b6020526040902054151590565b34801561038157600080fd5b506102b1610390366004612b09565b8051602081830181018051600f8252928201919093012091525481565b61030c6103bb366004612bf7565b610bb6565b3480156103cc57600080fd5b506000546103e0906001600160a01b031681565b6040516001600160a01b039091168152602001610270565b34801561040457600080fd5b50610418610413366004612bda565b61105d565b6040516102709190612c19565b34801561043157600080fd5b506102b1610440366004612b09565b8051602081830181018051600e8252928201919093012091525481565b34801561046957600080fd5b506102df610478366004612b3e565b6110c9565b34801561048957600080fd5b506102b1610498366004612c5d565b611175565b3480156104a957600080fd5b5061030c6104b8366004612c89565b6111a6565b3480156104c957600080fd5b506102b16104d8366004612b3e565b611350565b3480156104e957600080fd5b5061030c6104f8366004612cd9565b611380565b34801561050957600080fd5b506001546103e0906001600160a01b031681565b34801561052957600080fd5b5061030c610538366004612c5d565b611566565b34801561054957600080fd5b506102b1610558366004612b09565b805160208183018101805160088252928201919093012091525481565b34801561058157600080fd5b506002546103e0906001600160a01b031681565b3480156105a157600080fd5b5061030c6105b0366004612d0e565b611694565b3480156105c157600080fd5b5061030c6105d0366004612bda565b611a78565b3480156105e157600080fd5b5061030c6105f0366004612bda565b611b4d565b34801561060157600080fd5b506102b1610610366004612d3a565b611ca5565b34801561062157600080fd5b506103e0610630366004612b3e565b600a602052600090815260409020546001600160a01b031681565b34801561065757600080fd5b506102b1610666366004612b09565b805160208183018101805160058252928201919093012091525481565b34801561068f57600080fd5b506106af61069e366004612df5565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610270565b3480156106d457600080fd5b506102b16106e3366004612b3e565b600b6020526000908152604090205481565b34801561070157600080fd5b5061070a612120565b6040516102709190612ea3565b34801561072357600080fd5b506102b1610732366004612f05565b6121f9565b34801561074357600080fd5b5061030c610752366004612f4a565b612224565b34801561076357600080fd5b506102b1610772366004612fa7565b6124d6565b34801561078357600080fd5b50610418610792366004612c5d565b61258a565b3480156107a357600080fd5b5061030c6107b2366004612bda565b612688565b3480156107c357600080fd5b506102b16107d2366004612fa7565b6009602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b34801561080c57600080fd5b506106af61081b366004612fee565b63f23a6e6160e01b95945050505050565b34801561083857600080fd5b5061030c610847366004612b09565b6127e0565b34801561085857600080fd5b5060025461026490600160a01b900460ff1681565b606060005b6004548110156109c55760056004828154811061089157610891613057565b906000526020600020016040516108a891906130a8565b908152602001604051809103902054831015801561090057506006600482815481106108d6576108d6613057565b906000526020600020016040516108ed91906130a8565b9081526020016040518091039020548311155b156109b3576004818154811061091857610918613057565b90600052602060002001805461092d9061306d565b80601f01602080910402602001604051908101604052809291908181526020018280546109599061306d565b80156109a65780601f1061097b576101008083540402835291602001916109a6565b820191906000526020600020905b81548152906001019060200180831161098957829003601f168201915b5050505050915050919050565b806109bd81613130565b915050610872565b5050604080516020810190915260008152919050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a2757600080fd5b505afa158015610a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5f919061314b565b6000546001600160a01b03161580610af45750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690610aa4908490339060040161316e565b60206040518083038186803b158015610abc57600080fd5b505afa158015610ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af4919061318a565b610b195760405162461bcd60e51b8152600401610b10906131ac565b60405180910390fd5b600254600160a01b900460ff1615610b5f5760405162461bcd60e51b8152602060048201526009602482015268696e697420646f6e6560b81b6044820152606401610b10565b610b6f6301ffc9a760e01b61284d565b610b7f630271189760e51b61284d565b50600180546001600160a01b039092166001600160a01b03199092169190911790556002805460ff60a01b1916600160a01b179055565b6000610bc18361086d565b9050604051602001610bde90602080825260009082015260400190565b6040516020818303038152906040528051906020012081604051602001610c059190612baf565b604051602081830303815290604052805190602001201415610c585760405162461bcd60e51b815260206004820152600c60248201526b6e6f7420656c696769626c6560a01b6044820152606401610b10565b600154604051627eeac760e11b81526001600160a01b039091169062fdd58e90610c8890339087906004016131cf565b60206040518083038186803b158015610ca057600080fd5b505afa158015610cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd891906131e8565b610d115760405162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b6044820152606401610b10565b6000838152600a60205260409020546001600160a01b031615610d675760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481cdd185ad95960921b6044820152606401610b10565b60025460405163235d561d60e11b81526001600160a01b03909116906346baac3a90610d9990339086906004016131cf565b60206040518083038186803b158015610db157600080fd5b505afa158015610dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de9919061318a565b610e295760405162461bcd60e51b81526020600482015260116024820152701c1858dac8191bd95cdb9d08195e1a5cdd607a1b6044820152606401610b10565b600254604051631691e08560e31b81526000916001600160a01b03169063b48f042890610e5c90339087906004016131cf565b60006040518083038186803b158015610e7457600080fd5b505afa158015610e88573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610eb09190810190613201565b9050610edc3384600e84604051610ec79190613278565b90815260200160405180910390205442611ca5565b600f82604051610eec9190613278565b908152604080519182900360209081018320939093556000878152600b8452818120879055600a90935290912080546001600160a01b031916331790554290600e90610f39908490613278565b908152604080516020928190038301812093909355336000908152600c8352908120805460018101825590825291902001859055600d90610f7b908390613278565b90815260408051602092819003830181208054600180820183556000928352858320909101899055805494830184529082529151637921219560e11b81526001600160a01b039093169263f242432a92610fdf92339230928b929091600401613294565b600060405180830381600087803b158015610ff957600080fd5b505af115801561100d573d6000803e3d6000fd5b5050604080518781526020810187905242918101919091523392507fb4caaf29adda3eefee3ad552a8e85058589bf834c7466cae4ee58787f70589ed91506060015b60405180910390a250505050565b6001600160a01b0381166000908152600c60209081526040918290208054835181840281018401909452808452606093928301828280156110bd57602002820191906000526020600020905b8154815260200190600101908083116110a9575b50505050509050919050565b600481815481106110d957600080fd5b9060005260206000200160009150905080546110f49061306d565b80601f01602080910402602001604051908101604052809291908181526020018280546111209061306d565b801561116d5780601f106111425761010080835404028352916020019161116d565b820191906000526020600020905b81548152906001019060200180831161115057829003601f168201915b505050505081565b600c602052816000526040600020818154811061119157600080fd5b90600052602060002001600091509150505481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111f257600080fd5b505afa158015611206573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122a919061314b565b6000546001600160a01b031615806112bf5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f69061126f908490339060040161316e565b60206040518083038186803b15801561128757600080fd5b505afa15801561129b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bf919061318a565b6112db5760405162461bcd60e51b8152600401610b10906131ac565b8160096000868152602001908152602001600020846040516112fd9190613278565b9081526020016040518091039020819055507f90527546a008f3f5b4660a7de25fa1f748559a44ee9b7a37f449ca74070a41a9848484604051611342939291906132ce565b60405180910390a150505050565b6000600861135d8361086d565b60405161136a9190613278565b9081526020016040518091039020549050919050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113cc57600080fd5b505afa1580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611404919061314b565b6000546001600160a01b031615806114995750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611449908490339060040161316e565b60206040518083038186803b15801561146157600080fd5b505afa158015611475573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611499919061318a565b6114b55760405162461bcd60e51b8152600401610b10906131ac565b600254604051631691e08560e31b81526000916001600160a01b03169063b48f0428906114e890889088906004016131cf565b60006040518083038186803b15801561150057600080fd5b505afa158015611514573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261153c9190810190613201565b905082600e8260405161154f9190613278565b908152604051908190036020019020555050505050565b6002546001600160a01b031633146115ae5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b6044820152606401610b10565b600254604051631691e08560e31b81526000916001600160a01b03169063b48f0428906115e190869086906004016131cf565b60006040518083038186803b1580156115f957600080fd5b505afa15801561160d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116359190810190613201565b905061164c8383600e84604051610ec79190613278565b600f8260405161165c9190613278565b90815260200160405180910390208190555042600e8260405161167f9190613278565b90815260405190819003602001902055505050565b6000838152600a60205260409020546001600160a01b03166116e55760405162461bcd60e51b815260206004820152600a6024820152691b9bdd081cdd185ad95960b21b6044820152606401610b10565b6000838152600a60205260409020546001600160a01b031633146117385760405162461bcd60e51b815260206004820152600a6024820152693737ba1039ba30b5b2b960b11b6044820152606401610b10565b6000838152600b602052604090205482146117825760405162461bcd60e51b815260206004820152600a60248201526977726f6e67207061636b60b01b6044820152606401610b10565b600254604051631405860b60e21b81526001600160a01b0390911690635016182c906117b490339086906004016131cf565b600060405180830381600087803b1580156117ce57600080fd5b505af11580156117e2573d6000803e3d6000fd5b5050600254604051631691e08560e31b8152600093506001600160a01b03909116915063b48f04289061181b90339087906004016131cf565b60006040518083038186803b15801561183357600080fd5b505afa158015611847573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261186f9190810190613201565b6000858152600b60209081526040808320839055600a909152812080546001600160a01b03191690559091505b336000908152600c602052604090205481101561191857336000908152600c602052604090208054869190839081106118d7576118d7613057565b9060005260206000200154141561190657336000908152600c6020526040902061190190826128cc565b611918565b8061191081613130565b91505061189c565b5060005b600d8260405161192c9190613278565b908152604051908190036020019020548110156119c25784600d836040516119549190613278565b9081526020016040518091039020828154811061197357611973613057565b906000526020600020015414156119b0576119ab600d836040516119979190613278565b9081526020016040518091039020826128cc565b6119c2565b806119ba81613130565b91505061191c565b506001805460408051602081018252600081529051637921219560e11b81526001600160a01b039092169263f242432a92611a0692309233928b9290600401613294565b600060405180830381600087803b158015611a2057600080fd5b505af1158015611a34573d6000803e3d6000fd5b505060408051878152602081018790529081018590523392507f204fccf0d92ed8d48f204adb39b2e81e92bad0dedb93f5716ca9478cfb57de00915060600161104f565b600080546001600160a01b03161580611b0e5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611abe908490339060040161316e565b60206040518083038186803b158015611ad657600080fd5b505afa158015611aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0e919061318a565b611b2a5760405162461bcd60e51b8152600401610b10906131ac565b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b9957600080fd5b505afa158015611bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd1919061314b565b6000546001600160a01b03161580611c665750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611c16908490339060040161316e565b60206040518083038186803b158015611c2e57600080fd5b505afa158015611c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c66919061318a565b611c825760405162461bcd60e51b8152600401610b10906131ac565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080611cb2868661258a565b9050805160001415611cc8576000915050612118565b600254604051631691e08560e31b81526000916001600160a01b03169063b48f042890611cfb908a908a906004016131cf565b60006040518083038186803b158015611d1357600080fd5b505afa158015611d27573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d4f9190810190613201565b9050600e81604051611d619190613278565b90815260200160405180910390205460001415611d8357600092505050612118565b6000600f82604051611d959190613278565b90815260200160405180910390205490506000604051806020016040528060008152509050600080600080600260009054906101000a90046001600160a01b03166001600160a01b031663f4ec7b1d8e8e6040518363ffffffff1660e01b8152600401611e039291906131cf565b60206040518083038186803b158015611e1b57600080fd5b505afa158015611e2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5391906131e8565b905060005b885181101561210c57818310611e6d5761210c565b611e8f898281518110611e8257611e82613057565b602002602001015161086d565b9550604051602001611eac90602080825260009082015260400190565b6040516020818303038152906040528051906020012086604051602001611ed39190612baf565b604051602081830303815290604052805190602001201415611f015760009950505050505050505050612118565b600786604051611f119190613278565b90815260200160405180910390205460001415611f2d576120fa565b60015489516001600160a01b039091169062fdd58e9030908c9085908110611f5757611f57613057565b60200260200101516040518363ffffffff1660e01b8152600401611f7c9291906131cf565b60206040518083038186803b158015611f9457600080fd5b505afa158015611fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcc91906131e8565b611fd5576120fa565b611ff7898281518110611fea57611fea613057565b6020026020010151611350565b93508161200485856132f7565b111561201757612014838361330f565b93505b61202184846132f7565b92508b600e896040516120349190613278565b9081526020016040518091039020541161204e578b61206e565b600e8860405161205e9190613278565b9081526020016040518091039020545b94506007866040516120809190613278565b9081526020016040518091039020548510156120b8576007866040516120a69190613278565b90815260200160405180910390205494505b8a85106120c4576120fa565b836120cf8e886124d6565b6120d9878e61330f565b6120e39190613326565b6120ed9190613326565b6120f790886132f7565b96505b8061210481613130565b915050611e58565b50949750505050505050505b949350505050565b60606004805480602002602001604051908101604052809291908181526020016000905b828210156121f05783829060005260206000200180546121639061306d565b80601f016020809104026020016040519081016040528092919081815260200182805461218f9061306d565b80156121dc5780601f106121b1576101008083540402835291602001916121dc565b820191906000526020600020905b8154815290600101906020018083116121bf57829003601f168201915b505050505081526020019060010190612144565b50505050905090565b8151602081840181018051600d82529282019185019190912091905280548290811061119157600080fd5b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561227057600080fd5b505afa158015612284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a8919061314b565b6000546001600160a01b0316158061233d5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906122ed908490339060040161316e565b60206040518083038186803b15801561230557600080fd5b505afa158015612319573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233d919061318a565b6123595760405162461bcd60e51b8152600401610b10906131ac565b6000805b6004548110156123ee57876040516020016123789190612baf565b60405160208183030381529060405280519060200120600482815481106123a1576123a1613057565b906000526020600020016040516020016123bb9190613345565b6040516020818303038152906040528051906020012014156123dc57600191505b806123e681613130565b91505061235d565b508061243957600480546001810182556000919091528751612437917f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b019060208a0190612981565b505b8560058860405161244a9190613278565b9081526020016040518091039020819055508460068860405161246d9190613278565b9081526040519081900360200190205583612488574261248a565b835b60078860405161249a9190613278565b908152602001604051809103902081905550826008886040516124bd9190613278565b9081526040519081900360200190205550505050505050565b60008281526009602052604080822090518291906124f5908590613278565b90815260200160405180910390205411612556576000805260096020526040517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b90612542908490613278565b908152602001604051809103902054612583565b600083815260096020526040908190209051612573908490613278565b9081526020016040518091039020545b9392505050565b600254604051631691e08560e31b81526060916000916001600160a01b039091169063b48f0428906125c290879087906004016131cf565b60006040518083038186803b1580156125da57600080fd5b505afa1580156125ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126169190810190613201565b9050600d816040516126289190613278565b908152604080519182900360209081018320805480830285018301909352828452919083018282801561267a57602002820191906000526020600020905b815481526020019060010190808311612666575b505050505091505092915050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156126d457600080fd5b505afa1580156126e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270c919061314b565b6000546001600160a01b031615806127a15750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690612751908490339060040161316e565b60206040518083038186803b15801561276957600080fd5b505afa15801561277d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a1919061318a565b6127bd5760405162461bcd60e51b8152600401610b10906131ac565b50600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146128285760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b6044820152606401610b10565b6000600f8260405161283a9190613278565b9081526040519081900360200190205550565b6001600160e01b031980821614156128a75760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e74657266616365206964000000006044820152606401610b10565b6001600160e01b0319166000908152600360205260409020805460ff19166001179055565b81546000906128dd9060019061330f565b905060008382815481106128f3576128f3613057565b90600052602060002001549050818314156129335783805480612918576129186133ca565b6001900381819060005260206000200160009055905561297b565b8084848154811061294657612946613057565b906000526020600020018190555083805480612964576129646133ca565b600190038181906000526020600020016000905590555b50505050565b82805461298d9061306d565b90600052602060002090601f0160209004810192826129af57600085556129f5565b82601f106129c857805160ff19168380011785556129f5565b828001600101855582156129f5579182015b828111156129f55782518255916020019190600101906129da565b50612a01929150612a05565b5090565b5b80821115612a015760008155600101612a06565b600060208284031215612a2c57600080fd5b81356001600160e01b03198116811461258357600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612a8357612a83612a44565b604052919050565b600067ffffffffffffffff821115612aa557612aa5612a44565b50601f01601f191660200190565b600082601f830112612ac457600080fd5b8135612ad7612ad282612a8b565b612a5a565b818152846020838601011115612aec57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215612b1b57600080fd5b813567ffffffffffffffff811115612b3257600080fd5b61211884828501612ab3565b600060208284031215612b5057600080fd5b5035919050565b60005b83811015612b72578181015183820152602001612b5a565b8381111561297b5750506000910152565b60008151808452612b9b816020860160208601612b57565b601f01601f19169290920160200192915050565b6020815260006125836020830184612b83565b6001600160a01b0381168114612bd757600080fd5b50565b600060208284031215612bec57600080fd5b813561258381612bc2565b60008060408385031215612c0a57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015612c5157835183529284019291840191600101612c35565b50909695505050505050565b60008060408385031215612c7057600080fd5b8235612c7b81612bc2565b946020939093013593505050565b600080600060608486031215612c9e57600080fd5b83359250602084013567ffffffffffffffff811115612cbc57600080fd5b612cc886828701612ab3565b925050604084013590509250925092565b600080600060608486031215612cee57600080fd5b8335612cf981612bc2565b95602085013595506040909401359392505050565b600080600060608486031215612d2357600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215612d5057600080fd5b8435612d5b81612bc2565b966020860135965060408601359560600135945092505050565b600082601f830112612d8657600080fd5b8135602067ffffffffffffffff821115612da257612da2612a44565b8160051b612db1828201612a5a565b9283528481018201928281019087851115612dcb57600080fd5b83870192505b84831015612dea57823582529183019190830190612dd1565b979650505050505050565b600080600080600060a08688031215612e0d57600080fd5b8535612e1881612bc2565b94506020860135612e2881612bc2565b9350604086013567ffffffffffffffff80821115612e4557600080fd5b612e5189838a01612d75565b94506060880135915080821115612e6757600080fd5b612e7389838a01612d75565b93506080880135915080821115612e8957600080fd5b50612e9688828901612ab3565b9150509295509295909350565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612ef857603f19888603018452612ee6858351612b83565b94509285019290850190600101612eca565b5092979650505050505050565b60008060408385031215612f1857600080fd5b823567ffffffffffffffff811115612f2f57600080fd5b612f3b85828601612ab3565b95602094909401359450505050565b600080600080600060a08688031215612f6257600080fd5b853567ffffffffffffffff811115612f7957600080fd5b612f8588828901612ab3565b9860208801359850604088013597606081013597506080013595509350505050565b60008060408385031215612fba57600080fd5b82359150602083013567ffffffffffffffff811115612fd857600080fd5b612fe485828601612ab3565b9150509250929050565b600080600080600060a0868803121561300657600080fd5b853561301181612bc2565b9450602086013561302181612bc2565b93506040860135925060608601359150608086013567ffffffffffffffff81111561304b57600080fd5b612e9688828901612ab3565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061308157607f821691505b602082108114156130a257634e487b7160e01b600052602260045260246000fd5b50919050565b60008083546130b68161306d565b600182811680156130ce57600181146130df5761310e565b60ff1984168752828701945061310e565b8760005260208060002060005b858110156131055781548a8201529084019082016130ec565b50505082870194505b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b60006000198214156131445761314461311a565b5060010190565b60006020828403121561315d57600080fd5b815160ff8116811461258357600080fd5b60ff9290921682526001600160a01b0316602082015260400190565b60006020828403121561319c57600080fd5b8151801515811461258357600080fd5b6020808252600990820152686e6f2061636365737360b81b604082015260600190565b6001600160a01b03929092168252602082015260400190565b6000602082840312156131fa57600080fd5b5051919050565b60006020828403121561321357600080fd5b815167ffffffffffffffff81111561322a57600080fd5b8201601f8101841361323b57600080fd5b8051613249612ad282612a8b565b81815285602083850101111561325e57600080fd5b61326f826020830160208601612b57565b95945050505050565b6000825161328a818460208701612b57565b9190910192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612dea90830184612b83565b8381526060602082015260006132e76060830185612b83565b9050826040830152949350505050565b6000821982111561330a5761330a61311a565b500190565b6000828210156133215761332161311a565b500390565b60008160001904831182151516156133405761334061311a565b500290565b60006020808352600084546133598161306d565b8084870152604060018084166000811461337a576001811461338e576133bc565b60ff198516898401526060890195506133bc565b896000528660002060005b858110156133b45781548b8201860152908301908801613399565b8a0184019650505b509398975050505050505050565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205168daceac9b366d45f12baac26b39ab2402d85cc4082309cb93ed51e3eb916464736f6c63430008090033
Deployed Bytecode
0x6080604052600436106102255760003560e01c8063771194a711610123578063c712d34a116100ab578063ea463e7e1161006f578063ea463e7e14610797578063f16358a7146107b7578063f23a6e6114610800578063f4888a211461082c578063fed0a20e1461084c57600080fd5b8063c712d34a146106f5578063da39fe4414610717578063e8de1d0514610737578063e94d59dc14610757578063e9d7bd4c1461077757600080fd5b8063958434d2116100f2578063958434d2146105f55780639f4808da14610615578063a8936d591461064b578063bc197c8114610683578063c3326133146106c857600080fd5b8063771194a71461057557806378dba594146105955780637a0b9255146105b557806392e67c06146105d557600080fd5b8063559b12fe116101b157806360b5abe21161017557806360b5abe2146104bd5780636306cf38146104dd5780636441d379146104fd57806367b461351461051d57806368b087e81461053d57600080fd5b8063559b12fe146103f85780635806b6ae146104255780635ab9daf01461045d5780635ed441911461047d578063605c92781461049d57600080fd5b806324013560116101f8578063240135601461030e578063328f723314610346578063464cc0191461037557806351cecc80146103ad578063555d3e63146103c057600080fd5b806301ffc9a71461022a57806304dc6ada1461027957806313f93484146102bf57806319ab453c146102ec575b600080fd5b34801561023657600080fd5b50610264610245366004612a1a565b6001600160e01b03191660009081526003602052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561028557600080fd5b506102b1610294366004612b09565b805160208183018101805160068252928201919093012091525481565b604051908152602001610270565b3480156102cb57600080fd5b506102df6102da366004612b3e565b61086d565b6040516102709190612baf565b3480156102f857600080fd5b5061030c610307366004612bda565b6109db565b005b34801561031a57600080fd5b506102b1610329366004612b09565b805160208183018101805160078252928201919093012091525481565b34801561035257600080fd5b50610264610361366004612b3e565b6000908152600b6020526040902054151590565b34801561038157600080fd5b506102b1610390366004612b09565b8051602081830181018051600f8252928201919093012091525481565b61030c6103bb366004612bf7565b610bb6565b3480156103cc57600080fd5b506000546103e0906001600160a01b031681565b6040516001600160a01b039091168152602001610270565b34801561040457600080fd5b50610418610413366004612bda565b61105d565b6040516102709190612c19565b34801561043157600080fd5b506102b1610440366004612b09565b8051602081830181018051600e8252928201919093012091525481565b34801561046957600080fd5b506102df610478366004612b3e565b6110c9565b34801561048957600080fd5b506102b1610498366004612c5d565b611175565b3480156104a957600080fd5b5061030c6104b8366004612c89565b6111a6565b3480156104c957600080fd5b506102b16104d8366004612b3e565b611350565b3480156104e957600080fd5b5061030c6104f8366004612cd9565b611380565b34801561050957600080fd5b506001546103e0906001600160a01b031681565b34801561052957600080fd5b5061030c610538366004612c5d565b611566565b34801561054957600080fd5b506102b1610558366004612b09565b805160208183018101805160088252928201919093012091525481565b34801561058157600080fd5b506002546103e0906001600160a01b031681565b3480156105a157600080fd5b5061030c6105b0366004612d0e565b611694565b3480156105c157600080fd5b5061030c6105d0366004612bda565b611a78565b3480156105e157600080fd5b5061030c6105f0366004612bda565b611b4d565b34801561060157600080fd5b506102b1610610366004612d3a565b611ca5565b34801561062157600080fd5b506103e0610630366004612b3e565b600a602052600090815260409020546001600160a01b031681565b34801561065757600080fd5b506102b1610666366004612b09565b805160208183018101805160058252928201919093012091525481565b34801561068f57600080fd5b506106af61069e366004612df5565b63bc197c8160e01b95945050505050565b6040516001600160e01b03199091168152602001610270565b3480156106d457600080fd5b506102b16106e3366004612b3e565b600b6020526000908152604090205481565b34801561070157600080fd5b5061070a612120565b6040516102709190612ea3565b34801561072357600080fd5b506102b1610732366004612f05565b6121f9565b34801561074357600080fd5b5061030c610752366004612f4a565b612224565b34801561076357600080fd5b506102b1610772366004612fa7565b6124d6565b34801561078357600080fd5b50610418610792366004612c5d565b61258a565b3480156107a357600080fd5b5061030c6107b2366004612bda565b612688565b3480156107c357600080fd5b506102b16107d2366004612fa7565b6009602090815260009283526040909220815180830184018051928152908401929093019190912091525481565b34801561080c57600080fd5b506106af61081b366004612fee565b63f23a6e6160e01b95945050505050565b34801561083857600080fd5b5061030c610847366004612b09565b6127e0565b34801561085857600080fd5b5060025461026490600160a01b900460ff1681565b606060005b6004548110156109c55760056004828154811061089157610891613057565b906000526020600020016040516108a891906130a8565b908152602001604051809103902054831015801561090057506006600482815481106108d6576108d6613057565b906000526020600020016040516108ed91906130a8565b9081526020016040518091039020548311155b156109b3576004818154811061091857610918613057565b90600052602060002001805461092d9061306d565b80601f01602080910402602001604051908101604052809291908181526020018280546109599061306d565b80156109a65780601f1061097b576101008083540402835291602001916109a6565b820191906000526020600020905b81548152906001019060200180831161098957829003601f168201915b5050505050915050919050565b806109bd81613130565b915050610872565b5050604080516020810190915260008152919050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015610a2757600080fd5b505afa158015610a3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5f919061314b565b6000546001600160a01b03161580610af45750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690610aa4908490339060040161316e565b60206040518083038186803b158015610abc57600080fd5b505afa158015610ad0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af4919061318a565b610b195760405162461bcd60e51b8152600401610b10906131ac565b60405180910390fd5b600254600160a01b900460ff1615610b5f5760405162461bcd60e51b8152602060048201526009602482015268696e697420646f6e6560b81b6044820152606401610b10565b610b6f6301ffc9a760e01b61284d565b610b7f630271189760e51b61284d565b50600180546001600160a01b039092166001600160a01b03199092169190911790556002805460ff60a01b1916600160a01b179055565b6000610bc18361086d565b9050604051602001610bde90602080825260009082015260400190565b6040516020818303038152906040528051906020012081604051602001610c059190612baf565b604051602081830303815290604052805190602001201415610c585760405162461bcd60e51b815260206004820152600c60248201526b6e6f7420656c696769626c6560a01b6044820152606401610b10565b600154604051627eeac760e11b81526001600160a01b039091169062fdd58e90610c8890339087906004016131cf565b60206040518083038186803b158015610ca057600080fd5b505afa158015610cb4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd891906131e8565b610d115760405162461bcd60e51b815260206004820152600a6024820152690dcdee840cadcdeeaced60b31b6044820152606401610b10565b6000838152600a60205260409020546001600160a01b031615610d675760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481cdd185ad95960921b6044820152606401610b10565b60025460405163235d561d60e11b81526001600160a01b03909116906346baac3a90610d9990339086906004016131cf565b60206040518083038186803b158015610db157600080fd5b505afa158015610dc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610de9919061318a565b610e295760405162461bcd60e51b81526020600482015260116024820152701c1858dac8191bd95cdb9d08195e1a5cdd607a1b6044820152606401610b10565b600254604051631691e08560e31b81526000916001600160a01b03169063b48f042890610e5c90339087906004016131cf565b60006040518083038186803b158015610e7457600080fd5b505afa158015610e88573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610eb09190810190613201565b9050610edc3384600e84604051610ec79190613278565b90815260200160405180910390205442611ca5565b600f82604051610eec9190613278565b908152604080519182900360209081018320939093556000878152600b8452818120879055600a90935290912080546001600160a01b031916331790554290600e90610f39908490613278565b908152604080516020928190038301812093909355336000908152600c8352908120805460018101825590825291902001859055600d90610f7b908390613278565b90815260408051602092819003830181208054600180820183556000928352858320909101899055805494830184529082529151637921219560e11b81526001600160a01b039093169263f242432a92610fdf92339230928b929091600401613294565b600060405180830381600087803b158015610ff957600080fd5b505af115801561100d573d6000803e3d6000fd5b5050604080518781526020810187905242918101919091523392507fb4caaf29adda3eefee3ad552a8e85058589bf834c7466cae4ee58787f70589ed91506060015b60405180910390a250505050565b6001600160a01b0381166000908152600c60209081526040918290208054835181840281018401909452808452606093928301828280156110bd57602002820191906000526020600020905b8154815260200190600101908083116110a9575b50505050509050919050565b600481815481106110d957600080fd5b9060005260206000200160009150905080546110f49061306d565b80601f01602080910402602001604051908101604052809291908181526020018280546111209061306d565b801561116d5780601f106111425761010080835404028352916020019161116d565b820191906000526020600020905b81548152906001019060200180831161115057829003601f168201915b505050505081565b600c602052816000526040600020818154811061119157600080fd5b90600052602060002001600091509150505481565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111f257600080fd5b505afa158015611206573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061122a919061314b565b6000546001600160a01b031615806112bf5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f69061126f908490339060040161316e565b60206040518083038186803b15801561128757600080fd5b505afa15801561129b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bf919061318a565b6112db5760405162461bcd60e51b8152600401610b10906131ac565b8160096000868152602001908152602001600020846040516112fd9190613278565b9081526020016040518091039020819055507f90527546a008f3f5b4660a7de25fa1f748559a44ee9b7a37f449ca74070a41a9848484604051611342939291906132ce565b60405180910390a150505050565b6000600861135d8361086d565b60405161136a9190613278565b9081526020016040518091039020549050919050565b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b1580156113cc57600080fd5b505afa1580156113e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611404919061314b565b6000546001600160a01b031615806114995750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611449908490339060040161316e565b60206040518083038186803b15801561146157600080fd5b505afa158015611475573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611499919061318a565b6114b55760405162461bcd60e51b8152600401610b10906131ac565b600254604051631691e08560e31b81526000916001600160a01b03169063b48f0428906114e890889088906004016131cf565b60006040518083038186803b15801561150057600080fd5b505afa158015611514573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261153c9190810190613201565b905082600e8260405161154f9190613278565b908152604051908190036020019020555050505050565b6002546001600160a01b031633146115ae5760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b6044820152606401610b10565b600254604051631691e08560e31b81526000916001600160a01b03169063b48f0428906115e190869086906004016131cf565b60006040518083038186803b1580156115f957600080fd5b505afa15801561160d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526116359190810190613201565b905061164c8383600e84604051610ec79190613278565b600f8260405161165c9190613278565b90815260200160405180910390208190555042600e8260405161167f9190613278565b90815260405190819003602001902055505050565b6000838152600a60205260409020546001600160a01b03166116e55760405162461bcd60e51b815260206004820152600a6024820152691b9bdd081cdd185ad95960b21b6044820152606401610b10565b6000838152600a60205260409020546001600160a01b031633146117385760405162461bcd60e51b815260206004820152600a6024820152693737ba1039ba30b5b2b960b11b6044820152606401610b10565b6000838152600b602052604090205482146117825760405162461bcd60e51b815260206004820152600a60248201526977726f6e67207061636b60b01b6044820152606401610b10565b600254604051631405860b60e21b81526001600160a01b0390911690635016182c906117b490339086906004016131cf565b600060405180830381600087803b1580156117ce57600080fd5b505af11580156117e2573d6000803e3d6000fd5b5050600254604051631691e08560e31b8152600093506001600160a01b03909116915063b48f04289061181b90339087906004016131cf565b60006040518083038186803b15801561183357600080fd5b505afa158015611847573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261186f9190810190613201565b6000858152600b60209081526040808320839055600a909152812080546001600160a01b03191690559091505b336000908152600c602052604090205481101561191857336000908152600c602052604090208054869190839081106118d7576118d7613057565b9060005260206000200154141561190657336000908152600c6020526040902061190190826128cc565b611918565b8061191081613130565b91505061189c565b5060005b600d8260405161192c9190613278565b908152604051908190036020019020548110156119c25784600d836040516119549190613278565b9081526020016040518091039020828154811061197357611973613057565b906000526020600020015414156119b0576119ab600d836040516119979190613278565b9081526020016040518091039020826128cc565b6119c2565b806119ba81613130565b91505061191c565b506001805460408051602081018252600081529051637921219560e11b81526001600160a01b039092169263f242432a92611a0692309233928b9290600401613294565b600060405180830381600087803b158015611a2057600080fd5b505af1158015611a34573d6000803e3d6000fd5b505060408051878152602081018790529081018590523392507f204fccf0d92ed8d48f204adb39b2e81e92bad0dedb93f5716ca9478cfb57de00915060600161104f565b600080546001600160a01b03161580611b0e5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611abe908490339060040161316e565b60206040518083038186803b158015611ad657600080fd5b505afa158015611aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b0e919061318a565b611b2a5760405162461bcd60e51b8152600401610b10906131ac565b50600080546001600160a01b0319166001600160a01b0392909216919091179055565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b158015611b9957600080fd5b505afa158015611bad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bd1919061314b565b6000546001600160a01b03161580611c665750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690611c16908490339060040161316e565b60206040518083038186803b158015611c2e57600080fd5b505afa158015611c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c66919061318a565b611c825760405162461bcd60e51b8152600401610b10906131ac565b50600180546001600160a01b0319166001600160a01b0392909216919091179055565b600080611cb2868661258a565b9050805160001415611cc8576000915050612118565b600254604051631691e08560e31b81526000916001600160a01b03169063b48f042890611cfb908a908a906004016131cf565b60006040518083038186803b158015611d1357600080fd5b505afa158015611d27573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d4f9190810190613201565b9050600e81604051611d619190613278565b90815260200160405180910390205460001415611d8357600092505050612118565b6000600f82604051611d959190613278565b90815260200160405180910390205490506000604051806020016040528060008152509050600080600080600260009054906101000a90046001600160a01b03166001600160a01b031663f4ec7b1d8e8e6040518363ffffffff1660e01b8152600401611e039291906131cf565b60206040518083038186803b158015611e1b57600080fd5b505afa158015611e2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5391906131e8565b905060005b885181101561210c57818310611e6d5761210c565b611e8f898281518110611e8257611e82613057565b602002602001015161086d565b9550604051602001611eac90602080825260009082015260400190565b6040516020818303038152906040528051906020012086604051602001611ed39190612baf565b604051602081830303815290604052805190602001201415611f015760009950505050505050505050612118565b600786604051611f119190613278565b90815260200160405180910390205460001415611f2d576120fa565b60015489516001600160a01b039091169062fdd58e9030908c9085908110611f5757611f57613057565b60200260200101516040518363ffffffff1660e01b8152600401611f7c9291906131cf565b60206040518083038186803b158015611f9457600080fd5b505afa158015611fa8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcc91906131e8565b611fd5576120fa565b611ff7898281518110611fea57611fea613057565b6020026020010151611350565b93508161200485856132f7565b111561201757612014838361330f565b93505b61202184846132f7565b92508b600e896040516120349190613278565b9081526020016040518091039020541161204e578b61206e565b600e8860405161205e9190613278565b9081526020016040518091039020545b94506007866040516120809190613278565b9081526020016040518091039020548510156120b8576007866040516120a69190613278565b90815260200160405180910390205494505b8a85106120c4576120fa565b836120cf8e886124d6565b6120d9878e61330f565b6120e39190613326565b6120ed9190613326565b6120f790886132f7565b96505b8061210481613130565b915050611e58565b50949750505050505050505b949350505050565b60606004805480602002602001604051908101604052809291908181526020016000905b828210156121f05783829060005260206000200180546121639061306d565b80601f016020809104026020016040519081016040528092919081815260200182805461218f9061306d565b80156121dc5780601f106121b1576101008083540402835291602001916121dc565b820191906000526020600020905b8154815290600101906020018083116121bf57829003601f168201915b505050505081526020019060010190612144565b50505050905090565b8151602081840181018051600d82529282019185019190912091905280548290811061119157600080fd5b60008054906101000a90046001600160a01b03166001600160a01b0316630fe175bb6040518163ffffffff1660e01b815260040160206040518083038186803b15801561227057600080fd5b505afa158015612284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122a8919061314b565b6000546001600160a01b0316158061233d5750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f6906122ed908490339060040161316e565b60206040518083038186803b15801561230557600080fd5b505afa158015612319573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061233d919061318a565b6123595760405162461bcd60e51b8152600401610b10906131ac565b6000805b6004548110156123ee57876040516020016123789190612baf565b60405160208183030381529060405280519060200120600482815481106123a1576123a1613057565b906000526020600020016040516020016123bb9190613345565b6040516020818303038152906040528051906020012014156123dc57600191505b806123e681613130565b91505061235d565b508061243957600480546001810182556000919091528751612437917f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b019060208a0190612981565b505b8560058860405161244a9190613278565b9081526020016040518091039020819055508460068860405161246d9190613278565b9081526040519081900360200190205583612488574261248a565b835b60078860405161249a9190613278565b908152602001604051809103902081905550826008886040516124bd9190613278565b9081526040519081900360200190205550505050505050565b60008281526009602052604080822090518291906124f5908590613278565b90815260200160405180910390205411612556576000805260096020526040517fec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b90612542908490613278565b908152602001604051809103902054612583565b600083815260096020526040908190209051612573908490613278565b9081526020016040518091039020545b9392505050565b600254604051631691e08560e31b81526060916000916001600160a01b039091169063b48f0428906125c290879087906004016131cf565b60006040518083038186803b1580156125da57600080fd5b505afa1580156125ee573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526126169190810190613201565b9050600d816040516126289190613278565b908152604080519182900360209081018320805480830285018301909352828452919083018282801561267a57602002820191906000526020600020905b815481526020019060010190808311612666575b505050505091505092915050565b60008054906101000a90046001600160a01b03166001600160a01b0316637c7c7c3c6040518163ffffffff1660e01b815260040160206040518083038186803b1580156126d457600080fd5b505afa1580156126e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061270c919061314b565b6000546001600160a01b031615806127a15750600054604051634f4bdc7b60e11b81526001600160a01b0390911690639e97b8f690612751908490339060040161316e565b60206040518083038186803b15801561276957600080fd5b505afa15801561277d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a1919061318a565b6127bd5760405162461bcd60e51b8152600401610b10906131ac565b50600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546001600160a01b031633146128285760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd08185b1b1bddd95960aa1b6044820152606401610b10565b6000600f8260405161283a9190613278565b9081526040519081900360200190205550565b6001600160e01b031980821614156128a75760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e74657266616365206964000000006044820152606401610b10565b6001600160e01b0319166000908152600360205260409020805460ff19166001179055565b81546000906128dd9060019061330f565b905060008382815481106128f3576128f3613057565b90600052602060002001549050818314156129335783805480612918576129186133ca565b6001900381819060005260206000200160009055905561297b565b8084848154811061294657612946613057565b906000526020600020018190555083805480612964576129646133ca565b600190038181906000526020600020016000905590555b50505050565b82805461298d9061306d565b90600052602060002090601f0160209004810192826129af57600085556129f5565b82601f106129c857805160ff19168380011785556129f5565b828001600101855582156129f5579182015b828111156129f55782518255916020019190600101906129da565b50612a01929150612a05565b5090565b5b80821115612a015760008155600101612a06565b600060208284031215612a2c57600080fd5b81356001600160e01b03198116811461258357600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612a8357612a83612a44565b604052919050565b600067ffffffffffffffff821115612aa557612aa5612a44565b50601f01601f191660200190565b600082601f830112612ac457600080fd5b8135612ad7612ad282612a8b565b612a5a565b818152846020838601011115612aec57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215612b1b57600080fd5b813567ffffffffffffffff811115612b3257600080fd5b61211884828501612ab3565b600060208284031215612b5057600080fd5b5035919050565b60005b83811015612b72578181015183820152602001612b5a565b8381111561297b5750506000910152565b60008151808452612b9b816020860160208601612b57565b601f01601f19169290920160200192915050565b6020815260006125836020830184612b83565b6001600160a01b0381168114612bd757600080fd5b50565b600060208284031215612bec57600080fd5b813561258381612bc2565b60008060408385031215612c0a57600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015612c5157835183529284019291840191600101612c35565b50909695505050505050565b60008060408385031215612c7057600080fd5b8235612c7b81612bc2565b946020939093013593505050565b600080600060608486031215612c9e57600080fd5b83359250602084013567ffffffffffffffff811115612cbc57600080fd5b612cc886828701612ab3565b925050604084013590509250925092565b600080600060608486031215612cee57600080fd5b8335612cf981612bc2565b95602085013595506040909401359392505050565b600080600060608486031215612d2357600080fd5b505081359360208301359350604090920135919050565b60008060008060808587031215612d5057600080fd5b8435612d5b81612bc2565b966020860135965060408601359560600135945092505050565b600082601f830112612d8657600080fd5b8135602067ffffffffffffffff821115612da257612da2612a44565b8160051b612db1828201612a5a565b9283528481018201928281019087851115612dcb57600080fd5b83870192505b84831015612dea57823582529183019190830190612dd1565b979650505050505050565b600080600080600060a08688031215612e0d57600080fd5b8535612e1881612bc2565b94506020860135612e2881612bc2565b9350604086013567ffffffffffffffff80821115612e4557600080fd5b612e5189838a01612d75565b94506060880135915080821115612e6757600080fd5b612e7389838a01612d75565b93506080880135915080821115612e8957600080fd5b50612e9688828901612ab3565b9150509295509295909350565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015612ef857603f19888603018452612ee6858351612b83565b94509285019290850190600101612eca565b5092979650505050505050565b60008060408385031215612f1857600080fd5b823567ffffffffffffffff811115612f2f57600080fd5b612f3b85828601612ab3565b95602094909401359450505050565b600080600080600060a08688031215612f6257600080fd5b853567ffffffffffffffff811115612f7957600080fd5b612f8588828901612ab3565b9860208801359850604088013597606081013597506080013595509350505050565b60008060408385031215612fba57600080fd5b82359150602083013567ffffffffffffffff811115612fd857600080fd5b612fe485828601612ab3565b9150509250929050565b600080600080600060a0868803121561300657600080fd5b853561301181612bc2565b9450602086013561302181612bc2565b93506040860135925060608601359150608086013567ffffffffffffffff81111561304b57600080fd5b612e9688828901612ab3565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061308157607f821691505b602082108114156130a257634e487b7160e01b600052602260045260246000fd5b50919050565b60008083546130b68161306d565b600182811680156130ce57600181146130df5761310e565b60ff1984168752828701945061310e565b8760005260208060002060005b858110156131055781548a8201529084019082016130ec565b50505082870194505b50929695505050505050565b634e487b7160e01b600052601160045260246000fd5b60006000198214156131445761314461311a565b5060010190565b60006020828403121561315d57600080fd5b815160ff8116811461258357600080fd5b60ff9290921682526001600160a01b0316602082015260400190565b60006020828403121561319c57600080fd5b8151801515811461258357600080fd5b6020808252600990820152686e6f2061636365737360b81b604082015260600190565b6001600160a01b03929092168252602082015260400190565b6000602082840312156131fa57600080fd5b5051919050565b60006020828403121561321357600080fd5b815167ffffffffffffffff81111561322a57600080fd5b8201601f8101841361323b57600080fd5b8051613249612ad282612a8b565b81815285602083850101111561325e57600080fd5b61326f826020830160208601612b57565b95945050505050565b6000825161328a818460208701612b57565b9190910192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612dea90830184612b83565b8381526060602082015260006132e76060830185612b83565b9050826040830152949350505050565b6000821982111561330a5761330a61311a565b500190565b6000828210156133215761332161311a565b500390565b60008160001904831182151516156133405761334061311a565b500290565b60006020808352600084546133598161306d565b8084870152604060018084166000811461337a576001811461338e576133bc565b60ff198516898401526060890195506133bc565b896000528660002060005b858110156133b45781548b8201860152908301908801613399565b8a0184019650505b509398975050505050505050565b634e487b7160e01b600052603160045260246000fdfea26469706673582212205168daceac9b366d45f12baac26b39ab2402d85cc4082309cb93ed51e3eb916464736f6c63430008090033
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.