ERC-1155
Overview
Max Total Supply
32
Holders
29
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 Source Code Verified (Exact Match)
Contract Name:
NFSolutions
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-02-21 */ // File: @openzeppelin/contracts/utils/Strings.sol // 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/utils/Context.sol // 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/access/Ownable.sol // 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: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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/introspection/IERC165.sol // 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/utils/introspection/ERC165.sol // 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/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (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. * * NOTE: 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. * * NOTE: 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/IERC1155.sol // 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/extensions/IERC1155MetadataURI.sol // 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/token/ERC1155/ERC1155.sol // 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: NFT-ERC1155.sol pragma solidity ^0.8.0; contract NFSolutions is ERC1155, Ownable { using Strings for uint256; uint256 public collections; struct tokenData { uint256 maxSupply; uint256 currentSupply; uint256 preSalePrice; uint256 preSaleTime; uint256 publicSalePrice; uint256 publicSaleTime; string uri; } mapping(uint256 => tokenData) public tokenIdtoData; event itemSold( uint256 amount, uint256 tokenId, uint256 pricePaid, address buyer ); event withdrawFunds(uint256 amount, uint256 timestamp); constructor() ERC1155("") { tokenIdtoData[collections] = tokenData({ maxSupply: 2500, currentSupply: 0, preSalePrice: 0.3 ether, preSaleTime: 1645747200, publicSalePrice: 0.6 ether, publicSaleTime: 1645920000, uri: "ipfs://QmTmaPGARvwVy6QLzDMt3FZ8n3Raw3Yg8gxcrSqaMGSaWM" }); collections++; } function mint( uint256 _amount, uint256 _tokenId) public payable { tokenData storage token = tokenIdtoData[_tokenId]; require(token.maxSupply > 0, "token id not valid"); require(token.currentSupply + _amount <= token.maxSupply,"exceeds max supply"); if(block.timestamp > token.publicSaleTime){ require(token.publicSalePrice * _amount <= msg.value, "not enough ETH to buy"); } else { require(block.timestamp > token.preSaleTime, "Sale not started"); require(token.preSalePrice * _amount <= msg.value, "not enough ETH to buy"); } token.currentSupply = token.currentSupply + _amount; _mint(msg.sender, _tokenId, _amount, ""); emit itemSold(_amount, _tokenId, msg.value, msg.sender); } function createCollection(uint256 _maxSupply, uint256 _preSalePrice, uint256 _preSaleTime, uint256 _publicSalePrice, uint256 _publicSaleTime, string memory _uri) external onlyOwner { tokenIdtoData[collections] = tokenData({ maxSupply: _maxSupply, currentSupply: 0, preSalePrice: _preSalePrice, preSaleTime: _preSaleTime, publicSalePrice: _publicSalePrice, publicSaleTime: _publicSaleTime, uri: _uri }); collections++; } function modifyCollection( uint256 _tokenId, uint256 _maxSupply, uint256 _preSalePrice, uint256 _preSaleTime, uint256 _publicSalePrice, uint256 _publicSaleTime, string memory _uri) external onlyOwner { require(_exists(_tokenId), "Cannot query non-existent token"); tokenIdtoData[_tokenId].maxSupply = _maxSupply; tokenIdtoData[_tokenId].preSalePrice = _preSalePrice; tokenIdtoData[_tokenId].preSaleTime = _preSaleTime; tokenIdtoData[_tokenId].publicSalePrice = _publicSalePrice; tokenIdtoData[_tokenId].publicSaleTime = _publicSaleTime; tokenIdtoData[_tokenId].uri = _uri; } function withdraw() public onlyOwner { payable(msg.sender).transfer(address(this).balance); emit withdrawFunds(address(this).balance, block.timestamp); } function uri(uint256 _tokenId) public view virtual override returns (string memory) { require(_exists(_tokenId), "Cannot query non-existent token"); return tokenIdtoData[_tokenId].uri; } function _exists(uint256 _tokenId) internal view returns (bool) { return _tokenId < collections; } }
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":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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pricePaid","type":"uint256"},{"indexed":false,"internalType":"address","name":"buyer","type":"address"}],"name":"itemSold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"withdrawFunds","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":"collections","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_preSalePrice","type":"uint256"},{"internalType":"uint256","name":"_preSaleTime","type":"uint256"},{"internalType":"uint256","name":"_publicSalePrice","type":"uint256"},{"internalType":"uint256","name":"_publicSaleTime","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"createCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_preSalePrice","type":"uint256"},{"internalType":"uint256","name":"_preSaleTime","type":"uint256"},{"internalType":"uint256","name":"_publicSalePrice","type":"uint256"},{"internalType":"uint256","name":"_publicSaleTime","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"}],"name":"modifyCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdtoData","outputs":[{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"currentSupply","type":"uint256"},{"internalType":"uint256","name":"preSalePrice","type":"uint256"},{"internalType":"uint256","name":"preSaleTime","type":"uint256"},{"internalType":"uint256","name":"publicSalePrice","type":"uint256"},{"internalType":"uint256","name":"publicSaleTime","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"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
60806040523480156200001157600080fd5b506040805160208101909152600081526200002c816200012e565b50620000383362000147565b6040518060e001604052806109c4815260200160008152602001670429d069189e000081526020016362181c008152602001670853a0d2313c0000815260200163621abf0081526020016040518060600160405280603581526020016200228860359139815250600560006004548152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060190805190602001906200010e92919062000199565b5050600480549150600062000123836200027c565b9190505550620002a6565b80516200014390600290602084019062000199565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001a7906200023f565b90600052602060002090601f016020900481019282620001cb576000855562000216565b82601f10620001e657805160ff191683800117855562000216565b8280016001018555821562000216579182015b8281111562000216578251825591602001919060010190620001f9565b506200022492915062000228565b5090565b5b8082111562000224576000815560010162000229565b600181811c908216806200025457607f821691505b602082108114156200027657634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156200029f57634e487b7160e01b600052601160045260246000fd5b5060010190565b611fd280620002b66000396000f3fe6080604052600436106100fd5760003560e01c806381b70e7811610095578063e562dfd611610064578063e562dfd6146102b9578063e985e9c5146102cf578063f242432a14610318578063f2fde38b14610338578063fde0c1cc1461035857600080fd5b806381b70e781461021e5780638da5cb5b1461023e578063a22cb46514610266578063e4b238ae1461028657600080fd5b80632eb2c2d6116100d15780632eb2c2d6146101a75780633ccfd60b146101c75780634e1273f4146101dc578063715018a61461020957600080fd5b8062fdd58e1461010257806301ffc9a7146101355780630e89341c146101655780631b2ef1ca14610192575b600080fd5b34801561010e57600080fd5b5061012261011d36600461189e565b610378565b6040519081526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004611999565b61040f565b604051901515815260200161012c565b34801561017157600080fd5b506101856101803660046119d3565b610461565b60405161012c9190611c5d565b6101a56101a03660046119ec565b61055b565b005b3480156101b357600080fd5b506101a56101c2366004611753565b610783565b3480156101d357600080fd5b506101a561081a565b3480156101e857600080fd5b506101fc6101f73660046118c8565b6108ab565b60405161012c9190611c1c565b34801561021557600080fd5b506101a56109d5565b34801561022a57600080fd5b506101a5610239366004611a7a565b610a0b565b34801561024a57600080fd5b506003546040516001600160a01b03909116815260200161012c565b34801561027257600080fd5b506101a5610281366004611862565b610ad9565b34801561029257600080fd5b506102a66102a13660046119d3565b610ae8565b60405161012c9796959493929190611d7c565b3480156102c557600080fd5b5061012260045481565b3480156102db57600080fd5b506101556102ea366004611720565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561032457600080fd5b506101a56103333660046117fd565b610bb2565b34801561034457600080fd5b506101a56103533660046116fe565b610c39565b34801561036457600080fd5b506101a5610373366004611a0e565b610cd4565b60006001600160a01b0383166103e95760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061044057506001600160e01b031982166303a24d0760e21b145b8061045b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606061046e826004541190565b6104ba5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e0060448201526064016103e0565b600082815260056020526040902060060180546104d690611e1b565b80601f016020809104026020016040519081016040528092919081815260200182805461050290611e1b565b801561054f5780601f106105245761010080835404028352916020019161054f565b820191906000526020600020905b81548152906001019060200180831161053257829003601f168201915b50505050509050919050565b600081815260056020526040902080546105ac5760405162461bcd60e51b81526020600482015260126024820152711d1bdad95b881a59081b9bdd081d985b1a5960721b60448201526064016103e0565b805460018201546105be908590611de4565b11156106015760405162461bcd60e51b815260206004820152601260248201527165786365656473206d617820737570706c7960701b60448201526064016103e0565b8060050154421115610669573483826004015461061e9190611dfc565b11156106645760405162461bcd60e51b81526020600482015260156024820152746e6f7420656e6f7567682045544820746f2062757960581b60448201526064016103e0565b610706565b806003015442116106af5760405162461bcd60e51b815260206004820152601060248201526f14d85b19481b9bdd081cdd185c9d195960821b60448201526064016103e0565b348382600201546106c09190611dfc565b11156107065760405162461bcd60e51b81526020600482015260156024820152746e6f7420656e6f7567682045544820746f2062757960581b60448201526064016103e0565b8281600101546107169190611de4565b816001018190555061073933838560405180602001604052806000815250610da7565b6040805184815260208101849052348183015233606082015290517fa03ef714febde14a88144e926bcfe4623e7021bb20d98c11936e530a7633758d9181900360800190a1505050565b6001600160a01b03851633148061079f575061079f85336102ea565b6108065760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016103e0565b6108138585858585610eb1565b5050505050565b6003546001600160a01b031633146108445760405162461bcd60e51b81526004016103e090611d47565b60405133904780156108fc02916000818181858888f19350505050158015610870573d6000803e3d6000fd5b50604080514781524260208201527fe5253105361f0ab7ee494fbb0bf18c6b1a70774c0cd6a77045c53f41223ba332910160405180910390a1565b606081518351146109105760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016103e0565b6000835167ffffffffffffffff81111561092c5761092c611eca565b604051908082528060200260200182016040528015610955578160200160208202803683370190505b50905060005b84518110156109cd576109a085828151811061097957610979611eb4565b602002602001015185838151811061099357610993611eb4565b6020026020010151610378565b8282815181106109b2576109b2611eb4565b60209081029190910101526109c681611e83565b905061095b565b509392505050565b6003546001600160a01b031633146109ff5760405162461bcd60e51b81526004016103e090611d47565b610a09600061108e565b565b6003546001600160a01b03163314610a355760405162461bcd60e51b81526004016103e090611d47565b610a40876004541190565b610a8c5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e0060448201526064016103e0565b60008781526005602081815260409092208881556002810188905560038101879055600481018690559081018490558251610acf9260069092019184019061155e565b5050505050505050565b610ae43383836110e0565b5050565b6005602052806000526040600020600091509050806000015490806001015490806002015490806003015490806004015490806005015490806006018054610b2f90611e1b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5b90611e1b565b8015610ba85780601f10610b7d57610100808354040283529160200191610ba8565b820191906000526020600020905b815481529060010190602001808311610b8b57829003601f168201915b5050505050905087565b6001600160a01b038516331480610bce5750610bce85336102ea565b610c2c5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016103e0565b61081385858585856111c1565b6003546001600160a01b03163314610c635760405162461bcd60e51b81526004016103e090611d47565b6001600160a01b038116610cc85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103e0565b610cd18161108e565b50565b6003546001600160a01b03163314610cfe5760405162461bcd60e51b81526004016103e090611d47565b6040805160e081018252878152600060208083018281528385018a8152606085018a8152608086018a815260a087018a815260c088018a815260048054895260058089529a90982089518155955160018701559351600286015591516003850155519483019490945592519481019490945590518051929392610d87926006850192019061155e565b50506004805491506000610d9a83611e83565b9190505550505050505050565b6001600160a01b038416610e075760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016103e0565b33610e2181600087610e18886112de565b610813886112de565b6000848152602081815260408083206001600160a01b038916845290915281208054859290610e51908490611de4565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461081381600087878787611329565b8151835114610f135760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016103e0565b6001600160a01b038416610f395760405162461bcd60e51b81526004016103e090611cb8565b3360005b8451811015611020576000858281518110610f5a57610f5a611eb4565b602002602001015190506000858381518110610f7857610f78611eb4565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610fc85760405162461bcd60e51b81526004016103e090611cfd565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611005908490611de4565b925050819055505050508061101990611e83565b9050610f3d565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611070929190611c2f565b60405180910390a4611086818787878787611494565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156111545760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016103e0565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166111e75760405162461bcd60e51b81526004016103e090611cb8565b336111f7818787610e18886112de565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156112385760405162461bcd60e51b81526004016103e090611cfd565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611275908490611de4565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46112d5828888888888611329565b50505050505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061131857611318611eb4565b602090810291909101015292915050565b6001600160a01b0384163b156110865760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061136d9089908990889088908890600401611bd7565b602060405180830381600087803b15801561138757600080fd5b505af19250505080156113b7575060408051601f3d908101601f191682019092526113b4918101906119b6565b60015b611464576113c3611ee0565b806308c379a014156113fd57506113d8611efc565b806113e357506113ff565b8060405162461bcd60e51b81526004016103e09190611c5d565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016103e0565b6001600160e01b0319811663f23a6e6160e01b146112d55760405162461bcd60e51b81526004016103e090611c70565b6001600160a01b0384163b156110865760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906114d89089908990889088908890600401611b79565b602060405180830381600087803b1580156114f257600080fd5b505af1925050508015611522575060408051601f3d908101601f1916820190925261151f918101906119b6565b60015b61152e576113c3611ee0565b6001600160e01b0319811663bc197c8160e01b146112d55760405162461bcd60e51b81526004016103e090611c70565b82805461156a90611e1b565b90600052602060002090601f01602090048101928261158c57600085556115d2565b82601f106115a557805160ff19168380011785556115d2565b828001600101855582156115d2579182015b828111156115d25782518255916020019190600101906115b7565b506115de9291506115e2565b5090565b5b808211156115de57600081556001016115e3565b80356001600160a01b038116811461160e57600080fd5b919050565b600082601f83011261162457600080fd5b8135602061163182611dc0565b60405161163e8282611e56565b8381528281019150858301600585901b8701840188101561165e57600080fd5b60005b8581101561167d57813584529284019290840190600101611661565b5090979650505050505050565b600082601f83011261169b57600080fd5b813567ffffffffffffffff8111156116b5576116b5611eca565b6040516116cc601f8301601f191660200182611e56565b8181528460208386010111156116e157600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561171057600080fd5b611719826115f7565b9392505050565b6000806040838503121561173357600080fd5b61173c836115f7565b915061174a602084016115f7565b90509250929050565b600080600080600060a0868803121561176b57600080fd5b611774866115f7565b9450611782602087016115f7565b9350604086013567ffffffffffffffff8082111561179f57600080fd5b6117ab89838a01611613565b945060608801359150808211156117c157600080fd5b6117cd89838a01611613565b935060808801359150808211156117e357600080fd5b506117f08882890161168a565b9150509295509295909350565b600080600080600060a0868803121561181557600080fd5b61181e866115f7565b945061182c602087016115f7565b93506040860135925060608601359150608086013567ffffffffffffffff81111561185657600080fd5b6117f08882890161168a565b6000806040838503121561187557600080fd5b61187e836115f7565b91506020830135801515811461189357600080fd5b809150509250929050565b600080604083850312156118b157600080fd5b6118ba836115f7565b946020939093013593505050565b600080604083850312156118db57600080fd5b823567ffffffffffffffff808211156118f357600080fd5b818501915085601f83011261190757600080fd5b8135602061191482611dc0565b6040516119218282611e56565b8381528281019150858301600585901b870184018b101561194157600080fd5b600096505b8487101561196b57611957816115f7565b835260019690960195918301918301611946565b509650508601359250508082111561198257600080fd5b5061198f85828601611613565b9150509250929050565b6000602082840312156119ab57600080fd5b813561171981611f86565b6000602082840312156119c857600080fd5b815161171981611f86565b6000602082840312156119e557600080fd5b5035919050565b600080604083850312156119ff57600080fd5b50508035926020909101359150565b60008060008060008060c08789031215611a2757600080fd5b863595506020870135945060408701359350606087013592506080870135915060a087013567ffffffffffffffff811115611a6157600080fd5b611a6d89828a0161168a565b9150509295509295509295565b600080600080600080600060e0888a031215611a9557600080fd5b873596506020880135955060408801359450606088013593506080880135925060a0880135915060c088013567ffffffffffffffff811115611ad657600080fd5b611ae28a828b0161168a565b91505092959891949750929550565b600081518084526020808501945080840160005b83811015611b2157815187529582019590820190600101611b05565b509495945050505050565b6000815180845260005b81811015611b5257602081850181015186830182015201611b36565b81811115611b64576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0386811682528516602082015260a060408201819052600090611ba590830186611af1565b8281036060840152611bb78186611af1565b90508281036080840152611bcb8185611b2c565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611c1190830184611b2c565b979650505050505050565b6020815260006117196020830184611af1565b604081526000611c426040830185611af1565b8281036020840152611c548185611af1565b95945050505050565b6020815260006117196020830184611b2c565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8781528660208201528560408201528460608201528360808201528260a082015260e060c08201526000611db360e0830184611b2c565b9998505050505050505050565b600067ffffffffffffffff821115611dda57611dda611eca565b5060051b60200190565b60008219821115611df757611df7611e9e565b500190565b6000816000190483118215151615611e1657611e16611e9e565b500290565b600181811c90821680611e2f57607f821691505b60208210811415611e5057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715611e7c57611e7c611eca565b6040525050565b6000600019821415611e9757611e97611e9e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115611ef95760046000803e5060005160e01c5b90565b600060443d1015611f0a5790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611f3a57505050505090565b8285019150815181811115611f525750505050505090565b843d8701016020828501011115611f6c5750505050505090565b611f7b60208286010187611e56565b509095945050505050565b6001600160e01b031981168114610cd157600080fdfea26469706673582212209192802f8a6e91da7e2ff75cc2afedc806409b767e41a464d25f2569b9ebc1c764736f6c63430008070033697066733a2f2f516d546d61504741527677567936514c7a444d7433465a386e3352617733596738677863725371614d475361574d
Deployed Bytecode
0x6080604052600436106100fd5760003560e01c806381b70e7811610095578063e562dfd611610064578063e562dfd6146102b9578063e985e9c5146102cf578063f242432a14610318578063f2fde38b14610338578063fde0c1cc1461035857600080fd5b806381b70e781461021e5780638da5cb5b1461023e578063a22cb46514610266578063e4b238ae1461028657600080fd5b80632eb2c2d6116100d15780632eb2c2d6146101a75780633ccfd60b146101c75780634e1273f4146101dc578063715018a61461020957600080fd5b8062fdd58e1461010257806301ffc9a7146101355780630e89341c146101655780631b2ef1ca14610192575b600080fd5b34801561010e57600080fd5b5061012261011d36600461189e565b610378565b6040519081526020015b60405180910390f35b34801561014157600080fd5b50610155610150366004611999565b61040f565b604051901515815260200161012c565b34801561017157600080fd5b506101856101803660046119d3565b610461565b60405161012c9190611c5d565b6101a56101a03660046119ec565b61055b565b005b3480156101b357600080fd5b506101a56101c2366004611753565b610783565b3480156101d357600080fd5b506101a561081a565b3480156101e857600080fd5b506101fc6101f73660046118c8565b6108ab565b60405161012c9190611c1c565b34801561021557600080fd5b506101a56109d5565b34801561022a57600080fd5b506101a5610239366004611a7a565b610a0b565b34801561024a57600080fd5b506003546040516001600160a01b03909116815260200161012c565b34801561027257600080fd5b506101a5610281366004611862565b610ad9565b34801561029257600080fd5b506102a66102a13660046119d3565b610ae8565b60405161012c9796959493929190611d7c565b3480156102c557600080fd5b5061012260045481565b3480156102db57600080fd5b506101556102ea366004611720565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561032457600080fd5b506101a56103333660046117fd565b610bb2565b34801561034457600080fd5b506101a56103533660046116fe565b610c39565b34801561036457600080fd5b506101a5610373366004611a0e565b610cd4565b60006001600160a01b0383166103e95760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061044057506001600160e01b031982166303a24d0760e21b145b8061045b57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606061046e826004541190565b6104ba5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e0060448201526064016103e0565b600082815260056020526040902060060180546104d690611e1b565b80601f016020809104026020016040519081016040528092919081815260200182805461050290611e1b565b801561054f5780601f106105245761010080835404028352916020019161054f565b820191906000526020600020905b81548152906001019060200180831161053257829003601f168201915b50505050509050919050565b600081815260056020526040902080546105ac5760405162461bcd60e51b81526020600482015260126024820152711d1bdad95b881a59081b9bdd081d985b1a5960721b60448201526064016103e0565b805460018201546105be908590611de4565b11156106015760405162461bcd60e51b815260206004820152601260248201527165786365656473206d617820737570706c7960701b60448201526064016103e0565b8060050154421115610669573483826004015461061e9190611dfc565b11156106645760405162461bcd60e51b81526020600482015260156024820152746e6f7420656e6f7567682045544820746f2062757960581b60448201526064016103e0565b610706565b806003015442116106af5760405162461bcd60e51b815260206004820152601060248201526f14d85b19481b9bdd081cdd185c9d195960821b60448201526064016103e0565b348382600201546106c09190611dfc565b11156107065760405162461bcd60e51b81526020600482015260156024820152746e6f7420656e6f7567682045544820746f2062757960581b60448201526064016103e0565b8281600101546107169190611de4565b816001018190555061073933838560405180602001604052806000815250610da7565b6040805184815260208101849052348183015233606082015290517fa03ef714febde14a88144e926bcfe4623e7021bb20d98c11936e530a7633758d9181900360800190a1505050565b6001600160a01b03851633148061079f575061079f85336102ea565b6108065760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016103e0565b6108138585858585610eb1565b5050505050565b6003546001600160a01b031633146108445760405162461bcd60e51b81526004016103e090611d47565b60405133904780156108fc02916000818181858888f19350505050158015610870573d6000803e3d6000fd5b50604080514781524260208201527fe5253105361f0ab7ee494fbb0bf18c6b1a70774c0cd6a77045c53f41223ba332910160405180910390a1565b606081518351146109105760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016103e0565b6000835167ffffffffffffffff81111561092c5761092c611eca565b604051908082528060200260200182016040528015610955578160200160208202803683370190505b50905060005b84518110156109cd576109a085828151811061097957610979611eb4565b602002602001015185838151811061099357610993611eb4565b6020026020010151610378565b8282815181106109b2576109b2611eb4565b60209081029190910101526109c681611e83565b905061095b565b509392505050565b6003546001600160a01b031633146109ff5760405162461bcd60e51b81526004016103e090611d47565b610a09600061108e565b565b6003546001600160a01b03163314610a355760405162461bcd60e51b81526004016103e090611d47565b610a40876004541190565b610a8c5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e0060448201526064016103e0565b60008781526005602081815260409092208881556002810188905560038101879055600481018690559081018490558251610acf9260069092019184019061155e565b5050505050505050565b610ae43383836110e0565b5050565b6005602052806000526040600020600091509050806000015490806001015490806002015490806003015490806004015490806005015490806006018054610b2f90611e1b565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5b90611e1b565b8015610ba85780601f10610b7d57610100808354040283529160200191610ba8565b820191906000526020600020905b815481529060010190602001808311610b8b57829003601f168201915b5050505050905087565b6001600160a01b038516331480610bce5750610bce85336102ea565b610c2c5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b60648201526084016103e0565b61081385858585856111c1565b6003546001600160a01b03163314610c635760405162461bcd60e51b81526004016103e090611d47565b6001600160a01b038116610cc85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103e0565b610cd18161108e565b50565b6003546001600160a01b03163314610cfe5760405162461bcd60e51b81526004016103e090611d47565b6040805160e081018252878152600060208083018281528385018a8152606085018a8152608086018a815260a087018a815260c088018a815260048054895260058089529a90982089518155955160018701559351600286015591516003850155519483019490945592519481019490945590518051929392610d87926006850192019061155e565b50506004805491506000610d9a83611e83565b9190505550505050505050565b6001600160a01b038416610e075760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016103e0565b33610e2181600087610e18886112de565b610813886112de565b6000848152602081815260408083206001600160a01b038916845290915281208054859290610e51908490611de4565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461081381600087878787611329565b8151835114610f135760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016103e0565b6001600160a01b038416610f395760405162461bcd60e51b81526004016103e090611cb8565b3360005b8451811015611020576000858281518110610f5a57610f5a611eb4565b602002602001015190506000858381518110610f7857610f78611eb4565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610fc85760405162461bcd60e51b81526004016103e090611cfd565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611005908490611de4565b925050819055505050508061101990611e83565b9050610f3d565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611070929190611c2f565b60405180910390a4611086818787878787611494565b505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156111545760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016103e0565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166111e75760405162461bcd60e51b81526004016103e090611cb8565b336111f7818787610e18886112de565b6000848152602081815260408083206001600160a01b038a168452909152902054838110156112385760405162461bcd60e51b81526004016103e090611cfd565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611275908490611de4565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46112d5828888888888611329565b50505050505050565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061131857611318611eb4565b602090810291909101015292915050565b6001600160a01b0384163b156110865760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061136d9089908990889088908890600401611bd7565b602060405180830381600087803b15801561138757600080fd5b505af19250505080156113b7575060408051601f3d908101601f191682019092526113b4918101906119b6565b60015b611464576113c3611ee0565b806308c379a014156113fd57506113d8611efc565b806113e357506113ff565b8060405162461bcd60e51b81526004016103e09190611c5d565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016103e0565b6001600160e01b0319811663f23a6e6160e01b146112d55760405162461bcd60e51b81526004016103e090611c70565b6001600160a01b0384163b156110865760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906114d89089908990889088908890600401611b79565b602060405180830381600087803b1580156114f257600080fd5b505af1925050508015611522575060408051601f3d908101601f1916820190925261151f918101906119b6565b60015b61152e576113c3611ee0565b6001600160e01b0319811663bc197c8160e01b146112d55760405162461bcd60e51b81526004016103e090611c70565b82805461156a90611e1b565b90600052602060002090601f01602090048101928261158c57600085556115d2565b82601f106115a557805160ff19168380011785556115d2565b828001600101855582156115d2579182015b828111156115d25782518255916020019190600101906115b7565b506115de9291506115e2565b5090565b5b808211156115de57600081556001016115e3565b80356001600160a01b038116811461160e57600080fd5b919050565b600082601f83011261162457600080fd5b8135602061163182611dc0565b60405161163e8282611e56565b8381528281019150858301600585901b8701840188101561165e57600080fd5b60005b8581101561167d57813584529284019290840190600101611661565b5090979650505050505050565b600082601f83011261169b57600080fd5b813567ffffffffffffffff8111156116b5576116b5611eca565b6040516116cc601f8301601f191660200182611e56565b8181528460208386010111156116e157600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561171057600080fd5b611719826115f7565b9392505050565b6000806040838503121561173357600080fd5b61173c836115f7565b915061174a602084016115f7565b90509250929050565b600080600080600060a0868803121561176b57600080fd5b611774866115f7565b9450611782602087016115f7565b9350604086013567ffffffffffffffff8082111561179f57600080fd5b6117ab89838a01611613565b945060608801359150808211156117c157600080fd5b6117cd89838a01611613565b935060808801359150808211156117e357600080fd5b506117f08882890161168a565b9150509295509295909350565b600080600080600060a0868803121561181557600080fd5b61181e866115f7565b945061182c602087016115f7565b93506040860135925060608601359150608086013567ffffffffffffffff81111561185657600080fd5b6117f08882890161168a565b6000806040838503121561187557600080fd5b61187e836115f7565b91506020830135801515811461189357600080fd5b809150509250929050565b600080604083850312156118b157600080fd5b6118ba836115f7565b946020939093013593505050565b600080604083850312156118db57600080fd5b823567ffffffffffffffff808211156118f357600080fd5b818501915085601f83011261190757600080fd5b8135602061191482611dc0565b6040516119218282611e56565b8381528281019150858301600585901b870184018b101561194157600080fd5b600096505b8487101561196b57611957816115f7565b835260019690960195918301918301611946565b509650508601359250508082111561198257600080fd5b5061198f85828601611613565b9150509250929050565b6000602082840312156119ab57600080fd5b813561171981611f86565b6000602082840312156119c857600080fd5b815161171981611f86565b6000602082840312156119e557600080fd5b5035919050565b600080604083850312156119ff57600080fd5b50508035926020909101359150565b60008060008060008060c08789031215611a2757600080fd5b863595506020870135945060408701359350606087013592506080870135915060a087013567ffffffffffffffff811115611a6157600080fd5b611a6d89828a0161168a565b9150509295509295509295565b600080600080600080600060e0888a031215611a9557600080fd5b873596506020880135955060408801359450606088013593506080880135925060a0880135915060c088013567ffffffffffffffff811115611ad657600080fd5b611ae28a828b0161168a565b91505092959891949750929550565b600081518084526020808501945080840160005b83811015611b2157815187529582019590820190600101611b05565b509495945050505050565b6000815180845260005b81811015611b5257602081850181015186830182015201611b36565b81811115611b64576000602083870101525b50601f01601f19169290920160200192915050565b6001600160a01b0386811682528516602082015260a060408201819052600090611ba590830186611af1565b8281036060840152611bb78186611af1565b90508281036080840152611bcb8185611b2c565b98975050505050505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090611c1190830184611b2c565b979650505050505050565b6020815260006117196020830184611af1565b604081526000611c426040830185611af1565b8281036020840152611c548185611af1565b95945050505050565b6020815260006117196020830184611b2c565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8781528660208201528560408201528460608201528360808201528260a082015260e060c08201526000611db360e0830184611b2c565b9998505050505050505050565b600067ffffffffffffffff821115611dda57611dda611eca565b5060051b60200190565b60008219821115611df757611df7611e9e565b500190565b6000816000190483118215151615611e1657611e16611e9e565b500290565b600181811c90821680611e2f57607f821691505b60208210811415611e5057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8201601f1916810167ffffffffffffffff81118282101715611e7c57611e7c611eca565b6040525050565b6000600019821415611e9757611e97611e9e565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b600060033d1115611ef95760046000803e5060005160e01c5b90565b600060443d1015611f0a5790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611f3a57505050505090565b8285019150815181811115611f525750505050505090565b843d8701016020828501011115611f6c5750505050505090565b611f7b60208286010187611e56565b509095945050505050565b6001600160e01b031981168114610cd157600080fdfea26469706673582212209192802f8a6e91da7e2ff75cc2afedc806409b767e41a464d25f2569b9ebc1c764736f6c63430008070033
Deployed Bytecode Sourcemap
39069:3607:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25501:231;;;;;;;;;;-1:-1:-1;25501:231:0;;;;;:::i;:::-;;:::i;:::-;;;18545:25:1;;;18533:2;18518:18;25501:231:0;;;;;;;;24524:310;;;;;;;;;;-1:-1:-1;24524:310:0;;;;;:::i;:::-;;:::i;:::-;;;11112:14:1;;11105:22;11087:41;;11075:2;11060:18;24524:310:0;10947:187:1;42343:209:0;;;;;;;;;;-1:-1:-1;42343:209:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;40118:828::-;;;;;;:::i;:::-;;:::i;:::-;;27440:442;;;;;;;;;;-1:-1:-1;27440:442:0;;;;;:::i;:::-;;:::i;42157:178::-;;;;;;;;;;;;;:::i;25898:524::-;;;;;;;;;;-1:-1:-1;25898:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4730:103::-;;;;;;;;;;;;;:::i;41506:643::-;;;;;;;;;;-1:-1:-1;41506:643:0;;;;;:::i;:::-;;:::i;4079:87::-;;;;;;;;;;-1:-1:-1;4152:6:0;;4079:87;;-1:-1:-1;;;;;4152:6:0;;;8753:51:1;;8741:2;8726:18;4079:87:0;8607:203:1;26495:155:0;;;;;;;;;;-1:-1:-1;26495:155:0;;;;;:::i;:::-;;:::i;39432:50::-;;;;;;;;;;-1:-1:-1;39432:50:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;39155:26::-;;;;;;;;;;;;;;;;26722:168;;;;;;;;;;-1:-1:-1;26722:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;26845:27:0;;;26821:4;26845:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;26722:168;26962:401;;;;;;;;;;-1:-1:-1;26962:401:0;;;;;:::i;:::-;;:::i;4988:201::-;;;;;;;;;;-1:-1:-1;4988:201:0;;;;;:::i;:::-;;:::i;40954:544::-;;;;;;;;;;-1:-1:-1;40954:544:0;;;;;:::i;:::-;;:::i;25501:231::-;25587:7;-1:-1:-1;;;;;25615:21:0;;25607:77;;;;-1:-1:-1;;;25607:77:0;;12395:2:1;25607:77:0;;;12377:21:1;12434:2;12414:18;;;12407:30;12473:34;12453:18;;;12446:62;-1:-1:-1;;;12524:18:1;;;12517:41;12575:19;;25607:77:0;;;;;;;;;-1:-1:-1;25702:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;25702:22:0;;;;;;;;;;;;25501:231::o;24524:310::-;24626:4;-1:-1:-1;;;;;;24663:41:0;;-1:-1:-1;;;24663:41:0;;:110;;-1:-1:-1;;;;;;;24721:52:0;;-1:-1:-1;;;24721:52:0;24663:110;:163;;;-1:-1:-1;;;;;;;;;;15941:40:0;;;24790:36;24643:183;24524:310;-1:-1:-1;;24524:310:0:o;42343:209::-;42412:13;42446:17;42454:8;42653:11;;-1:-1:-1;42642:22:0;42560:112;42446:17;42438:61;;;;-1:-1:-1;;;42438:61:0;;16260:2:1;42438:61:0;;;16242:21:1;16299:2;16279:18;;;16272:30;16338:33;16318:18;;;16311:61;16389:18;;42438:61:0;16058:355:1;42438:61:0;42517:23;;;;:13;:23;;;;;:27;;42510:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42343:209;;;:::o;40118:828::-;40194:23;40220;;;:13;:23;;;;;40262:15;;40254:50;;;;-1:-1:-1;;;40254:50:0;;12807:2:1;40254:50:0;;;12789:21:1;12846:2;12826:18;;;12819:30;-1:-1:-1;;;12865:18:1;;;12858:48;12923:18;;40254:50:0;12605:342:1;40254:50:0;40364:15;;40331:19;;;;:29;;40353:7;;40331:29;:::i;:::-;:48;;40323:78;;;;-1:-1:-1;;;40323:78:0;;14316:2:1;40323:78:0;;;14298:21:1;14355:2;14335:18;;;14328:30;-1:-1:-1;;;14374:18:1;;;14367:48;14432:18;;40323:78:0;14114:342:1;40323:78:0;40435:5;:20;;;40417:15;:38;40414:342;;;40514:9;40503:7;40479:5;:21;;;:31;;;;:::i;:::-;:44;;40471:78;;;;-1:-1:-1;;;40471:78:0;;16620:2:1;40471:78:0;;;16602:21:1;16659:2;16639:18;;;16632:30;-1:-1:-1;;;16678:18:1;;;16671:51;16739:18;;40471:78:0;16418:345:1;40471:78:0;40414:342;;;40616:5;:17;;;40598:15;:35;40590:64;;;;-1:-1:-1;;;40590:64:0;;13971:2:1;40590:64:0;;;13953:21:1;14010:2;13990:18;;;13983:30;-1:-1:-1;;;14029:18:1;;;14022:46;14085:18;;40590:64:0;13769:340:1;40590:64:0;40709:9;40698:7;40677:5;:18;;;:28;;;;:::i;:::-;:41;;40669:75;;;;-1:-1:-1;;;40669:75:0;;16620:2:1;40669:75:0;;;16602:21:1;16659:2;16639:18;;;16632:30;-1:-1:-1;;;16678:18:1;;;16671:51;16739:18;;40669:75:0;16418:345:1;40669:75:0;40812:7;40790:5;:19;;;:29;;;;:::i;:::-;40768:5;:19;;:51;;;;40832:40;40838:10;40850:8;40860:7;40832:40;;;;;;;;;;;;:5;:40::i;:::-;40888:50;;;19065:25:1;;;19121:2;19106:18;;19099:34;;;40916:9:0;19149:18:1;;;19142:34;40927:10:0;19207:2:1;19192:18;;19185:60;40888:50:0;;;;;;;19052:3:1;40888:50:0;;;40183:763;40118:828;;:::o;27440:442::-;-1:-1:-1;;;;;27673:20:0;;2883:10;27673:20;;:60;;-1:-1:-1;27697:36:0;27714:4;2883:10;26722:168;:::i;27697:36::-;27651:160;;;;-1:-1:-1;;;27651:160:0;;15069:2:1;27651:160:0;;;15051:21:1;15108:2;15088:18;;;15081:30;15147:34;15127:18;;;15120:62;-1:-1:-1;;;15198:18:1;;;15191:48;15256:19;;27651:160:0;14867:414:1;27651:160:0;27822:52;27845:4;27851:2;27855:3;27860:7;27869:4;27822:22;:52::i;:::-;27440:442;;;;;:::o;42157:178::-;4152:6;;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;42205:51:::1;::::0;42213:10:::1;::::0;42234:21:::1;42205:51:::0;::::1;;;::::0;::::1;::::0;;;42234:21;42213:10;42205:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;42274:53:0::1;::::0;;42288:21:::1;18755:25:1::0;;42311:15:0::1;18811:2:1::0;18796:18;;18789:34;42274:53:0::1;::::0;18728:18:1;42274:53:0::1;;;;;;;42157:178::o:0;25898:524::-;26054:16;26115:3;:10;26096:8;:15;:29;26088:83;;;;-1:-1:-1;;;26088:83:0;;17380:2:1;26088:83:0;;;17362:21:1;17419:2;17399:18;;;17392:30;17458:34;17438:18;;;17431:62;-1:-1:-1;;;17509:18:1;;;17502:39;17558:19;;26088:83:0;17178:405:1;26088:83:0;26184:30;26231:8;:15;26217:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26217:30:0;;26184:63;;26265:9;26260:122;26284:8;:15;26280:1;:19;26260:122;;;26340:30;26350:8;26359:1;26350:11;;;;;;;;:::i;:::-;;;;;;;26363:3;26367:1;26363:6;;;;;;;;:::i;:::-;;;;;;;26340:9;:30::i;:::-;26321:13;26335:1;26321:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;26301:3;;;:::i;:::-;;;26260:122;;;-1:-1:-1;26401:13:0;25898:524;-1:-1:-1;;;25898:524:0:o;4730:103::-;4152:6;;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;4795:30:::1;4822:1;4795:18;:30::i;:::-;4730:103::o:0;41506:643::-;4152:6;;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;41725:17:::1;41733:8;42653:11:::0;;-1:-1:-1;42642:22:0;42560:112;41725:17:::1;41717:61;;;::::0;-1:-1:-1;;;41717:61:0;;16260:2:1;41717:61:0::1;::::0;::::1;16242:21:1::0;16299:2;16279:18;;;16272:30;16338:33;16318:18;;;16311:61;16389:18;;41717:61:0::1;16058:355:1::0;41717:61:0::1;41789:23;::::0;;;:13:::1;:23;::::0;;;;;;;:46;;;41846:36:::1;::::0;::::1;:52:::0;;;41909:35:::1;::::0;::::1;:50:::0;;;41970:39:::1;::::0;::::1;:58:::0;;;42039:38;;::::1;:56:::0;;;42107:34;;::::1;::::0;:27:::1;::::0;;::::1;::::0;:34;::::1;::::0;::::1;:::i;:::-;;41506:643:::0;;;;;;;:::o;26495:155::-;26590:52;2883:10;26623:8;26633;26590:18;:52::i;:::-;26495:155;;:::o;39432:50::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26962:401::-;-1:-1:-1;;;;;27170:20:0;;2883:10;27170:20;;:60;;-1:-1:-1;27194:36:0;27211:4;2883:10;26722:168;:::i;27194:36::-;27148:151;;;;-1:-1:-1;;;27148:151:0;;13561:2:1;27148:151:0;;;13543:21:1;13600:2;13580:18;;;13573:30;13639:34;13619:18;;;13612:62;-1:-1:-1;;;13690:18:1;;;13683:39;13739:19;;27148:151:0;13359:405:1;27148:151:0;27310:45;27328:4;27334:2;27338;27342:6;27350:4;27310:17;:45::i;4988:201::-;4152:6;;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5077:22:0;::::1;5069:73;;;::::0;-1:-1:-1;;;5069:73:0;;13154:2:1;5069:73:0::1;::::0;::::1;13136:21:1::0;13193:2;13173:18;;;13166:30;13232:34;13212:18;;;13205:62;-1:-1:-1;;;13283:18:1;;;13276:36;13329:19;;5069:73:0::1;12952:402:1::0;5069:73:0::1;5153:28;5172:8;5153:18;:28::i;:::-;4988:201:::0;:::o;40954:544::-;4152:6;;-1:-1:-1;;;;;4152:6:0;2883:10;4299:23;4291:68;;;;-1:-1:-1;;;4291:68:0;;;;;;;:::i;:::-;41175:289:::1;::::0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;41175:289:0::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41160:11:::1;::::0;;41146:26;;:13:::1;:26:::0;;;;;;;:318;;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;41175:289;;41146:26;:318:::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;;41477:11:0::1;:13:::0;;;-1:-1:-1;41477:11:0::1;:13;::::0;::::1;:::i;:::-;;;;;;40954:544:::0;;;;;;:::o;31916:569::-;-1:-1:-1;;;;;32069:16:0;;32061:62;;;;-1:-1:-1;;;32061:62:0;;18199:2:1;32061:62:0;;;18181:21:1;18238:2;18218:18;;;18211:30;18277:34;18257:18;;;18250:62;-1:-1:-1;;;18328:18:1;;;18321:31;18369:19;;32061:62:0;17997:397:1;32061:62:0;2883:10;32180:102;2883:10;32136:16;32223:2;32227:21;32245:2;32227:17;:21::i;:::-;32250:25;32268:6;32250:17;:25::i;32180:102::-;32295:9;:13;;;;;;;;;;;-1:-1:-1;;;;;32295:17:0;;;;;;;;;:27;;32316:6;;32295:9;:27;;32316:6;;32295:27;:::i;:::-;;;;-1:-1:-1;;32338:52:0;;;18755:25:1;;;18811:2;18796:18;;18789:34;;;-1:-1:-1;;;;;32338:52:0;;;;32371:1;;32338:52;;;;;;18728:18:1;32338:52:0;;;;;;;32403:74;32434:8;32452:1;32456:2;32460;32464:6;32472:4;32403:30;:74::i;29524:1074::-;29751:7;:14;29737:3;:10;:28;29729:81;;;;-1:-1:-1;;;29729:81:0;;17790:2:1;29729:81:0;;;17772:21:1;17829:2;17809:18;;;17802:30;17868:34;17848:18;;;17841:62;-1:-1:-1;;;17919:18:1;;;17912:38;17967:19;;29729:81:0;17588:404:1;29729:81:0;-1:-1:-1;;;;;29829:16:0;;29821:66;;;;-1:-1:-1;;;29821:66:0;;;;;;;:::i;:::-;2883:10;29900:16;30017:421;30041:3;:10;30037:1;:14;30017:421;;;30073:10;30086:3;30090:1;30086:6;;;;;;;;:::i;:::-;;;;;;;30073:19;;30107:14;30124:7;30132:1;30124:10;;;;;;;;:::i;:::-;;;;;;;;;;;;30151:19;30173:13;;;;;;;;;;-1:-1:-1;;;;;30173:19:0;;;;;;;;;;;;30124:10;;-1:-1:-1;30215:21:0;;;;30207:76;;;;-1:-1:-1;;;30207:76:0;;;;;;;:::i;:::-;30327:9;:13;;;;;;;;;;;-1:-1:-1;;;;;30327:19:0;;;;;;;;;;30349:20;;;30327:42;;30399:17;;;;;;;:27;;30349:20;;30327:9;30399:27;;30349:20;;30399:27;:::i;:::-;;;;;;;;30058:380;;;30053:3;;;;:::i;:::-;;;30017:421;;;;30485:2;-1:-1:-1;;;;;30455:47:0;30479:4;-1:-1:-1;;;;;30455:47:0;30469:8;-1:-1:-1;;;;;30455:47:0;;30489:3;30494:7;30455:47;;;;;;;:::i;:::-;;;;;;;;30515:75;30551:8;30561:4;30567:2;30571:3;30576:7;30585:4;30515:35;:75::i;:::-;29718:880;29524:1074;;;;;:::o;5349:191::-;5442:6;;;-1:-1:-1;;;;;5459:17:0;;;-1:-1:-1;;;;;;5459:17:0;;;;;;;5492:40;;5442:6;;;5459:17;5442:6;;5492:40;;5423:16;;5492:40;5412:128;5349:191;:::o;35710:331::-;35865:8;-1:-1:-1;;;;;35856:17:0;:5;-1:-1:-1;;;;;35856:17:0;;;35848:71;;;;-1:-1:-1;;;35848:71:0;;16970:2:1;35848:71:0;;;16952:21:1;17009:2;16989:18;;;16982:30;17048:34;17028:18;;;17021:62;-1:-1:-1;;;17099:18:1;;;17092:39;17148:19;;35848:71:0;16768:405:1;35848:71:0;-1:-1:-1;;;;;35930:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;35930:46:0;;;;;;;;;;35992:41;;11087::1;;;35992::0;;11060:18:1;35992:41:0;;;;;;;35710:331;;;:::o;28346:820::-;-1:-1:-1;;;;;28534:16:0;;28526:66;;;;-1:-1:-1;;;28526:66:0;;;;;;;:::i;:::-;2883:10;28649:96;2883:10;28680:4;28686:2;28690:21;28708:2;28690:17;:21::i;28649:96::-;28758:19;28780:13;;;;;;;;;;;-1:-1:-1;;;;;28780:19:0;;;;;;;;;;28818:21;;;;28810:76;;;;-1:-1:-1;;;28810:76:0;;;;;;;:::i;:::-;28922:9;:13;;;;;;;;;;;-1:-1:-1;;;;;28922:19:0;;;;;;;;;;28944:20;;;28922:42;;28986:17;;;;;;;:27;;28944:20;;28922:9;28986:27;;28944:20;;28986:27;:::i;:::-;;;;-1:-1:-1;;29031:46:0;;;18755:25:1;;;18811:2;18796:18;;18789:34;;;-1:-1:-1;;;;;29031:46:0;;;;;;;;;;;;;;18728:18:1;29031:46:0;;;;;;;29090:68;29121:8;29131:4;29137:2;29141;29145:6;29153:4;29090:30;:68::i;:::-;28515:651;;28346:820;;;;;:::o;38799:198::-;38919:16;;;38933:1;38919:16;;;;;;;;;38865;;38894:22;;38919:16;;;;;;;;;;;;-1:-1:-1;38919:16:0;38894:41;;38957:7;38946:5;38952:1;38946:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;38984:5;38799:198;-1:-1:-1;;38799:198:0:o;37226:744::-;-1:-1:-1;;;;;37441:13:0;;7075:19;:23;37437:526;;37477:72;;-1:-1:-1;;;37477:72:0;;-1:-1:-1;;;;;37477:38:0;;;;;:72;;37516:8;;37526:4;;37532:2;;37536:6;;37544:4;;37477:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37477:72:0;;;;;;;;-1:-1:-1;;37477:72:0;;;;;;;;;;;;:::i;:::-;;;37473:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;37825:6;37818:14;;-1:-1:-1;;;37818:14:0;;;;;;;;:::i;37473:479::-;;;37874:62;;-1:-1:-1;;;37874:62:0;;11565:2:1;37874:62:0;;;11547:21:1;11604:2;11584:18;;;11577:30;11643:34;11623:18;;;11616:62;-1:-1:-1;;;11694:18:1;;;11687:50;11754:19;;37874:62:0;11363:416:1;37473:479:0;-1:-1:-1;;;;;;37599:55:0;;-1:-1:-1;;;37599:55:0;37595:154;;37679:50;;-1:-1:-1;;;37679:50:0;;;;;;;:::i;37978:813::-;-1:-1:-1;;;;;38218:13:0;;7075:19;:23;38214:570;;38254:79;;-1:-1:-1;;;38254:79:0;;-1:-1:-1;;;;;38254:43:0;;;;;:79;;38298:8;;38308:4;;38314:3;;38319:7;;38328:4;;38254:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38254:79:0;;;;;;;;-1:-1:-1;;38254:79:0;;;;;;;;;;;;:::i;:::-;;;38250:523;;;;:::i;:::-;-1:-1:-1;;;;;;38415:60:0;;-1:-1:-1;;;38415:60:0;38411:159;;38500:50;;-1:-1:-1;;;38500:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:735::-;246:5;299:3;292:4;284:6;280:17;276:27;266:55;;317:1;314;307:12;266:55;353:6;340:20;379:4;402:43;442:2;402:43;:::i;:::-;474:2;468:9;486:31;514:2;506:6;486:31;:::i;:::-;552:18;;;586:15;;;;-1:-1:-1;621:15:1;;;671:1;667:10;;;655:23;;651:32;;648:41;-1:-1:-1;645:61:1;;;702:1;699;692:12;645:61;724:1;734:163;748:2;745:1;742:9;734:163;;;805:17;;793:30;;843:12;;;;875;;;;766:1;759:9;734:163;;;-1:-1:-1;915:6:1;;192:735;-1:-1:-1;;;;;;;192:735:1:o;932:555::-;974:5;1027:3;1020:4;1012:6;1008:17;1004:27;994:55;;1045:1;1042;1035:12;994:55;1081:6;1068:20;1107:18;1103:2;1100:26;1097:52;;;1129:18;;:::i;:::-;1178:2;1172:9;1190:67;1245:2;1226:13;;-1:-1:-1;;1222:27:1;1251:4;1218:38;1172:9;1190:67;:::i;:::-;1281:2;1273:6;1266:18;1327:3;1320:4;1315:2;1307:6;1303:15;1299:26;1296:35;1293:55;;;1344:1;1341;1334:12;1293:55;1408:2;1401:4;1393:6;1389:17;1382:4;1374:6;1370:17;1357:54;1455:1;1431:15;;;1448:4;1427:26;1420:37;;;;1435:6;932:555;-1:-1:-1;;;932:555:1:o;1492:186::-;1551:6;1604:2;1592:9;1583:7;1579:23;1575:32;1572:52;;;1620:1;1617;1610:12;1572:52;1643:29;1662:9;1643:29;:::i;:::-;1633:39;1492:186;-1:-1:-1;;;1492:186:1:o;1683:260::-;1751:6;1759;1812:2;1800:9;1791:7;1787:23;1783:32;1780:52;;;1828:1;1825;1818:12;1780:52;1851:29;1870:9;1851:29;:::i;:::-;1841:39;;1899:38;1933:2;1922:9;1918:18;1899:38;:::i;:::-;1889:48;;1683:260;;;;;:::o;1948:943::-;2102:6;2110;2118;2126;2134;2187:3;2175:9;2166:7;2162:23;2158:33;2155:53;;;2204:1;2201;2194:12;2155:53;2227:29;2246:9;2227:29;:::i;:::-;2217:39;;2275:38;2309:2;2298:9;2294:18;2275:38;:::i;:::-;2265:48;;2364:2;2353:9;2349:18;2336:32;2387:18;2428:2;2420:6;2417:14;2414:34;;;2444:1;2441;2434:12;2414:34;2467:61;2520:7;2511:6;2500:9;2496:22;2467:61;:::i;:::-;2457:71;;2581:2;2570:9;2566:18;2553:32;2537:48;;2610:2;2600:8;2597:16;2594:36;;;2626:1;2623;2616:12;2594:36;2649:63;2704:7;2693:8;2682:9;2678:24;2649:63;:::i;:::-;2639:73;;2765:3;2754:9;2750:19;2737:33;2721:49;;2795:2;2785:8;2782:16;2779:36;;;2811:1;2808;2801:12;2779:36;;2834:51;2877:7;2866:8;2855:9;2851:24;2834:51;:::i;:::-;2824:61;;;1948:943;;;;;;;;:::o;2896:606::-;3000:6;3008;3016;3024;3032;3085:3;3073:9;3064:7;3060:23;3056:33;3053:53;;;3102:1;3099;3092:12;3053:53;3125:29;3144:9;3125:29;:::i;:::-;3115:39;;3173:38;3207:2;3196:9;3192:18;3173:38;:::i;:::-;3163:48;;3258:2;3247:9;3243:18;3230:32;3220:42;;3309:2;3298:9;3294:18;3281:32;3271:42;;3364:3;3353:9;3349:19;3336:33;3392:18;3384:6;3381:30;3378:50;;;3424:1;3421;3414:12;3378:50;3447:49;3488:7;3479:6;3468:9;3464:22;3447:49;:::i;3507:347::-;3572:6;3580;3633:2;3621:9;3612:7;3608:23;3604:32;3601:52;;;3649:1;3646;3639:12;3601:52;3672:29;3691:9;3672:29;:::i;:::-;3662:39;;3751:2;3740:9;3736:18;3723:32;3798:5;3791:13;3784:21;3777:5;3774:32;3764:60;;3820:1;3817;3810:12;3764:60;3843:5;3833:15;;;3507:347;;;;;:::o;3859:254::-;3927:6;3935;3988:2;3976:9;3967:7;3963:23;3959:32;3956:52;;;4004:1;4001;3994:12;3956:52;4027:29;4046:9;4027:29;:::i;:::-;4017:39;4103:2;4088:18;;;;4075:32;;-1:-1:-1;;;3859:254:1:o;4118:1219::-;4236:6;4244;4297:2;4285:9;4276:7;4272:23;4268:32;4265:52;;;4313:1;4310;4303:12;4265:52;4353:9;4340:23;4382:18;4423:2;4415:6;4412:14;4409:34;;;4439:1;4436;4429:12;4409:34;4477:6;4466:9;4462:22;4452:32;;4522:7;4515:4;4511:2;4507:13;4503:27;4493:55;;4544:1;4541;4534:12;4493:55;4580:2;4567:16;4602:4;4625:43;4665:2;4625:43;:::i;:::-;4697:2;4691:9;4709:31;4737:2;4729:6;4709:31;:::i;:::-;4775:18;;;4809:15;;;;-1:-1:-1;4844:11:1;;;4886:1;4882:10;;;4874:19;;4870:28;;4867:41;-1:-1:-1;4864:61:1;;;4921:1;4918;4911:12;4864:61;4943:1;4934:10;;4953:169;4967:2;4964:1;4961:9;4953:169;;;5024:23;5043:3;5024:23;:::i;:::-;5012:36;;4985:1;4978:9;;;;;5068:12;;;;5100;;4953:169;;;-1:-1:-1;5141:6:1;-1:-1:-1;;5185:18:1;;5172:32;;-1:-1:-1;;5216:16:1;;;5213:36;;;5245:1;5242;5235:12;5213:36;;5268:63;5323:7;5312:8;5301:9;5297:24;5268:63;:::i;:::-;5258:73;;;4118:1219;;;;;:::o;5342:245::-;5400:6;5453:2;5441:9;5432:7;5428:23;5424:32;5421:52;;;5469:1;5466;5459:12;5421:52;5508:9;5495:23;5527:30;5551:5;5527:30;:::i;5592:249::-;5661:6;5714:2;5702:9;5693:7;5689:23;5685:32;5682:52;;;5730:1;5727;5720:12;5682:52;5762:9;5756:16;5781:30;5805:5;5781:30;:::i;5846:180::-;5905:6;5958:2;5946:9;5937:7;5933:23;5929:32;5926:52;;;5974:1;5971;5964:12;5926:52;-1:-1:-1;5997:23:1;;5846:180;-1:-1:-1;5846:180:1:o;6031:248::-;6099:6;6107;6160:2;6148:9;6139:7;6135:23;6131:32;6128:52;;;6176:1;6173;6166:12;6128:52;-1:-1:-1;;6199:23:1;;;6269:2;6254:18;;;6241:32;;-1:-1:-1;6031:248:1:o;6284:664::-;6398:6;6406;6414;6422;6430;6438;6491:3;6479:9;6470:7;6466:23;6462:33;6459:53;;;6508:1;6505;6498:12;6459:53;6544:9;6531:23;6521:33;;6601:2;6590:9;6586:18;6573:32;6563:42;;6652:2;6641:9;6637:18;6624:32;6614:42;;6703:2;6692:9;6688:18;6675:32;6665:42;;6754:3;6743:9;6739:19;6726:33;6716:43;;6810:3;6799:9;6795:19;6782:33;6838:18;6830:6;6827:30;6824:50;;;6870:1;6867;6860:12;6824:50;6893:49;6934:7;6925:6;6914:9;6910:22;6893:49;:::i;:::-;6883:59;;;6284:664;;;;;;;;:::o;6953:733::-;7076:6;7084;7092;7100;7108;7116;7124;7177:3;7165:9;7156:7;7152:23;7148:33;7145:53;;;7194:1;7191;7184:12;7145:53;7230:9;7217:23;7207:33;;7287:2;7276:9;7272:18;7259:32;7249:42;;7338:2;7327:9;7323:18;7310:32;7300:42;;7389:2;7378:9;7374:18;7361:32;7351:42;;7440:3;7429:9;7425:19;7412:33;7402:43;;7492:3;7481:9;7477:19;7464:33;7454:43;;7548:3;7537:9;7533:19;7520:33;7576:18;7568:6;7565:30;7562:50;;;7608:1;7605;7598:12;7562:50;7631:49;7672:7;7663:6;7652:9;7648:22;7631:49;:::i;:::-;7621:59;;;6953:733;;;;;;;;;;:::o;7691:435::-;7744:3;7782:5;7776:12;7809:6;7804:3;7797:19;7835:4;7864:2;7859:3;7855:12;7848:19;;7901:2;7894:5;7890:14;7922:1;7932:169;7946:6;7943:1;7940:13;7932:169;;;8007:13;;7995:26;;8041:12;;;;8076:15;;;;7968:1;7961:9;7932:169;;;-1:-1:-1;8117:3:1;;7691:435;-1:-1:-1;;;;;7691:435:1:o;8131:471::-;8172:3;8210:5;8204:12;8237:6;8232:3;8225:19;8262:1;8272:162;8286:6;8283:1;8280:13;8272:162;;;8348:4;8404:13;;;8400:22;;8394:29;8376:11;;;8372:20;;8365:59;8301:12;8272:162;;;8452:6;8449:1;8446:13;8443:87;;;8518:1;8511:4;8502:6;8497:3;8493:16;8489:27;8482:38;8443:87;-1:-1:-1;8584:2:1;8563:15;-1:-1:-1;;8559:29:1;8550:39;;;;8591:4;8546:50;;8131:471;-1:-1:-1;;8131:471:1:o;8815:826::-;-1:-1:-1;;;;;9212:15:1;;;9194:34;;9264:15;;9259:2;9244:18;;9237:43;9174:3;9311:2;9296:18;;9289:31;;;9137:4;;9343:57;;9380:19;;9372:6;9343:57;:::i;:::-;9448:9;9440:6;9436:22;9431:2;9420:9;9416:18;9409:50;9482:44;9519:6;9511;9482:44;:::i;:::-;9468:58;;9575:9;9567:6;9563:22;9557:3;9546:9;9542:19;9535:51;9603:32;9628:6;9620;9603:32;:::i;:::-;9595:40;8815:826;-1:-1:-1;;;;;;;;8815:826:1:o;9646:560::-;-1:-1:-1;;;;;9943:15:1;;;9925:34;;9995:15;;9990:2;9975:18;;9968:43;10042:2;10027:18;;10020:34;;;10085:2;10070:18;;10063:34;;;9905:3;10128;10113:19;;10106:32;;;9868:4;;10155:45;;10180:19;;10172:6;10155:45;:::i;:::-;10147:53;9646:560;-1:-1:-1;;;;;;;9646:560:1:o;10211:261::-;10390:2;10379:9;10372:21;10353:4;10410:56;10462:2;10451:9;10447:18;10439:6;10410:56;:::i;10477:465::-;10734:2;10723:9;10716:21;10697:4;10760:56;10812:2;10801:9;10797:18;10789:6;10760:56;:::i;:::-;10864:9;10856:6;10852:22;10847:2;10836:9;10832:18;10825:50;10892:44;10929:6;10921;10892:44;:::i;:::-;10884:52;10477:465;-1:-1:-1;;;;;10477:465:1:o;11139:219::-;11288:2;11277:9;11270:21;11251:4;11308:44;11348:2;11337:9;11333:18;11325:6;11308:44;:::i;11784:404::-;11986:2;11968:21;;;12025:2;12005:18;;;11998:30;12064:34;12059:2;12044:18;;12037:62;-1:-1:-1;;;12130:2:1;12115:18;;12108:38;12178:3;12163:19;;11784:404::o;14461:401::-;14663:2;14645:21;;;14702:2;14682:18;;;14675:30;14741:34;14736:2;14721:18;;14714:62;-1:-1:-1;;;14807:2:1;14792:18;;14785:35;14852:3;14837:19;;14461:401::o;15286:406::-;15488:2;15470:21;;;15527:2;15507:18;;;15500:30;15566:34;15561:2;15546:18;;15539:62;-1:-1:-1;;;15632:2:1;15617:18;;15610:40;15682:3;15667:19;;15286:406::o;15697:356::-;15899:2;15881:21;;;15918:18;;;15911:30;15977:34;15972:2;15957:18;;15950:62;16044:2;16029:18;;15697:356::o;19256:650::-;19573:6;19562:9;19555:25;19616:6;19611:2;19600:9;19596:18;19589:34;19659:6;19654:2;19643:9;19639:18;19632:34;19702:6;19697:2;19686:9;19682:18;19675:34;19746:6;19740:3;19729:9;19725:19;19718:35;19790:6;19784:3;19773:9;19769:19;19762:35;19834:3;19828;19817:9;19813:19;19806:32;19536:4;19855:45;19895:3;19884:9;19880:19;19872:6;19855:45;:::i;:::-;19847:53;19256:650;-1:-1:-1;;;;;;;;;19256:650:1:o;19911:183::-;19971:4;20004:18;19996:6;19993:30;19990:56;;;20026:18;;:::i;:::-;-1:-1:-1;20071:1:1;20067:14;20083:4;20063:25;;19911:183::o;20099:128::-;20139:3;20170:1;20166:6;20163:1;20160:13;20157:39;;;20176:18;;:::i;:::-;-1:-1:-1;20212:9:1;;20099:128::o;20232:168::-;20272:7;20338:1;20334;20330:6;20326:14;20323:1;20320:21;20315:1;20308:9;20301:17;20297:45;20294:71;;;20345:18;;:::i;:::-;-1:-1:-1;20385:9:1;;20232:168::o;20405:380::-;20484:1;20480:12;;;;20527;;;20548:61;;20602:4;20594:6;20590:17;20580:27;;20548:61;20655:2;20647:6;20644:14;20624:18;20621:38;20618:161;;;20701:10;20696:3;20692:20;20689:1;20682:31;20736:4;20733:1;20726:15;20764:4;20761:1;20754:15;20618:161;;20405:380;;;:::o;20790:249::-;20900:2;20881:13;;-1:-1:-1;;20877:27:1;20865:40;;20935:18;20920:34;;20956:22;;;20917:62;20914:88;;;20982:18;;:::i;:::-;21018:2;21011:22;-1:-1:-1;;20790:249:1:o;21044:135::-;21083:3;-1:-1:-1;;21104:17:1;;21101:43;;;21124:18;;:::i;:::-;-1:-1:-1;21171:1:1;21160:13;;21044:135::o;21184:127::-;21245:10;21240:3;21236:20;21233:1;21226:31;21276:4;21273:1;21266:15;21300:4;21297:1;21290:15;21316:127;21377:10;21372:3;21368:20;21365:1;21358:31;21408:4;21405:1;21398:15;21432:4;21429:1;21422:15;21448:127;21509:10;21504:3;21500:20;21497:1;21490:31;21540:4;21537:1;21530:15;21564:4;21561:1;21554:15;21580:179;21615:3;21657:1;21639:16;21636:23;21633:120;;;21703:1;21700;21697;21682:23;-1:-1:-1;21740:1:1;21734:8;21729:3;21725:18;21633:120;21580:179;:::o;21764:671::-;21803:3;21845:4;21827:16;21824:26;21821:39;;;21764:671;:::o;21821:39::-;21887:2;21881:9;-1:-1:-1;;21952:16:1;21948:25;;21945:1;21881:9;21924:50;22003:4;21997:11;22027:16;22062:18;22133:2;22126:4;22118:6;22114:17;22111:25;22106:2;22098:6;22095:14;22092:45;22089:58;;;22140:5;;;;;21764:671;:::o;22089:58::-;22177:6;22171:4;22167:17;22156:28;;22213:3;22207:10;22240:2;22232:6;22229:14;22226:27;;;22246:5;;;;;;21764:671;:::o;22226:27::-;22330:2;22311:16;22305:4;22301:27;22297:36;22290:4;22281:6;22276:3;22272:16;22268:27;22265:69;22262:82;;;22337:5;;;;;;21764:671;:::o;22262:82::-;22353:57;22404:4;22395:6;22387;22383:19;22379:30;22373:4;22353:57;:::i;:::-;-1:-1:-1;22426:3:1;;21764:671;-1:-1:-1;;;;;21764:671:1:o;22440:131::-;-1:-1:-1;;;;;;22514:32:1;;22504:43;;22494:71;;22561:1;22558;22551:12
Swarm Source
ipfs://9192802f8a6e91da7e2ff75cc2afedc806409b767e41a464d25f2569b9ebc1c7
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.