Feature Tip: Add private address tag to any address under My Name Tag !
ERC-1155
Overview
Max Total Supply
250 KPG
Holders
198
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
KickzPassGenesis
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-28 */ //SPDX-License-Identifier: MIT pragma solidity ^0.8.13; /** _ ___ _ ____ | |/ (_) ___| | __ ____ | _ \ __ _ ___ ___ | ' /| |/ __| |/ /|_ / | |_) / _` / __/ __| | . \| | (__| < / / | __/ (_| \__ \__ \ |_|\_\_|\___|_|\_\/___| |_| \__,_|___/___/ **/ /// @author NFTprest (https://twitter.com/NFTprest) // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts (last updated v4.6.0) (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: address zero is not a valid owner"); 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(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, 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); _afterTokenTransfer(operator, from, to, ids, amounts, data); _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); _afterTokenTransfer(operator, from, to, ids, amounts, data); _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(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _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); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _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(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); 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); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @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); _afterTokenTransfer(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 {} /** * @dev Hook that is called after 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 _afterTokenTransfer( 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: contracts/KickzPassGenesis.sol pragma solidity ^0.8.13; contract KickzPassGenesis is ERC1155, Ownable, ReentrancyGuard { string public constant name = "Kickz Pass Genesis"; string public constant symbol = "KPG"; uint private constant MAX_SUPPLY = 250; uint private constant PASS_ID = 1; uint public passCount = 0; bool public isMintOpen = false; //TODO: Update for production bytes32 public merkleRoot = 0xab1c094c9ebd4c5e3b64166d167b0387321c5a976d4812b7c6e3ba6a3e07c962; mapping(address => uint) public mintCount; constructor() ERC1155("ipfs://QmSvvYeC9rg9eb8iLV2gSuJX5T6YpYAyGnjrS8A4xmufJE/metadata.json") {} function whiteListMint(bytes32[] calldata merkleProof) external nonReentrant{ require(passCount < MAX_SUPPLY, "Sold out"); require(mintCount[msg.sender] < 1, "At mint limit"); require(MerkleProof.verify(merkleProof, merkleRoot,keccak256(abi.encodePacked(msg.sender))), "Proof invalid"); require(isMintOpen, "Mint not open"); mintCount[msg.sender]++; passCount++; _mint(msg.sender, PASS_ID, 1, ""); } function setMintOpen() external onlyOwner{ isMintOpen = !isMintOpen; } function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner{ merkleRoot = _merkleRoot; } function ownerMint(address to, uint amount) external onlyOwner { require(passCount + amount <= MAX_SUPPLY, "Sold out"); passCount += amount; _mint(to, PASS_ID, amount, ""); } function setURI(string memory uri) external onlyOwner { _setURI(uri); } function totalSupply() external view returns (uint256) { return passCount; } }
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"},{"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":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"passCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setMintOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whiteListMint","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006005556006805460ff191690557fab1c094c9ebd4c5e3b64166d167b0387321c5a976d4812b7c6e3ba6a3e07c9626007553480156200004457600080fd5b5060405180608001604052806043815260200162002546604391396200006a8162000081565b5062000076336200009a565b6001600455620001ce565b805162000096906002906020840190620000ec565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620000fa9062000192565b90600052602060002090601f0160209004810192826200011e576000855562000169565b82601f106200013957805160ff191683800117855562000169565b8280016001018555821562000169579182015b82811115620001695782518255916020019190600101906200014c565b50620001779291506200017b565b5090565b5b808211156200017757600081556001016200017c565b600181811c90821680620001a757607f821691505b602082108103620001c857634e487b7160e01b600052602260045260246000fd5b50919050565b61236880620001de6000396000f3fe608060405234801561001057600080fd5b506004361061018c5760003560e01c80634e1273f4116100e357806397254e551161008c578063ed9ec88811610066578063ed9ec88814610394578063f242432a146103b4578063f2fde38b146103c757600080fd5b806397254e5514610332578063a22cb46514610345578063e985e9c51461035857600080fd5b80638377dfd4116100bd5780638377dfd4146102d25780638da5cb5b146102db57806395d89b41146102f657600080fd5b80634e1273f414610297578063715018a6146102b75780637cb64759146102bf57600080fd5b806318160ddd116101455780632eb4a7ab1161011f5780632eb4a7ab146102735780632f85423a1461027c578063484b973c1461028457600080fd5b806318160ddd1461024b57806319908016146102535780632eb2c2d61461026057600080fd5b806302fe53051161017657806302fe5305146101da57806306fdde03146101ef5780630e89341c1461023857600080fd5b8062fdd58e1461019157806301ffc9a7146101b7575b600080fd5b6101a461019f366004611aa5565b6103da565b6040519081526020015b60405180910390f35b6101ca6101c5366004611afd565b610483565b60405190151581526020016101ae565b6101ed6101e8366004611bdb565b610568565b005b61022b6040518060400160405280601281526020017f4b69636b7a20506173732047656e65736973000000000000000000000000000081525081565b6040516101ae9190611c79565b61022b610246366004611c8c565b6105ce565b6005546101a4565b6006546101ca9060ff1681565b6101ed61026e366004611d5a565b610662565b6101a460075481565b6101ed610704565b6101ed610292366004611aa5565b610790565b6102aa6102a5366004611e04565b610881565b6040516101ae9190611f0a565b6101ed6109bf565b6101ed6102cd366004611c8c565b610a25565b6101a460055481565b6003546040516001600160a01b0390911681526020016101ae565b61022b6040518060400160405280600381526020017f4b5047000000000000000000000000000000000000000000000000000000000081525081565b6101ed610340366004611f1d565b610a84565b6101ed610353366004611f92565b610d0c565b6101ca610366366004611fce565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101a46103a2366004612001565b60086020526000908152604090205481565b6101ed6103c236600461201c565b610d17565b6101ed6103d5366004612001565b610db2565b60006001600160a01b03831661045d5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061051657507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061056257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6003546001600160a01b031633146105c25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b6105cb81610e91565b50565b6060600280546105dd90612081565b80601f016020809104026020016040519081016040528092919081815260200182805461060990612081565b80156106565780601f1061062b57610100808354040283529160200191610656565b820191906000526020600020905b81548152906001019060200180831161063957829003601f168201915b50505050509050919050565b6001600160a01b03851633148061067e575061067e8533610366565b6106f05760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610454565b6106fd8585858585610ea4565b5050505050565b6003546001600160a01b0316331461075e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6003546001600160a01b031633146107ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b60fa816005546107fa9190612103565b11156108485760405162461bcd60e51b815260206004820152600860248201527f536f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610454565b806005600082825461085a9190612103565b9250508190555061087d8260018360405180602001604052806000815250611142565b5050565b606081518351146108fa5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610454565b6000835167ffffffffffffffff81111561091657610916611b21565b60405190808252806020026020018201604052801561093f578160200160208202803683370190505b50905060005b84518110156109b75761098a8582815181106109635761096361211b565b602002602001015185838151811061097d5761097d61211b565b60200260200101516103da565b82828151811061099c5761099c61211b565b60209081029190910101526109b08161214a565b9050610945565b509392505050565b6003546001600160a01b03163314610a195760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b610a236000611272565b565b6003546001600160a01b03163314610a7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b600755565b600260045403610ad65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610454565b600260045560055460fa11610b2d5760405162461bcd60e51b815260206004820152600860248201527f536f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610454565b33600090815260086020526040902054600111610b8c5760405162461bcd60e51b815260206004820152600d60248201527f4174206d696e74206c696d6974000000000000000000000000000000000000006044820152606401610454565b610c14828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506007546040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b1660208201529092506034019050604051602081830303815290604052805190602001206112dc565b610c605760405162461bcd60e51b815260206004820152600d60248201527f50726f6f6620696e76616c6964000000000000000000000000000000000000006044820152606401610454565b60065460ff16610cb25760405162461bcd60e51b815260206004820152600d60248201527f4d696e74206e6f74206f70656e000000000000000000000000000000000000006044820152606401610454565b336000908152600860205260408120805491610ccd8361214a565b909155505060058054906000610ce28361214a565b9190505550610d033360018060405180602001604052806000815250611142565b50506001600455565b61087d3383836112f2565b6001600160a01b038516331480610d335750610d338533610366565b610da55760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610454565b6106fd8585858585611404565b6003546001600160a01b03163314610e0c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b6001600160a01b038116610e885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610454565b6105cb81611272565b805161087d9060029060208401906119f0565b8151835114610f1b5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610454565b6001600160a01b038416610f975760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610454565b3360005b84518110156110d4576000858281518110610fb857610fb861211b565b602002602001015190506000858381518110610fd657610fd661211b565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561107c5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610454565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906110b9908490612103565b92505081905550505050806110cd9061214a565b9050610f9b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611124929190612182565b60405180910390a461113a8187878787876115da565b505050505050565b6001600160a01b0384166111be5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610454565b3360006111ca856117de565b905060006111d7856117de565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290611209908490612103565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461126983600089898989611829565b50505050505050565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826112e98584611984565b14949350505050565b816001600160a01b0316836001600160a01b0316036113795760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610454565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166114805760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610454565b33600061148c856117de565b90506000611499856117de565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156115325760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610454565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061156f908490612103565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115cf848a8a8a8a8a611829565b505050505050505050565b6001600160a01b0384163b1561113a576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c819061163790899089908890889088906004016121b0565b6020604051808303816000875af1925050508015611672575060408051601f3d908101601f1916820190925261166f9181019061220e565b60015b6117275761167e61222b565b806308c379a0036116b75750611692612247565b8061169d57506116b9565b8060405162461bcd60e51b81526004016104549190611c79565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610454565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146112695760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610454565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106118185761181861211b565b602090810291909101015292915050565b6001600160a01b0384163b1561113a576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e619061188690899089908890889088906004016122ef565b6020604051808303816000875af19250505080156118c1575060408051601f3d908101601f191682019092526118be9181019061220e565b60015b6118cd5761167e61222b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146112695760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610454565b600081815b84518110156109b75760008582815181106119a6576119a661211b565b602002602001015190508083116119cc57600083815260208290526040902092506119dd565b600081815260208490526040902092505b50806119e88161214a565b915050611989565b8280546119fc90612081565b90600052602060002090601f016020900481019282611a1e5760008555611a64565b82601f10611a3757805160ff1916838001178555611a64565b82800160010185558215611a64579182015b82811115611a64578251825591602001919060010190611a49565b50611a70929150611a74565b5090565b5b80821115611a705760008155600101611a75565b80356001600160a01b0381168114611aa057600080fd5b919050565b60008060408385031215611ab857600080fd5b611ac183611a89565b946020939093013593505050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146105cb57600080fd5b600060208284031215611b0f57600080fd5b8135611b1a81611acf565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715611b7657611b76611b21565b6040525050565b600067ffffffffffffffff831115611b9757611b97611b21565b604051611bae6020601f19601f8701160182611b50565b809150838152848484011115611bc357600080fd5b83836020830137600060208583010152509392505050565b600060208284031215611bed57600080fd5b813567ffffffffffffffff811115611c0457600080fd5b8201601f81018413611c1557600080fd5b611c2484823560208401611b7d565b949350505050565b6000815180845260005b81811015611c5257602081850181015186830182015201611c36565b81811115611c64576000602083870101525b50601f01601f19169290920160200192915050565b602081526000611b1a6020830184611c2c565b600060208284031215611c9e57600080fd5b5035919050565b600067ffffffffffffffff821115611cbf57611cbf611b21565b5060051b60200190565b600082601f830112611cda57600080fd5b81356020611ce782611ca5565b604051611cf48282611b50565b83815260059390931b8501820192828101915086841115611d1457600080fd5b8286015b84811015611d2f5780358352918301918301611d18565b509695505050505050565b600082601f830112611d4b57600080fd5b611b1a83833560208501611b7d565b600080600080600060a08688031215611d7257600080fd5b611d7b86611a89565b9450611d8960208701611a89565b9350604086013567ffffffffffffffff80821115611da657600080fd5b611db289838a01611cc9565b94506060880135915080821115611dc857600080fd5b611dd489838a01611cc9565b93506080880135915080821115611dea57600080fd5b50611df788828901611d3a565b9150509295509295909350565b60008060408385031215611e1757600080fd5b823567ffffffffffffffff80821115611e2f57600080fd5b818501915085601f830112611e4357600080fd5b81356020611e5082611ca5565b604051611e5d8282611b50565b83815260059390931b8501820192828101915089841115611e7d57600080fd5b948201945b83861015611ea257611e9386611a89565b82529482019490820190611e82565b96505086013592505080821115611eb857600080fd5b50611ec585828601611cc9565b9150509250929050565b600081518084526020808501945080840160005b83811015611eff57815187529582019590820190600101611ee3565b509495945050505050565b602081526000611b1a6020830184611ecf565b60008060208385031215611f3057600080fd5b823567ffffffffffffffff80821115611f4857600080fd5b818501915085601f830112611f5c57600080fd5b813581811115611f6b57600080fd5b8660208260051b8501011115611f8057600080fd5b60209290920196919550909350505050565b60008060408385031215611fa557600080fd5b611fae83611a89565b915060208301358015158114611fc357600080fd5b809150509250929050565b60008060408385031215611fe157600080fd5b611fea83611a89565b9150611ff860208401611a89565b90509250929050565b60006020828403121561201357600080fd5b611b1a82611a89565b600080600080600060a0868803121561203457600080fd5b61203d86611a89565b945061204b60208701611a89565b93506040860135925060608601359150608086013567ffffffffffffffff81111561207557600080fd5b611df788828901611d3a565b600181811c9082168061209557607f821691505b6020821081036120ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612116576121166120d4565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361217b5761217b6120d4565b5060010190565b6040815260006121956040830185611ecf565b82810360208401526121a78185611ecf565b95945050505050565b60006001600160a01b03808816835280871660208401525060a060408301526121dc60a0830186611ecf565b82810360608401526121ee8186611ecf565b905082810360808401526122028185611c2c565b98975050505050505050565b60006020828403121561222057600080fd5b8151611b1a81611acf565b600060033d11156122445760046000803e5060005160e01c5b90565b600060443d10156122555790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff81602484011181841117156122a357505050505090565b82850191508151818111156122bb5750505050505090565b843d87010160208285010111156122d55750505050505090565b6122e460208286010187611b50565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261232760a0830184611c2c565b97965050505050505056fea2646970667358221220dd9d940505adbb8150024463f9b71d00ebb224979e12fef50cb013b5ce6ce9b364736f6c634300080d0033697066733a2f2f516d53767659654339726739656238694c56326753754a583554365970594179476e6a7253384134786d75664a452f6d657461646174612e6a736f6e
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061018c5760003560e01c80634e1273f4116100e357806397254e551161008c578063ed9ec88811610066578063ed9ec88814610394578063f242432a146103b4578063f2fde38b146103c757600080fd5b806397254e5514610332578063a22cb46514610345578063e985e9c51461035857600080fd5b80638377dfd4116100bd5780638377dfd4146102d25780638da5cb5b146102db57806395d89b41146102f657600080fd5b80634e1273f414610297578063715018a6146102b75780637cb64759146102bf57600080fd5b806318160ddd116101455780632eb4a7ab1161011f5780632eb4a7ab146102735780632f85423a1461027c578063484b973c1461028457600080fd5b806318160ddd1461024b57806319908016146102535780632eb2c2d61461026057600080fd5b806302fe53051161017657806302fe5305146101da57806306fdde03146101ef5780630e89341c1461023857600080fd5b8062fdd58e1461019157806301ffc9a7146101b7575b600080fd5b6101a461019f366004611aa5565b6103da565b6040519081526020015b60405180910390f35b6101ca6101c5366004611afd565b610483565b60405190151581526020016101ae565b6101ed6101e8366004611bdb565b610568565b005b61022b6040518060400160405280601281526020017f4b69636b7a20506173732047656e65736973000000000000000000000000000081525081565b6040516101ae9190611c79565b61022b610246366004611c8c565b6105ce565b6005546101a4565b6006546101ca9060ff1681565b6101ed61026e366004611d5a565b610662565b6101a460075481565b6101ed610704565b6101ed610292366004611aa5565b610790565b6102aa6102a5366004611e04565b610881565b6040516101ae9190611f0a565b6101ed6109bf565b6101ed6102cd366004611c8c565b610a25565b6101a460055481565b6003546040516001600160a01b0390911681526020016101ae565b61022b6040518060400160405280600381526020017f4b5047000000000000000000000000000000000000000000000000000000000081525081565b6101ed610340366004611f1d565b610a84565b6101ed610353366004611f92565b610d0c565b6101ca610366366004611fce565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101a46103a2366004612001565b60086020526000908152604090205481565b6101ed6103c236600461201c565b610d17565b6101ed6103d5366004612001565b610db2565b60006001600160a01b03831661045d5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201527f616c6964206f776e65720000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167fd9b67a2600000000000000000000000000000000000000000000000000000000148061051657507fffffffff0000000000000000000000000000000000000000000000000000000082167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061056257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b6003546001600160a01b031633146105c25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b6105cb81610e91565b50565b6060600280546105dd90612081565b80601f016020809104026020016040519081016040528092919081815260200182805461060990612081565b80156106565780601f1061062b57610100808354040283529160200191610656565b820191906000526020600020905b81548152906001019060200180831161063957829003601f168201915b50505050509050919050565b6001600160a01b03851633148061067e575061067e8533610366565b6106f05760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f76656400000000000000000000000000006064820152608401610454565b6106fd8585858585610ea4565b5050505050565b6003546001600160a01b0316331461075e5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b600680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00811660ff90911615179055565b6003546001600160a01b031633146107ea5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b60fa816005546107fa9190612103565b11156108485760405162461bcd60e51b815260206004820152600860248201527f536f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610454565b806005600082825461085a9190612103565b9250508190555061087d8260018360405180602001604052806000815250611142565b5050565b606081518351146108fa5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d6174636800000000000000000000000000000000000000000000006064820152608401610454565b6000835167ffffffffffffffff81111561091657610916611b21565b60405190808252806020026020018201604052801561093f578160200160208202803683370190505b50905060005b84518110156109b75761098a8582815181106109635761096361211b565b602002602001015185838151811061097d5761097d61211b565b60200260200101516103da565b82828151811061099c5761099c61211b565b60209081029190910101526109b08161214a565b9050610945565b509392505050565b6003546001600160a01b03163314610a195760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b610a236000611272565b565b6003546001600160a01b03163314610a7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b600755565b600260045403610ad65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610454565b600260045560055460fa11610b2d5760405162461bcd60e51b815260206004820152600860248201527f536f6c64206f75740000000000000000000000000000000000000000000000006044820152606401610454565b33600090815260086020526040902054600111610b8c5760405162461bcd60e51b815260206004820152600d60248201527f4174206d696e74206c696d6974000000000000000000000000000000000000006044820152606401610454565b610c14828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506007546040517fffffffffffffffffffffffffffffffffffffffff0000000000000000000000003360601b1660208201529092506034019050604051602081830303815290604052805190602001206112dc565b610c605760405162461bcd60e51b815260206004820152600d60248201527f50726f6f6620696e76616c6964000000000000000000000000000000000000006044820152606401610454565b60065460ff16610cb25760405162461bcd60e51b815260206004820152600d60248201527f4d696e74206e6f74206f70656e000000000000000000000000000000000000006044820152606401610454565b336000908152600860205260408120805491610ccd8361214a565b909155505060058054906000610ce28361214a565b9190505550610d033360018060405180602001604052806000815250611142565b50506001600455565b61087d3383836112f2565b6001600160a01b038516331480610d335750610d338533610366565b610da55760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f76656400000000000000000000000000000000000000000000006064820152608401610454565b6106fd8585858585611404565b6003546001600160a01b03163314610e0c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610454565b6001600160a01b038116610e885760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610454565b6105cb81611272565b805161087d9060029060208401906119f0565b8151835114610f1b5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060448201527f6d69736d617463680000000000000000000000000000000000000000000000006064820152608401610454565b6001600160a01b038416610f975760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610454565b3360005b84518110156110d4576000858281518110610fb857610fb861211b565b602002602001015190506000858381518110610fd657610fd661211b565b602090810291909101810151600084815280835260408082206001600160a01b038e16835290935291909120549091508181101561107c5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610454565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906110b9908490612103565b92505081905550505050806110cd9061214a565b9050610f9b565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611124929190612182565b60405180910390a461113a8187878787876115da565b505050505050565b6001600160a01b0384166111be5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f2061646472657360448201527f73000000000000000000000000000000000000000000000000000000000000006064820152608401610454565b3360006111ca856117de565b905060006111d7856117de565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290611209908490612103565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461126983600089898989611829565b50505050505050565b600380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826112e98584611984565b14949350505050565b816001600160a01b0316836001600160a01b0316036113795760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c6600000000000000000000000000000000000000000000006064820152608401610454565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166114805760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f20616460448201527f64726573730000000000000000000000000000000000000000000000000000006064820152608401610454565b33600061148c856117de565b90506000611499856117de565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156115325760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201527f72207472616e73666572000000000000000000000000000000000000000000006064820152608401610454565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061156f908490612103565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46115cf848a8a8a8a8a611829565b505050505050505050565b6001600160a01b0384163b1561113a576040517fbc197c810000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063bc197c819061163790899089908890889088906004016121b0565b6020604051808303816000875af1925050508015611672575060408051601f3d908101601f1916820190925261166f9181019061220e565b60015b6117275761167e61222b565b806308c379a0036116b75750611692612247565b8061169d57506116b9565b8060405162461bcd60e51b81526004016104549190611c79565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e7465720000000000000000000000006064820152608401610454565b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c8100000000000000000000000000000000000000000000000000000000146112695760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610454565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106118185761181861211b565b602090810291909101015292915050565b6001600160a01b0384163b1561113a576040517ff23a6e610000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063f23a6e619061188690899089908890889088906004016122ef565b6020604051808303816000875af19250505080156118c1575060408051601f3d908101601f191682019092526118be9181019061220e565b60015b6118cd5761167e61222b565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e6100000000000000000000000000000000000000000000000000000000146112695760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a6563746560448201527f6420746f6b656e730000000000000000000000000000000000000000000000006064820152608401610454565b600081815b84518110156109b75760008582815181106119a6576119a661211b565b602002602001015190508083116119cc57600083815260208290526040902092506119dd565b600081815260208490526040902092505b50806119e88161214a565b915050611989565b8280546119fc90612081565b90600052602060002090601f016020900481019282611a1e5760008555611a64565b82601f10611a3757805160ff1916838001178555611a64565b82800160010185558215611a64579182015b82811115611a64578251825591602001919060010190611a49565b50611a70929150611a74565b5090565b5b80821115611a705760008155600101611a75565b80356001600160a01b0381168114611aa057600080fd5b919050565b60008060408385031215611ab857600080fd5b611ac183611a89565b946020939093013593505050565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146105cb57600080fd5b600060208284031215611b0f57600080fd5b8135611b1a81611acf565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715611b7657611b76611b21565b6040525050565b600067ffffffffffffffff831115611b9757611b97611b21565b604051611bae6020601f19601f8701160182611b50565b809150838152848484011115611bc357600080fd5b83836020830137600060208583010152509392505050565b600060208284031215611bed57600080fd5b813567ffffffffffffffff811115611c0457600080fd5b8201601f81018413611c1557600080fd5b611c2484823560208401611b7d565b949350505050565b6000815180845260005b81811015611c5257602081850181015186830182015201611c36565b81811115611c64576000602083870101525b50601f01601f19169290920160200192915050565b602081526000611b1a6020830184611c2c565b600060208284031215611c9e57600080fd5b5035919050565b600067ffffffffffffffff821115611cbf57611cbf611b21565b5060051b60200190565b600082601f830112611cda57600080fd5b81356020611ce782611ca5565b604051611cf48282611b50565b83815260059390931b8501820192828101915086841115611d1457600080fd5b8286015b84811015611d2f5780358352918301918301611d18565b509695505050505050565b600082601f830112611d4b57600080fd5b611b1a83833560208501611b7d565b600080600080600060a08688031215611d7257600080fd5b611d7b86611a89565b9450611d8960208701611a89565b9350604086013567ffffffffffffffff80821115611da657600080fd5b611db289838a01611cc9565b94506060880135915080821115611dc857600080fd5b611dd489838a01611cc9565b93506080880135915080821115611dea57600080fd5b50611df788828901611d3a565b9150509295509295909350565b60008060408385031215611e1757600080fd5b823567ffffffffffffffff80821115611e2f57600080fd5b818501915085601f830112611e4357600080fd5b81356020611e5082611ca5565b604051611e5d8282611b50565b83815260059390931b8501820192828101915089841115611e7d57600080fd5b948201945b83861015611ea257611e9386611a89565b82529482019490820190611e82565b96505086013592505080821115611eb857600080fd5b50611ec585828601611cc9565b9150509250929050565b600081518084526020808501945080840160005b83811015611eff57815187529582019590820190600101611ee3565b509495945050505050565b602081526000611b1a6020830184611ecf565b60008060208385031215611f3057600080fd5b823567ffffffffffffffff80821115611f4857600080fd5b818501915085601f830112611f5c57600080fd5b813581811115611f6b57600080fd5b8660208260051b8501011115611f8057600080fd5b60209290920196919550909350505050565b60008060408385031215611fa557600080fd5b611fae83611a89565b915060208301358015158114611fc357600080fd5b809150509250929050565b60008060408385031215611fe157600080fd5b611fea83611a89565b9150611ff860208401611a89565b90509250929050565b60006020828403121561201357600080fd5b611b1a82611a89565b600080600080600060a0868803121561203457600080fd5b61203d86611a89565b945061204b60208701611a89565b93506040860135925060608601359150608086013567ffffffffffffffff81111561207557600080fd5b611df788828901611d3a565b600181811c9082168061209557607f821691505b6020821081036120ce577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612116576121166120d4565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361217b5761217b6120d4565b5060010190565b6040815260006121956040830185611ecf565b82810360208401526121a78185611ecf565b95945050505050565b60006001600160a01b03808816835280871660208401525060a060408301526121dc60a0830186611ecf565b82810360608401526121ee8186611ecf565b905082810360808401526122028185611c2c565b98975050505050505050565b60006020828403121561222057600080fd5b8151611b1a81611acf565b600060033d11156122445760046000803e5060005160e01c5b90565b600060443d10156122555790565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc803d016004833e81513d67ffffffffffffffff81602484011181841117156122a357505050505090565b82850191508151818111156122bb5750505050505090565b843d87010160208285010111156122d55750505050505090565b6122e460208286010187611b50565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261232760a0830184611c2c565b97965050505050505056fea2646970667358221220dd9d940505adbb8150024463f9b71d00ebb224979e12fef50cb013b5ce6ce9b364736f6c634300080d0033
Deployed Bytecode Sourcemap
45288:1619:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29836:230;;;;;;:::i;:::-;;:::i;:::-;;;620:25:1;;;608:2;593:18;29836:230:0;;;;;;;;28859:310;;;;;;:::i;:::-;;:::i;:::-;;;1253:14:1;;1246:22;1228:41;;1216:2;1201:18;28859:310:0;1088:187:1;46735:79:0;;;;;;:::i;:::-;;:::i;:::-;;45362:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;29580:105::-;;;;;;:::i;:::-;;:::i;46820:84::-;46889:9;;46820:84;;45578:30;;;;;;;;;31774:442;;;;;;:::i;:::-;;:::i;45649:94::-;;;;;;46348:78;;;:::i;46537:192::-;;;;;;:::i;:::-;;:::i;30232:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8679:103::-;;;:::i;46432:99::-;;;;;;:::i;:::-;;:::i;45544:25::-;;;;;;8028:87;8101:6;;8028:87;;-1:-1:-1;;;;;8101:6:0;;;8240:74:1;;8228:2;8213:18;8028:87:0;8094:226:1;45417:37:0;;;;;;;;;;;;;;;;;;;;;45901:439;;;;;;:::i;:::-;;:::i;30829:155::-;;;;;;:::i;:::-;;:::i;31056:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;31179:27:0;;;31155:4;31179:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;31056:168;45750:41;;;;;;:::i;:::-;;;;;;;;;;;;;;31296:401;;;;;;:::i;:::-;;:::i;8937:201::-;;;;;;:::i;:::-;;:::i;29836:230::-;29922:7;-1:-1:-1;;;;;29950:21:0;;29942:76;;;;-1:-1:-1;;;29942:76:0;;10566:2:1;29942:76:0;;;10548:21:1;10605:2;10585:18;;;10578:30;10644:34;10624:18;;;10617:62;10715:12;10695:18;;;10688:40;10745:19;;29942:76:0;;;;;;;;;-1:-1:-1;30036:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;30036:22:0;;;;;;;;;;;;29836:230::o;28859:310::-;28961:4;28998:41;;;29013:26;28998:41;;:110;;-1:-1:-1;29056:52:0;;;29071:37;29056:52;28998:110;:163;;;-1:-1:-1;20064:25:0;20049:40;;;;29125:36;28978:183;28859:310;-1:-1:-1;;28859:310:0:o;46735:79::-;8101:6;;-1:-1:-1;;;;;8101:6:0;6779:10;8248:23;8240:68;;;;-1:-1:-1;;;8240:68:0;;10977:2:1;8240:68:0;;;10959:21:1;;;10996:18;;;10989:30;11055:34;11035:18;;;11028:62;11107:18;;8240:68:0;10775:356:1;8240:68:0;46796:12:::1;46804:3;46796:7;:12::i;:::-;46735:79:::0;:::o;29580:105::-;29640:13;29673:4;29666:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29580:105;;;:::o;31774:442::-;-1:-1:-1;;;;;32007:20:0;;6779:10;32007:20;;:60;;-1:-1:-1;32031:36:0;32048:4;6779:10;31056:168;:::i;32031:36::-;31985:160;;;;-1:-1:-1;;;31985:160:0;;11780:2:1;31985:160:0;;;11762:21:1;11819:2;11799:18;;;11792:30;11858:34;11838:18;;;11831:62;11929:20;11909:18;;;11902:48;11967:19;;31985:160:0;11578:414:1;31985:160:0;32156:52;32179:4;32185:2;32189:3;32194:7;32203:4;32156:22;:52::i;:::-;31774:442;;;;;:::o;46348:78::-;8101:6;;-1:-1:-1;;;;;8101:6:0;6779:10;8248:23;8240:68;;;;-1:-1:-1;;;8240:68:0;;10977:2:1;8240:68:0;;;10959:21:1;;;10996:18;;;10989:30;11055:34;11035:18;;;11028:62;11107:18;;8240:68:0;10775:356:1;8240:68:0;46410:10:::1;::::0;;46396:24;;::::1;46410:10;::::0;;::::1;46409:11;46396:24;::::0;;46348:78::o;46537:192::-;8101:6;;-1:-1:-1;;;;;8101:6:0;6779:10;8248:23;8240:68;;;;-1:-1:-1;;;8240:68:0;;10977:2:1;8240:68:0;;;10959:21:1;;;10996:18;;;10989:30;11055:34;11035:18;;;11028:62;11107:18;;8240:68:0;10775:356:1;8240:68:0;45496:3:::1;46627:6;46615:9;;:18;;;;:::i;:::-;:32;;46607:53;;;::::0;-1:-1:-1;;;46607:53:0;;12521:2:1;46607:53:0::1;::::0;::::1;12503:21:1::0;12560:1;12540:18;;;12533:29;12598:10;12578:18;;;12571:38;12626:18;;46607:53:0::1;12319:331:1::0;46607:53:0::1;46680:6;46667:9;;:19;;;;;;;:::i;:::-;;;;;;;;46693:30;46699:2;45536:1;46712:6;46693:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;46537:192:::0;;:::o;30232:524::-;30388:16;30449:3;:10;30430:8;:15;:29;30422:83;;;;-1:-1:-1;;;30422:83:0;;12857:2:1;30422:83:0;;;12839:21:1;12896:2;12876:18;;;12869:30;12935:34;12915:18;;;12908:62;13006:11;12986:18;;;12979:39;13035:19;;30422:83:0;12655:405:1;30422:83:0;30518:30;30565:8;:15;30551:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30551:30:0;;30518:63;;30599:9;30594:122;30618:8;:15;30614:1;:19;30594:122;;;30674:30;30684:8;30693:1;30684:11;;;;;;;;:::i;:::-;;;;;;;30697:3;30701:1;30697:6;;;;;;;;:::i;:::-;;;;;;;30674:9;:30::i;:::-;30655:13;30669:1;30655:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;30635:3;;;:::i;:::-;;;30594:122;;;-1:-1:-1;30735:13:0;30232:524;-1:-1:-1;;;30232:524:0:o;8679:103::-;8101:6;;-1:-1:-1;;;;;8101:6:0;6779:10;8248:23;8240:68;;;;-1:-1:-1;;;8240:68:0;;10977:2:1;8240:68:0;;;10959:21:1;;;10996:18;;;10989:30;11055:34;11035:18;;;11028:62;11107:18;;8240:68:0;10775:356:1;8240:68:0;8744:30:::1;8771:1;8744:18;:30::i;:::-;8679:103::o:0;46432:99::-;8101:6;;-1:-1:-1;;;;;8101:6:0;6779:10;8248:23;8240:68;;;;-1:-1:-1;;;8240:68:0;;10977:2:1;8240:68:0;;;10959:21:1;;;10996:18;;;10989:30;11055:34;11035:18;;;11028:62;11107:18;;8240:68:0;10775:356:1;8240:68:0;46501:10:::1;:24:::0;46432:99::o;45901:439::-;5020:1;5618:7;;:19;5610:63;;;;-1:-1:-1;;;5610:63:0;;13656:2:1;5610:63:0;;;13638:21:1;13695:2;13675:18;;;13668:30;13734:33;13714:18;;;13707:61;13785:18;;5610:63:0;13454:355:1;5610:63:0;5020:1;5751:7;:18;45992:9:::1;::::0;45496:3:::1;-1:-1:-1::0;45984:43:0::1;;;::::0;-1:-1:-1;;;45984:43:0;;12521:2:1;45984:43:0::1;::::0;::::1;12503:21:1::0;12560:1;12540:18;;;12533:29;12598:10;12578:18;;;12571:38;12626:18;;45984:43:0::1;12319:331:1::0;45984:43:0::1;46052:10;46042:21;::::0;;;:9:::1;:21;::::0;;;;;46066:1:::1;-1:-1:-1::0;46034:51:0::1;;;::::0;-1:-1:-1;;;46034:51:0;;14016:2:1;46034:51:0::1;::::0;::::1;13998:21:1::0;14055:2;14035:18;;;14028:30;14094:15;14074:18;;;14067:43;14127:18;;46034:51:0::1;13814:337:1::0;46034:51:0::1;46100:83;46119:11;;46100:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;46132:10:0::1;::::0;46153:28:::1;::::0;14318:66:1;46170:10:0::1;14305:2:1::0;14301:15;14297:88;46153:28:0::1;::::0;::::1;14285:101:1::0;46132:10:0;;-1:-1:-1;14402:12:1;;;-1:-1:-1;46153:28:0::1;;;;;;;;;;;;46143:39;;;;;;46100:18;:83::i;:::-;46092:109;;;::::0;-1:-1:-1;;;46092:109:0;;14627:2:1;46092:109:0::1;::::0;::::1;14609:21:1::0;14666:2;14646:18;;;14639:30;14705:15;14685:18;;;14678:43;14738:18;;46092:109:0::1;14425:337:1::0;46092:109:0::1;46216:10;::::0;::::1;;46208:36;;;::::0;-1:-1:-1;;;46208:36:0;;14969:2:1;46208:36:0::1;::::0;::::1;14951:21:1::0;15008:2;14988:18;;;14981:30;15047:15;15027:18;;;15020:43;15080:18;;46208:36:0::1;14767:337:1::0;46208:36:0::1;46263:10;46253:21;::::0;;;:9:::1;:21;::::0;;;;:23;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;46283:9:0::1;:11:::0;;;:9:::1;:11;::::0;::::1;:::i;:::-;;;;;;46301:33;46307:10;45536:1;46328::::0;46301:33:::1;;;;;;;;;;;::::0;:5:::1;:33::i;:::-;-1:-1:-1::0;;4976:1:0;5930:7;:22;45901:439::o;30829:155::-;30924:52;6779:10;30957:8;30967;30924:18;:52::i;31296:401::-;-1:-1:-1;;;;;31504:20:0;;6779:10;31504:20;;:60;;-1:-1:-1;31528:36:0;31545:4;6779:10;31056:168;:::i;31528:36::-;31482:151;;;;-1:-1:-1;;;31482:151:0;;15311:2:1;31482:151:0;;;15293:21:1;15350:2;15330:18;;;15323:30;15389:34;15369:18;;;15362:62;15460:11;15440:18;;;15433:39;15489:19;;31482:151:0;15109:405:1;31482:151:0;31644:45;31662:4;31668:2;31672;31676:6;31684:4;31644:17;:45::i;8937:201::-;8101:6;;-1:-1:-1;;;;;8101:6:0;6779:10;8248:23;8240:68;;;;-1:-1:-1;;;8240:68:0;;10977:2:1;8240:68:0;;;10959:21:1;;;10996:18;;;10989:30;11055:34;11035:18;;;11028:62;11107:18;;8240:68:0;10775:356:1;8240:68:0;-1:-1:-1;;;;;9026:22:0;::::1;9018:73;;;::::0;-1:-1:-1;;;9018:73:0;;15721:2:1;9018:73:0::1;::::0;::::1;15703:21:1::0;15760:2;15740:18;;;15733:30;15799:34;15779:18;;;15772:62;15870:8;15850:18;;;15843:36;15896:19;;9018:73:0::1;15519:402:1::0;9018:73:0::1;9102:28;9121:8;9102:18;:28::i;36002:88::-:0;36069:13;;;;:4;;:13;;;;;:::i;34012:1146::-;34239:7;:14;34225:3;:10;:28;34217:81;;;;-1:-1:-1;;;34217:81:0;;16128:2:1;34217:81:0;;;16110:21:1;16167:2;16147:18;;;16140:30;16206:34;16186:18;;;16179:62;16277:10;16257:18;;;16250:38;16305:19;;34217:81:0;15926:404:1;34217:81:0;-1:-1:-1;;;;;34317:16:0;;34309:66;;;;-1:-1:-1;;;34309:66:0;;16537:2:1;34309:66:0;;;16519:21:1;16576:2;16556:18;;;16549:30;16615:34;16595:18;;;16588:62;16686:7;16666:18;;;16659:35;16711:19;;34309:66:0;16335:401:1;34309:66:0;6779:10;34388:16;34505:421;34529:3;:10;34525:1;:14;34505:421;;;34561:10;34574:3;34578:1;34574:6;;;;;;;;:::i;:::-;;;;;;;34561:19;;34595:14;34612:7;34620:1;34612:10;;;;;;;;:::i;:::-;;;;;;;;;;;;34639:19;34661:13;;;;;;;;;;-1:-1:-1;;;;;34661:19:0;;;;;;;;;;;;34612:10;;-1:-1:-1;34703:21:0;;;;34695:76;;;;-1:-1:-1;;;34695:76:0;;16943:2:1;34695:76:0;;;16925:21:1;16982:2;16962:18;;;16955:30;17021:34;17001:18;;;16994:62;17092:12;17072:18;;;17065:40;17122:19;;34695:76:0;16741:406:1;34695:76:0;34815:9;:13;;;;;;;;;;;-1:-1:-1;;;;;34815:19:0;;;;;;;;;;34837:20;;;34815:42;;34887:17;;;;;;;:27;;34837:20;;34815:9;34887:27;;34837:20;;34887:27;:::i;:::-;;;;;;;;34546:380;;;34541:3;;;;:::i;:::-;;;34505:421;;;;34973:2;-1:-1:-1;;;;;34943:47:0;34967:4;-1:-1:-1;;;;;34943:47:0;34957:8;-1:-1:-1;;;;;34943:47:0;;34977:3;34982:7;34943:47;;;;;;;:::i;:::-;;;;;;;;35075:75;35111:8;35121:4;35127:2;35131:3;35136:7;35145:4;35075:35;:75::i;:::-;34206:952;34012:1146;;;;;:::o;36476:729::-;-1:-1:-1;;;;;36629:16:0;;36621:62;;;;-1:-1:-1;;;36621:62:0;;17824:2:1;36621:62:0;;;17806:21:1;17863:2;17843:18;;;17836:30;17902:34;17882:18;;;17875:62;17973:3;17953:18;;;17946:31;17994:19;;36621:62:0;17622:397:1;36621:62:0;6779:10;36696:16;36761:21;36779:2;36761:17;:21::i;:::-;36738:44;;36793:24;36820:25;36838:6;36820:17;:25::i;:::-;36793:52;;36937:9;:13;;;;;;;;;;;-1:-1:-1;;;;;36937:17:0;;;;;;;;;:27;;36958:6;;36937:9;:27;;36958:6;;36937:27;:::i;:::-;;;;-1:-1:-1;;36980:52:0;;;18198:25:1;;;18254:2;18239:18;;18232:34;;;-1:-1:-1;;;;;36980:52:0;;;;37013:1;;36980:52;;;;;;18171:18:1;36980:52:0;;;;;;;37123:74;37154:8;37172:1;37176:2;37180;37184:6;37192:4;37123:30;:74::i;:::-;36610:595;;;36476:729;;;;:::o;9298:191::-;9391:6;;;-1:-1:-1;;;;;9408:17:0;;;;;;;;;;;9441:40;;9391:6;;;9408:17;9391:6;;9441:40;;9372:16;;9441:40;9361:128;9298:191;:::o;1690:190::-;1815:4;1868;1839:25;1852:5;1859:4;1839:12;:25::i;:::-;:33;;1690:190;-1:-1:-1;;;;1690:190:0:o;40746:331::-;40901:8;-1:-1:-1;;;;;40892:17:0;:5;-1:-1:-1;;;;;40892:17:0;;40884:71;;;;-1:-1:-1;;;40884:71:0;;18479:2:1;40884:71:0;;;18461:21:1;18518:2;18498:18;;;18491:30;18557:34;18537:18;;;18530:62;18628:11;18608:18;;;18601:39;18657:19;;40884:71:0;18277:405:1;40884:71:0;-1:-1:-1;;;;;40966:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;;;;;;;;;;;;41028:41;;1228::1;;;41028::0;;1201:18:1;41028:41:0;;;;;;;40746:331;;;:::o;32680:974::-;-1:-1:-1;;;;;32868:16:0;;32860:66;;;;-1:-1:-1;;;32860:66:0;;16537:2:1;32860:66:0;;;16519:21:1;16576:2;16556:18;;;16549:30;16615:34;16595:18;;;16588:62;16686:7;16666:18;;;16659:35;16711:19;;32860:66:0;16335:401:1;32860:66:0;6779:10;32939:16;33004:21;33022:2;33004:17;:21::i;:::-;32981:44;;33036:24;33063:25;33081:6;33063:17;:25::i;:::-;33036:52;;33174:19;33196:13;;;;;;;;;;;-1:-1:-1;;;;;33196:19:0;;;;;;;;;;33234:21;;;;33226:76;;;;-1:-1:-1;;;33226:76:0;;16943:2:1;33226:76:0;;;16925:21:1;16982:2;16962:18;;;16955:30;17021:34;17001:18;;;16994:62;17092:12;17072:18;;;17065:40;17122:19;;33226:76:0;16741:406:1;33226:76:0;33338:9;:13;;;;;;;;;;;-1:-1:-1;;;;;33338:19:0;;;;;;;;;;33360:20;;;33338:42;;33402:17;;;;;;;:27;;33360:20;;33338:9;33402:27;;33360:20;;33402:27;:::i;:::-;;;;-1:-1:-1;;33447:46:0;;;18198:25:1;;;18254:2;18239:18;;18232:34;;;-1:-1:-1;;;;;33447:46:0;;;;;;;;;;;;;;18171:18:1;33447:46:0;;;;;;;33578:68;33609:8;33619:4;33625:2;33629;33633:6;33641:4;33578:30;:68::i;:::-;32849:805;;;;32680:974;;;;;:::o;44189:813::-;-1:-1:-1;;;;;44429:13:0;;11077:19;:23;44425:570;;44465:79;;;;;-1:-1:-1;;;;;44465:43:0;;;;;:79;;44509:8;;44519:4;;44525:3;;44530:7;;44539:4;;44465:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44465:79:0;;;;;;;;-1:-1:-1;;44465:79:0;;;;;;;;;;;;:::i;:::-;;;44461:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;44857:6;44850:14;;-1:-1:-1;;;44850:14:0;;;;;;;;:::i;44461:523::-;;;44906:62;;-1:-1:-1;;;44906:62:0;;20918:2:1;44906:62:0;;;20900:21:1;20957:2;20937:18;;;20930:30;20996:34;20976:18;;;20969:62;21067:22;21047:18;;;21040:50;21107:19;;44906:62:0;20716:416:1;44461:523:0;44626:60;;;44638:48;44626:60;44622:159;;44711:50;;-1:-1:-1;;;44711:50:0;;21339:2:1;44711:50:0;;;21321:21:1;21378:2;21358:18;;;21351:30;21417:34;21397:18;;;21390:62;21488:10;21468:18;;;21461:38;21516:19;;44711:50:0;21137:404:1;45010:198:0;45130:16;;;45144:1;45130:16;;;;;;;;;45076;;45105:22;;45130:16;;;;;;;;;;;;-1:-1:-1;45130:16:0;45105:41;;45168:7;45157:5;45163:1;45157:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;45195:5;45010:198;-1:-1:-1;;45010:198:0:o;43437:744::-;-1:-1:-1;;;;;43652:13:0;;11077:19;:23;43648:526;;43688:72;;;;;-1:-1:-1;;;;;43688:38:0;;;;;:72;;43727:8;;43737:4;;43743:2;;43747:6;;43755:4;;43688:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43688:72:0;;;;;;;;-1:-1:-1;;43688:72:0;;;;;;;;;;;;:::i;:::-;;;43684:479;;;;:::i;:::-;43810:55;;;43822:43;43810:55;43806:154;;43890:50;;-1:-1:-1;;;43890:50:0;;21339:2:1;43890:50:0;;;21321:21:1;21378:2;21358:18;;;21351:30;21417:34;21397:18;;;21390:62;21488:10;21468:18;;;21461:38;21516:19;;43890:50:0;21137:404:1;2241:675:0;2324:7;2367:4;2324:7;2382:497;2406:5;:12;2402:1;:16;2382:497;;;2440:20;2463:5;2469:1;2463:8;;;;;;;;:::i;:::-;;;;;;;2440:31;;2506:12;2490;:28;2486:382;;2992:13;3042:15;;;3078:4;3071:15;;;3125:4;3109:21;;2618:57;;2486:382;;;2992:13;3042:15;;;3078:4;3071:15;;;3125:4;3109:21;;2795:57;;2486:382;-1:-1:-1;2420:3:0;;;;:::i;:::-;;;;2382:497;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:196:1;82:20;;-1:-1:-1;;;;;131:54:1;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:254::-;283:6;291;344:2;332:9;323:7;319:23;315:32;312:52;;;360:1;357;350:12;312:52;383:29;402:9;383:29;:::i;:::-;373:39;459:2;444:18;;;;431:32;;-1:-1:-1;;;215:254:1:o;656:177::-;741:66;734:5;730:78;723:5;720:89;710:117;;823:1;820;813:12;838:245;896:6;949:2;937:9;928:7;924:23;920:32;917:52;;;965:1;962;955:12;917:52;1004:9;991:23;1023:30;1047:5;1023:30;:::i;:::-;1072:5;838:245;-1:-1:-1;;;838:245:1:o;1280:184::-;1332:77;1329:1;1322:88;1429:4;1426:1;1419:15;1453:4;1450:1;1443:15;1469:308;-1:-1:-1;;1570:2:1;1564:4;1560:13;1556:86;1548:6;1544:99;1709:6;1697:10;1694:22;1673:18;1661:10;1658:34;1655:62;1652:88;;;1720:18;;:::i;:::-;1756:2;1749:22;-1:-1:-1;;1469:308:1:o;1782:528::-;1847:5;1881:18;1873:6;1870:30;1867:56;;;1903:18;;:::i;:::-;1952:2;1946:9;1964:128;2086:4;-1:-1:-1;;2012:2:1;2004:6;2000:15;1996:88;1992:99;1984:6;1964:128;:::i;:::-;2110:6;2101:15;;2140:6;2132;2125:22;2180:3;2171:6;2166:3;2162:16;2159:25;2156:45;;;2197:1;2194;2187:12;2156:45;2247:6;2242:3;2235:4;2227:6;2223:17;2210:44;2302:1;2295:4;2286:6;2278;2274:19;2270:30;2263:41;;1782:528;;;;;:::o;2315:451::-;2384:6;2437:2;2425:9;2416:7;2412:23;2408:32;2405:52;;;2453:1;2450;2443:12;2405:52;2493:9;2480:23;2526:18;2518:6;2515:30;2512:50;;;2558:1;2555;2548:12;2512:50;2581:22;;2634:4;2626:13;;2622:27;-1:-1:-1;2612:55:1;;2663:1;2660;2653:12;2612:55;2686:74;2752:7;2747:2;2734:16;2729:2;2725;2721:11;2686:74;:::i;:::-;2676:84;2315:451;-1:-1:-1;;;;2315:451:1:o;2771:531::-;2813:3;2851:5;2845:12;2878:6;2873:3;2866:19;2903:1;2913:162;2927:6;2924:1;2921:13;2913:162;;;2989:4;3045:13;;;3041:22;;3035:29;3017:11;;;3013:20;;3006:59;2942:12;2913:162;;;3093:6;3090:1;3087:13;3084:87;;;3159:1;3152:4;3143:6;3138:3;3134:16;3130:27;3123:38;3084:87;-1:-1:-1;3216:2:1;3204:15;-1:-1:-1;;3200:88:1;3191:98;;;;3291:4;3187:109;;2771:531;-1:-1:-1;;2771:531:1:o;3307:220::-;3456:2;3445:9;3438:21;3419:4;3476:45;3517:2;3506:9;3502:18;3494:6;3476:45;:::i;3532:180::-;3591:6;3644:2;3632:9;3623:7;3619:23;3615:32;3612:52;;;3660:1;3657;3650:12;3612:52;-1:-1:-1;3683:23:1;;3532:180;-1:-1:-1;3532:180:1:o;3717:183::-;3777:4;3810:18;3802:6;3799:30;3796:56;;;3832:18;;:::i;:::-;-1:-1:-1;3877:1:1;3873:14;3889:4;3869:25;;3717:183::o;3905:724::-;3959:5;4012:3;4005:4;3997:6;3993:17;3989:27;3979:55;;4030:1;4027;4020:12;3979:55;4066:6;4053:20;4092:4;4115:43;4155:2;4115:43;:::i;:::-;4187:2;4181:9;4199:31;4227:2;4219:6;4199:31;:::i;:::-;4265:18;;;4357:1;4353:10;;;;4341:23;;4337:32;;;4299:15;;;;-1:-1:-1;4381:15:1;;;4378:35;;;4409:1;4406;4399:12;4378:35;4445:2;4437:6;4433:15;4457:142;4473:6;4468:3;4465:15;4457:142;;;4539:17;;4527:30;;4577:12;;;;4490;;4457:142;;;-1:-1:-1;4617:6:1;3905:724;-1:-1:-1;;;;;;3905:724:1:o;4634:221::-;4676:5;4729:3;4722:4;4714:6;4710:17;4706:27;4696:55;;4747:1;4744;4737:12;4696:55;4769:80;4845:3;4836:6;4823:20;4816:4;4808:6;4804:17;4769:80;:::i;4860:943::-;5014:6;5022;5030;5038;5046;5099:3;5087:9;5078:7;5074:23;5070:33;5067:53;;;5116:1;5113;5106:12;5067:53;5139:29;5158:9;5139:29;:::i;:::-;5129:39;;5187:38;5221:2;5210:9;5206:18;5187:38;:::i;:::-;5177:48;;5276:2;5265:9;5261:18;5248:32;5299:18;5340:2;5332:6;5329:14;5326:34;;;5356:1;5353;5346:12;5326:34;5379:61;5432:7;5423:6;5412:9;5408:22;5379:61;:::i;:::-;5369:71;;5493:2;5482:9;5478:18;5465:32;5449:48;;5522:2;5512:8;5509:16;5506:36;;;5538:1;5535;5528:12;5506:36;5561:63;5616:7;5605:8;5594:9;5590:24;5561:63;:::i;:::-;5551:73;;5677:3;5666:9;5662:19;5649:33;5633:49;;5707:2;5697:8;5694:16;5691:36;;;5723:1;5720;5713:12;5691:36;;5746:51;5789:7;5778:8;5767:9;5763:24;5746:51;:::i;:::-;5736:61;;;4860:943;;;;;;;;:::o;5990:1208::-;6108:6;6116;6169:2;6157:9;6148:7;6144:23;6140:32;6137:52;;;6185:1;6182;6175:12;6137:52;6225:9;6212:23;6254:18;6295:2;6287:6;6284:14;6281:34;;;6311:1;6308;6301:12;6281:34;6349:6;6338:9;6334:22;6324:32;;6394:7;6387:4;6383:2;6379:13;6375:27;6365:55;;6416:1;6413;6406:12;6365:55;6452:2;6439:16;6474:4;6497:43;6537:2;6497:43;:::i;:::-;6569:2;6563:9;6581:31;6609:2;6601:6;6581:31;:::i;:::-;6647:18;;;6735:1;6731:10;;;;6723:19;;6719:28;;;6681:15;;;;-1:-1:-1;6759:19:1;;;6756:39;;;6791:1;6788;6781:12;6756:39;6815:11;;;;6835:148;6851:6;6846:3;6843:15;6835:148;;;6917:23;6936:3;6917:23;:::i;:::-;6905:36;;6868:12;;;;6961;;;;6835:148;;;7002:6;-1:-1:-1;;7046:18:1;;7033:32;;-1:-1:-1;;7077:16:1;;;7074:36;;;7106:1;7103;7096:12;7074:36;;7129:63;7184:7;7173:8;7162:9;7158:24;7129:63;:::i;:::-;7119:73;;;5990:1208;;;;;:::o;7203:435::-;7256:3;7294:5;7288:12;7321:6;7316:3;7309:19;7347:4;7376:2;7371:3;7367:12;7360:19;;7413:2;7406:5;7402:14;7434:1;7444:169;7458:6;7455:1;7452:13;7444:169;;;7519:13;;7507:26;;7553:12;;;;7588:15;;;;7480:1;7473:9;7444:169;;;-1:-1:-1;7629:3:1;;7203:435;-1:-1:-1;;;;;7203:435:1:o;7643:261::-;7822:2;7811:9;7804:21;7785:4;7842:56;7894:2;7883:9;7879:18;7871:6;7842:56;:::i;8325:615::-;8411:6;8419;8472:2;8460:9;8451:7;8447:23;8443:32;8440:52;;;8488:1;8485;8478:12;8440:52;8528:9;8515:23;8557:18;8598:2;8590:6;8587:14;8584:34;;;8614:1;8611;8604:12;8584:34;8652:6;8641:9;8637:22;8627:32;;8697:7;8690:4;8686:2;8682:13;8678:27;8668:55;;8719:1;8716;8709:12;8668:55;8759:2;8746:16;8785:2;8777:6;8774:14;8771:34;;;8801:1;8798;8791:12;8771:34;8854:7;8849:2;8839:6;8836:1;8832:14;8828:2;8824:23;8820:32;8817:45;8814:65;;;8875:1;8872;8865:12;8814:65;8906:2;8898:11;;;;;8928:6;;-1:-1:-1;8325:615:1;;-1:-1:-1;;;;8325:615:1:o;8945:347::-;9010:6;9018;9071:2;9059:9;9050:7;9046:23;9042:32;9039:52;;;9087:1;9084;9077:12;9039:52;9110:29;9129:9;9110:29;:::i;:::-;9100:39;;9189:2;9178:9;9174:18;9161:32;9236:5;9229:13;9222:21;9215:5;9212:32;9202:60;;9258:1;9255;9248:12;9202:60;9281:5;9271:15;;;8945:347;;;;;:::o;9297:260::-;9365:6;9373;9426:2;9414:9;9405:7;9401:23;9397:32;9394:52;;;9442:1;9439;9432:12;9394:52;9465:29;9484:9;9465:29;:::i;:::-;9455:39;;9513:38;9547:2;9536:9;9532:18;9513:38;:::i;:::-;9503:48;;9297:260;;;;;:::o;9562:186::-;9621:6;9674:2;9662:9;9653:7;9649:23;9645:32;9642:52;;;9690:1;9687;9680:12;9642:52;9713:29;9732:9;9713:29;:::i;9753:606::-;9857:6;9865;9873;9881;9889;9942:3;9930:9;9921:7;9917:23;9913:33;9910:53;;;9959:1;9956;9949:12;9910:53;9982:29;10001:9;9982:29;:::i;:::-;9972:39;;10030:38;10064:2;10053:9;10049:18;10030:38;:::i;:::-;10020:48;;10115:2;10104:9;10100:18;10087:32;10077:42;;10166:2;10155:9;10151:18;10138:32;10128:42;;10221:3;10210:9;10206:19;10193:33;10249:18;10241:6;10238:30;10235:50;;;10281:1;10278;10271:12;10235:50;10304:49;10345:7;10336:6;10325:9;10321:22;10304:49;:::i;11136:437::-;11215:1;11211:12;;;;11258;;;11279:61;;11333:4;11325:6;11321:17;11311:27;;11279:61;11386:2;11378:6;11375:14;11355:18;11352:38;11349:218;;11423:77;11420:1;11413:88;11524:4;11521:1;11514:15;11552:4;11549:1;11542:15;11349:218;;11136:437;;;:::o;11997:184::-;12049:77;12046:1;12039:88;12146:4;12143:1;12136:15;12170:4;12167:1;12160:15;12186:128;12226:3;12257:1;12253:6;12250:1;12247:13;12244:39;;;12263:18;;:::i;:::-;-1:-1:-1;12299:9:1;;12186:128::o;13065:184::-;13117:77;13114:1;13107:88;13214:4;13211:1;13204:15;13238:4;13235:1;13228:15;13254:195;13293:3;13324:66;13317:5;13314:77;13311:103;;13394:18;;:::i;:::-;-1:-1:-1;13441:1:1;13430:13;;13254:195::o;17152:465::-;17409:2;17398:9;17391:21;17372:4;17435:56;17487:2;17476:9;17472:18;17464:6;17435:56;:::i;:::-;17539:9;17531:6;17527:22;17522:2;17511:9;17507:18;17500:50;17567:44;17604:6;17596;17567:44;:::i;:::-;17559:52;17152:465;-1:-1:-1;;;;;17152:465:1:o;18687:850::-;19009:4;-1:-1:-1;;;;;19119:2:1;19111:6;19107:15;19096:9;19089:34;19171:2;19163:6;19159:15;19154:2;19143:9;19139:18;19132:43;;19211:3;19206:2;19195:9;19191:18;19184:31;19238:57;19290:3;19279:9;19275:19;19267:6;19238:57;:::i;:::-;19343:9;19335:6;19331:22;19326:2;19315:9;19311:18;19304:50;19377:44;19414:6;19406;19377:44;:::i;:::-;19363:58;;19470:9;19462:6;19458:22;19452:3;19441:9;19437:19;19430:51;19498:33;19524:6;19516;19498:33;:::i;:::-;19490:41;18687:850;-1:-1:-1;;;;;;;;18687:850:1:o;19542:249::-;19611:6;19664:2;19652:9;19643:7;19639:23;19635:32;19632:52;;;19680:1;19677;19670:12;19632:52;19712:9;19706:16;19731:30;19755:5;19731:30;:::i;19796:179::-;19831:3;19873:1;19855:16;19852:23;19849:120;;;19919:1;19916;19913;19898:23;-1:-1:-1;19956:1:1;19950:8;19945:3;19941:18;19849:120;19796:179;:::o;19980:731::-;20019:3;20061:4;20043:16;20040:26;20037:39;;;19980:731;:::o;20037:39::-;20103:2;20097:9;20125:66;20246:2;20228:16;20224:25;20221:1;20215:4;20200:50;20279:4;20273:11;20303:16;20338:18;20409:2;20402:4;20394:6;20390:17;20387:25;20382:2;20374:6;20371:14;20368:45;20365:58;;;20416:5;;;;;19980:731;:::o;20365:58::-;20453:6;20447:4;20443:17;20432:28;;20489:3;20483:10;20516:2;20508:6;20505:14;20502:27;;;20522:5;;;;;;19980:731;:::o;20502:27::-;20606:2;20587:16;20581:4;20577:27;20573:36;20566:4;20557:6;20552:3;20548:16;20544:27;20541:69;20538:82;;;20613:5;;;;;;19980:731;:::o;20538:82::-;20629:57;20680:4;20671:6;20663;20659:19;20655:30;20649:4;20629:57;:::i;:::-;-1:-1:-1;20702:3:1;;19980:731;-1:-1:-1;;;;;19980:731:1:o;21546:584::-;21768:4;-1:-1:-1;;;;;21878:2:1;21870:6;21866:15;21855:9;21848:34;21930:2;21922:6;21918:15;21913:2;21902:9;21898:18;21891:43;;21970:6;21965:2;21954:9;21950:18;21943:34;22013:6;22008:2;21997:9;21993:18;21986:34;22057:3;22051;22040:9;22036:19;22029:32;22078:46;22119:3;22108:9;22104:19;22096:6;22078:46;:::i;:::-;22070:54;21546:584;-1:-1:-1;;;;;;;21546:584:1:o
Swarm Source
ipfs://dd9d940505adbb8150024463f9b71d00ebb224979e12fef50cb013b5ce6ce9b3
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.