ERC-1155
Overview
Max Total Supply
251 WMAN
Holders
49
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
AlphaNode
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-31 */ // SPDX-License-Identifier: MIT // Sources flattened with hardhat v2.8.0 https://hardhat.org // File @openzeppelin/contracts/utils/introspection/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC1155/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface 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/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _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/token/ERC1155/extensions/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @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/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @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 on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; 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"); (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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/utils/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/introspection/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC1155/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @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 ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @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) public 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 virtual 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 virtual 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) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual 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( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(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( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `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 memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - 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[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); 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]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += 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 `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` 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 to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _doSafeTransferAcceptanceCheck(operator, address(0), to, 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]; } 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 `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, 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 from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @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.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.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 @openzeppelin/contracts/token/ERC721/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/token/ERC721/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/access/[email protected] // MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.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. */ abstract 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() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/AlphaNode.sol // MIT pragma solidity ^0.8.4; contract AlphaNode is ERC1155, Ownable { string public name = "Alpha Node"; string public symbol = "WMAN"; uint256 public maxSupply = 1000; uint256 public price = 0.1 ether; string public baseURI = "https://gateway.pinata.cloud/ipfs/QmXDpd31RQNdEM19oLvQLvcnKfeBwRt9kX6VZDifxY7vtW"; mapping (uint256 => bool) mintedTokens; uint256 totalMinted = 0; ERC721Enumerable WhaleContract = ERC721Enumerable(0xA87121eDa32661C0c178f06F8b44F12f80ae4E88); // Mainnet event TokenMinted(address to, uint256[] amount); constructor() ERC1155("https://gateway.pinata.cloud/ipfs/QmXDpd31RQNdEM19oLvQLvcnKfeBwRt9kX6VZDifxY7vtW") {} function mint(uint256 amount) external payable { require(price * amount <= msg.value, "NOT_ENOUGH_PAID"); require(totalMinted + amount <= maxSupply, "EXCEED_MAX_SUPPLY"); uint256 bal = WhaleContract.balanceOf(msg.sender); require(bal >= amount, "NOT_ENOUGH_WHALE_MAKER"); uint256[] memory passes = new uint256[](amount); uint256[] memory amounts = new uint256[](amount); uint256 mintCount; for (uint8 i = 0; i < bal; i++) { uint256 tokenId = WhaleContract.tokenOfOwnerByIndex(msg.sender, i); if (!mintedTokens[tokenId]) { mintedTokens[tokenId] = true; passes[mintCount] = tokenId; amounts[mintCount] = 1; mintCount++; } if (mintCount >= amount) break; } require(mintCount > 0, "NO_PASSES_REMAINING"); require(mintCount == amount, "NOT_ENOUGH_UNCLAIMED"); _mintBatch(msg.sender, passes, amounts, ""); emit TokenMinted(msg.sender, passes); } function uri(uint256 tokenId) override public view returns (string memory) { require(mintedTokens[tokenId], "NOT_EXISTED_TOKEN"); return ( string(abi.encodePacked( baseURI )) ); } function totalSupply() public view returns(uint256) { return WhaleContract.totalSupply(); } function setBaseUri(string memory newUri) external onlyOwner { baseURI = newUri; } function setCurrentPrice(uint256 newPrice) external onlyOwner { price = newPrice; } function setMaxSupply(uint256 newSupply) external onlyOwner { maxSupply = newSupply; } function withdraw() external onlyOwner { require(address(this).balance > 0, "NO_BALANCE"); payable(msg.sender).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"amount","type":"uint256[]"}],"name":"TokenMinted","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"},{"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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"string","name":"newUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setCurrentPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupply","type":"uint256"}],"name":"setMaxSupply","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052600a608081905269416c706861204e6f646560b01b60a09081526200002d91600491906200017a565b50604080518082019091526004808252632ba6a0a760e11b60209092019182526200005b916005916200017a565b506103e860065567016345785d8a00006007556040518060800160405280605081526020016200242e6050913980516200009e916008916020909101906200017a565b506000600a55600b80546001600160a01b03191673a87121eda32661c0c178f06f8b44f12f80ae4e88179055348015620000d757600080fd5b506040518060800160405280605081526020016200242e60509139620000fd816200010f565b50620001093362000128565b6200025d565b8051620001249060029060208401906200017a565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001889062000220565b90600052602060002090601f016020900481019282620001ac5760008555620001f7565b82601f10620001c757805160ff1916838001178555620001f7565b82800160010185558215620001f7579182015b82811115620001f7578251825591602001919060010190620001da565b506200020592915062000209565b5090565b5b808211156200020557600081556001016200020a565b600181811c908216806200023557607f821691505b602082108114156200025757634e487b7160e01b600052602260045260246000fd5b50919050565b6121c1806200026d6000396000f3fe6080604052600436106101345760003560e01c8063715018a6116100ab578063a0bcfc7f1161006f578063a0bcfc7f14610327578063a22cb46514610347578063d5abeb0114610367578063e985e9c51461037d578063f242432a146103c6578063f2fde38b146103e657600080fd5b8063715018a6146102ac5780638da5cb5b146102c157806395d89b41146102e9578063a035b1fe146102fe578063a0712d681461031457600080fd5b806318b20071116100fd57806318b20071146101f35780632eb2c2d6146102155780633ccfd60b146102355780634e1273f41461024a5780636c0360eb146102775780636f8b44b01461028c57600080fd5b8062fdd58e1461013957806301ffc9a71461016c57806306fdde031461019c5780630e89341c146101be57806318160ddd146101de575b600080fd5b34801561014557600080fd5b50610159610154366004611a44565b610406565b6040519081526020015b60405180910390f35b34801561017857600080fd5b5061018c610187366004611b3f565b61049d565b6040519015158152602001610163565b3480156101a857600080fd5b506101b16104ef565b6040516101639190611e28565b3480156101ca57600080fd5b506101b16101d9366004611bca565b61057d565b3480156101ea57600080fd5b506101596105fa565b3480156101ff57600080fd5b5061021361020e366004611bca565b61067c565b005b34801561022157600080fd5b506102136102303660046118f9565b6106ab565b34801561024157600080fd5b50610213610742565b34801561025657600080fd5b5061026a610265366004611a6e565b6107d8565b6040516101639190611de7565b34801561028357600080fd5b506101b1610902565b34801561029857600080fd5b506102136102a7366004611bca565b61090f565b3480156102b857600080fd5b5061021361093e565b3480156102cd57600080fd5b506003546040516001600160a01b039091168152602001610163565b3480156102f557600080fd5b506101b1610974565b34801561030a57600080fd5b5061015960075481565b610213610322366004611bca565b610981565b34801561033357600080fd5b50610213610342366004611b79565b610d95565b34801561035357600080fd5b50610213610362366004611a08565b610dd6565b34801561037357600080fd5b5061015960065481565b34801561038957600080fd5b5061018c6103983660046118c6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156103d257600080fd5b506102136103e13660046119a3565b610de1565b3480156103f257600080fd5b506102136104013660046118ab565b610e68565b60006001600160a01b0383166104775760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806104ce57506001600160e01b031982166303a24d0760e21b145b806104e957506301ffc9a760e01b6001600160e01b03198316145b92915050565b600480546104fc90611fea565b80601f016020809104026020016040519081016040528092919081815260200182805461052890611fea565b80156105755780601f1061054a57610100808354040283529160200191610575565b820191906000526020600020905b81548152906001019060200180831161055857829003601f168201915b505050505081565b60008181526009602052604090205460609060ff166105d25760405162461bcd60e51b81526020600482015260116024820152702727aa2fa2ac24a9aa22a22faa27a5a2a760791b604482015260640161046e565b60086040516020016105e49190611c84565b6040516020818303038152906040529050919050565b600b54604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561063f57600080fd5b505afa158015610653573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106779190611be3565b905090565b6003546001600160a01b031633146106a65760405162461bcd60e51b815260040161046e90611f12565b600755565b6001600160a01b0385163314806106c757506106c78533610398565b61072e5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161046e565b61073b8585858585610f00565b5050505050565b6003546001600160a01b0316331461076c5760405162461bcd60e51b815260040161046e90611f12565b600047116107a95760405162461bcd60e51b815260206004820152600a6024820152694e4f5f42414c414e434560b01b604482015260640161046e565b60405133904780156108fc02916000818181858888f193505050501580156107d5573d6000803e3d6000fd5b50565b6060815183511461083d5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161046e565b6000835167ffffffffffffffff811115610859576108596120b9565b604051908082528060200260200182016040528015610882578160200160208202803683370190505b50905060005b84518110156108fa576108cd8582815181106108a6576108a66120a3565b60200260200101518583815181106108c0576108c06120a3565b6020026020010151610406565b8282815181106108df576108df6120a3565b60209081029190910101526108f381612052565b9050610888565b509392505050565b600880546104fc90611fea565b6003546001600160a01b031633146109395760405162461bcd60e51b815260040161046e90611f12565b600655565b6003546001600160a01b031633146109685760405162461bcd60e51b815260040161046e90611f12565b610972600061109c565b565b600580546104fc90611fea565b34816007546109909190611fcb565b11156109d05760405162461bcd60e51b815260206004820152600f60248201526e1393d517d15393d551d217d4105251608a1b604482015260640161046e565b60065481600a546109e19190611fb3565b1115610a235760405162461bcd60e51b81526020600482015260116024820152704558434545445f4d41585f535550504c5960781b604482015260640161046e565b600b546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610a6757600080fd5b505afa158015610a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9f9190611be3565b905081811015610aea5760405162461bcd60e51b81526020600482015260166024820152752727aa2fa2a727aaa3a42faba420a622afa6a0a5a2a960511b604482015260640161046e565b60008267ffffffffffffffff811115610b0557610b056120b9565b604051908082528060200260200182016040528015610b2e578160200160208202803683370190505b50905060008367ffffffffffffffff811115610b4c57610b4c6120b9565b604051908082528060200260200182016040528015610b75578160200160208202803683370190505b5090506000805b848160ff161015610cad57600b54604051632f745c5960e01b815233600482015260ff831660248201526000916001600160a01b031690632f745c599060440160206040518083038186803b158015610bd457600080fd5b505afa158015610be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0c9190611be3565b60008181526009602052604090205490915060ff16610c8d576000818152600960205260409020805460ff1916600117905584518190869085908110610c5457610c546120a3565b6020026020010181815250506001848481518110610c7457610c746120a3565b602090810291909101015282610c8981612052565b9350505b868310610c9a5750610cad565b5080610ca58161206d565b915050610b7c565b5060008111610cf45760405162461bcd60e51b81526020600482015260136024820152724e4f5f5041535345535f52454d41494e494e4760681b604482015260640161046e565b848114610d3a5760405162461bcd60e51b81526020600482015260146024820152731393d517d15393d551d217d55390d3105253515160621b604482015260640161046e565b610d55338484604051806020016040528060008152506110ee565b7fb01f9161a9962c1cc090924bf32c4d882069bedfb39af9fa850022cda12302bc3384604051610d86929190611dc3565b60405180910390a15050505050565b6003546001600160a01b03163314610dbf5760405162461bcd60e51b815260040161046e90611f12565b8051610dd29060089060208401906116fa565b5050565b610dd2338383611273565b6001600160a01b038516331480610dfd5750610dfd8533610398565b610e5b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161046e565b61073b8585858585611354565b6003546001600160a01b03163314610e925760405162461bcd60e51b815260040161046e90611f12565b6001600160a01b038116610ef75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161046e565b6107d58161109c565b8151835114610f215760405162461bcd60e51b815260040161046e90611f47565b6001600160a01b038416610f475760405162461bcd60e51b815260040161046e90611e83565b3360005b845181101561102e576000858281518110610f6857610f686120a3565b602002602001015190506000858381518110610f8657610f866120a3565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610fd65760405162461bcd60e51b815260040161046e90611ec8565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611013908490611fb3565b925050819055505050508061102790612052565b9050610f4b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161107e929190611dfa565b60405180910390a461109481878787878761147a565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03841661114e5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161046e565b815183511461116f5760405162461bcd60e51b815260040161046e90611f47565b3360005b845181101561120b5783818151811061118e5761118e6120a3565b60200260200101516000808784815181106111ab576111ab6120a3565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546111f39190611fb3565b9091555081905061120381612052565b915050611173565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161125c929190611dfa565b60405180910390a461073b8160008787878761147a565b816001600160a01b0316836001600160a01b031614156112e75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161046e565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661137a5760405162461bcd60e51b815260040161046e90611e83565b3361139381878761138a886115e5565b61073b886115e5565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156113d45760405162461bcd60e51b815260040161046e90611ec8565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611411908490611fb3565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611471828888888888611630565b50505050505050565b6001600160a01b0384163b156110945760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906114be9089908990889088908890600401611d20565b602060405180830381600087803b1580156114d857600080fd5b505af1925050508015611508575060408051601f3d908101601f1916820190925261150591810190611b5c565b60015b6115b5576115146120cf565b806308c379a0141561154e57506115296120eb565b806115345750611550565b8060405162461bcd60e51b815260040161046e9190611e28565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161046e565b6001600160e01b0319811663bc197c8160e01b146114715760405162461bcd60e51b815260040161046e90611e3b565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061161f5761161f6120a3565b602090810291909101015292915050565b6001600160a01b0384163b156110945760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906116749089908990889088908890600401611d7e565b602060405180830381600087803b15801561168e57600080fd5b505af19250505080156116be575060408051601f3d908101601f191682019092526116bb91810190611b5c565b60015b6116ca576115146120cf565b6001600160e01b0319811663f23a6e6160e01b146114715760405162461bcd60e51b815260040161046e90611e3b565b82805461170690611fea565b90600052602060002090601f016020900481019282611728576000855561176e565b82601f1061174157805160ff191683800117855561176e565b8280016001018555821561176e579182015b8281111561176e578251825591602001919060010190611753565b5061177a92915061177e565b5090565b5b8082111561177a576000815560010161177f565b600067ffffffffffffffff8311156117ad576117ad6120b9565b6040516117c4601f8501601f191660200182612025565b8091508381528484840111156117d957600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b038116811461180857600080fd5b919050565b600082601f83011261181e57600080fd5b8135602061182b82611f8f565b6040516118388282612025565b8381528281019150858301600585901b8701840188101561185857600080fd5b60005b858110156118775781358452928401929084019060010161185b565b5090979650505050505050565b600082601f83011261189557600080fd5b6118a483833560208501611793565b9392505050565b6000602082840312156118bd57600080fd5b6118a4826117f1565b600080604083850312156118d957600080fd5b6118e2836117f1565b91506118f0602084016117f1565b90509250929050565b600080600080600060a0868803121561191157600080fd5b61191a866117f1565b9450611928602087016117f1565b9350604086013567ffffffffffffffff8082111561194557600080fd5b61195189838a0161180d565b9450606088013591508082111561196757600080fd5b61197389838a0161180d565b9350608088013591508082111561198957600080fd5b5061199688828901611884565b9150509295509295909350565b600080600080600060a086880312156119bb57600080fd5b6119c4866117f1565b94506119d2602087016117f1565b93506040860135925060608601359150608086013567ffffffffffffffff8111156119fc57600080fd5b61199688828901611884565b60008060408385031215611a1b57600080fd5b611a24836117f1565b915060208301358015158114611a3957600080fd5b809150509250929050565b60008060408385031215611a5757600080fd5b611a60836117f1565b946020939093013593505050565b60008060408385031215611a8157600080fd5b823567ffffffffffffffff80821115611a9957600080fd5b818501915085601f830112611aad57600080fd5b81356020611aba82611f8f565b604051611ac78282612025565b8381528281019150858301600585901b870184018b1015611ae757600080fd5b600096505b84871015611b1157611afd816117f1565b835260019690960195918301918301611aec565b5096505086013592505080821115611b2857600080fd5b50611b358582860161180d565b9150509250929050565b600060208284031215611b5157600080fd5b81356118a481612175565b600060208284031215611b6e57600080fd5b81516118a481612175565b600060208284031215611b8b57600080fd5b813567ffffffffffffffff811115611ba257600080fd5b8201601f81018413611bb357600080fd5b611bc284823560208401611793565b949350505050565b600060208284031215611bdc57600080fd5b5035919050565b600060208284031215611bf557600080fd5b5051919050565b600081518084526020808501945080840160005b83811015611c2c57815187529582019590820190600101611c10565b509495945050505050565b6000815180845260005b81811015611c5d57602081850181015186830182015201611c41565b81811115611c6f576000602083870101525b50601f01601f19169290920160200192915050565b600080835481600182811c915080831680611ca057607f831692505b6020808410821415611cc057634e487b7160e01b86526022600452602486fd5b818015611cd45760018114611ce557611d12565b60ff19861689528489019650611d12565b60008a81526020902060005b86811015611d0a5781548b820152908501908301611cf1565b505084890196505b509498975050505050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090611d4c90830186611bfc565b8281036060840152611d5e8186611bfc565b90508281036080840152611d728185611c37565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611db890830184611c37565b979650505050505050565b6001600160a01b0383168152604060208201819052600090611bc290830184611bfc565b6020815260006118a46020830184611bfc565b604081526000611e0d6040830185611bfc565b8281036020840152611e1f8185611bfc565b95945050505050565b6020815260006118a46020830184611c37565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b600067ffffffffffffffff821115611fa957611fa96120b9565b5060051b60200190565b60008219821115611fc657611fc661208d565b500190565b6000816000190483118215151615611fe557611fe561208d565b500290565b600181811c90821680611ffe57607f821691505b6020821081141561201f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff8111828210171561204b5761204b6120b9565b6040525050565b60006000198214156120665761206661208d565b5060010190565b600060ff821660ff8114156120845761208461208d565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156120e85760046000803e5060005160e01c5b90565b600060443d10156120f95790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561212957505050505090565b82850191508151818111156121415750505050505090565b843d870101602082850101111561215b5750505050505090565b61216a60208286010187612025565b509095945050505050565b6001600160e01b0319811681146107d557600080fdfea2646970667358221220752c695e19336bd13bf45a0f13cff0ecbd37a9e99a195efed1d1b921a0216a9a64736f6c6343000807003368747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d58447064333152514e64454d31396f4c76514c76636e4b666542775274396b5836565a446966785937767457
Deployed Bytecode
0x6080604052600436106101345760003560e01c8063715018a6116100ab578063a0bcfc7f1161006f578063a0bcfc7f14610327578063a22cb46514610347578063d5abeb0114610367578063e985e9c51461037d578063f242432a146103c6578063f2fde38b146103e657600080fd5b8063715018a6146102ac5780638da5cb5b146102c157806395d89b41146102e9578063a035b1fe146102fe578063a0712d681461031457600080fd5b806318b20071116100fd57806318b20071146101f35780632eb2c2d6146102155780633ccfd60b146102355780634e1273f41461024a5780636c0360eb146102775780636f8b44b01461028c57600080fd5b8062fdd58e1461013957806301ffc9a71461016c57806306fdde031461019c5780630e89341c146101be57806318160ddd146101de575b600080fd5b34801561014557600080fd5b50610159610154366004611a44565b610406565b6040519081526020015b60405180910390f35b34801561017857600080fd5b5061018c610187366004611b3f565b61049d565b6040519015158152602001610163565b3480156101a857600080fd5b506101b16104ef565b6040516101639190611e28565b3480156101ca57600080fd5b506101b16101d9366004611bca565b61057d565b3480156101ea57600080fd5b506101596105fa565b3480156101ff57600080fd5b5061021361020e366004611bca565b61067c565b005b34801561022157600080fd5b506102136102303660046118f9565b6106ab565b34801561024157600080fd5b50610213610742565b34801561025657600080fd5b5061026a610265366004611a6e565b6107d8565b6040516101639190611de7565b34801561028357600080fd5b506101b1610902565b34801561029857600080fd5b506102136102a7366004611bca565b61090f565b3480156102b857600080fd5b5061021361093e565b3480156102cd57600080fd5b506003546040516001600160a01b039091168152602001610163565b3480156102f557600080fd5b506101b1610974565b34801561030a57600080fd5b5061015960075481565b610213610322366004611bca565b610981565b34801561033357600080fd5b50610213610342366004611b79565b610d95565b34801561035357600080fd5b50610213610362366004611a08565b610dd6565b34801561037357600080fd5b5061015960065481565b34801561038957600080fd5b5061018c6103983660046118c6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b3480156103d257600080fd5b506102136103e13660046119a3565b610de1565b3480156103f257600080fd5b506102136104013660046118ab565b610e68565b60006001600160a01b0383166104775760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806104ce57506001600160e01b031982166303a24d0760e21b145b806104e957506301ffc9a760e01b6001600160e01b03198316145b92915050565b600480546104fc90611fea565b80601f016020809104026020016040519081016040528092919081815260200182805461052890611fea565b80156105755780601f1061054a57610100808354040283529160200191610575565b820191906000526020600020905b81548152906001019060200180831161055857829003601f168201915b505050505081565b60008181526009602052604090205460609060ff166105d25760405162461bcd60e51b81526020600482015260116024820152702727aa2fa2ac24a9aa22a22faa27a5a2a760791b604482015260640161046e565b60086040516020016105e49190611c84565b6040516020818303038152906040529050919050565b600b54604080516318160ddd60e01b815290516000926001600160a01b0316916318160ddd916004808301926020929190829003018186803b15801561063f57600080fd5b505afa158015610653573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106779190611be3565b905090565b6003546001600160a01b031633146106a65760405162461bcd60e51b815260040161046e90611f12565b600755565b6001600160a01b0385163314806106c757506106c78533610398565b61072e5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606482015260840161046e565b61073b8585858585610f00565b5050505050565b6003546001600160a01b0316331461076c5760405162461bcd60e51b815260040161046e90611f12565b600047116107a95760405162461bcd60e51b815260206004820152600a6024820152694e4f5f42414c414e434560b01b604482015260640161046e565b60405133904780156108fc02916000818181858888f193505050501580156107d5573d6000803e3d6000fd5b50565b6060815183511461083d5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b606482015260840161046e565b6000835167ffffffffffffffff811115610859576108596120b9565b604051908082528060200260200182016040528015610882578160200160208202803683370190505b50905060005b84518110156108fa576108cd8582815181106108a6576108a66120a3565b60200260200101518583815181106108c0576108c06120a3565b6020026020010151610406565b8282815181106108df576108df6120a3565b60209081029190910101526108f381612052565b9050610888565b509392505050565b600880546104fc90611fea565b6003546001600160a01b031633146109395760405162461bcd60e51b815260040161046e90611f12565b600655565b6003546001600160a01b031633146109685760405162461bcd60e51b815260040161046e90611f12565b610972600061109c565b565b600580546104fc90611fea565b34816007546109909190611fcb565b11156109d05760405162461bcd60e51b815260206004820152600f60248201526e1393d517d15393d551d217d4105251608a1b604482015260640161046e565b60065481600a546109e19190611fb3565b1115610a235760405162461bcd60e51b81526020600482015260116024820152704558434545445f4d41585f535550504c5960781b604482015260640161046e565b600b546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015610a6757600080fd5b505afa158015610a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a9f9190611be3565b905081811015610aea5760405162461bcd60e51b81526020600482015260166024820152752727aa2fa2a727aaa3a42faba420a622afa6a0a5a2a960511b604482015260640161046e565b60008267ffffffffffffffff811115610b0557610b056120b9565b604051908082528060200260200182016040528015610b2e578160200160208202803683370190505b50905060008367ffffffffffffffff811115610b4c57610b4c6120b9565b604051908082528060200260200182016040528015610b75578160200160208202803683370190505b5090506000805b848160ff161015610cad57600b54604051632f745c5960e01b815233600482015260ff831660248201526000916001600160a01b031690632f745c599060440160206040518083038186803b158015610bd457600080fd5b505afa158015610be8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0c9190611be3565b60008181526009602052604090205490915060ff16610c8d576000818152600960205260409020805460ff1916600117905584518190869085908110610c5457610c546120a3565b6020026020010181815250506001848481518110610c7457610c746120a3565b602090810291909101015282610c8981612052565b9350505b868310610c9a5750610cad565b5080610ca58161206d565b915050610b7c565b5060008111610cf45760405162461bcd60e51b81526020600482015260136024820152724e4f5f5041535345535f52454d41494e494e4760681b604482015260640161046e565b848114610d3a5760405162461bcd60e51b81526020600482015260146024820152731393d517d15393d551d217d55390d3105253515160621b604482015260640161046e565b610d55338484604051806020016040528060008152506110ee565b7fb01f9161a9962c1cc090924bf32c4d882069bedfb39af9fa850022cda12302bc3384604051610d86929190611dc3565b60405180910390a15050505050565b6003546001600160a01b03163314610dbf5760405162461bcd60e51b815260040161046e90611f12565b8051610dd29060089060208401906116fa565b5050565b610dd2338383611273565b6001600160a01b038516331480610dfd5750610dfd8533610398565b610e5b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b606482015260840161046e565b61073b8585858585611354565b6003546001600160a01b03163314610e925760405162461bcd60e51b815260040161046e90611f12565b6001600160a01b038116610ef75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161046e565b6107d58161109c565b8151835114610f215760405162461bcd60e51b815260040161046e90611f47565b6001600160a01b038416610f475760405162461bcd60e51b815260040161046e90611e83565b3360005b845181101561102e576000858281518110610f6857610f686120a3565b602002602001015190506000858381518110610f8657610f866120a3565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610fd65760405162461bcd60e51b815260040161046e90611ec8565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611013908490611fb3565b925050819055505050508061102790612052565b9050610f4b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161107e929190611dfa565b60405180910390a461109481878787878761147a565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03841661114e5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b606482015260840161046e565b815183511461116f5760405162461bcd60e51b815260040161046e90611f47565b3360005b845181101561120b5783818151811061118e5761118e6120a3565b60200260200101516000808784815181106111ab576111ab6120a3565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b0316815260200190815260200160002060008282546111f39190611fb3565b9091555081905061120381612052565b915050611173565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161125c929190611dfa565b60405180910390a461073b8160008787878761147a565b816001600160a01b0316836001600160a01b031614156112e75760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b606482015260840161046e565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661137a5760405162461bcd60e51b815260040161046e90611e83565b3361139381878761138a886115e5565b61073b886115e5565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156113d45760405162461bcd60e51b815260040161046e90611ec8565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611411908490611fb3565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611471828888888888611630565b50505050505050565b6001600160a01b0384163b156110945760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906114be9089908990889088908890600401611d20565b602060405180830381600087803b1580156114d857600080fd5b505af1925050508015611508575060408051601f3d908101601f1916820190925261150591810190611b5c565b60015b6115b5576115146120cf565b806308c379a0141561154e57506115296120eb565b806115345750611550565b8060405162461bcd60e51b815260040161046e9190611e28565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b606482015260840161046e565b6001600160e01b0319811663bc197c8160e01b146114715760405162461bcd60e51b815260040161046e90611e3b565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061161f5761161f6120a3565b602090810291909101015292915050565b6001600160a01b0384163b156110945760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906116749089908990889088908890600401611d7e565b602060405180830381600087803b15801561168e57600080fd5b505af19250505080156116be575060408051601f3d908101601f191682019092526116bb91810190611b5c565b60015b6116ca576115146120cf565b6001600160e01b0319811663f23a6e6160e01b146114715760405162461bcd60e51b815260040161046e90611e3b565b82805461170690611fea565b90600052602060002090601f016020900481019282611728576000855561176e565b82601f1061174157805160ff191683800117855561176e565b8280016001018555821561176e579182015b8281111561176e578251825591602001919060010190611753565b5061177a92915061177e565b5090565b5b8082111561177a576000815560010161177f565b600067ffffffffffffffff8311156117ad576117ad6120b9565b6040516117c4601f8501601f191660200182612025565b8091508381528484840111156117d957600080fd5b83836020830137600060208583010152509392505050565b80356001600160a01b038116811461180857600080fd5b919050565b600082601f83011261181e57600080fd5b8135602061182b82611f8f565b6040516118388282612025565b8381528281019150858301600585901b8701840188101561185857600080fd5b60005b858110156118775781358452928401929084019060010161185b565b5090979650505050505050565b600082601f83011261189557600080fd5b6118a483833560208501611793565b9392505050565b6000602082840312156118bd57600080fd5b6118a4826117f1565b600080604083850312156118d957600080fd5b6118e2836117f1565b91506118f0602084016117f1565b90509250929050565b600080600080600060a0868803121561191157600080fd5b61191a866117f1565b9450611928602087016117f1565b9350604086013567ffffffffffffffff8082111561194557600080fd5b61195189838a0161180d565b9450606088013591508082111561196757600080fd5b61197389838a0161180d565b9350608088013591508082111561198957600080fd5b5061199688828901611884565b9150509295509295909350565b600080600080600060a086880312156119bb57600080fd5b6119c4866117f1565b94506119d2602087016117f1565b93506040860135925060608601359150608086013567ffffffffffffffff8111156119fc57600080fd5b61199688828901611884565b60008060408385031215611a1b57600080fd5b611a24836117f1565b915060208301358015158114611a3957600080fd5b809150509250929050565b60008060408385031215611a5757600080fd5b611a60836117f1565b946020939093013593505050565b60008060408385031215611a8157600080fd5b823567ffffffffffffffff80821115611a9957600080fd5b818501915085601f830112611aad57600080fd5b81356020611aba82611f8f565b604051611ac78282612025565b8381528281019150858301600585901b870184018b1015611ae757600080fd5b600096505b84871015611b1157611afd816117f1565b835260019690960195918301918301611aec565b5096505086013592505080821115611b2857600080fd5b50611b358582860161180d565b9150509250929050565b600060208284031215611b5157600080fd5b81356118a481612175565b600060208284031215611b6e57600080fd5b81516118a481612175565b600060208284031215611b8b57600080fd5b813567ffffffffffffffff811115611ba257600080fd5b8201601f81018413611bb357600080fd5b611bc284823560208401611793565b949350505050565b600060208284031215611bdc57600080fd5b5035919050565b600060208284031215611bf557600080fd5b5051919050565b600081518084526020808501945080840160005b83811015611c2c57815187529582019590820190600101611c10565b509495945050505050565b6000815180845260005b81811015611c5d57602081850181015186830182015201611c41565b81811115611c6f576000602083870101525b50601f01601f19169290920160200192915050565b600080835481600182811c915080831680611ca057607f831692505b6020808410821415611cc057634e487b7160e01b86526022600452602486fd5b818015611cd45760018114611ce557611d12565b60ff19861689528489019650611d12565b60008a81526020902060005b86811015611d0a5781548b820152908501908301611cf1565b505084890196505b509498975050505050505050565b6001600160a01b0386811682528516602082015260a060408201819052600090611d4c90830186611bfc565b8281036060840152611d5e8186611bfc565b90508281036080840152611d728185611c37565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611db890830184611c37565b979650505050505050565b6001600160a01b0383168152604060208201819052600090611bc290830184611bfc565b6020815260006118a46020830184611bfc565b604081526000611e0d6040830185611bfc565b8281036020840152611e1f8185611bfc565b95945050505050565b6020815260006118a46020830184611c37565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b600067ffffffffffffffff821115611fa957611fa96120b9565b5060051b60200190565b60008219821115611fc657611fc661208d565b500190565b6000816000190483118215151615611fe557611fe561208d565b500290565b600181811c90821680611ffe57607f821691505b6020821081141561201f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff8111828210171561204b5761204b6120b9565b6040525050565b60006000198214156120665761206661208d565b5060010190565b600060ff821660ff8114156120845761208461208d565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d11156120e85760046000803e5060005160e01c5b90565b600060443d10156120f95790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561212957505050505090565b82850191508151818111156121415750505050505090565b843d870101602082850101111561215b5750505050505090565b61216a60208286010187612025565b509095945050505050565b6001600160e01b0319811681146107d557600080fdfea2646970667358221220752c695e19336bd13bf45a0f13cff0ecbd37a9e99a195efed1d1b921a0216a9a64736f6c63430008070033
Deployed Bytecode Sourcemap
67742:2666:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20645:231;;;;;;;;;;-1:-1:-1;20645:231:0;;;;;:::i;:::-;;:::i;:::-;;;20096:25:1;;;20084:2;20069:18;20645:231:0;;;;;;;;19668:310;;;;;;;;;;-1:-1:-1;19668:310:0;;;;;:::i;:::-;;:::i;:::-;;;11989:14:1;;11982:22;11964:41;;11952:2;11937:18;19668:310:0;11824:187:1;67788:33:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;69545:254::-;;;;;;;;;;-1:-1:-1;69545:254:0;;;;;:::i;:::-;;:::i;69807:105::-;;;;;;;;;;;;;:::i;70024:97::-;;;;;;;;;;-1:-1:-1;70024:97:0;;;;;:::i;:::-;;:::i;:::-;;22584:442;;;;;;;;;;-1:-1:-1;22584:442:0;;;;;:::i;:::-;;:::i;70237:168::-;;;;;;;;;;;;;:::i;21042:524::-;;;;;;;;;;-1:-1:-1;21042:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;67943:106::-;;;;;;;;;;;;;:::i;70129:100::-;;;;;;;;;;-1:-1:-1;70129:100:0;;;;;:::i;:::-;;:::i;66855:103::-;;;;;;;;;;;;;:::i;66204:87::-;;;;;;;;;;-1:-1:-1;66277:6:0;;66204:87;;-1:-1:-1;;;;;66277:6:0;;;8979:51:1;;8967:2;8952:18;66204:87:0;8833:203:1;67828:29:0;;;;;;;;;;;;;:::i;67902:32::-;;;;;;;;;;;;;;;;68426:1111;;;;;;:::i;:::-;;:::i;69920:96::-;;;;;;;;;;-1:-1:-1;69920:96:0;;;;;:::i;:::-;;:::i;21639:155::-;;;;;;;;;;-1:-1:-1;21639:155:0;;;;;:::i;:::-;;:::i;67864:31::-;;;;;;;;;;;;;;;;21866:168;;;;;;;;;;-1:-1:-1;21866:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;21989:27:0;;;21965:4;21989:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;21866:168;22106:401;;;;;;;;;;-1:-1:-1;22106:401:0;;;;;:::i;:::-;;:::i;67113:201::-;;;;;;;;;;-1:-1:-1;67113:201:0;;;;;:::i;:::-;;:::i;20645:231::-;20731:7;-1:-1:-1;;;;;20759:21:0;;20751:77;;;;-1:-1:-1;;;20751:77:0;;13272:2:1;20751:77:0;;;13254:21:1;13311:2;13291:18;;;13284:30;13350:34;13330:18;;;13323:62;-1:-1:-1;;;13401:18:1;;;13394:41;13452:19;;20751:77:0;;;;;;;;;-1:-1:-1;20846:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;20846:22:0;;;;;;;;;;;;20645:231::o;19668:310::-;19770:4;-1:-1:-1;;;;;;19807:41:0;;-1:-1:-1;;;19807:41:0;;:110;;-1:-1:-1;;;;;;;19865:52:0;;-1:-1:-1;;;19865:52:0;19807:110;:163;;;-1:-1:-1;;;;;;;;;;18524:40:0;;;19934:36;19787:183;19668:310;-1:-1:-1;;19668:310:0:o;67788:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;69545:254::-;69639:21;;;;:12;:21;;;;;;69605:13;;69639:21;;69631:51;;;;-1:-1:-1;;;69631:51:0;;19806:2:1;69631:51:0;;;19788:21:1;19845:2;19825:18;;;19818:30;-1:-1:-1;;;19864:18:1;;;19857:47;19921:18;;69631:51:0;19604:341:1;69631:51:0;69757:7;69722:57;;;;;;;;:::i;:::-;;;;;;;;;;;;;69693:98;;69545:254;;;:::o;69807:105::-;69877:13;;:27;;;-1:-1:-1;;;69877:27:0;;;;69850:7;;-1:-1:-1;;;;;69877:13:0;;:25;;:27;;;;;;;;;;;;;;:13;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69870:34;;69807:105;:::o;70024:97::-;66277:6;;-1:-1:-1;;;;;66277:6:0;17404:10;66424:23;66416:68;;;;-1:-1:-1;;;66416:68:0;;;;;;;:::i;:::-;70097:5:::1;:16:::0;70024:97::o;22584:442::-;-1:-1:-1;;;;;22817:20:0;;17404:10;22817:20;;:60;;-1:-1:-1;22841:36:0;22858:4;17404:10;21866:168;:::i;22841:36::-;22795:160;;;;-1:-1:-1;;;22795:160:0;;16285:2:1;22795:160:0;;;16267:21:1;16324:2;16304:18;;;16297:30;16363:34;16343:18;;;16336:62;-1:-1:-1;;;16414:18:1;;;16407:48;16472:19;;22795:160:0;16083:414:1;22795:160:0;22966:52;22989:4;22995:2;22999:3;23004:7;23013:4;22966:22;:52::i;:::-;22584:442;;;;;:::o;70237:168::-;66277:6;;-1:-1:-1;;;;;66277:6:0;17404:10;66424:23;66416:68;;;;-1:-1:-1;;;66416:68:0;;;;;;;:::i;:::-;70319:1:::1;70295:21;:25;70287:48;;;::::0;-1:-1:-1;;;70287:48:0;;14091:2:1;70287:48:0::1;::::0;::::1;14073:21:1::0;14130:2;14110:18;;;14103:30;-1:-1:-1;;;14149:18:1;;;14142:40;14199:18;;70287:48:0::1;13889:334:1::0;70287:48:0::1;70346:51;::::0;70354:10:::1;::::0;70375:21:::1;70346:51:::0;::::1;;;::::0;::::1;::::0;;;70375:21;70354:10;70346:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;70237:168::o:0;21042:524::-;21198:16;21259:3;:10;21240:8;:15;:29;21232:83;;;;-1:-1:-1;;;21232:83:0;;18234:2:1;21232:83:0;;;18216:21:1;18273:2;18253:18;;;18246:30;18312:34;18292:18;;;18285:62;-1:-1:-1;;;18363:18:1;;;18356:39;18412:19;;21232:83:0;18032:405:1;21232:83:0;21328:30;21375:8;:15;21361:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21361:30:0;;21328:63;;21409:9;21404:122;21428:8;:15;21424:1;:19;21404:122;;;21484:30;21494:8;21503:1;21494:11;;;;;;;;:::i;:::-;;;;;;;21507:3;21511:1;21507:6;;;;;;;;:::i;:::-;;;;;;;21484:9;:30::i;:::-;21465:13;21479:1;21465:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;21445:3;;;:::i;:::-;;;21404:122;;;-1:-1:-1;21545:13:0;21042:524;-1:-1:-1;;;21042:524:0:o;67943:106::-;;;;;;;:::i;70129:100::-;66277:6;;-1:-1:-1;;;;;66277:6:0;17404:10;66424:23;66416:68;;;;-1:-1:-1;;;66416:68:0;;;;;;;:::i;:::-;70200:9:::1;:21:::0;70129:100::o;66855:103::-;66277:6;;-1:-1:-1;;;;;66277:6:0;17404:10;66424:23;66416:68;;;;-1:-1:-1;;;66416:68:0;;;;;;;:::i;:::-;66920:30:::1;66947:1;66920:18;:30::i;:::-;66855:103::o:0;67828:29::-;;;;;;;:::i;68426:1111::-;68514:9;68504:6;68496:5;;:14;;;;:::i;:::-;:27;;68488:55;;;;-1:-1:-1;;;68488:55:0;;15186:2:1;68488:55:0;;;15168:21:1;15225:2;15205:18;;;15198:30;-1:-1:-1;;;15244:18:1;;;15237:45;15299:18;;68488:55:0;14984:339:1;68488:55:0;68586:9;;68576:6;68562:11;;:20;;;;:::i;:::-;:33;;68554:63;;;;-1:-1:-1;;;68554:63:0;;14430:2:1;68554:63:0;;;14412:21:1;14469:2;14449:18;;;14442:30;-1:-1:-1;;;14488:18:1;;;14481:47;14545:18;;68554:63:0;14228:341:1;68554:63:0;68644:13;;:35;;-1:-1:-1;;;68644:35:0;;68668:10;68644:35;;;8979:51:1;68630:11:0;;-1:-1:-1;;;;;68644:13:0;;:23;;8952:18:1;;68644:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68630:49;;68705:6;68698:3;:13;;68690:48;;;;-1:-1:-1;;;68690:48:0;;19455:2:1;68690:48:0;;;19437:21:1;19494:2;19474:18;;;19467:30;-1:-1:-1;;;19513:18:1;;;19506:52;19575:18;;68690:48:0;19253:346:1;68690:48:0;68751:23;68791:6;68777:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68777:21:0;;68751:47;;68809:24;68850:6;68836:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68836:21:0;-1:-1:-1;68809:48:0;-1:-1:-1;68868:17:0;;68898:408;68920:3;68916:1;:7;;;68898:408;;;68963:13;;:48;;-1:-1:-1;;;68963:48:0;;68997:10;68963:48;;;10972:51:1;11071:4;11059:17;;11039:18;;;11032:45;68945:15:0;;-1:-1:-1;;;;;68963:13:0;;:33;;10945:18:1;;68963:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69045:21;;;;:12;:21;;;;;;68945:66;;-1:-1:-1;69045:21:0;;69040:208;;69087:21;;;;:12;:21;;;;;:28;;-1:-1:-1;;69087:28:0;69111:4;69087:28;;;69134:17;;69100:7;;69134:6;;69141:9;;69134:17;;;;;;:::i;:::-;;;;;;:27;;;;;69201:1;69180:7;69188:9;69180:18;;;;;;;;:::i;:::-;;;;;;;;;;:22;69221:11;;;;:::i;:::-;;;;69040:208;69281:6;69268:9;:19;69264:30;;69289:5;;;69264:30;-1:-1:-1;68925:3:0;;;;:::i;:::-;;;;68898:408;;;;69338:1;69326:9;:13;69318:45;;;;-1:-1:-1;;;69318:45:0;;17115:2:1;69318:45:0;;;17097:21:1;17154:2;17134:18;;;17127:30;-1:-1:-1;;;17173:18:1;;;17166:49;17232:18;;69318:45:0;16913:343:1;69318:45:0;69395:6;69382:9;:19;69374:52;;;;-1:-1:-1;;;69374:52:0;;15530:2:1;69374:52:0;;;15512:21:1;15569:2;15549:18;;;15542:30;-1:-1:-1;;;15588:18:1;;;15581:50;15648:18;;69374:52:0;15328:344:1;69374:52:0;69439:43;69450:10;69462:6;69470:7;69439:43;;;;;;;;;;;;:10;:43::i;:::-;69498:31;69510:10;69522:6;69498:31;;;;;;;:::i;:::-;;;;;;;;68473:1064;;;;68426:1111;:::o;69920:96::-;66277:6;;-1:-1:-1;;;;;66277:6:0;17404:10;66424:23;66416:68;;;;-1:-1:-1;;;66416:68:0;;;;;;;:::i;:::-;69992:16;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;;69920:96:::0;:::o;21639:155::-;21734:52;17404:10;21767:8;21777;21734:18;:52::i;22106:401::-;-1:-1:-1;;;;;22314:20:0;;17404:10;22314:20;;:60;;-1:-1:-1;22338:36:0;22355:4;17404:10;21866:168;:::i;22338:36::-;22292:151;;;;-1:-1:-1;;;22292:151:0;;14776:2:1;22292:151:0;;;14758:21:1;14815:2;14795:18;;;14788:30;14854:34;14834:18;;;14827:62;-1:-1:-1;;;14905:18:1;;;14898:39;14954:19;;22292:151:0;14574:405:1;22292:151:0;22454:45;22472:4;22478:2;22482;22486:6;22494:4;22454:17;:45::i;67113:201::-;66277:6;;-1:-1:-1;;;;;66277:6:0;17404:10;66424:23;66416:68;;;;-1:-1:-1;;;66416:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;67202:22:0;::::1;67194:73;;;::::0;-1:-1:-1;;;67194:73:0;;13684:2:1;67194:73:0::1;::::0;::::1;13666:21:1::0;13723:2;13703:18;;;13696:30;13762:34;13742:18;;;13735:62;-1:-1:-1;;;13813:18:1;;;13806:36;13859:19;;67194:73:0::1;13482:402:1::0;67194:73:0::1;67278:28;67297:8;67278:18;:28::i;24668:1074::-:0;24895:7;:14;24881:3;:10;:28;24873:81;;;;-1:-1:-1;;;24873:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24973:16:0;;24965:66;;;;-1:-1:-1;;;24965:66:0;;;;;;;:::i;:::-;17404:10;25044:16;25161:421;25185:3;:10;25181:1;:14;25161:421;;;25217:10;25230:3;25234:1;25230:6;;;;;;;;:::i;:::-;;;;;;;25217:19;;25251:14;25268:7;25276:1;25268:10;;;;;;;;:::i;:::-;;;;;;;;;;;;25295:19;25317:13;;;;;;;;;;-1:-1:-1;;;;;25317:19:0;;;;;;;;;;;;25268:10;;-1:-1:-1;25359:21:0;;;;25351:76;;;;-1:-1:-1;;;25351:76:0;;;;;;;:::i;:::-;25471:9;:13;;;;;;;;;;;-1:-1:-1;;;;;25471:19:0;;;;;;;;;;25493:20;;;25471:42;;25543:17;;;;;;;:27;;25493:20;;25471:9;25543:27;;25493:20;;25543:27;:::i;:::-;;;;;;;;25202:380;;;25197:3;;;;:::i;:::-;;;25161:421;;;;25629:2;-1:-1:-1;;;;;25599:47:0;25623:4;-1:-1:-1;;;;;25599:47:0;25613:8;-1:-1:-1;;;;;25599:47:0;;25633:3;25638:7;25599:47;;;;;;;:::i;:::-;;;;;;;;25659:75;25695:8;25705:4;25711:2;25715:3;25720:7;25729:4;25659:35;:75::i;:::-;24862:880;24668:1074;;;;;:::o;67474:191::-;67567:6;;;-1:-1:-1;;;;;67584:17:0;;;-1:-1:-1;;;;;;67584:17:0;;;;;;;67617:40;;67567:6;;;67584:17;67567:6;;67617:40;;67548:16;;67617:40;67537:128;67474:191;:::o;27985:735::-;-1:-1:-1;;;;;28163:16:0;;28155:62;;;;-1:-1:-1;;;28155:62:0;;19053:2:1;28155:62:0;;;19035:21:1;19092:2;19072:18;;;19065:30;19131:34;19111:18;;;19104:62;-1:-1:-1;;;19182:18:1;;;19175:31;19223:19;;28155:62:0;18851:397:1;28155:62:0;28250:7;:14;28236:3;:10;:28;28228:81;;;;-1:-1:-1;;;28228:81:0;;;;;;;:::i;:::-;17404:10;28322:16;28445:103;28469:3;:10;28465:1;:14;28445:103;;;28526:7;28534:1;28526:10;;;;;;;;:::i;:::-;;;;;;;28501:9;:17;28511:3;28515:1;28511:6;;;;;;;;:::i;:::-;;;;;;;28501:17;;;;;;;;;;;:21;28519:2;-1:-1:-1;;;;;28501:21:0;-1:-1:-1;;;;;28501:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;28481:3:0;;-1:-1:-1;28481:3:0;;;:::i;:::-;;;;28445:103;;;;28601:2;-1:-1:-1;;;;;28565:53:0;28597:1;-1:-1:-1;;;;;28565:53:0;28579:8;-1:-1:-1;;;;;28565:53:0;;28605:3;28610:7;28565:53;;;;;;;:::i;:::-;;;;;;;;28631:81;28667:8;28685:1;28689:2;28693:3;28698:7;28707:4;28631:35;:81::i;30854:331::-;31009:8;-1:-1:-1;;;;;31000:17:0;:5;-1:-1:-1;;;;;31000:17:0;;;30992:71;;;;-1:-1:-1;;;30992:71:0;;17824:2:1;30992:71:0;;;17806:21:1;17863:2;17843:18;;;17836:30;17902:34;17882:18;;;17875:62;-1:-1:-1;;;17953:18:1;;;17946:39;18002:19;;30992:71:0;17622:405:1;30992:71:0;-1:-1:-1;;;;;31074:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;31074:46:0;;;;;;;;;;31136:41;;11964::1;;;31136::0;;11937:18:1;31136:41:0;;;;;;;30854:331;;;:::o;23490:820::-;-1:-1:-1;;;;;23678:16:0;;23670:66;;;;-1:-1:-1;;;23670:66:0;;;;;;;:::i;:::-;17404:10;23793:96;17404:10;23824:4;23830:2;23834:21;23852:2;23834:17;:21::i;:::-;23857:25;23875:6;23857:17;:25::i;23793:96::-;23902:19;23924:13;;;;;;;;;;;-1:-1:-1;;;;;23924:19:0;;;;;;;;;;23962:21;;;;23954:76;;;;-1:-1:-1;;;23954:76:0;;;;;;;:::i;:::-;24066:9;:13;;;;;;;;;;;-1:-1:-1;;;;;24066:19:0;;;;;;;;;;24088:20;;;24066:42;;24130:17;;;;;;;:27;;24088:20;;24066:9;24130:27;;24088:20;;24130:27;:::i;:::-;;;;-1:-1:-1;;24175:46:0;;;20306:25:1;;;20362:2;20347:18;;20340:34;;;-1:-1:-1;;;;;24175:46:0;;;;;;;;;;;;;;20279:18:1;24175:46:0;;;;;;;24234:68;24265:8;24275:4;24281:2;24285;24289:6;24297:4;24234:30;:68::i;:::-;23659:651;;23490:820;;;;;:::o;33122:813::-;-1:-1:-1;;;;;33362:13:0;;9623:20;9671:8;33358:570;;33398:79;;-1:-1:-1;;;33398:79:0;;-1:-1:-1;;;;;33398:43:0;;;;;:79;;33442:8;;33452:4;;33458:3;;33463:7;;33472:4;;33398:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33398:79:0;;;;;;;;-1:-1:-1;;33398:79:0;;;;;;;;;;;;:::i;:::-;;;33394:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;33790:6;33783:14;;-1:-1:-1;;;33783:14:0;;;;;;;;:::i;33394:523::-;;;33839:62;;-1:-1:-1;;;33839:62:0;;12442:2:1;33839:62:0;;;12424:21:1;12481:2;12461:18;;;12454:30;12520:34;12500:18;;;12493:62;-1:-1:-1;;;12571:18:1;;;12564:50;12631:19;;33839:62:0;12240:416:1;33394:523:0;-1:-1:-1;;;;;;33559:60:0;;-1:-1:-1;;;33559:60:0;33555:159;;33644:50;;-1:-1:-1;;;33644:50:0;;;;;;;:::i;33943:198::-;34063:16;;;34077:1;34063:16;;;;;;;;;34009;;34038:22;;34063:16;;;;;;;;;;;;-1:-1:-1;34063:16:0;34038:41;;34101:7;34090:5;34096:1;34090:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;34128:5;33943:198;-1:-1:-1;;33943:198:0:o;32370:744::-;-1:-1:-1;;;;;32585:13:0;;9623:20;9671:8;32581:526;;32621:72;;-1:-1:-1;;;32621:72:0;;-1:-1:-1;;;;;32621:38:0;;;;;:72;;32660:8;;32670:4;;32676:2;;32680:6;;32688:4;;32621:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32621:72:0;;;;;;;;-1:-1:-1;;32621:72:0;;;;;;;;;;;;:::i;:::-;;;32617:479;;;;:::i;:::-;-1:-1:-1;;;;;;32743:55:0;;-1:-1:-1;;;32743:55:0;32739:154;;32823:50;;-1:-1:-1;;;32823:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:468:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;183:2;177:9;195:69;252:2;231:15;;-1:-1:-1;;227:29:1;258:4;223:40;177:9;195:69;:::i;:::-;282:6;273:15;;312:6;304;297:22;352:3;343:6;338:3;334:16;331:25;328:45;;;369:1;366;359:12;328:45;419:6;414:3;407:4;399:6;395:17;382:44;474:1;467:4;458:6;450;446:19;442:30;435:41;;14:468;;;;;:::o;487:173::-;555:20;;-1:-1:-1;;;;;604:31:1;;594:42;;584:70;;650:1;647;640:12;584:70;487:173;;;:::o;665:735::-;719:5;772:3;765:4;757:6;753:17;749:27;739:55;;790:1;787;780:12;739:55;826:6;813:20;852:4;875:43;915:2;875:43;:::i;:::-;947:2;941:9;959:31;987:2;979:6;959:31;:::i;:::-;1025:18;;;1059:15;;;;-1:-1:-1;1094:15:1;;;1144:1;1140:10;;;1128:23;;1124:32;;1121:41;-1:-1:-1;1118:61:1;;;1175:1;1172;1165:12;1118:61;1197:1;1207:163;1221:2;1218:1;1215:9;1207:163;;;1278:17;;1266:30;;1316:12;;;;1348;;;;1239:1;1232:9;1207:163;;;-1:-1:-1;1388:6:1;;665:735;-1:-1:-1;;;;;;;665:735:1:o;1405:220::-;1447:5;1500:3;1493:4;1485:6;1481:17;1477:27;1467:55;;1518:1;1515;1508:12;1467:55;1540:79;1615:3;1606:6;1593:20;1586:4;1578:6;1574:17;1540:79;:::i;:::-;1531:88;1405:220;-1:-1:-1;;;1405:220:1:o;1630:186::-;1689:6;1742:2;1730:9;1721:7;1717:23;1713:32;1710:52;;;1758:1;1755;1748:12;1710:52;1781:29;1800:9;1781:29;:::i;1821:260::-;1889:6;1897;1950:2;1938:9;1929:7;1925:23;1921:32;1918:52;;;1966:1;1963;1956:12;1918:52;1989:29;2008:9;1989:29;:::i;:::-;1979:39;;2037:38;2071:2;2060:9;2056:18;2037:38;:::i;:::-;2027:48;;1821:260;;;;;:::o;2086:943::-;2240:6;2248;2256;2264;2272;2325:3;2313:9;2304:7;2300:23;2296:33;2293:53;;;2342:1;2339;2332:12;2293:53;2365:29;2384:9;2365:29;:::i;:::-;2355:39;;2413:38;2447:2;2436:9;2432:18;2413:38;:::i;:::-;2403:48;;2502:2;2491:9;2487:18;2474:32;2525:18;2566:2;2558:6;2555:14;2552:34;;;2582:1;2579;2572:12;2552:34;2605:61;2658:7;2649:6;2638:9;2634:22;2605:61;:::i;:::-;2595:71;;2719:2;2708:9;2704:18;2691:32;2675:48;;2748:2;2738:8;2735:16;2732:36;;;2764:1;2761;2754:12;2732:36;2787:63;2842:7;2831:8;2820:9;2816:24;2787:63;:::i;:::-;2777:73;;2903:3;2892:9;2888:19;2875:33;2859:49;;2933:2;2923:8;2920:16;2917:36;;;2949:1;2946;2939:12;2917:36;;2972:51;3015:7;3004:8;2993:9;2989:24;2972:51;:::i;:::-;2962:61;;;2086:943;;;;;;;;:::o;3034:606::-;3138:6;3146;3154;3162;3170;3223:3;3211:9;3202:7;3198:23;3194:33;3191:53;;;3240:1;3237;3230:12;3191:53;3263:29;3282:9;3263:29;:::i;:::-;3253:39;;3311:38;3345:2;3334:9;3330:18;3311:38;:::i;:::-;3301:48;;3396:2;3385:9;3381:18;3368:32;3358:42;;3447:2;3436:9;3432:18;3419:32;3409:42;;3502:3;3491:9;3487:19;3474:33;3530:18;3522:6;3519:30;3516:50;;;3562:1;3559;3552:12;3516:50;3585:49;3626:7;3617:6;3606:9;3602:22;3585:49;:::i;3645:347::-;3710:6;3718;3771:2;3759:9;3750:7;3746:23;3742:32;3739:52;;;3787:1;3784;3777:12;3739:52;3810:29;3829:9;3810:29;:::i;:::-;3800:39;;3889:2;3878:9;3874:18;3861:32;3936:5;3929:13;3922:21;3915:5;3912:32;3902:60;;3958:1;3955;3948:12;3902:60;3981:5;3971:15;;;3645:347;;;;;:::o;3997:254::-;4065:6;4073;4126:2;4114:9;4105:7;4101:23;4097:32;4094:52;;;4142:1;4139;4132:12;4094:52;4165:29;4184:9;4165:29;:::i;:::-;4155:39;4241:2;4226:18;;;;4213:32;;-1:-1:-1;;;3997:254:1:o;4256:1219::-;4374:6;4382;4435:2;4423:9;4414:7;4410:23;4406:32;4403:52;;;4451:1;4448;4441:12;4403:52;4491:9;4478:23;4520:18;4561:2;4553:6;4550:14;4547:34;;;4577:1;4574;4567:12;4547:34;4615:6;4604:9;4600:22;4590:32;;4660:7;4653:4;4649:2;4645:13;4641:27;4631:55;;4682:1;4679;4672:12;4631:55;4718:2;4705:16;4740:4;4763:43;4803:2;4763:43;:::i;:::-;4835:2;4829:9;4847:31;4875:2;4867:6;4847:31;:::i;:::-;4913:18;;;4947:15;;;;-1:-1:-1;4982:11:1;;;5024:1;5020:10;;;5012:19;;5008:28;;5005:41;-1:-1:-1;5002:61:1;;;5059:1;5056;5049:12;5002:61;5081:1;5072:10;;5091:169;5105:2;5102:1;5099:9;5091:169;;;5162:23;5181:3;5162:23;:::i;:::-;5150:36;;5123:1;5116:9;;;;;5206:12;;;;5238;;5091:169;;;-1:-1:-1;5279:6:1;-1:-1:-1;;5323:18:1;;5310:32;;-1:-1:-1;;5354:16:1;;;5351:36;;;5383:1;5380;5373:12;5351:36;;5406:63;5461:7;5450:8;5439:9;5435:24;5406:63;:::i;:::-;5396:73;;;4256:1219;;;;;:::o;5480:245::-;5538:6;5591:2;5579:9;5570:7;5566:23;5562:32;5559:52;;;5607:1;5604;5597:12;5559:52;5646:9;5633:23;5665:30;5689:5;5665:30;:::i;5730:249::-;5799:6;5852:2;5840:9;5831:7;5827:23;5823:32;5820:52;;;5868:1;5865;5858:12;5820:52;5900:9;5894:16;5919:30;5943:5;5919:30;:::i;5984:450::-;6053:6;6106:2;6094:9;6085:7;6081:23;6077:32;6074:52;;;6122:1;6119;6112:12;6074:52;6162:9;6149:23;6195:18;6187:6;6184:30;6181:50;;;6227:1;6224;6217:12;6181:50;6250:22;;6303:4;6295:13;;6291:27;-1:-1:-1;6281:55:1;;6332:1;6329;6322:12;6281:55;6355:73;6420:7;6415:2;6402:16;6397:2;6393;6389:11;6355:73;:::i;:::-;6345:83;5984:450;-1:-1:-1;;;;5984:450:1:o;6439:180::-;6498:6;6551:2;6539:9;6530:7;6526:23;6522:32;6519:52;;;6567:1;6564;6557:12;6519:52;-1:-1:-1;6590:23:1;;6439:180;-1:-1:-1;6439:180:1:o;6624:184::-;6694:6;6747:2;6735:9;6726:7;6722:23;6718:32;6715:52;;;6763:1;6760;6753:12;6715:52;-1:-1:-1;6786:16:1;;6624:184;-1:-1:-1;6624:184:1:o;6813:435::-;6866:3;6904:5;6898:12;6931:6;6926:3;6919:19;6957:4;6986:2;6981:3;6977:12;6970:19;;7023:2;7016:5;7012:14;7044:1;7054:169;7068:6;7065:1;7062:13;7054:169;;;7129:13;;7117:26;;7163:12;;;;7198:15;;;;7090:1;7083:9;7054:169;;;-1:-1:-1;7239:3:1;;6813:435;-1:-1:-1;;;;;6813:435:1:o;7253:471::-;7294:3;7332:5;7326:12;7359:6;7354:3;7347:19;7384:1;7394:162;7408:6;7405:1;7402:13;7394:162;;;7470:4;7526:13;;;7522:22;;7516:29;7498:11;;;7494:20;;7487:59;7423:12;7394:162;;;7574:6;7571:1;7568:13;7565:87;;;7640:1;7633:4;7624:6;7619:3;7615:16;7611:27;7604:38;7565:87;-1:-1:-1;7706:2:1;7685:15;-1:-1:-1;;7681:29:1;7672:39;;;;7713:4;7668:50;;7253:471;-1:-1:-1;;7253:471:1:o;7729:1099::-;7857:3;7886:1;7919:6;7913:13;7949:3;7971:1;7999:9;7995:2;7991:18;7981:28;;8059:2;8048:9;8044:18;8081;8071:61;;8125:4;8117:6;8113:17;8103:27;;8071:61;8151:2;8199;8191:6;8188:14;8168:18;8165:38;8162:165;;;-1:-1:-1;;;8226:33:1;;8282:4;8279:1;8272:15;8312:4;8233:3;8300:17;8162:165;8343:18;8370:104;;;;8488:1;8483:320;;;;8336:467;;8370:104;-1:-1:-1;;8403:24:1;;8391:37;;8448:16;;;;-1:-1:-1;8370:104:1;;8483:320;20646:1;20639:14;;;20683:4;20670:18;;8578:1;8592:165;8606:6;8603:1;8600:13;8592:165;;;8684:14;;8671:11;;;8664:35;8727:16;;;;8621:10;;8592:165;;;8596:3;;8786:6;8781:3;8777:16;8770:23;;8336:467;-1:-1:-1;8819:3:1;;7729:1099;-1:-1:-1;;;;;;;;7729:1099:1:o;9041:826::-;-1:-1:-1;;;;;9438:15:1;;;9420:34;;9490:15;;9485:2;9470:18;;9463:43;9400:3;9537:2;9522:18;;9515:31;;;9363:4;;9569:57;;9606:19;;9598:6;9569:57;:::i;:::-;9674:9;9666:6;9662:22;9657:2;9646:9;9642:18;9635:50;9708:44;9745:6;9737;9708:44;:::i;:::-;9694:58;;9801:9;9793:6;9789:22;9783:3;9772:9;9768:19;9761:51;9829:32;9854:6;9846;9829:32;:::i;:::-;9821:40;9041:826;-1:-1:-1;;;;;;;;9041:826:1:o;9872:560::-;-1:-1:-1;;;;;10169:15:1;;;10151:34;;10221:15;;10216:2;10201:18;;10194:43;10268:2;10253:18;;10246:34;;;10311:2;10296:18;;10289:34;;;10131:3;10354;10339:19;;10332:32;;;10094:4;;10381:45;;10406:19;;10398:6;10381:45;:::i;:::-;10373:53;9872:560;-1:-1:-1;;;;;;;9872:560:1:o;10437:358::-;-1:-1:-1;;;;;10644:32:1;;10626:51;;10713:2;10708;10693:18;;10686:30;;;-1:-1:-1;;10733:56:1;;10770:18;;10762:6;10733:56;:::i;11088:261::-;11267:2;11256:9;11249:21;11230:4;11287:56;11339:2;11328:9;11324:18;11316:6;11287:56;:::i;11354:465::-;11611:2;11600:9;11593:21;11574:4;11637:56;11689:2;11678:9;11674:18;11666:6;11637:56;:::i;:::-;11741:9;11733:6;11729:22;11724:2;11713:9;11709:18;11702:50;11769:44;11806:6;11798;11769:44;:::i;:::-;11761:52;11354:465;-1:-1:-1;;;;;11354:465:1:o;12016:219::-;12165:2;12154:9;12147:21;12128:4;12185:44;12225:2;12214:9;12210:18;12202:6;12185:44;:::i;12661:404::-;12863:2;12845:21;;;12902:2;12882:18;;;12875:30;12941:34;12936:2;12921:18;;12914:62;-1:-1:-1;;;13007:2:1;12992:18;;12985:38;13055:3;13040:19;;12661:404::o;15677:401::-;15879:2;15861:21;;;15918:2;15898:18;;;15891:30;15957:34;15952:2;15937:18;;15930:62;-1:-1:-1;;;16023:2:1;16008:18;;16001:35;16068:3;16053:19;;15677:401::o;16502:406::-;16704:2;16686:21;;;16743:2;16723:18;;;16716:30;16782:34;16777:2;16762:18;;16755:62;-1:-1:-1;;;16848:2:1;16833:18;;16826:40;16898:3;16883:19;;16502:406::o;17261:356::-;17463:2;17445:21;;;17482:18;;;17475:30;17541:34;17536:2;17521:18;;17514:62;17608:2;17593:18;;17261:356::o;18442:404::-;18644:2;18626:21;;;18683:2;18663:18;;;18656:30;18722:34;18717:2;18702:18;;18695:62;-1:-1:-1;;;18788:2:1;18773:18;;18766:38;18836:3;18821:19;;18442:404::o;20385:183::-;20445:4;20478:18;20470:6;20467:30;20464:56;;;20500:18;;:::i;:::-;-1:-1:-1;20545:1:1;20541:14;20557:4;20537:25;;20385:183::o;20699:128::-;20739:3;20770:1;20766:6;20763:1;20760:13;20757:39;;;20776:18;;:::i;:::-;-1:-1:-1;20812:9:1;;20699:128::o;20832:168::-;20872:7;20938:1;20934;20930:6;20926:14;20923:1;20920:21;20915:1;20908:9;20901:17;20897:45;20894:71;;;20945:18;;:::i;:::-;-1:-1:-1;20985:9:1;;20832:168::o;21005:380::-;21084:1;21080:12;;;;21127;;;21148:61;;21202:4;21194:6;21190:17;21180:27;;21148:61;21255:2;21247:6;21244:14;21224:18;21221:38;21218:161;;;21301:10;21296:3;21292:20;21289:1;21282:31;21336:4;21333:1;21326:15;21364:4;21361:1;21354:15;21218:161;;21005:380;;;:::o;21390:249::-;21500:2;21481:13;;-1:-1:-1;;21477:27:1;21465:40;;21535:18;21520:34;;21556:22;;;21517:62;21514:88;;;21582:18;;:::i;:::-;21618:2;21611:22;-1:-1:-1;;21390:249:1:o;21644:135::-;21683:3;-1:-1:-1;;21704:17:1;;21701:43;;;21724:18;;:::i;:::-;-1:-1:-1;21771:1:1;21760:13;;21644:135::o;21784:175::-;21821:3;21865:4;21858:5;21854:16;21894:4;21885:7;21882:17;21879:43;;;21902:18;;:::i;:::-;21951:1;21938:15;;21784:175;-1:-1:-1;;21784:175:1:o;21964:127::-;22025:10;22020:3;22016:20;22013:1;22006:31;22056:4;22053:1;22046:15;22080:4;22077:1;22070:15;22096:127;22157:10;22152:3;22148:20;22145:1;22138:31;22188:4;22185:1;22178:15;22212:4;22209:1;22202:15;22228:127;22289:10;22284:3;22280:20;22277:1;22270:31;22320:4;22317:1;22310:15;22344:4;22341:1;22334:15;22360:179;22395:3;22437:1;22419:16;22416:23;22413:120;;;22483:1;22480;22477;22462:23;-1:-1:-1;22520:1:1;22514:8;22509:3;22505:18;22413:120;22360:179;:::o;22544:671::-;22583:3;22625:4;22607:16;22604:26;22601:39;;;22544:671;:::o;22601:39::-;22667:2;22661:9;-1:-1:-1;;22732:16:1;22728:25;;22725:1;22661:9;22704:50;22783:4;22777:11;22807:16;22842:18;22913:2;22906:4;22898:6;22894:17;22891:25;22886:2;22878:6;22875:14;22872:45;22869:58;;;22920:5;;;;;22544:671;:::o;22869:58::-;22957:6;22951:4;22947:17;22936:28;;22993:3;22987:10;23020:2;23012:6;23009:14;23006:27;;;23026:5;;;;;;22544:671;:::o;23006:27::-;23110:2;23091:16;23085:4;23081:27;23077:36;23070:4;23061:6;23056:3;23052:16;23048:27;23045:69;23042:82;;;23117:5;;;;;;22544:671;:::o;23042:82::-;23133:57;23184:4;23175:6;23167;23163:19;23159:30;23153:4;23133:57;:::i;:::-;-1:-1:-1;23206:3:1;;22544:671;-1:-1:-1;;;;;22544:671:1:o;23220:131::-;-1:-1:-1;;;;;;23294:32:1;;23284:43;;23274:71;;23341:1;23338;23331:12
Swarm Source
ipfs://752c695e19336bd13bf45a0f13cff0ecbd37a9e99a195efed1d1b921a0216a9a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.