Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 30 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 15903910 | 683 days ago | IN | 0 ETH | 0.0003401 | ||||
Set Approval For... | 15903878 | 683 days ago | IN | 0 ETH | 0.00036884 | ||||
Set Approval For... | 15903800 | 683 days ago | IN | 0 ETH | 0.00057897 | ||||
Set Approval For... | 15903684 | 683 days ago | IN | 0 ETH | 0.00036392 | ||||
Set Approval For... | 15897444 | 684 days ago | IN | 0 ETH | 0.00065673 | ||||
Set Approval For... | 15897144 | 684 days ago | IN | 0 ETH | 0.00077637 | ||||
Set Approval For... | 15897130 | 684 days ago | IN | 0 ETH | 0.00078642 | ||||
Set Approval For... | 15896947 | 684 days ago | IN | 0 ETH | 0.00080529 | ||||
Set Approval For... | 15896350 | 684 days ago | IN | 0 ETH | 0.00031292 | ||||
Set Approval For... | 15895627 | 684 days ago | IN | 0 ETH | 0.00045012 | ||||
Set Approval For... | 15895562 | 684 days ago | IN | 0 ETH | 0.00037928 | ||||
Set Approval For... | 15889279 | 685 days ago | IN | 0 ETH | 0.00040541 | ||||
Set Approval For... | 15883111 | 686 days ago | IN | 0 ETH | 0.00033877 | ||||
Set Approval For... | 15883111 | 686 days ago | IN | 0 ETH | 0.00029907 | ||||
Set Approval For... | 15883111 | 686 days ago | IN | 0 ETH | 0.00028995 | ||||
Set Approval For... | 15883023 | 686 days ago | IN | 0 ETH | 0.00033313 | ||||
Set Approval For... | 15882906 | 686 days ago | IN | 0 ETH | 0.00026497 | ||||
Set Approval For... | 15882859 | 686 days ago | IN | 0 ETH | 0.00027557 | ||||
Set Approval For... | 15882825 | 686 days ago | IN | 0 ETH | 0.0002658 | ||||
Set Approval For... | 15882751 | 686 days ago | IN | 0 ETH | 0.00026509 | ||||
Set Operator | 15882577 | 686 days ago | IN | 0 ETH | 0.00049682 | ||||
Set Approval For... | 15882305 | 686 days ago | IN | 0 ETH | 0.00026906 | ||||
Set Approval For... | 15882116 | 686 days ago | IN | 0 ETH | 0.00024045 | ||||
Set Approval For... | 15882064 | 686 days ago | IN | 0 ETH | 0.000409 | ||||
Set Approval For... | 15882042 | 686 days ago | IN | 0 ETH | 0.00026262 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
NFTStore
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-20 */ // SPDX-License-Identifier: UNLICINCED 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, 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) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * 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); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/introspection/IERC165.sol pragma solidity ^0.6.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); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol 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 IERC1155 is IERC165 { /** * @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; } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol pragma solidity ^0.6.0; /** * _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); } // File: @openzeppelin/contracts/introspection/ERC165.sol pragma solidity ^0.6.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ 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 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; } } // File: @openzeppelin/contracts/token/ERC1155/ERC1155Receiver.sol pragma solidity ^0.6.0; /** * @dev _Available since v3.1._ */ abstract contract ERC1155Receiver is ERC165, IERC1155Receiver { constructor() public { _registerInterface( ERC1155Receiver(0).onERC1155Received.selector ^ ERC1155Receiver(0).onERC1155BatchReceived.selector ); } } // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address 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; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/lib/CommonConstants.sol pragma solidity 0.6.12; /** Note: Simple contract to use as base for const vals */ contract CommonConstants { bytes4 internal constant ERC1155_ACCEPTED = 0xf23a6e61; // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)")) bytes4 internal constant ERC1155_BATCH_ACCEPTED = 0xbc197c81; // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)")) } // File: contracts/lib/Roles.sol pragma solidity 0.6.12; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping(address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } // File: contracts/lib/SignerRole.sol pragma solidity 0.6.12; contract SignerRole is Context { using Roles for Roles.Role; event SignerAdded(address indexed account); event SignerRemoved(address indexed account); Roles.Role private _signers; constructor() internal { _addSigner(_msgSender()); } modifier onlySigner() { require( isSigner(_msgSender()), "SignerRole: caller does not have the Signer role" ); _; } function isSigner(address account) public view returns (bool) { return _signers.has(account); } function addSigner(address account) public virtual onlySigner { _addSigner(account); } function renounceSigner() public { _removeSigner(_msgSender()); } function _addSigner(address account) internal { _signers.add(account); emit SignerAdded(account); } function _removeSigner(address account) internal { _signers.remove(account); emit SignerRemoved(account); } } // File: @openzeppelin/contracts/token/ERC1155/IERC1155MetadataURI.sol pragma solidity ^0.6.2; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: contracts/lib/ERC1155Base.sol pragma solidity 0.6.12; /** * * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155Base is Context, ERC165, IERC1155, IERC1155MetadataURI { using SafeMath for uint256; using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) internal _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) internal _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string internal _uri; /* * bytes4(keccak256('balanceOf(address,uint256)')) == 0x00fdd58e * bytes4(keccak256('balanceOfBatch(address[],uint256[])')) == 0x4e1273f4 * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('safeTransferFrom(address,address,uint256,uint256,bytes)')) == 0xf242432a * bytes4(keccak256('safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)')) == 0x2eb2c2d6 * * => 0x00fdd58e ^ 0x4e1273f4 ^ 0xa22cb465 ^ * 0xe985e9c5 ^ 0xf242432a ^ 0x2eb2c2d6 == 0xd9b67a26 */ bytes4 private constant _INTERFACE_ID_ERC1155 = 0xd9b67a26; /* * bytes4(keccak256('uri(uint256)')) == 0x0e89341c */ bytes4 private constant _INTERFACE_ID_ERC1155_METADATA_URI = 0x0e89341c; /** * @dev See {_setURI}. */ constructor() public { // register the supported interfaces to conform to ERC1155 via ERC165 _registerInterface(_INTERFACE_ID_ERC1155); // register the supported interfaces to conform to ERC1155MetadataURI via ERC165 _registerInterface(_INTERFACE_ID_ERC1155_METADATA_URI); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) external view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view override returns (uint256) { require( account != address(0), "ERC1155: balance query for the zero address" ); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view override returns (uint256[] memory) { require( accounts.length == ids.length, "ERC1155: accounts and ids length mismatch" ); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { require( accounts[i] != address(0), "ERC1155: batch balance query for the zero address" ); batchBalances[i] = _balances[ids[i]][accounts[i]]; } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require( _msgSender() != operator, "ERC1155: setting approval status for self" ); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); address operator = _msgSender(); _beforeTokenTransfer( operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data ); _balances[id][from] = _balances[id][from].sub( amount, "ERC1155: insufficient balance for transfer" ); _balances[id][to] = _balances[id][to].add(amount); emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); require(to != address(0), "ERC1155: transfer to the zero address"); require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; _balances[id][from] = _balances[id][from].sub( amount, "ERC1155: insufficient balance for transfer" ); _balances[id][to] = _balances[id][to].add(amount); } emit TransferBatch(operator, from, to, ids, amounts); _doSafeBatchTransferAcceptanceCheck( operator, from, to, ids, amounts, data ); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`. * * Emits a {TransferSingle} event. * * Requirements: * * - `account` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address account, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(account != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer( operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data ); _balances[id][account] = _balances[id][account].add(amount); emit TransferSingle(operator, address(0), account, id, amount); _doSafeTransferAcceptanceCheck( operator, address(0), account, id, amount, data ); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * 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 _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] = amounts[i].add(_balances[ids[i]][to]); } emit TransferBatch(operator, address(0), to, ids, amounts); _doSafeBatchTransferAcceptanceCheck( operator, address(0), to, ids, amounts, data ); } /** * @dev Destroys `amount` tokens of token type `id` from `account` * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens of token type `id`. */ function _burn( address account, uint256 id, uint256 amount ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer( operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "" ); _balances[id][account] = _balances[id][account].sub( amount, "ERC1155: burn amount exceeds balance" ); emit TransferSingle(operator, account, address(0), id, amount); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address account, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(account != address(0), "ERC1155: burn from the zero address"); require( ids.length == amounts.length, "ERC1155: ids and amounts length mismatch" ); address operator = _msgSender(); _beforeTokenTransfer(operator, account, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][account] = _balances[ids[i]][account].sub( amounts[i], "ERC1155: burn amount exceeds balance" ); } emit TransferBatch(operator, account, address(0), ids, amounts); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received( operator, from, id, amount, data ) returns (bytes4 response) { if ( response != IERC1155Receiver(to).onERC1155Received.selector ) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived( operator, from, ids, amounts, data ) returns (bytes4 response) { if ( response != IERC1155Receiver(to).onERC1155BatchReceived.selector ) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: contracts/test.sol // File: contracts/lib/UintLibrary.sol pragma solidity 0.6.12; library UintLibrary { function toString(uint256 _i) internal pure returns (string memory) { if (_i == 0) { return "0"; } uint256 j = _i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len - 1; while (_i != 0) { bstr[k--] = bytes1(uint8(48 + (_i % 10))); _i /= 10; } return string(bstr); } } // File: contracts/lib/StringLibrary.sol pragma solidity 0.6.12; library StringLibrary { using UintLibrary for uint256; function append(string memory _a, string memory _b) internal pure returns (string memory) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory bab = new bytes(_ba.length + _bb.length); uint256 k = 0; for (uint256 i = 0; i < _ba.length; i++) bab[k++] = _ba[i]; for (uint256 i = 0; i < _bb.length; i++) bab[k++] = _bb[i]; return string(bab); } function append( string memory _a, string memory _b, string memory _c ) internal pure returns (string memory) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory _bc = bytes(_c); bytes memory bbb = new bytes(_ba.length + _bb.length + _bc.length); uint256 k = 0; for (uint256 i = 0; i < _ba.length; i++) bbb[k++] = _ba[i]; for (uint256 i = 0; i < _bb.length; i++) bbb[k++] = _bb[i]; for (uint256 i = 0; i < _bc.length; i++) bbb[k++] = _bc[i]; return string(bbb); } function recover( string memory message, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { bytes memory msgBytes = bytes(message); bytes memory fullMessage = concat( bytes("\x19Ethereum Signed Message:\n"), bytes(msgBytes.length.toString()), msgBytes, new bytes(0), new bytes(0), new bytes(0), new bytes(0) ); return ecrecover(keccak256(fullMessage), v, r, s); } function concat( bytes memory _ba, bytes memory _bb, bytes memory _bc, bytes memory _bd, bytes memory _be, bytes memory _bf, bytes memory _bg ) internal pure returns (bytes memory) { bytes memory resultBytes = new bytes( _ba.length + _bb.length + _bc.length + _bd.length + _be.length + _bf.length + _bg.length ); uint256 k = 0; for (uint256 i = 0; i < _ba.length; i++) resultBytes[k++] = _ba[i]; for (uint256 i = 0; i < _bb.length; i++) resultBytes[k++] = _bb[i]; for (uint256 i = 0; i < _bc.length; i++) resultBytes[k++] = _bc[i]; for (uint256 i = 0; i < _bd.length; i++) resultBytes[k++] = _bd[i]; for (uint256 i = 0; i < _be.length; i++) resultBytes[k++] = _be[i]; for (uint256 i = 0; i < _bf.length; i++) resultBytes[k++] = _bf[i]; for (uint256 i = 0; i < _bg.length; i++) resultBytes[k++] = _bg[i]; return resultBytes; } } library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { revert("ECDSA: invalid signature length"); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { revert("ECDSA: invalid signature 's' value"); } if (v != 27 && v != 28) { revert("ECDSA: invalid signature 'v' value"); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); require(signer != address(0), "ECDSA: invalid signature"); return signer; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign[`eth_sign`] * JSON-RPC method. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } // File: contracts/lib/HasTokenURI.sol pragma solidity 0.6.12; contract HasTokenURI { using StringLibrary for string; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev Returns an URI for a given token ID. * Throws if the token ID does not exist. May return an empty string. * @param tokenId uint256 ID of the token to query */ function _tokenURI(uint256 tokenId) internal view returns (string memory) { return (_tokenURIs[tokenId]); } /** * @dev Internal function to set the token URI for a given token. * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to set its URI * @param uri string URI to assign */ function _setTokenURI(uint256 tokenId, string memory uri) internal virtual { _tokenURIs[tokenId] = uri; } function _clearTokenURI(uint256 tokenId) internal { if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: contracts/lib/StoreBase.sol pragma solidity 0.6.12; /** Note: The ERC-165 identifier for this interface is 0x0e89341c. */ contract ERC1155Metadata_URI is HasTokenURI { function tokenUri(uint256 _id) external view virtual returns (string memory) { return _tokenURI(_id); } } contract StoreBase is ERC165, Ownable, ERC1155Metadata_URI, ERC1155Base { // id => creator mapping(uint256 => address) public creators; // Creates a new token type and assings _initialSupply to minter function _mint( address from, address to, uint256 _id, uint256 _supply, string memory _uri ) internal { require( creators[_id] == address(0x0) || creators[_id] == from, "Token is already minted" ); require(_supply != 0, "Supply should be positive"); require(bytes(_uri).length > 0, "Uri should be set"); creators[_id] = from; _balances[_id][to] += _supply; _setTokenURI(_id, _uri); // Transfer event with mint semantic emit TransferSingle(msg.sender, address(0x0), to, _id, _supply); emit URI(_uri, _id); } function burn(uint256 _id, uint256 _value) external { require(creators[_id] == msg.sender, "Only creators able to burns "); _burn(msg.sender, _id, _value); } /** * @dev Internal function to set the token URI for a given token. * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to set its URI * @param uri string URI to assign */ function _setTokenURI(uint256 tokenId, string memory uri) internal virtual override { require(creators[tokenId] != address(0x0), "Token should exist"); super._setTokenURI(tokenId, uri); } } pragma solidity 0.6.12; pragma experimental ABIEncoderV2; contract NFTStore is Ownable, SignerRole, StoreBase { string public name; string public symbol; using ECDSA for address; mapping(address => bool) public operators; mapping(bytes32 => bool) public messageHash; uint256 public blockLimit = 10; event SetOperator(address operators, bool status); //modifier modifier isOperator() { require(operators[msg.sender] == true, "Only operator"); _; } constructor( string memory _name, string memory _symbol, address signer ) public { name = _name; symbol = _symbol; _addSigner(signer); _registerInterface(bytes4(keccak256("MINT_WITH_ADDRESS"))); } function addSigner(address account) public virtual override onlyOwner { _addSigner(account); } function removeSigner(address account) public onlyOwner { _removeSigner(account); } function mint( address from, address to, uint256 id, uint256 blockExpiry, uint8 v, bytes32 r, bytes32 s, uint256 supply, string memory uri ) public isOperator returns (bool) { bytes32 msgHash = prepareHash(id, blockExpiry); require( isSigner(ecrecover(msgHash, v, r, s)), "signer should sign tokenId" ); require(!messageHash[msgHash], "signature duplicate"); messageHash[msgHash] = true; _mint(from, to, id, supply, uri); return true; } function multiMint(address to,uint256[] memory id,string[] memory uri) public { require(uri.length == id.length && to != address(0),"Incorrect params"); for (uint8 i = 0;i < uri.length;i++){ _mint(_msgSender(), to, id[i], 1, uri[i]); } } function mintWithSignature( address from, address to, uint256 id, uint256 blockExpiry, bytes memory _signature, uint256 supply, string memory uri ) public returns (bool) { require( blockExpiry >= block.number && blockExpiry <= (block.number + blockLimit), "signature expired" ); bytes32 msgHash = prepareMintHash(from, id, blockExpiry); require( isSigner(verifySignature(msgHash,_signature)),"not signed" ); require(!messageHash[msgHash], "signature duplicate"); messageHash[msgHash] = true; _mint(from, to, id, supply, uri); return true; } function setOperator(address operator, bool status) public onlyOwner { operators[operator] = status; emit SetOperator(operator, status); }/// function verifySignature(bytes32 _messageHash, bytes memory _signature) public pure returns (address signatureAddress) { bytes32 hash = ECDSA.toEthSignedMessageHash(_messageHash); signatureAddress = ECDSA.recover(hash, _signature); } function prepareHash(uint256 id, uint256 blockExpiry) public view returns (bytes32) { return keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256( abi.encodePacked( abi.encodePacked( id, blockExpiry) ) ) ) ); } function prepareMintHash( address from, uint256 id, uint256 blockExpiry ) public view returns (bytes32) { return keccak256( abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256( abi.encodePacked( abi.encodePacked(address(this), id, blockExpiry, from) ) ) ) ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"signer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operators","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"SetOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SignerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SignerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"messageHash","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"blockExpiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"blockExpiry","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"mintWithSignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"id","type":"uint256[]"},{"internalType":"string[]","name":"uri","type":"string[]"}],"name":"multiMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"blockExpiry","type":"uint256"}],"name":"prepareHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"blockExpiry","type":"uint256"}],"name":"prepareMintHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_messageHash","type":"bytes32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"verifySignature","outputs":[{"internalType":"address","name":"signatureAddress","type":"address"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
6080604052600a600c553480156200001657600080fd5b5060405162003315380380620033158339810160408190526200003991620003d8565b6200004b6301ffc9a760e01b62000148565b600062000057620001a3565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000b9620000b3620001a3565b620001a7565b620000cb636cdb3d1360e11b62000148565b620000dd6303a24d0760e21b62000148565b8251620000f290600890602086019062000295565b5081516200010890600990602085019062000295565b506200011481620001a7565b6200013f7fe37243f27916e395706434720b54132b80ef5cc8c56f39b0df6485e8dfb697cf62000148565b50505062000511565b6001600160e01b031980821614156200017e5760405162461bcd60e51b8152600401620001759062000498565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b3390565b620001c2816002620001f960201b620012b01790919060201c565b6040516001600160a01b038216907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a250565b6200020582826200024a565b15620002255760405162461bcd60e51b8152600401620001759062000461565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620002755760405162461bcd60e51b81526004016200017590620004cf565b506001600160a01b03166000908152602091909152604090205460ff1690565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002d857805160ff191683800117855562000308565b8280016001018555821562000308579182015b8281111562000308578251825591602001919060010190620002eb565b50620003169291506200031a565b5090565b5b808211156200031657600081556001016200031b565b600082601f83011262000342578081fd5b81516001600160401b038082111562000359578283fd5b6040516020601f8401601f19168201810183811183821017156200037b578586fd5b806040525081945083825286818588010111156200039857600080fd5b600092505b83831015620003bc57858301810151828401820152918201916200039d565b83831115620003ce5760008185840101525b5050505092915050565b600080600060608486031215620003ed578283fd5b83516001600160401b038082111562000404578485fd5b620004128783880162000331565b9450602086015191508082111562000428578384fd5b50620004378682870162000331565b604086015190935090506001600160a01b038116811462000456578182fd5b809150509250925092565b6020808252601f908201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604082015260600190565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b60208082526022908201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604082015261737360f01b606082015260800190565b612df480620005216000396000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c806395d89b4111610104578063d5b4f0a1116100a2578063eb12d61e11610071578063eb12d61e146103e1578063f242432a146103f4578063f2fde38b14610407578063f3bcd2371461041a576101d9565b8063d5b4f0a1146103a0578063daca6f78146103b3578063e5c8b03d146103c6578063e985e9c5146103ce576101d9565b8063b390c0ab116100de578063b390c0ab14610354578063bc9ffa1714610367578063cd53d08e1461037a578063d1442f4d1461038d576101d9565b806395d89b41146103265780639644d1fe1461032e578063a22cb46514610341576101d9565b80632eb2c2d61161017c578063715018a61161014b578063715018a6146102e35780637649145c146102eb5780637df73e27146102fe5780638da5cb5b14610311576101d9565b80632eb2c2d61461028a57806336cedc7c1461029d5780634e1273f4146102b0578063558a7297146102d0576101d9565b80630e316ab7116101b85780630e316ab71461023c5780630e89341c1461025157806313e7c9d8146102645780631675f45514610277576101d9565b8062fdd58e146101de57806301ffc9a71461020757806306fdde0314610227575b600080fd5b6101f16101ec36600461207a565b610422565b6040516101fe919061245a565b60405180910390f35b61021a6102153660046121ec565b61047e565b6040516101fe919061244f565b61022f61049d565b6040516101fe9190612481565b61024f61024a366004611cd8565b61052b565b005b61022f61025f366004612199565b61056c565b61021a610272366004611cd8565b610604565b61022f610285366004612199565b610619565b61024f610298366004611d27565b610624565b6101f16102ab3660046120a4565b610843565b6102c36102be3660046120d7565b6108be565b6040516101fe919061240e565b61024f6102de36600461203f565b6109fe565b61024f610a95565b61021a6102f9366004611ed7565b610b14565b61021a61030c366004611cd8565b610c2f565b610319610c3c565b6040516101fe919061233c565b61022f610c4c565b61021a61033c366004611e36565b610ca7565b61024f61034f36600461203f565b610d75565b61024f610362366004612224565b610e43565b61021a610375366004612199565b610e88565b610319610388366004612199565b610e9d565b6101f161039b366004612224565b610eb8565b61024f6103ae366004611f7e565b610f2e565b6103196103c13660046121b1565b610fc1565b61024f610fe1565b61021a6103dc366004611cf3565b610ff3565b61024f6103ef366004611cd8565b611021565b61024f610402366004611dd1565b61105f565b61024f610415366004611cd8565b6111f3565b6101f16112aa565b60006001600160a01b0383166104535760405162461bcd60e51b815260040161044a90612601565b60405180910390fd5b5060008181526004602090815260408083206001600160a01b03861684529091529020545b92915050565b6001600160e01b03191660009081526020819052604090205460ff1690565b6008805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105235780601f106104f857610100808354040283529160200191610523565b820191906000526020600020905b81548152906001019060200180831161050657829003601f168201915b505050505081565b6105336112fc565b6001546001600160a01b039081169116146105605760405162461bcd60e51b815260040161044a90612984565b61056981611300565b50565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105f85780601f106105cd576101008083540402835291602001916105f8565b820191906000526020600020905b8154815290600101906020018083116105db57829003601f168201915b50505050509050919050565b600a6020526000908152604090205460ff1681565b606061047882611342565b81518351146106455760405162461bcd60e51b815260040161044a90612b1f565b6001600160a01b03841661066b5760405162461bcd60e51b815260040161044a906127fd565b6106736112fc565b6001600160a01b0316856001600160a01b031614806106995750610699856103dc6112fc565b6106b55760405162461bcd60e51b815260040161044a90612842565b60006106bf6112fc565b90506106cf81878787878761083b565b60005b84518110156107d55760008582815181106106e957fe5b60200260200101519050600085838151811061070157fe5b6020026020010151905061076e816040518060600160405280602a8152602001612d95602a91396004600086815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020546113ac9092919063ffffffff16565b60008381526004602090815260408083206001600160a01b038e811685529252808320939093558a16815220546107a590826113d8565b60009283526004602090815260408085206001600160a01b038c16865290915290922091909155506001016106d2565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610825929190612421565b60405180910390a461083b818787878787611404565b505050505050565b60003083838660405160200161085c94939291906122ab565b60408051601f1981840301815290829052610879916020016122e1565b6040516020818303038152906040528051906020012060405160200161089f91906122fd565b6040516020818303038152906040528051906020012090509392505050565b606081518351146108e15760405162461bcd60e51b815260040161044a90612ad6565b6060835167ffffffffffffffff811180156108fb57600080fd5b50604051908082528060200260200182016040528015610925578160200160208202803683370190505b50905060005b84518110156109f65760006001600160a01b031685828151811061094b57fe5b60200260200101516001600160a01b0316141561097a5760405162461bcd60e51b815260040161044a9061264c565b6004600085838151811061098a57fe5b6020026020010151815260200190815260200160002060008683815181106109ae57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020548282815181106109e357fe5b602090810291909101015260010161092b565b509392505050565b610a066112fc565b6001546001600160a01b03908116911614610a335760405162461bcd60e51b815260040161044a90612984565b6001600160a01b0382166000908152600a602052604090819020805460ff1916831515179055517f1618a22a3b00b9ac70fd5a82f1f5cdd8cb272bd0f1b740ddf7c26ab05881dd5b90610a8990849084906123f3565b60405180910390a15050565b610a9d6112fc565b6001546001600160a01b03908116911614610aca5760405162461bcd60e51b815260040161044a90612984565b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b336000908152600a602052604081205460ff161515600114610b485760405162461bcd60e51b815260040161044a90612b9e565b6000610b548989610eb8565b9050610bad60018289898960405160008152602001604052604051610b7c9493929190612463565b6020604051602081039080840390855afa158015610b9e573d6000803e3d6000fd5b50505060206040510351610c2f565b610bc95760405162461bcd60e51b815260040161044a90612bf0565b6000818152600b602052604090205460ff1615610bf85760405162461bcd60e51b815260040161044a906127a5565b6000818152600b60205260409020805460ff19166001179055610c1e8b8b8b878761151b565b5060019a9950505050505050505050565b6000610478600283611699565b6001546001600160a01b03165b90565b6009805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105235780601f106104f857610100808354040283529160200191610523565b6000438510158015610cbd5750600c5443018511155b610cd95760405162461bcd60e51b815260040161044a90612bc5565b6000610ce6898888610843565b9050610cf561030c8287610fc1565b610d115760405162461bcd60e51b815260040161044a90612a69565b6000818152600b602052604090205460ff1615610d405760405162461bcd60e51b815260040161044a906127a5565b6000818152600b60205260409020805460ff19166001179055610d66898989878761151b565b50600198975050505050505050565b816001600160a01b0316610d876112fc565b6001600160a01b03161415610dae5760405162461bcd60e51b815260040161044a90612a8d565b8060056000610dbb6112fc565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610dff6112fc565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e37919061244f565b60405180910390a35050565b6000828152600760205260409020546001600160a01b03163314610e795760405162461bcd60e51b815260040161044a90612b67565b610e843383836116e1565b5050565b600b6020526000908152604090205460ff1681565b6007602052600090815260409020546001600160a01b031681565b60008282604051602001610ecd92919061232e565b60408051601f1981840301815290829052610eea916020016122e1565b60405160208183030381529060405280519060200120604051602001610f1091906122fd565b60405160208183030381529060405280519060200120905092915050565b81518151148015610f4757506001600160a01b03831615155b610f635760405162461bcd60e51b815260040161044a906128d5565b60005b81518160ff161015610fbb57610fb3610f7d6112fc565b85858460ff1681518110610f8d57fe5b60200260200101516001868660ff1681518110610fa657fe5b602002602001015161151b565b600101610f66565b50505050565b600080610fcd846117f7565b9050610fd98184611827565b949350505050565b610ff1610fec6112fc565b611300565b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6110296112fc565b6001546001600160a01b039081169116146110565760405162461bcd60e51b815260040161044a90612984565b61056981611955565b6001600160a01b0384166110855760405162461bcd60e51b815260040161044a906127fd565b61108d6112fc565b6001600160a01b0316856001600160a01b031614806110b357506110b3856103dc6112fc565b6110cf5760405162461bcd60e51b815260040161044a9061271a565b60006110d96112fc565b90506110f98187876110ea88611997565b6110f388611997565b8761083b565b611140836040518060600160405280602a8152602001612d95602a913960008781526004602090815260408083206001600160a01b038d16845290915290205491906113ac565b60008581526004602090815260408083206001600160a01b038b8116855292528083209390935587168152205461117790846113d8565b60008581526004602090815260408083206001600160a01b03808b168086529190935292819020939093559151909188811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906111dd908990899061232e565b60405180910390a461083b8187878787876119db565b6111fb6112fc565b6001546001600160a01b039081169116146112285760405162461bcd60e51b815260040161044a90612984565b6001600160a01b03811661124e5760405162461bcd60e51b815260040161044a9061269d565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600c5481565b6112ba8282611699565b156112d75760405162461bcd60e51b815260040161044a90612593565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b3390565b61130b600282611aac565b6040516001600160a01b038216907f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b90600090a250565b60008181526003602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156105f85780601f106105cd576101008083540402835291602001916105f8565b600081848411156113d05760405162461bcd60e51b815260040161044a9190612481565b505050900390565b6000828201838110156113fd5760405162461bcd60e51b815260040161044a906126e3565b9392505050565b611416846001600160a01b0316611af4565b1561083b5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061144f9089908990889088908890600401612350565b602060405180830381600087803b15801561146957600080fd5b505af1925050508015611499575060408051601f3d908101601f1916820190925261149691810190612208565b60015b6114e2576114a5612ca0565b806114b057506114ca565b8060405162461bcd60e51b815260040161044a9190612481565b60405162461bcd60e51b815260040161044a906124cb565b6001600160e01b0319811663bc197c8160e01b146115125760405162461bcd60e51b815260040161044a9061254b565b50505050505050565b6000838152600760205260409020546001600160a01b0316158061155857506000838152600760205260409020546001600160a01b038681169116145b6115745760405162461bcd60e51b815260040161044a906129fb565b816115915760405162461bcd60e51b815260040161044a90612a32565b60008151116115b25760405162461bcd60e51b815260040161044a906127d2565b600083815260076020908152604080832080546001600160a01b0319166001600160a01b038a81169190911790915560048352818420908816845290915290208054830190556116028382611afa565b836001600160a01b031660006001600160a01b0316336001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62868660405161165292919061232e565b60405180910390a4827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b8260405161168a9190612481565b60405180910390a25050505050565b60006001600160a01b0382166116c15760405162461bcd60e51b815260040161044a906129b9565b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b0383166117075760405162461bcd60e51b815260040161044a90612941565b60006117116112fc565b90506117418185600061172387611997565b61172c87611997565b6040518060200160405280600081525061083b565b61178882604051806060016040528060248152602001612d716024913960008681526004602090815260408083206001600160a01b038b16845290915290205491906113ac565b60008481526004602090815260408083206001600160a01b03808a16808652919093528184209490945551919291908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906117e9908890889061232e565b60405180910390a450505050565b60008160405160200161180a91906122fd565b604051602081830303815290604052805190602001209050919050565b6000815160411461184a5760405162461bcd60e51b815260040161044a906125ca565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561189c5760405162461bcd60e51b815260040161044a90612763565b8060ff16601b141580156118b457508060ff16601c14155b156118d15760405162461bcd60e51b815260040161044a906128ff565b6000600187838686604051600081526020016040526040516118f69493929190612463565b6020604051602081039080840390855afa158015611918573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661194b5760405162461bcd60e51b815260040161044a90612494565b9695505050505050565b6119606002826112b0565b6040516001600160a01b038216907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a250565b6040805160018082528183019092526060918291906020808301908036833701905050905082816000815181106119ca57fe5b602090810291909101015292915050565b6119ed846001600160a01b0316611af4565b1561083b5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611a2690899089908890889088906004016123ae565b602060405180830381600087803b158015611a4057600080fd5b505af1925050508015611a70575060408051601f3d908101601f19168201909252611a6d91810190612208565b60015b611a7c576114a5612ca0565b6001600160e01b0319811663f23a6e6160e01b146115125760405162461bcd60e51b815260040161044a9061254b565b611ab68282611699565b611ad25760405162461bcd60e51b815260040161044a90612894565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b3b151590565b6000828152600760205260409020546001600160a01b0316611b2e5760405162461bcd60e51b815260040161044a9061251f565b610e84828260008281526003602090815260409091208251611b5292840190611b57565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611b9857805160ff1916838001178555611bc5565b82800160010185558215611bc5579182015b82811115611bc5578251825591602001919060010190611baa565b50611bd1929150611bd5565b5090565b5b80821115611bd15760008155600101611bd6565b80356001600160a01b038116811461047857600080fd5b600082601f830112611c11578081fd5b8135611c24611c1f82612c4e565b612c27565b818152915060208083019084810181840286018201871015611c4557600080fd5b60005b84811015611c6457813584529282019290820190600101611c48565b505050505092915050565b600082601f830112611c7f578081fd5b813567ffffffffffffffff811115611c95578182fd5b611ca8601f8201601f1916602001612c27565b9150808252836020828501011115611cbf57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611ce9578081fd5b6113fd8383611bea565b60008060408385031215611d05578081fd5b611d0f8484611bea565b9150611d1e8460208501611bea565b90509250929050565b600080600080600060a08688031215611d3e578081fd5b8535611d4981612d45565b94506020860135611d5981612d45565b9350604086013567ffffffffffffffff80821115611d75578283fd5b611d8189838a01611c01565b94506060880135915080821115611d96578283fd5b611da289838a01611c01565b93506080880135915080821115611db7578283fd5b50611dc488828901611c6f565b9150509295509295909350565b600080600080600060a08688031215611de8578081fd5b611df28787611bea565b9450611e018760208801611bea565b93506040860135925060608601359150608086013567ffffffffffffffff811115611e2a578182fd5b611dc488828901611c6f565b600080600080600080600060e0888a031215611e50578182fd5b611e5a8989611bea565b9650611e698960208a01611bea565b95506040880135945060608801359350608088013567ffffffffffffffff80821115611e93578384fd5b611e9f8b838c01611c6f565b945060a08a0135935060c08a0135915080821115611ebb578283fd5b50611ec88a828b01611c6f565b91505092959891949750929550565b60008060008060008060008060006101208a8c031215611ef5578182fd5b611eff8b8b611bea565b9850611f0e8b60208c01611bea565b975060408a0135965060608a0135955060808a013560ff81168114611f31578283fd5b945060a08a0135935060c08a0135925060e08a013591506101008a013567ffffffffffffffff811115611f62578182fd5b611f6e8c828d01611c6f565b9150509295985092959850929598565b600080600060608486031215611f92578081fd5b611f9c8585611bea565b925060208085013567ffffffffffffffff80821115611fb9578384fd5b611fc588838901611c01565b94506040870135915080821115611fda578384fd5b508501601f81018713611feb578283fd5b8035611ff9611c1f82612c4e565b81815283810190838501865b8481101561202e5761201c8c888435890101611c6f565b84529286019290860190600101612005565b505080955050505050509250925092565b60008060408385031215612051578182fd5b61205b8484611bea565b91506020830135801515811461206f578182fd5b809150509250929050565b6000806040838503121561208c578182fd5b6120968484611bea565b946020939093013593505050565b6000806000606084860312156120b8578081fd5b6120c28585611bea565b95602085013595506040909401359392505050565b600080604083850312156120e9578182fd5b823567ffffffffffffffff80821115612100578384fd5b818501915085601f830112612113578384fd5b8135612121611c1f82612c4e565b80828252602080830192508086018a828387028901011115612141578889fd5b8896505b8487101561216b576121578b82611bea565b845260019690960195928101928101612145565b509096508701359350505080821115612182578283fd5b5061218f85828601611c01565b9150509250929050565b6000602082840312156121aa578081fd5b5035919050565b600080604083850312156121c3578182fd5b82359150602083013567ffffffffffffffff8111156121e0578182fd5b61218f85828601611c6f565b6000602082840312156121fd578081fd5b81356113fd81612d5a565b600060208284031215612219578081fd5b81516113fd81612d5a565b60008060408385031215612236578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b8381101561227457815187529582019590820190600101612258565b509495945050505050565b60008151808452612297816020860160208601612c6e565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606095861b811682526014820194909452603481019290925290921b16605482015260680190565b600082516122f3818460208701612c6e565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061237c90830186612245565b828103606084015261238e8186612245565b905082810360808401526123a2818561227f565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906123e89083018461227f565b979650505050505050565b6001600160a01b039290921682521515602082015260400190565b6000602082526113fd6020830184612245565b6000604082526124346040830185612245565b82810360208401526124468185612245565b95945050505050565b901515815260200190565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526113fd602083018461227f565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b602080825260129082015271151bdad95b881cda1bdd5b1908195e1a5cdd60721b604082015260600190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252601f908201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604082015260600190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526031908201527f455243313135353a2062617463682062616c616e636520717565727920666f7260408201527020746865207a65726f206164647265737360781b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b6020808252601390820152727369676e6174757265206475706c696361746560681b604082015260600190565b602080825260119082015270155c9a481cda1bdd5b19081899481cd95d607a1b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b60208082526021908201527f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6040820152606560f81b606082015260800190565b60208082526010908201526f496e636f727265637420706172616d7360801b604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526017908201527f546f6b656e20697320616c7265616479206d696e746564000000000000000000604082015260600190565b60208082526019908201527f537570706c792073686f756c6420626520706f73697469766500000000000000604082015260600190565b6020808252600a90820152691b9bdd081cda59db995960b21b604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252601c908201527f4f6e6c792063726561746f72732061626c6520746f206275726e732000000000604082015260600190565b6020808252600d908201526c27b7363c9037b832b930ba37b960991b604082015260600190565b6020808252601190820152701cda59db985d1d5c9948195e1c1a5c9959607a1b604082015260600190565b6020808252601a908201527f7369676e65722073686f756c64207369676e20746f6b656e4964000000000000604082015260600190565b60405181810167ffffffffffffffff81118282101715612c4657600080fd5b604052919050565b600067ffffffffffffffff821115612c64578081fd5b5060209081020190565b60005b83811015612c89578181015183820152602001612c71565b83811115610fbb5750506000910152565b60e01c90565b600060443d1015612cb057610c49565b600481823e6308c379a0612cc48251612c9a565b14612cce57610c49565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715612cfe5750505050610c49565b82840192508251915080821115612d185750505050610c49565b503d83016020828401011115612d3057505050610c49565b601f01601f1916810160200160405291505090565b6001600160a01b038116811461056957600080fd5b6001600160e01b03198116811461056957600080fdfe455243313135353a206275726e20616d6f756e7420657863656564732062616c616e6365455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e73666572a26469706673582212207187880b64cfed23a5c24122b02a8b4adfcd3319ea007cc7a68e8acff598d59a64736f6c634300060c0033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000cfe7036ca7896c23b0df2446252407e885ad44fd0000000000000000000000000000000000000000000000000000000000000008454d4f4e204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007454d4f4e4e465400000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101d95760003560e01c806395d89b4111610104578063d5b4f0a1116100a2578063eb12d61e11610071578063eb12d61e146103e1578063f242432a146103f4578063f2fde38b14610407578063f3bcd2371461041a576101d9565b8063d5b4f0a1146103a0578063daca6f78146103b3578063e5c8b03d146103c6578063e985e9c5146103ce576101d9565b8063b390c0ab116100de578063b390c0ab14610354578063bc9ffa1714610367578063cd53d08e1461037a578063d1442f4d1461038d576101d9565b806395d89b41146103265780639644d1fe1461032e578063a22cb46514610341576101d9565b80632eb2c2d61161017c578063715018a61161014b578063715018a6146102e35780637649145c146102eb5780637df73e27146102fe5780638da5cb5b14610311576101d9565b80632eb2c2d61461028a57806336cedc7c1461029d5780634e1273f4146102b0578063558a7297146102d0576101d9565b80630e316ab7116101b85780630e316ab71461023c5780630e89341c1461025157806313e7c9d8146102645780631675f45514610277576101d9565b8062fdd58e146101de57806301ffc9a71461020757806306fdde0314610227575b600080fd5b6101f16101ec36600461207a565b610422565b6040516101fe919061245a565b60405180910390f35b61021a6102153660046121ec565b61047e565b6040516101fe919061244f565b61022f61049d565b6040516101fe9190612481565b61024f61024a366004611cd8565b61052b565b005b61022f61025f366004612199565b61056c565b61021a610272366004611cd8565b610604565b61022f610285366004612199565b610619565b61024f610298366004611d27565b610624565b6101f16102ab3660046120a4565b610843565b6102c36102be3660046120d7565b6108be565b6040516101fe919061240e565b61024f6102de36600461203f565b6109fe565b61024f610a95565b61021a6102f9366004611ed7565b610b14565b61021a61030c366004611cd8565b610c2f565b610319610c3c565b6040516101fe919061233c565b61022f610c4c565b61021a61033c366004611e36565b610ca7565b61024f61034f36600461203f565b610d75565b61024f610362366004612224565b610e43565b61021a610375366004612199565b610e88565b610319610388366004612199565b610e9d565b6101f161039b366004612224565b610eb8565b61024f6103ae366004611f7e565b610f2e565b6103196103c13660046121b1565b610fc1565b61024f610fe1565b61021a6103dc366004611cf3565b610ff3565b61024f6103ef366004611cd8565b611021565b61024f610402366004611dd1565b61105f565b61024f610415366004611cd8565b6111f3565b6101f16112aa565b60006001600160a01b0383166104535760405162461bcd60e51b815260040161044a90612601565b60405180910390fd5b5060008181526004602090815260408083206001600160a01b03861684529091529020545b92915050565b6001600160e01b03191660009081526020819052604090205460ff1690565b6008805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105235780601f106104f857610100808354040283529160200191610523565b820191906000526020600020905b81548152906001019060200180831161050657829003601f168201915b505050505081565b6105336112fc565b6001546001600160a01b039081169116146105605760405162461bcd60e51b815260040161044a90612984565b61056981611300565b50565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105f85780601f106105cd576101008083540402835291602001916105f8565b820191906000526020600020905b8154815290600101906020018083116105db57829003601f168201915b50505050509050919050565b600a6020526000908152604090205460ff1681565b606061047882611342565b81518351146106455760405162461bcd60e51b815260040161044a90612b1f565b6001600160a01b03841661066b5760405162461bcd60e51b815260040161044a906127fd565b6106736112fc565b6001600160a01b0316856001600160a01b031614806106995750610699856103dc6112fc565b6106b55760405162461bcd60e51b815260040161044a90612842565b60006106bf6112fc565b90506106cf81878787878761083b565b60005b84518110156107d55760008582815181106106e957fe5b60200260200101519050600085838151811061070157fe5b6020026020010151905061076e816040518060600160405280602a8152602001612d95602a91396004600086815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020546113ac9092919063ffffffff16565b60008381526004602090815260408083206001600160a01b038e811685529252808320939093558a16815220546107a590826113d8565b60009283526004602090815260408085206001600160a01b038c16865290915290922091909155506001016106d2565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610825929190612421565b60405180910390a461083b818787878787611404565b505050505050565b60003083838660405160200161085c94939291906122ab565b60408051601f1981840301815290829052610879916020016122e1565b6040516020818303038152906040528051906020012060405160200161089f91906122fd565b6040516020818303038152906040528051906020012090509392505050565b606081518351146108e15760405162461bcd60e51b815260040161044a90612ad6565b6060835167ffffffffffffffff811180156108fb57600080fd5b50604051908082528060200260200182016040528015610925578160200160208202803683370190505b50905060005b84518110156109f65760006001600160a01b031685828151811061094b57fe5b60200260200101516001600160a01b0316141561097a5760405162461bcd60e51b815260040161044a9061264c565b6004600085838151811061098a57fe5b6020026020010151815260200190815260200160002060008683815181106109ae57fe5b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020548282815181106109e357fe5b602090810291909101015260010161092b565b509392505050565b610a066112fc565b6001546001600160a01b03908116911614610a335760405162461bcd60e51b815260040161044a90612984565b6001600160a01b0382166000908152600a602052604090819020805460ff1916831515179055517f1618a22a3b00b9ac70fd5a82f1f5cdd8cb272bd0f1b740ddf7c26ab05881dd5b90610a8990849084906123f3565b60405180910390a15050565b610a9d6112fc565b6001546001600160a01b03908116911614610aca5760405162461bcd60e51b815260040161044a90612984565b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b336000908152600a602052604081205460ff161515600114610b485760405162461bcd60e51b815260040161044a90612b9e565b6000610b548989610eb8565b9050610bad60018289898960405160008152602001604052604051610b7c9493929190612463565b6020604051602081039080840390855afa158015610b9e573d6000803e3d6000fd5b50505060206040510351610c2f565b610bc95760405162461bcd60e51b815260040161044a90612bf0565b6000818152600b602052604090205460ff1615610bf85760405162461bcd60e51b815260040161044a906127a5565b6000818152600b60205260409020805460ff19166001179055610c1e8b8b8b878761151b565b5060019a9950505050505050505050565b6000610478600283611699565b6001546001600160a01b03165b90565b6009805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156105235780601f106104f857610100808354040283529160200191610523565b6000438510158015610cbd5750600c5443018511155b610cd95760405162461bcd60e51b815260040161044a90612bc5565b6000610ce6898888610843565b9050610cf561030c8287610fc1565b610d115760405162461bcd60e51b815260040161044a90612a69565b6000818152600b602052604090205460ff1615610d405760405162461bcd60e51b815260040161044a906127a5565b6000818152600b60205260409020805460ff19166001179055610d66898989878761151b565b50600198975050505050505050565b816001600160a01b0316610d876112fc565b6001600160a01b03161415610dae5760405162461bcd60e51b815260040161044a90612a8d565b8060056000610dbb6112fc565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155610dff6112fc565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e37919061244f565b60405180910390a35050565b6000828152600760205260409020546001600160a01b03163314610e795760405162461bcd60e51b815260040161044a90612b67565b610e843383836116e1565b5050565b600b6020526000908152604090205460ff1681565b6007602052600090815260409020546001600160a01b031681565b60008282604051602001610ecd92919061232e565b60408051601f1981840301815290829052610eea916020016122e1565b60405160208183030381529060405280519060200120604051602001610f1091906122fd565b60405160208183030381529060405280519060200120905092915050565b81518151148015610f4757506001600160a01b03831615155b610f635760405162461bcd60e51b815260040161044a906128d5565b60005b81518160ff161015610fbb57610fb3610f7d6112fc565b85858460ff1681518110610f8d57fe5b60200260200101516001868660ff1681518110610fa657fe5b602002602001015161151b565b600101610f66565b50505050565b600080610fcd846117f7565b9050610fd98184611827565b949350505050565b610ff1610fec6112fc565b611300565b565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6110296112fc565b6001546001600160a01b039081169116146110565760405162461bcd60e51b815260040161044a90612984565b61056981611955565b6001600160a01b0384166110855760405162461bcd60e51b815260040161044a906127fd565b61108d6112fc565b6001600160a01b0316856001600160a01b031614806110b357506110b3856103dc6112fc565b6110cf5760405162461bcd60e51b815260040161044a9061271a565b60006110d96112fc565b90506110f98187876110ea88611997565b6110f388611997565b8761083b565b611140836040518060600160405280602a8152602001612d95602a913960008781526004602090815260408083206001600160a01b038d16845290915290205491906113ac565b60008581526004602090815260408083206001600160a01b038b8116855292528083209390935587168152205461117790846113d8565b60008581526004602090815260408083206001600160a01b03808b168086529190935292819020939093559151909188811691908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906111dd908990899061232e565b60405180910390a461083b8187878787876119db565b6111fb6112fc565b6001546001600160a01b039081169116146112285760405162461bcd60e51b815260040161044a90612984565b6001600160a01b03811661124e5760405162461bcd60e51b815260040161044a9061269d565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600c5481565b6112ba8282611699565b156112d75760405162461bcd60e51b815260040161044a90612593565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b3390565b61130b600282611aac565b6040516001600160a01b038216907f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b90600090a250565b60008181526003602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452606093928301828280156105f85780601f106105cd576101008083540402835291602001916105f8565b600081848411156113d05760405162461bcd60e51b815260040161044a9190612481565b505050900390565b6000828201838110156113fd5760405162461bcd60e51b815260040161044a906126e3565b9392505050565b611416846001600160a01b0316611af4565b1561083b5760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061144f9089908990889088908890600401612350565b602060405180830381600087803b15801561146957600080fd5b505af1925050508015611499575060408051601f3d908101601f1916820190925261149691810190612208565b60015b6114e2576114a5612ca0565b806114b057506114ca565b8060405162461bcd60e51b815260040161044a9190612481565b60405162461bcd60e51b815260040161044a906124cb565b6001600160e01b0319811663bc197c8160e01b146115125760405162461bcd60e51b815260040161044a9061254b565b50505050505050565b6000838152600760205260409020546001600160a01b0316158061155857506000838152600760205260409020546001600160a01b038681169116145b6115745760405162461bcd60e51b815260040161044a906129fb565b816115915760405162461bcd60e51b815260040161044a90612a32565b60008151116115b25760405162461bcd60e51b815260040161044a906127d2565b600083815260076020908152604080832080546001600160a01b0319166001600160a01b038a81169190911790915560048352818420908816845290915290208054830190556116028382611afa565b836001600160a01b031660006001600160a01b0316336001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62868660405161165292919061232e565b60405180910390a4827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b8260405161168a9190612481565b60405180910390a25050505050565b60006001600160a01b0382166116c15760405162461bcd60e51b815260040161044a906129b9565b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b0383166117075760405162461bcd60e51b815260040161044a90612941565b60006117116112fc565b90506117418185600061172387611997565b61172c87611997565b6040518060200160405280600081525061083b565b61178882604051806060016040528060248152602001612d716024913960008681526004602090815260408083206001600160a01b038b16845290915290205491906113ac565b60008481526004602090815260408083206001600160a01b03808a16808652919093528184209490945551919291908416907fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62906117e9908890889061232e565b60405180910390a450505050565b60008160405160200161180a91906122fd565b604051602081830303815290604052805190602001209050919050565b6000815160411461184a5760405162461bcd60e51b815260040161044a906125ca565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a082111561189c5760405162461bcd60e51b815260040161044a90612763565b8060ff16601b141580156118b457508060ff16601c14155b156118d15760405162461bcd60e51b815260040161044a906128ff565b6000600187838686604051600081526020016040526040516118f69493929190612463565b6020604051602081039080840390855afa158015611918573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661194b5760405162461bcd60e51b815260040161044a90612494565b9695505050505050565b6119606002826112b0565b6040516001600160a01b038216907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a250565b6040805160018082528183019092526060918291906020808301908036833701905050905082816000815181106119ca57fe5b602090810291909101015292915050565b6119ed846001600160a01b0316611af4565b1561083b5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611a2690899089908890889088906004016123ae565b602060405180830381600087803b158015611a4057600080fd5b505af1925050508015611a70575060408051601f3d908101601f19168201909252611a6d91810190612208565b60015b611a7c576114a5612ca0565b6001600160e01b0319811663f23a6e6160e01b146115125760405162461bcd60e51b815260040161044a9061254b565b611ab68282611699565b611ad25760405162461bcd60e51b815260040161044a90612894565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b3b151590565b6000828152600760205260409020546001600160a01b0316611b2e5760405162461bcd60e51b815260040161044a9061251f565b610e84828260008281526003602090815260409091208251611b5292840190611b57565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10611b9857805160ff1916838001178555611bc5565b82800160010185558215611bc5579182015b82811115611bc5578251825591602001919060010190611baa565b50611bd1929150611bd5565b5090565b5b80821115611bd15760008155600101611bd6565b80356001600160a01b038116811461047857600080fd5b600082601f830112611c11578081fd5b8135611c24611c1f82612c4e565b612c27565b818152915060208083019084810181840286018201871015611c4557600080fd5b60005b84811015611c6457813584529282019290820190600101611c48565b505050505092915050565b600082601f830112611c7f578081fd5b813567ffffffffffffffff811115611c95578182fd5b611ca8601f8201601f1916602001612c27565b9150808252836020828501011115611cbf57600080fd5b8060208401602084013760009082016020015292915050565b600060208284031215611ce9578081fd5b6113fd8383611bea565b60008060408385031215611d05578081fd5b611d0f8484611bea565b9150611d1e8460208501611bea565b90509250929050565b600080600080600060a08688031215611d3e578081fd5b8535611d4981612d45565b94506020860135611d5981612d45565b9350604086013567ffffffffffffffff80821115611d75578283fd5b611d8189838a01611c01565b94506060880135915080821115611d96578283fd5b611da289838a01611c01565b93506080880135915080821115611db7578283fd5b50611dc488828901611c6f565b9150509295509295909350565b600080600080600060a08688031215611de8578081fd5b611df28787611bea565b9450611e018760208801611bea565b93506040860135925060608601359150608086013567ffffffffffffffff811115611e2a578182fd5b611dc488828901611c6f565b600080600080600080600060e0888a031215611e50578182fd5b611e5a8989611bea565b9650611e698960208a01611bea565b95506040880135945060608801359350608088013567ffffffffffffffff80821115611e93578384fd5b611e9f8b838c01611c6f565b945060a08a0135935060c08a0135915080821115611ebb578283fd5b50611ec88a828b01611c6f565b91505092959891949750929550565b60008060008060008060008060006101208a8c031215611ef5578182fd5b611eff8b8b611bea565b9850611f0e8b60208c01611bea565b975060408a0135965060608a0135955060808a013560ff81168114611f31578283fd5b945060a08a0135935060c08a0135925060e08a013591506101008a013567ffffffffffffffff811115611f62578182fd5b611f6e8c828d01611c6f565b9150509295985092959850929598565b600080600060608486031215611f92578081fd5b611f9c8585611bea565b925060208085013567ffffffffffffffff80821115611fb9578384fd5b611fc588838901611c01565b94506040870135915080821115611fda578384fd5b508501601f81018713611feb578283fd5b8035611ff9611c1f82612c4e565b81815283810190838501865b8481101561202e5761201c8c888435890101611c6f565b84529286019290860190600101612005565b505080955050505050509250925092565b60008060408385031215612051578182fd5b61205b8484611bea565b91506020830135801515811461206f578182fd5b809150509250929050565b6000806040838503121561208c578182fd5b6120968484611bea565b946020939093013593505050565b6000806000606084860312156120b8578081fd5b6120c28585611bea565b95602085013595506040909401359392505050565b600080604083850312156120e9578182fd5b823567ffffffffffffffff80821115612100578384fd5b818501915085601f830112612113578384fd5b8135612121611c1f82612c4e565b80828252602080830192508086018a828387028901011115612141578889fd5b8896505b8487101561216b576121578b82611bea565b845260019690960195928101928101612145565b509096508701359350505080821115612182578283fd5b5061218f85828601611c01565b9150509250929050565b6000602082840312156121aa578081fd5b5035919050565b600080604083850312156121c3578182fd5b82359150602083013567ffffffffffffffff8111156121e0578182fd5b61218f85828601611c6f565b6000602082840312156121fd578081fd5b81356113fd81612d5a565b600060208284031215612219578081fd5b81516113fd81612d5a565b60008060408385031215612236578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b8381101561227457815187529582019590820190600101612258565b509495945050505050565b60008151808452612297816020860160208601612c6e565b601f01601f19169290920160200192915050565b6bffffffffffffffffffffffff19606095861b811682526014820194909452603481019290925290921b16605482015260680190565b600082516122f3818460208701612c6e565b9190910192915050565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b918252602082015260400190565b6001600160a01b0391909116815260200190565b6001600160a01b0386811682528516602082015260a06040820181905260009061237c90830186612245565b828103606084015261238e8186612245565b905082810360808401526123a2818561227f565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906123e89083018461227f565b979650505050505050565b6001600160a01b039290921682521515602082015260400190565b6000602082526113fd6020830184612245565b6000604082526124346040830185612245565b82810360208401526124468185612245565b95945050505050565b901515815260200190565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526113fd602083018461227f565b60208082526018908201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604082015260600190565b60208082526034908201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356040820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606082015260800190565b602080825260129082015271151bdad95b881cda1bdd5b1908195e1a5cdd60721b604082015260600190565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6020808252601f908201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604082015260600190565b6020808252601f908201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604082015260600190565b6020808252602b908201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526031908201527f455243313135353a2062617463682062616c616e636520717565727920666f7260408201527020746865207a65726f206164647265737360781b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604082015261756560f01b606082015260800190565b6020808252601390820152727369676e6174757265206475706c696361746560681b604082015260600190565b602080825260119082015270155c9a481cda1bdd5b19081899481cd95d607a1b604082015260600190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526032908201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b60208082526021908201527f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6040820152606560f81b606082015260800190565b60208082526010908201526f496e636f727265637420706172616d7360801b604082015260600190565b60208082526022908201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604082015261756560f01b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526022908201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526017908201527f546f6b656e20697320616c7265616479206d696e746564000000000000000000604082015260600190565b60208082526019908201527f537570706c792073686f756c6420626520706f73697469766500000000000000604082015260600190565b6020808252600a90820152691b9bdd081cda59db995960b21b604082015260600190565b60208082526029908201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604082015268103337b91039b2b63360b91b606082015260800190565b60208082526029908201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604082015268040dad2e6dac2e8c6d60bb1b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6020808252601c908201527f4f6e6c792063726561746f72732061626c6520746f206275726e732000000000604082015260600190565b6020808252600d908201526c27b7363c9037b832b930ba37b960991b604082015260600190565b6020808252601190820152701cda59db985d1d5c9948195e1c1a5c9959607a1b604082015260600190565b6020808252601a908201527f7369676e65722073686f756c64207369676e20746f6b656e4964000000000000604082015260600190565b60405181810167ffffffffffffffff81118282101715612c4657600080fd5b604052919050565b600067ffffffffffffffff821115612c64578081fd5b5060209081020190565b60005b83811015612c89578181015183820152602001612c71565b83811115610fbb5750506000910152565b60e01c90565b600060443d1015612cb057610c49565b600481823e6308c379a0612cc48251612c9a565b14612cce57610c49565b6040513d600319016004823e80513d67ffffffffffffffff8160248401118184111715612cfe5750505050610c49565b82840192508251915080821115612d185750505050610c49565b503d83016020828401011115612d3057505050610c49565b601f01601f1916810160200160405291505090565b6001600160a01b038116811461056957600080fd5b6001600160e01b03198116811461056957600080fdfe455243313135353a206275726e20616d6f756e7420657863656564732062616c616e6365455243313135353a20696e73756666696369656e742062616c616e636520666f72207472616e73666572a26469706673582212207187880b64cfed23a5c24122b02a8b4adfcd3319ea007cc7a68e8acff598d59a64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000cfe7036ca7896c23b0df2446252407e885ad44fd0000000000000000000000000000000000000000000000000000000000000008454d4f4e204e46540000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007454d4f4e4e465400000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): EMON NFT
Arg [1] : _symbol (string): EMONNFT
Arg [2] : signer (address): 0xcfe7036ca7896c23b0DF2446252407e885ad44fD
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 000000000000000000000000cfe7036ca7896c23b0df2446252407e885ad44fd
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [4] : 454d4f4e204e4654000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [6] : 454d4f4e4e465400000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
53324:4117:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30159:301;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13567:142;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;53383:18::-;;;:::i;:::-;;;;;;;:::i;54189:97::-;;;;;;:::i;:::-;;:::i;:::-;;29851:157;;;;;;:::i;:::-;;:::i;53467:41::-;;;;;;:::i;:::-;;:::i;51497:158::-;;;;;;:::i;:::-;;:::i;33214:1314::-;;;;;;:::i;:::-;;:::i;56918:520::-;;;;;;:::i;:::-;;:::i;30626:695::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;55989:161::-;;;;;;:::i;:::-;;:::i;17443:148::-;;;:::i;54294:624::-;;;;;;:::i;:::-;;:::i;20089:109::-;;;;;;:::i;:::-;;:::i;16801:79::-;;;:::i;:::-;;;;;;;:::i;53408:20::-;;;:::i;55223:756::-;;;;;;:::i;:::-;;:::i;31394:380::-;;;;;;:::i;:::-;;:::i;52576:182::-;;;;;;:::i;:::-;;:::i;53515:43::-;;;;;;:::i;:::-;;:::i;51763:::-;;;;;;:::i;:::-;;:::i;56430:480::-;;;;;;:::i;:::-;;:::i;54926:289::-;;;;;;:::i;:::-;;:::i;56161:261::-;;;;;;:::i;:::-;;:::i;20314:79::-;;;:::i;31846:201::-;;;;;;:::i;:::-;;:::i;54073:108::-;;;;;;:::i;:::-;;:::i;32119:1018::-;;;;;;:::i;:::-;;:::i;17746:244::-;;;;;;:::i;:::-;;:::i;53567:30::-;;;:::i;30159:301::-;30273:7;-1:-1:-1;;;;;30320:21:0;;30298:114;;;;-1:-1:-1;;;30298:114:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;30430:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;30430:22:0;;;;;;;;;;30159:301;;;;;:::o;13567:142::-;-1:-1:-1;;;;;;13668:33:0;13644:4;13668:33;;;;;;;;;;;;;;13567:142::o;53383:18::-;;;;;;;;;;;;;;;-1:-1:-1;;53383:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54189:97::-;17023:12;:10;:12::i;:::-;17013:6;;-1:-1:-1;;;;;17013:6:0;;;:22;;;17005:67;;;;-1:-1:-1;;;17005:67:0;;;;;;;:::i;:::-;54256:22:::1;54270:7;54256:13;:22::i;:::-;54189:97:::0;:::o;29851:157::-;29996:4;29989:11;;;;;;;;-1:-1:-1;;29989:11:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29958:13;;29989:11;;29996:4;;29989:11;;29996:4;29989:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29851:157;;;:::o;53467:41::-;;;;;;;;;;;;;;;:::o;51497:158::-;51595:13;51633:14;51643:3;51633:9;:14::i;33214:1314::-;33461:7;:14;33447:3;:10;:28;33425:118;;;;-1:-1:-1;;;33425:118:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33562:16:0;;33554:66;;;;-1:-1:-1;;;33554:66:0;;;;;;;:::i;:::-;33661:12;:10;:12::i;:::-;-1:-1:-1;;;;;33653:20:0;:4;-1:-1:-1;;;;;33653:20:0;;:60;;;;33677:36;33694:4;33700:12;:10;:12::i;33677:36::-;33631:160;;;;-1:-1:-1;;;33631:160:0;;;;;;;:::i;:::-;33804:16;33823:12;:10;:12::i;:::-;33804:31;;33848:60;33869:8;33879:4;33885:2;33889:3;33894:7;33903:4;33848:20;:60::i;:::-;33926:9;33921:358;33945:3;:10;33941:1;:14;33921:358;;;33977:10;33990:3;33994:1;33990:6;;;;;;;;;;;;;;33977:19;;34011:14;34028:7;34036:1;34028:10;;;;;;;;;;;;;;34011:27;;34077:126;34119:6;34077:126;;;;;;;;;;;;;;;;;:9;:13;34087:2;34077:13;;;;;;;;;;;:19;34091:4;-1:-1:-1;;;;;34077:19:0;-1:-1:-1;;;;;34077:19:0;;;;;;;;;;;;;:23;;:126;;;;;:::i;:::-;34055:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;34055:19:0;;;;;;;;;;:148;;;;34238:17;;;;;;:29;;34260:6;34238:21;:29::i;:::-;34218:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;34218:17:0;;;;;;;;;;:49;;;;-1:-1:-1;33957:3:0;;33921:358;;;;34326:2;-1:-1:-1;;;;;34296:47:0;34320:4;-1:-1:-1;;;;;34296:47:0;34310:8;-1:-1:-1;;;;;34296:47:0;;34330:3;34335:7;34296:47;;;;;;;:::i;:::-;;;;;;;;34356:164;34406:8;34429:4;34448:2;34465:3;34483:7;34505:4;34356:35;:164::i;:::-;33214:1314;;;;;;:::o;56918:520::-;57045:7;57317:4;57324:2;57328:11;57341:4;57292:54;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;57292:54:0;;;;;;;;;;57245:128;;57292:54;57245:128;;:::i;:::-;;;;;;;;;;;;;57209:187;;;;;;57113:302;;;;;;;;:::i;:::-;;;;;;;;;;;;;57085:345;;;;;;57065:365;;56918:520;;;;;:::o;30626:695::-;30765:16;30840:3;:10;30821:8;:15;:29;30799:120;;;;-1:-1:-1;;;30799:120:0;;;;;;;:::i;:::-;30932:30;30979:8;:15;30965:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30965:30:0;;30932:63;;31013:9;31008:273;31032:8;:15;31028:1;:19;31008:273;;;31118:1;-1:-1:-1;;;;;31095:25:0;:8;31104:1;31095:11;;;;;;;;;;;;;;-1:-1:-1;;;;;31095:25:0;;;31069:136;;;;-1:-1:-1;;;31069:136:0;;;;;;;:::i;:::-;31239:9;:17;31249:3;31253:1;31249:6;;;;;;;;;;;;;;31239:17;;;;;;;;;;;:30;31257:8;31266:1;31257:11;;;;;;;;;;;;;;-1:-1:-1;;;;;31239:30:0;-1:-1:-1;;;;;31239:30:0;;;;;;;;;;;;;31220:13;31234:1;31220:16;;;;;;;;;;;;;;;;;:49;31049:3;;31008:273;;;-1:-1:-1;31300:13:0;30626:695;-1:-1:-1;;;30626:695:0:o;55989:161::-;17023:12;:10;:12::i;:::-;17013:6;;-1:-1:-1;;;;;17013:6:0;;;:22;;;17005:67;;;;-1:-1:-1;;;17005:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;56069:19:0;::::1;;::::0;;;:9:::1;:19;::::0;;;;;;:28;;-1:-1:-1;;56069:28:0::1;::::0;::::1;;;::::0;;56113:29;::::1;::::0;::::1;::::0;56069:19;;:28;;56113:29:::1;:::i;:::-;;;;;;;;55989:161:::0;;:::o;17443:148::-;17023:12;:10;:12::i;:::-;17013:6;;-1:-1:-1;;;;;17013:6:0;;;:22;;;17005:67;;;;-1:-1:-1;;;17005:67:0;;;;;;;:::i;:::-;17534:6:::1;::::0;17513:40:::1;::::0;17550:1:::1;::::0;-1:-1:-1;;;;;17534:6:0::1;::::0;17513:40:::1;::::0;17550:1;;17513:40:::1;17564:6;:19:::0;;-1:-1:-1;;;;;;17564:19:0::1;::::0;;17443:148::o;54294:624::-;53729:10;54548:4;53719:21;;;:9;:21;;;;;;;;:29;;:21;:29;53711:55;;;;-1:-1:-1;;;53711:55:0;;;;;;;:::i;:::-;54567:15:::1;54585:28;54597:2;54601:11;54585;:28::i;:::-;54567:46;;54646:37;54655:27;54665:7;54674:1;54677;54680;54655:27;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;54646:8;:37::i;:::-;54624:113;;;;-1:-1:-1::0;;;54624:113:0::1;;;;;;;:::i;:::-;54757:20;::::0;;;:11:::1;:20;::::0;;;;;::::1;;54756:21;54748:53;;;;-1:-1:-1::0;;;54748:53:0::1;;;;;;;:::i;:::-;54814:20;::::0;;;:11:::1;:20;::::0;;;;:27;;-1:-1:-1;;54814:27:0::1;54837:4;54814:27;::::0;;54854:32:::1;54860:4:::0;54866:2;54870;54874:6;54882:3;54854:5:::1;:32::i;:::-;-1:-1:-1::0;54906:4:0::1;::::0;54294:624;-1:-1:-1;;;;;;;;;;54294:624:0:o;20089:109::-;20145:4;20169:21;:8;20182:7;20169:12;:21::i;16801:79::-;16866:6;;-1:-1:-1;;;;;16866:6:0;16801:79;;:::o;53408:20::-;;;;;;;;;;;;;;;-1:-1:-1;;53408:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55223:756;55455:4;55509:12;55494:11;:27;;:90;;;;;55573:10;;55558:12;:25;55542:11;:42;;55494:90;55472:157;;;;-1:-1:-1;;;55472:157:0;;;;;;;:::i;:::-;55640:15;55658:38;55674:4;55680:2;55684:11;55658:15;:38::i;:::-;55640:56;;55729:45;55738:35;55754:7;55762:10;55738:15;:35::i;55729:45::-;55707:91;;;;-1:-1:-1;;;55707:91:0;;;;;;;:::i;:::-;55818:20;;;;:11;:20;;;;;;;;55817:21;55809:53;;;;-1:-1:-1;;;55809:53:0;;;;;;;:::i;:::-;55875:20;;;;:11;:20;;;;;:27;;-1:-1:-1;;55875:27:0;55898:4;55875:27;;;55915:32;55921:4;55927:2;55931;55935:6;55943:3;55915:5;:32::i;:::-;-1:-1:-1;55967:4:0;;55223:756;-1:-1:-1;;;;;;;;55223:756:0:o;31394:380::-;31559:8;-1:-1:-1;;;;;31543:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;31543:24:0;;;31521:115;;;;-1:-1:-1;;;31521:115:0;;;;;;;:::i;:::-;31694:8;31649:18;:32;31668:12;:10;:12::i;:::-;-1:-1:-1;;;;;31649:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;31649:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;31649:53:0;;;;;;;;;;;31733:12;:10;:12::i;:::-;-1:-1:-1;;;;;31718:48:0;;31757:8;31718:48;;;;;;:::i;:::-;;;;;;;;31394:380;;:::o;52576:182::-;52647:13;;;;:8;:13;;;;;;-1:-1:-1;;;;;52647:13:0;52664:10;52647:27;52639:68;;;;-1:-1:-1;;;52639:68:0;;;;;;;:::i;:::-;52720:30;52726:10;52738:3;52743:6;52720:5;:30::i;:::-;52576:182;;:::o;53515:43::-;;;;;;;;;;;;;;;:::o;51763:::-;;;;;;;;;;;;-1:-1:-1;;;;;51763:43:0;;:::o;56430:480::-;56532:7;56802:2;56806:11;56784:34;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;56784:34:0;;;;;;;;;;56737:108;;56784:34;56737:108;;:::i;:::-;;;;;;;;;;;;;56701:167;;;;;;56605:282;;;;;;;;:::i;:::-;;;;;;;;;;;;;56577:325;;;;;;56557:345;;56430:480;;;;:::o;54926:289::-;55046:2;:9;55032:3;:10;:23;:43;;;;-1:-1:-1;;;;;;55059:16:0;;;;55032:43;55024:71;;;;-1:-1:-1;;;55024:71:0;;;;;;;:::i;:::-;55113:7;55108:100;55129:3;:10;55125:1;:14;;;55108:100;;;55155:41;55161:12;:10;:12::i;:::-;55175:2;55179;55182:1;55179:5;;;;;;;;;;;;;;;;55186:1;55189:3;55193:1;55189:6;;;;;;;;;;;;;;;;55155:5;:41::i;:::-;55140:3;;55108:100;;;;54926:289;;;:::o;56161:261::-;56254:24;56296:12;56311:42;56340:12;56311:28;:42::i;:::-;56296:57;;56383:31;56397:4;56403:10;56383:13;:31::i;:::-;56364:50;56161:261;-1:-1:-1;;;;56161:261:0:o;20314:79::-;20358:27;20372:12;:10;:12::i;:::-;20358:13;:27::i;:::-;20314:79::o;31846:201::-;-1:-1:-1;;;;;32002:27:0;;;31973:4;32002:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;31846:201::o;54073:108::-;17023:12;:10;:12::i;:::-;17013:6;;-1:-1:-1;;;;;17013:6:0;;;:22;;;17005:67;;;;-1:-1:-1;;;17005:67:0;;;;;;;:::i;:::-;54154:19:::1;54165:7;54154:10;:19::i;32119:1018::-:0;-1:-1:-1;;;;;32313:16:0;;32305:66;;;;-1:-1:-1;;;32305:66:0;;;;;;;:::i;:::-;32412:12;:10;:12::i;:::-;-1:-1:-1;;;;;32404:20:0;:4;-1:-1:-1;;;;;32404:20:0;;:60;;;;32428:36;32445:4;32451:12;:10;:12::i;32428:36::-;32382:151;;;;-1:-1:-1;;;32382:151:0;;;;;;;:::i;:::-;32546:16;32565:12;:10;:12::i;:::-;32546:31;;32590:185;32625:8;32648:4;32667:2;32684:21;32702:2;32684:17;:21::i;:::-;32720:25;32738:6;32720:17;:25::i;:::-;32760:4;32590:20;:185::i;:::-;32810:114;32848:6;32810:114;;;;;;;;;;;;;;;;;:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;32810:19:0;;;;;;;;;;;:114;:23;:114::i;:::-;32788:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;32788:19:0;;;;;;;;;;:136;;;;32955:17;;;;;;:29;;32977:6;32955:21;:29::i;:::-;32935:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;32935:17:0;;;;;;;;;;;;;;:49;;;;33002:46;;32935:17;;33002:46;;;;;;;;;;;;32945:2;;33041:6;;33002:46;:::i;:::-;;;;;;;;33061:68;33092:8;33102:4;33108:2;33112;33116:6;33124:4;33061:30;:68::i;17746:244::-;17023:12;:10;:12::i;:::-;17013:6;;-1:-1:-1;;;;;17013:6:0;;;:22;;;17005:67;;;;-1:-1:-1;;;17005:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;17835:22:0;::::1;17827:73;;;;-1:-1:-1::0;;;17827:73:0::1;;;;;;;:::i;:::-;17937:6;::::0;17916:38:::1;::::0;-1:-1:-1;;;;;17916:38:0;;::::1;::::0;17937:6:::1;::::0;17916:38:::1;::::0;17937:6:::1;::::0;17916:38:::1;17965:6;:17:::0;;-1:-1:-1;;;;;;17965:17:0::1;-1:-1:-1::0;;;;;17965:17:0;;;::::1;::::0;;;::::1;::::0;;17746:244::o;53567:30::-;;;;:::o;18777:178::-;18855:18;18859:4;18865:7;18855:3;:18::i;:::-;18854:19;18846:63;;;;-1:-1:-1;;;18846:63:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18920:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;18920:27:0;18943:4;18920:27;;;18777:178::o;15357:106::-;15445:10;15357:106;:::o;20531:130::-;20591:24;:8;20607:7;20591:15;:24::i;:::-;20631:22;;-1:-1:-1;;;;;20631:22:0;;;;;;;;20531:130;:::o;50635:121::-;50728:19;;;;:10;:19;;;;;;;;;50720:28;;;;;;-1:-1:-1;;50720:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50694:13;;50720:28;;;50728:19;50720:28;;;;;;;;;;;;;;;;;;;;;;;;1810:192;1896:7;1932:12;1924:6;;;;1916:29;;;;-1:-1:-1;;;1916:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;1968:5:0;;;1810:192::o;907:181::-;965:7;997:5;;;1021:6;;;;1013:46;;;;-1:-1:-1;;;1013:46:0;;;;;;;:::i;:::-;1079:1;907:181;-1:-1:-1;;;907:181:0:o;41969:1000::-;42209:15;:2;-1:-1:-1;;;;;42209:13:0;;:15::i;:::-;42205:757;;;42262:203;;-1:-1:-1;;;42262:203:0;;-1:-1:-1;;;;;42262:43:0;;;;;:203;;42328:8;;42359:4;;42386:3;;42412:7;;42442:4;;42262:203;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42262:203:0;;;;;;;;-1:-1:-1;;42262:203:0;;;;;;;;;;;;:::i;:::-;;;42241:710;;;;:::i;:::-;;;;;;;;42824:6;42817:14;;-1:-1:-1;;;42817:14:0;;;;;;;;:::i;42241:710::-;42873:62;;-1:-1:-1;;;42873:62:0;;;;;;;:::i;42241:710::-;-1:-1:-1;;;;;;42550:85:0;;-1:-1:-1;;;42550:85:0;42524:224;;42678:50;;-1:-1:-1;;;42678:50:0;;;;;;;:::i;42524:224::-;42479:284;41969:1000;;;;;;:::o;51885:683::-;52095:3;52070:13;;;:8;:13;;;;;;-1:-1:-1;;;;;52070:13:0;:29;;:54;;-1:-1:-1;52103:13:0;;;;:8;:13;;;;;;-1:-1:-1;;;;;52103:21:0;;;:13;;:21;52070:54;52048:127;;;;-1:-1:-1;;;52048:127:0;;;;;;;:::i;:::-;52194:12;52186:50;;;;-1:-1:-1;;;52186:50:0;;;;;;;:::i;:::-;52276:1;52261:4;52255:18;:22;52247:52;;;;-1:-1:-1;;;52247:52:0;;;;;;;:::i;:::-;52312:13;;;;:8;:13;;;;;;;;:20;;-1:-1:-1;;;;;;52312:20:0;-1:-1:-1;;;;;52312:20:0;;;;;;;;;;52345:9;:14;;;;;:18;;;;;;;;;;:29;;;;;;52385:23;52312:13;52403:4;52385:12;:23::i;:::-;52513:2;-1:-1:-1;;;;;52472:58:0;52507:3;-1:-1:-1;;;;;52472:58:0;52487:10;-1:-1:-1;;;;;52472:58:0;;52517:3;52522:7;52472:58;;;;;;;:::i;:::-;;;;;;;;52556:3;52546:14;52550:4;52546:14;;;;;;:::i;:::-;;;;;;;;51885:683;;;;;:::o;19313:235::-;19412:4;-1:-1:-1;;;;;19442:21:0;;19434:68;;;;-1:-1:-1;;;19434:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;19520:20:0;:11;:20;;;;;;;;;;;;;;;19313:235::o;38162:674::-;-1:-1:-1;;;;;38292:21:0;;38284:69;;;;-1:-1:-1;;;38284:69:0;;;;;;;:::i;:::-;38366:16;38385:12;:10;:12::i;:::-;38366:31;;38410:194;38445:8;38468:7;38498:1;38515:21;38533:2;38515:17;:21::i;:::-;38551:25;38569:6;38551:17;:25::i;:::-;38410:194;;;;;;;;;;;;:20;:194::i;:::-;38642:111;38683:6;38642:111;;;;;;;;;;;;;;;;;:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;38642:22:0;;;;;;;;;;;:111;:26;:111::i;:::-;38617:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;38617:22:0;;;;;;;;;;;;;:136;;;;38771:57;38617:13;;:22;38771:57;;;;;;;;38627:2;;38821:6;;38771:57;:::i;:::-;;;;;;;;38162:674;;;;:::o;49930:269::-;49999:7;50185:4;50132:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;50122:69;;;;;;50115:76;;49930:269;;;:::o;47546:2110::-;47624:7;47687:9;:16;47707:2;47687:22;47683:96;;47726:41;;-1:-1:-1;;;47726:41:0;;;;;;;:::i;47683:96::-;48140:4;48125:20;;48119:27;48186:4;48171:20;;48165:27;48240:4;48225:20;;48219:27;47848:9;48211:36;49170:66;49157:79;;49153:156;;;49253:44;;-1:-1:-1;;;49253:44:0;;;;;;;:::i;49153:156::-;49325:1;:7;;49330:2;49325:7;;:18;;;;;49336:1;:7;;49341:2;49336:7;;49325:18;49321:95;;;49360:44;;-1:-1:-1;;;49360:44:0;;;;;;;:::i;49321:95::-;49513:14;49530:24;49540:4;49546:1;49549;49552;49530:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;49530:24:0;;-1:-1:-1;;49530:24:0;;;-1:-1:-1;;;;;;;49573:20:0;;49565:57;;;;-1:-1:-1;;;49565:57:0;;;;;;;:::i;:::-;49642:6;47546:2110;-1:-1:-1;;;;;;47546:2110:0:o;20401:122::-;20458:21;:8;20471:7;20458:12;:21::i;:::-;20495:20;;-1:-1:-1;;;;;20495:20:0;;;;;;;;20401:122;:::o;42977:230::-;43129:16;;;43143:1;43129:16;;;;;;;;;43070;;;;43129;;;;;;;;;;;;-1:-1:-1;43129:16:0;43104:41;;43167:7;43156:5;43162:1;43156:8;;;;;;;;;;;;;;;;;:18;43194:5;42977:230;-1:-1:-1;;42977:230:0:o;41019:942::-;41234:15;:2;-1:-1:-1;;;;;41234:13:0;;:15::i;:::-;41230:724;;;41287:196;;-1:-1:-1;;;41287:196:0;;-1:-1:-1;;;;;41287:38:0;;;;;:196;;41348:8;;41379:4;;41406:2;;41431:6;;41460:4;;41287:196;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41287:196:0;;;;;;;;-1:-1:-1;;41287:196:0;;;;;;;;;;;;:::i;:::-;;;41266:677;;;;:::i;:::-;-1:-1:-1;;;;;;41568:59:0;;-1:-1:-1;;;41568:59:0;41542:198;;41670:50;;-1:-1:-1;;;41670:50:0;;;;;;;:::i;19035:183::-;19115:18;19119:4;19125:7;19115:3;:18::i;:::-;19107:64;;;;-1:-1:-1;;;19107:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19182:20:0;19205:5;19182:20;;;;;;;;;;;:28;;-1:-1:-1;;19182:28:0;;;19035:183::o;22054:422::-;22421:20;22460:8;;;22054:422::o;53013:242::-;53177:3;53148:17;;;:8;:17;;;;;;-1:-1:-1;;;;;53148:17:0;53140:64;;;;-1:-1:-1;;;53140:64:0;;;;;;;:::i;:::-;53215:32;53234:7;53243:3;51089:19;;;;:10;:19;;;;;;;;:25;;;;;;;;:::i;:::-;;51003:119;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;5:130;72:20;;-1:-1;;;;;53337:54;;55487:35;;55477:2;;55536:1;;55526:12;1626:707;;1743:3;1736:4;1728:6;1724:17;1720:27;1710:2;;-1:-1;;1751:12;1710:2;1798:6;1785:20;1820:80;1835:64;1892:6;1835:64;:::i;:::-;1820:80;:::i;:::-;1928:21;;;1811:89;-1:-1;1972:4;1985:14;;;;1960:17;;;2074;;;2065:27;;;;2062:36;-1:-1;2059:2;;;2111:1;;2101:12;2059:2;2136:1;2121:206;2146:6;2143:1;2140:13;2121:206;;;3850:20;;2214:50;;2278:14;;;;2306;;;;2168:1;2161:9;2121:206;;;2125:14;;;;;1703:630;;;;:::o;2884:440::-;;2985:3;2978:4;2970:6;2966:17;2962:27;2952:2;;-1:-1;;2993:12;2952:2;3040:6;3027:20;50830:18;50822:6;50819:30;50816:2;;;-1:-1;;50852:12;50816:2;3062:64;50925:9;50906:17;;-1:-1;;50902:33;50993:4;50983:15;3062:64;:::i;:::-;3053:73;;3146:6;3139:5;3132:21;3250:3;50993:4;3241:6;3174;3232:16;;3229:25;3226:2;;;3267:1;;3257:12;3226:2;53652:6;50993:4;3174:6;3170:17;50993:4;3208:5;3204:16;53629:30;53708:1;53690:16;;;50993:4;53690:16;53683:27;3208:5;2945:379;-1:-1;;2945:379::o;4053:241::-;;4157:2;4145:9;4136:7;4132:23;4128:32;4125:2;;;-1:-1;;4163:12;4125:2;4225:53;4270:7;4246:22;4225:53;:::i;4301:366::-;;;4422:2;4410:9;4401:7;4397:23;4393:32;4390:2;;;-1:-1;;4428:12;4390:2;4490:53;4535:7;4511:22;4490:53;:::i;:::-;4480:63;;4598:53;4643:7;4580:2;4623:9;4619:22;4598:53;:::i;:::-;4588:63;;4384:283;;;;;:::o;4674:1119::-;;;;;;4905:3;4893:9;4884:7;4880:23;4876:33;4873:2;;;-1:-1;;4912:12;4873:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4964:63;-1:-1;5064:2;5103:22;;72:20;97:33;72:20;97:33;:::i;:::-;5072:63;-1:-1;5200:2;5185:18;;5172:32;5224:18;5213:30;;;5210:2;;;-1:-1;;5246:12;5210:2;5276:78;5346:7;5337:6;5326:9;5322:22;5276:78;:::i;:::-;5266:88;;5419:2;5408:9;5404:18;5391:32;5377:46;;5224:18;5435:6;5432:30;5429:2;;;-1:-1;;5465:12;5429:2;5495:78;5565:7;5556:6;5545:9;5541:22;5495:78;:::i;:::-;5485:88;;5638:3;5627:9;5623:19;5610:33;5596:47;;5224:18;5655:6;5652:30;5649:2;;;-1:-1;;5685:12;5649:2;;5715:62;5769:7;5760:6;5749:9;5745:22;5715:62;:::i;:::-;5705:72;;;4867:926;;;;;;;;:::o;5800:847::-;;;;;;5981:3;5969:9;5960:7;5956:23;5952:33;5949:2;;;-1:-1;;5988:12;5949:2;6050:53;6095:7;6071:22;6050:53;:::i;:::-;6040:63;;6158:53;6203:7;6140:2;6183:9;6179:22;6158:53;:::i;:::-;6148:63;;6248:2;6291:9;6287:22;3850:20;6256:63;;6356:2;6399:9;6395:22;3850:20;6364:63;;6492:3;6481:9;6477:19;6464:33;6517:18;6509:6;6506:30;6503:2;;;-1:-1;;6539:12;6503:2;6569:62;6623:7;6614:6;6603:9;6599:22;6569:62;:::i;6654:1205::-;;;;;;;;6879:3;6867:9;6858:7;6854:23;6850:33;6847:2;;;-1:-1;;6886:12;6847:2;6948:53;6993:7;6969:22;6948:53;:::i;:::-;6938:63;;7056:53;7101:7;7038:2;7081:9;7077:22;7056:53;:::i;:::-;7046:63;;7146:2;7189:9;7185:22;3850:20;7154:63;;7254:2;7297:9;7293:22;3850:20;7262:63;;7390:3;7379:9;7375:19;7362:33;7415:18;;7407:6;7404:30;7401:2;;;-1:-1;;7437:12;7401:2;7467:62;7521:7;7512:6;7501:9;7497:22;7467:62;:::i;:::-;7457:72;;7566:3;7610:9;7606:22;3850:20;7575:63;;7703:3;7692:9;7688:19;7675:33;7661:47;;7415:18;7720:6;7717:30;7714:2;;;-1:-1;;7750:12;7714:2;;7780:63;7835:7;7826:6;7815:9;7811:22;7780:63;:::i;:::-;7770:73;;;6841:1018;;;;;;;;;;:::o;7866:1349::-;;;;;;;;;;8114:3;8102:9;8093:7;8089:23;8085:33;8082:2;;;-1:-1;;8121:12;8082:2;8183:53;8228:7;8204:22;8183:53;:::i;:::-;8173:63;;8291:53;8336:7;8273:2;8316:9;8312:22;8291:53;:::i;:::-;8281:63;;8381:2;8424:9;8420:22;3850:20;8389:63;;8489:2;8532:9;8528:22;3850:20;8497:63;;8597:3;8639:9;8635:22;3985:20;53553:4;56123:5;53542:16;56100:5;56097:33;56087:2;;-1:-1;;56134:12;56087:2;8606:61;-1:-1;8704:3;8744:22;;2539:20;;-1:-1;8813:3;8853:22;;2539:20;;-1:-1;8922:3;8962:22;;3850:20;;-1:-1;9059:3;9044:19;;9031:33;9084:18;9073:30;;9070:2;;;-1:-1;;9106:12;9070:2;9136:63;9191:7;9182:6;9171:9;9167:22;9136:63;:::i;:::-;9126:73;;;8076:1139;;;;;;;;;;;:::o;9222:783::-;;;;9420:2;9408:9;9399:7;9395:23;9391:32;9388:2;;;-1:-1;;9426:12;9388:2;9488:53;9533:7;9509:22;9488:53;:::i;:::-;9478:63;;9606:2;;9595:9;9591:18;9578:32;9630:18;;9622:6;9619:30;9616:2;;;-1:-1;;9652:12;9616:2;9682:78;9752:7;9743:6;9732:9;9728:22;9682:78;:::i;:::-;9672:88;;9825:2;9814:9;9810:18;9797:32;9783:46;;9630:18;9841:6;9838:30;9835:2;;;-1:-1;;9871:12;9835:2;-1:-1;9957:22;;1012:4;1000:17;;996:27;-1:-1;986:2;;-1:-1;;1027:12;986:2;1074:6;1061:20;1096:90;1111:74;1178:6;1111:74;:::i;1096:90::-;1214:21;;;1271:14;;;;1246:17;;;-1:-1;1351:243;1376:6;1373:1;1370:13;1351:243;;;1483:47;1526:3;9606:2;1459:3;1446:17;1250:6;1434:30;;1483:47;:::i;:::-;1471:60;;1545:14;;;;1573;;;;1398:1;1391:9;1351:243;;;1355:14;;9891:98;;;;;;;;9382:623;;;;;:::o;10012:360::-;;;10130:2;10118:9;10109:7;10105:23;10101:32;10098:2;;;-1:-1;;10136:12;10098:2;10198:53;10243:7;10219:22;10198:53;:::i;:::-;10188:63;;10288:2;10328:9;10324:22;2405:20;55633:5;53019:13;53012:21;55611:5;55608:32;55598:2;;-1:-1;;55644:12;55598:2;10296:60;;;;10092:280;;;;;:::o;10379:366::-;;;10500:2;10488:9;10479:7;10475:23;10471:32;10468:2;;;-1:-1;;10506:12;10468:2;10568:53;10613:7;10589:22;10568:53;:::i;:::-;10558:63;10658:2;10697:22;;;;3850:20;;-1:-1;;;10462:283::o;10752:491::-;;;;10890:2;10878:9;10869:7;10865:23;10861:32;10858:2;;;-1:-1;;10896:12;10858:2;10958:53;11003:7;10979:22;10958:53;:::i;:::-;10948:63;11048:2;11087:22;;3850:20;;-1:-1;11156:2;11195:22;;;3850:20;;10852:391;-1:-1;;;10852:391::o;11250:638::-;;;11421:2;11409:9;11400:7;11396:23;11392:32;11389:2;;;-1:-1;;11427:12;11389:2;11485:17;11472:31;11523:18;;11515:6;11512:30;11509:2;;;-1:-1;;11545:12;11509:2;11636:6;11625:9;11621:22;;;277:3;270:4;262:6;258:17;254:27;244:2;;-1:-1;;285:12;244:2;332:6;319:20;354:80;369:64;426:6;369:64;:::i;354:80::-;440:16;476:6;469:5;462:21;506:4;;523:3;519:14;512:21;;506:4;498:6;494:17;628:3;506:4;;612:6;608:17;498:6;599:27;;596:36;593:2;;;-1:-1;;635:12;593:2;-1:-1;661:10;;655:206;680:6;677:1;674:13;655:206;;;760:37;793:3;781:10;760:37;:::i;:::-;748:50;;702:1;695:9;;;;;812:14;;;;840;;655:206;;;-1:-1;11565:88;;-1:-1;11703:18;;11690:32;;-1:-1;;;11731:30;;;11728:2;;;-1:-1;;11764:12;11728:2;;11794:78;11864:7;11855:6;11844:9;11840:22;11794:78;:::i;:::-;11784:88;;;11383:505;;;;;:::o;11895:241::-;;11999:2;11987:9;11978:7;11974:23;11970:32;11967:2;;;-1:-1;;12005:12;11967:2;-1:-1;2539:20;;11961:175;-1:-1;11961:175::o;12143:470::-;;;12273:2;12261:9;12252:7;12248:23;12244:32;12241:2;;;-1:-1;;12279:12;12241:2;2552:6;2539:20;12331:63;;12459:2;12448:9;12444:18;12431:32;12483:18;12475:6;12472:30;12469:2;;;-1:-1;;12505:12;12469:2;12535:62;12589:7;12580:6;12569:9;12565:22;12535:62;:::i;12620:239::-;;12723:2;12711:9;12702:7;12698:23;12694:32;12691:2;;;-1:-1;;12729:12;12691:2;2688:6;2675:20;2700:32;2726:5;2700:32;:::i;12866:261::-;;12980:2;12968:9;12959:7;12955:23;12951:32;12948:2;;;-1:-1;;12986:12;12948:2;2827:6;2821:13;2839:32;2865:5;2839:32;:::i;13382:366::-;;;13503:2;13491:9;13482:7;13478:23;13474:32;13471:2;;;-1:-1;;13509:12;13471:2;-1:-1;;3850:20;;;13661:2;13700:22;;;3850:20;;-1:-1;13465:283::o;14247:690::-;;14440:5;51605:12;52149:6;52144:3;52137:19;52186:4;;52181:3;52177:14;14452:93;;52186:4;14616:5;51459:14;-1:-1;14655:260;14680:6;14677:1;14674:13;14655:260;;;14741:13;;15127:37;;13909:14;;;;51992;;;;14702:1;14695:9;14655:260;;;-1:-1;14921:10;;14371:566;-1:-1;;;;;14371:566::o;15335:343::-;;15477:5;51605:12;52149:6;52144:3;52137:19;15570:52;15615:6;52186:4;52181:3;52177:14;52186:4;15596:5;15592:16;15570:52;:::i;:::-;50925:9;54429:14;-1:-1;;54425:28;15634:39;;;;52186:4;15634:39;;15425:253;-1:-1;;15425:253::o;28793:670::-;-1:-1;;54540:2;54536:14;;;;;14146:58;;29102:2;29093:12;;15127:37;;;;29204:12;;;15127:37;;;;54536:14;;;;29315:12;;;14146:58;29426:12;;;28993:470::o;29470:271::-;;15845:5;51605:12;15956:52;16001:6;15996:3;15989:4;15982:5;15978:16;15956:52;:::i;:::-;16020:16;;;;;29604:137;-1:-1;;29604:137::o;29748:520::-;18823:66;18803:87;;18787:2;18909:12;;15127:37;;;;30231:12;;;29965:303::o;30275:392::-;15127:37;;;30528:2;30519:12;;15127:37;30630:12;;;30419:248::o;30674:222::-;-1:-1;;;;;53337:54;;;;14008:37;;30801:2;30786:18;;30772:124::o;30903:1048::-;-1:-1;;;;;53337:54;;;14008:37;;53337:54;;31425:2;31410:18;;14008:37;53348:42;31462:2;31447:18;;31440:48;;;30903:1048;;31502:108;;31245:19;;31596:6;31502:108;:::i;:::-;31658:9;31652:4;31648:20;31643:2;31632:9;31628:18;31621:48;31683:108;31786:4;31777:6;31683:108;:::i;:::-;31675:116;;31840:9;31834:4;31830:20;31824:3;31813:9;31809:19;31802:49;31865:76;31936:4;31927:6;31865:76;:::i;:::-;31857:84;31231:720;-1:-1;;;;;;;;31231:720::o;31958:752::-;-1:-1;;;;;53337:54;;;14008:37;;53337:54;;32380:2;32365:18;;14008:37;32463:2;32448:18;;15127:37;;;32546:2;32531:18;;15127:37;;;53348:42;32583:3;32568:19;;32561:49;;;31958:752;;32624:76;;32200:19;;32686:6;32624:76;:::i;:::-;32616:84;32186:524;-1:-1;;;;;;;32186:524::o;32717:321::-;-1:-1;;;;;53337:54;;;;14008:37;;53019:13;53012:21;33024:2;33009:18;;15010:34;32866:2;32851:18;;32837:201::o;33045:370::-;;33222:2;33243:17;33236:47;33297:108;33222:2;33211:9;33207:18;33391:6;33297:108;:::i;33422:629::-;;33677:2;33698:17;33691:47;33752:108;33677:2;33666:9;33662:18;33846:6;33752:108;:::i;:::-;33908:9;33902:4;33898:20;33893:2;33882:9;33878:18;33871:48;33933:108;34036:4;34027:6;33933:108;:::i;:::-;33925:116;33648:403;-1:-1;;;;;33648:403::o;34058:210::-;53019:13;;53012:21;15010:34;;34179:2;34164:18;;34150:118::o;34275:222::-;15127:37;;;34402:2;34387:18;;34373:124::o;34504:548::-;15127:37;;;53553:4;53542:16;;;;34872:2;34857:18;;28746:35;34955:2;34940:18;;15127:37;35038:2;35023:18;;15127:37;34711:3;34696:19;;34682:370::o;35059:310::-;;35206:2;35227:17;35220:47;35281:78;35206:2;35195:9;35191:18;35345:6;35281:78;:::i;35376:416::-;35576:2;35590:47;;;16627:2;35561:18;;;52137:19;16663:26;52177:14;;;16643:47;16709:12;;;35547:245::o;35799:416::-;35999:2;36013:47;;;16960:2;35984:18;;;52137:19;16996:34;52177:14;;;16976:55;-1:-1;;;17051:12;;;17044:44;17107:12;;;35970:245::o;36222:416::-;36422:2;36436:47;;;17358:2;36407:18;;;52137:19;-1:-1;;;52177:14;;;17374:41;17434:12;;;36393:245::o;36645:416::-;36845:2;36859:47;;;17685:2;36830:18;;;52137:19;17721:34;52177:14;;;17701:55;-1:-1;;;17776:12;;;17769:32;17820:12;;;36816:245::o;37068:416::-;37268:2;37282:47;;;18071:2;37253:18;;;52137:19;18107:33;52177:14;;;18087:54;18160:12;;;37239:245::o;37491:416::-;37691:2;37705:47;;;18411:2;37676:18;;;52137:19;18447:33;52177:14;;;18427:54;18500:12;;;37662:245::o;37914:416::-;38114:2;38128:47;;;19160:2;38099:18;;;52137:19;19196:34;52177:14;;;19176:55;-1:-1;;;19251:12;;;19244:35;19298:12;;;38085:245::o;38337:416::-;38537:2;38551:47;;;19549:2;38522:18;;;52137:19;19585:34;52177:14;;;19565:55;-1:-1;;;19640:12;;;19633:41;19693:12;;;38508:245::o;38760:416::-;38960:2;38974:47;;;19944:2;38945:18;;;52137:19;19980:34;52177:14;;;19960:55;-1:-1;;;20035:12;;;20028:30;20077:12;;;38931:245::o;39183:416::-;39383:2;39397:47;;;20328:2;39368:18;;;52137:19;20364:29;52177:14;;;20344:50;20413:12;;;39354:245::o;39606:416::-;39806:2;39820:47;;;20664:2;39791:18;;;52137:19;20700:34;52177:14;;;20680:55;-1:-1;;;20755:12;;;20748:33;20800:12;;;39777:245::o;40029:416::-;40229:2;40243:47;;;21051:2;40214:18;;;52137:19;21087:34;52177:14;;;21067:55;-1:-1;;;21142:12;;;21135:26;21180:12;;;40200:245::o;40452:416::-;40652:2;40666:47;;;21431:2;40637:18;;;52137:19;-1:-1;;;52177:14;;;21447:42;21508:12;;;40623:245::o;40875:416::-;41075:2;41089:47;;;21759:2;41060:18;;;52137:19;-1:-1;;;52177:14;;;21775:40;21834:12;;;41046:245::o;41298:416::-;41498:2;41512:47;;;22085:2;41483:18;;;52137:19;22121:34;52177:14;;;22101:55;-1:-1;;;22176:12;;;22169:29;22217:12;;;41469:245::o;41721:416::-;41921:2;41935:47;;;22468:2;41906:18;;;52137:19;22504:34;52177:14;;;22484:55;-1:-1;;;22559:12;;;22552:42;22613:12;;;41892:245::o;42144:416::-;42344:2;42358:47;;;22864:2;42329:18;;;52137:19;22900:34;52177:14;;;22880:55;-1:-1;;;22955:12;;;22948:25;22992:12;;;42315:245::o;42567:416::-;42767:2;42781:47;;;23243:2;42752:18;;;52137:19;-1:-1;;;52177:14;;;23259:39;23317:12;;;42738:245::o;42990:416::-;43190:2;43204:47;;;23568:2;43175:18;;;52137:19;23604:34;52177:14;;;23584:55;-1:-1;;;23659:12;;;23652:26;23697:12;;;43161:245::o;43413:416::-;43613:2;43627:47;;;23948:2;43598:18;;;52137:19;23984:34;52177:14;;;23964:55;-1:-1;;;24039:12;;;24032:27;24078:12;;;43584:245::o;43836:416::-;44036:2;44050:47;;;44021:18;;;52137:19;24365:34;52177:14;;;24345:55;24419:12;;;44007:245::o;44259:416::-;44459:2;44473:47;;;24670:2;44444:18;;;52137:19;24706:34;52177:14;;;24686:55;-1:-1;;;24761:12;;;24754:26;24799:12;;;44430:245::o;44682:416::-;44882:2;44896:47;;;25050:2;44867:18;;;52137:19;25086:25;52177:14;;;25066:46;25131:12;;;44853:245::o;45105:416::-;45305:2;45319:47;;;25382:2;45290:18;;;52137:19;25418:27;52177:14;;;25398:48;25465:12;;;45276:245::o;45528:416::-;45728:2;45742:47;;;25716:2;45713:18;;;52137:19;-1:-1;;;52177:14;;;25732:33;25784:12;;;45699:245::o;45951:416::-;46151:2;46165:47;;;26035:2;46136:18;;;52137:19;26071:34;52177:14;;;26051:55;-1:-1;;;26126:12;;;26119:33;26171:12;;;46122:245::o;46374:416::-;46574:2;46588:47;;;26422:2;46559:18;;;52137:19;26458:34;52177:14;;;26438:55;-1:-1;;;26513:12;;;26506:33;26558:12;;;46545:245::o;46797:416::-;46997:2;47011:47;;;26809:2;46982:18;;;52137:19;26845:34;52177:14;;;26825:55;-1:-1;;;26900:12;;;26893:32;26944:12;;;46968:245::o;47220:416::-;47420:2;47434:47;;;27195:2;47405:18;;;52137:19;27231:30;52177:14;;;27211:51;27281:12;;;47391:245::o;47643:416::-;47843:2;47857:47;;;27532:2;47828:18;;;52137:19;-1:-1;;;52177:14;;;27548:36;27603:12;;;47814:245::o;48066:416::-;48266:2;48280:47;;;27854:2;48251:18;;;52137:19;-1:-1;;;52177:14;;;27870:40;27929:12;;;48237:245::o;48489:416::-;48689:2;48703:47;;;28180:2;48674:18;;;52137:19;28216:28;52177:14;;;28196:49;28264:12;;;48660:245::o;49481:256::-;49543:2;49537:9;49569:17;;;49644:18;49629:34;;49665:22;;;49626:62;49623:2;;;49701:1;;49691:12;49623:2;49543;49710:22;49521:216;;-1:-1;49521:216::o;49744:304::-;;49903:18;49895:6;49892:30;49889:2;;;-1:-1;;49925:12;49889:2;-1:-1;49970:4;49958:17;;;50023:15;;49826:222::o;53725:268::-;53790:1;53797:101;53811:6;53808:1;53805:13;53797:101;;;53878:11;;;53872:18;53859:11;;;53852:39;53833:2;53826:10;53797:101;;;53913:6;53910:1;53907:13;53904:2;;;-1:-1;;53790:1;53960:16;;53953:27;53774:219::o;54568:106::-;54653:3;54649:15;;54621:53::o;54682:739::-;;54755:4;54737:16;54734:26;54731:2;;;54763:5;;54731:2;54797:1;-1:-1;;54776:23;54872:10;54815:34;-1:-1;54840:8;54815:34;:::i;:::-;54864:19;54854:2;;54887:5;;54854:2;54918;54912:9;54954:16;-1:-1;;54950:24;54797:1;54912:9;54926:49;55001:4;54995:11;55082:16;55034:18;55082:16;55075:4;55067:6;55063:17;55060:39;55034:18;55026:6;55023:30;55014:91;55011:2;;;55113:5;;;;;;55011:2;55151:6;55145:4;55141:17;55130:28;;55183:3;55177:10;55163:24;;55034:18;55198:6;55195:30;55192:2;;;55228:5;;;;;;55192:2;;55305:16;55299:4;55295:27;55265:4;55272:6;55260:3;55252:27;;55287:36;55284:2;;;55326:5;;;;;55284:2;50925:9;54429:14;-1:-1;;54425:28;55350:50;;55265:4;55350:50;54918:2;55339:62;55358:3;-1:-1;;54725:696;:::o;55428:117::-;-1:-1;;;;;53337:54;;55487:35;;55477:2;;55536:1;;55526:12;55794:115;-1:-1;;;;;;53185:78;;55852:34;;55842:2;;55900:1;;55890:12
Swarm Source
ipfs://7187880b64cfed23a5c24122b02a8b4adfcd3319ea007cc7a68e8acff598d59a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 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.