ETH Price: $3,577.84 (-1.11%)

Token

ERC-20: SANNAS (SNS)
 

Overview

Max Total Supply

3,001 SNS

Holders

154

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SNS
0x3aa7ecd5eedd68c7aef768f74de01f6b36bd25c8
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SANNAS

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 300 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-30
*/

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.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.
 */
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 Merklee 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: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: contracts/nft.sol



pragma solidity ^0.8.4;




contract SANNAS is ERC721A, Ownable {
    using Strings for uint256;
    
    string baseURI;
    string public notRevealedUri;
    string public baseExtension = ".json";
    bool public paused = false;
    bool public revealed = false;
    uint256 public cost = 0.03 ether;
    uint256 public maxSupply = 3000;
    uint256 public maxMintAmount = 20;
    uint256 public startDatePS = 1628566000;
    uint256 public endDatePS = 1628568000;

    uint256[4] public merkleRoot = [0x963e1ab74c1e97c4b178b274753e1df8935c036baf7ae5b62cbab45e157bc0bf, 0xbf4444c1e052ae93e924191b9e32a169e911e8066115d90dd4bb6102ddb967d9, 0xadb30ee6d6b1731aa1f14ba31726cdfb08f2508e664593438d0b5d481b515c7e, 0xb5a88a89930765de73b8c0256a8a18d0ce5cf391e7c295dd2e200812e52f6ebf];
    
    address[] public usedAddr;
    
    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI,
        string memory _initNotRevealedUri
    ) ERC721A(_name, _symbol) {
        setBaseURI(_initBaseURI);
        setNotRevealedURI(_initNotRevealedUri);
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    function mint(uint256 _mintAmount) public payable {
        require(!paused, "the contract is paused");
        
        uint256 supply = totalSupply();

        if (msg.sender != owner()) {
            require(_mintAmount > 0, "need to mint at least 1 NFT");
            require(_mintAmount <= maxMintAmount);
            require(supply + _mintAmount <= maxSupply, "max mint amount per session exceeded");
            require(msg.value >= cost * _mintAmount, "insufficient funds");
        }

        _safeMint(msg.sender, _mintAmount);
    }

    function mintWL(uint256 _mintAmount, uint8 _idGroup, bytes32[] calldata _merkleProof) public payable {
        uint256 supply = totalSupply();
        uint256 currentTime = block.timestamp;
        require(!paused);
        require(endDatePS > currentTime, "Presale is over");
        require(_mintAmount > 0);
        require(_mintAmount <= maxMintAmount);
        require(supply + _mintAmount <= maxSupply, "max mint amount per session exceeded");

        if (msg.sender != owner()) {

            for (uint i=0; i<usedAddr.length; i++) {
                require(usedAddr[i] != msg.sender, "Used all nft for free mint");
            }
        
            require(MerkleProof.verify(_merkleProof, bytes32(merkleRoot[_idGroup]), keccak256(abi.encodePacked(msg.sender))), "You are not in the list");
            usedAddr.push(msg.sender);
        }

        _safeMint(msg.sender, _mintAmount);
    }
 
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
        _exists(tokenId),
        "ERC721A: URI query for nonexistent token"
        );
        
        if(revealed == false) {
            return notRevealedUri;
        }

        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
            : "";
    }

  //only owner
   function send(address to, uint256 _mintAmount) public onlyOwner {
        _safeMint(to, _mintAmount);
    }

    function setPresaleDate(uint256 _startTime, uint256 _endTime) public onlyOwner {
        startDatePS = _startTime;
        endDatePS = _endTime;
    }

    function setMaxSupply(uint256 _maxSupply) public onlyOwner {
        maxSupply = _maxSupply;
    }

    function reveal() public onlyOwner {
        revealed = true;
    }
    
    //set the cost of an NFT
    function setCost(uint256 _newCost) public onlyOwner {
        cost = _newCost;
    }

    //set the max amount an address can mint
    function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
        maxMintAmount = _newmaxMintAmount;
    }
    
    //set the not revealed URI on IPFS
    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }

    //set the base URI on IPFS
    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }

    function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
        baseExtension = _newBaseExtension;
    }

    function pause(bool _state) public onlyOwner {
        paused = _state;
    }

    function withdraw() public payable onlyOwner {
        (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
        require(success);
    }
    
    //function returns the owner
    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        unchecked {
            uint256[] memory a = new uint256[](balanceOf(_owner)); 
            uint256 end = _currentIndex;
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            for (uint256 i; i < end; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == _owner) {
                    a[tokenIdsIdx++] = i;
                }
            }
            return a;    
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endDatePS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleRoot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"uint8","name":"_idGroup","type":"uint8"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"mintWL","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_endTime","type":"uint256"}],"name":"setPresaleDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startDatePS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","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":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60c06040526005608081905264173539b7b760d91b60a09081526200002891600b9190620002b2565b50600c805461ffff19169055666a94d74f430000600d55610bb8600e556014600f55636111f1f0601055636111f9c0601155604080516080810182527f963e1ab74c1e97c4b178b274753e1df8935c036baf7ae5b62cbab45e157bc0bf81527fbf4444c1e052ae93e924191b9e32a169e911e8066115d90dd4bb6102ddb967d960208201527fadb30ee6d6b1731aa1f14ba31726cdfb08f2508e664593438d0b5d481b515c7e918101919091527fb5a88a89930765de73b8c0256a8a18d0ce5cf391e7c295dd2e200812e52f6ebf60608201526200010b90601290600462000341565b503480156200011957600080fd5b5060405162002b1b38038062002b1b8339810160408190526200013c916200043f565b83518490849062000155906002906020850190620002b2565b5080516200016b906003906020840190620002b2565b505060008055506200017d336200019d565b6200018882620001ef565b620001938162000257565b505050506200054b565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b031633146200023e5760405162461bcd60e51b8152602060048201819052602482015260008051602062002afb83398151915260448201526064015b60405180910390fd5b805162000253906009906020840190620002b2565b5050565b6008546001600160a01b03163314620002a25760405162461bcd60e51b8152602060048201819052602482015260008051602062002afb833981519152604482015260640162000235565b80516200025390600a9060208401905b828054620002c090620004f8565b90600052602060002090601f016020900481019282620002e457600085556200032f565b82601f10620002ff57805160ff19168380011785556200032f565b828001600101855582156200032f579182015b828111156200032f57825182559160200191906001019062000312565b506200033d92915062000371565b5090565b82600481019282156200032f57916020028201828111156200032f57825182559160200191906001019062000312565b5b808211156200033d576000815560010162000372565b600082601f8301126200039a57600080fd5b81516001600160401b0380821115620003b757620003b762000535565b604051601f8301601f19908116603f01168101908282118183101715620003e257620003e262000535565b81604052838152602092508683858801011115620003ff57600080fd5b600091505b8382101562000423578582018301518183018401529082019062000404565b83821115620004355760008385830101525b9695505050505050565b600080600080608085870312156200045657600080fd5b84516001600160401b03808211156200046e57600080fd5b6200047c8883890162000388565b955060208701519150808211156200049357600080fd5b620004a18883890162000388565b94506040870151915080821115620004b857600080fd5b620004c68883890162000388565b93506060870151915080821115620004dd57600080fd5b50620004ec8782880162000388565b91505092959194509250565b600181811c908216806200050d57607f821691505b602082108114156200052f57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6125a0806200055b6000396000f3fe6080604052600436106102715760003560e01c806370a0823111610149578063b88d4fde116100c6578063da3ef23f1161008a578063f2c4ce1e11610064578063f2c4ce1e14610720578063f2fde38b14610740578063f93d8a0c1461076057600080fd5b8063da3ef23f146106a1578063dec55ade146106c1578063e985e9c5146106d757600080fd5b8063b88d4fde14610616578063c668286214610636578063c87b56dd1461064b578063d0679d341461066b578063d5abeb011461068b57600080fd5b80638da5cb5b1161010d5780638da5cb5b1461059b57806395d89b41146105b9578063a0712d68146105ce578063a22cb465146105e1578063a475b5dd1461060157600080fd5b806370a0823114610513578063715018a6146105335780637e9339ca146105485780637f00c7a61461056857806387f8b4101461058857600080fd5b80633c70b357116101f257806351830227116101b65780635e681741116101905780635e681741146104bd5780636352211e146104d35780636f8b44b0146104f357600080fd5b8063518302271461046457806355f804b3146104835780635c975abb146104a357600080fd5b80633c70b357146103cf5780633ccfd60b146103ef57806342842e0e146103f7578063438b63001461041757806344a0d68a1461044457600080fd5b8063095ea7b311610239578063095ea7b31461033c57806313faede61461035c57806318160ddd14610380578063239c70ae1461039957806323b872dd146103af57600080fd5b806301ffc9a71461027657806302329a29146102ab57806306fdde03146102cd578063081812fc146102ef578063081c8c4414610327575b600080fd5b34801561028257600080fd5b506102966102913660046120b8565b610780565b60405190151581526020015b60405180910390f35b3480156102b757600080fd5b506102cb6102c636600461209d565b6107d2565b005b3480156102d957600080fd5b506102e2610818565b6040516102a29190612378565b3480156102fb57600080fd5b5061030f61030a36600461213b565b6108aa565b6040516001600160a01b0390911681526020016102a2565b34801561033357600080fd5b506102e26108ee565b34801561034857600080fd5b506102cb610357366004612073565b61097c565b34801561036857600080fd5b50610372600d5481565b6040519081526020016102a2565b34801561038c57600080fd5b5060015460005403610372565b3480156103a557600080fd5b50610372600f5481565b3480156103bb57600080fd5b506102cb6103ca366004611f91565b610a0a565b3480156103db57600080fd5b506103726103ea36600461213b565b610a15565b6102cb610a2c565b34801561040357600080fd5b506102cb610412366004611f91565b610aae565b34801561042357600080fd5b50610437610432366004611f43565b610ac9565b6040516102a29190612334565b34801561045057600080fd5b506102cb61045f36600461213b565b610bf4565b34801561047057600080fd5b50600c5461029690610100900460ff1681565b34801561048f57600080fd5b506102cb61049e3660046120f2565b610c23565b3480156104af57600080fd5b50600c546102969060ff1681565b3480156104c957600080fd5b5061037260115481565b3480156104df57600080fd5b5061030f6104ee36600461213b565b610c64565b3480156104ff57600080fd5b506102cb61050e36600461213b565b610c76565b34801561051f57600080fd5b5061037261052e366004611f43565b610ca5565b34801561053f57600080fd5b506102cb610cf4565b34801561055457600080fd5b506102cb610563366004612154565b610d2a565b34801561057457600080fd5b506102cb61058336600461213b565b610d5f565b6102cb610596366004612176565b610d8e565b3480156105a757600080fd5b506008546001600160a01b031661030f565b3480156105c557600080fd5b506102e2611017565b6102cb6105dc36600461213b565b611026565b3480156105ed57600080fd5b506102cb6105fc366004612049565b61119a565b34801561060d57600080fd5b506102cb611230565b34801561062257600080fd5b506102cb610631366004611fcd565b61126b565b34801561064257600080fd5b506102e26112bc565b34801561065757600080fd5b506102e261066636600461213b565b6112c9565b34801561067757600080fd5b506102cb610686366004612073565b611431565b34801561069757600080fd5b50610372600e5481565b3480156106ad57600080fd5b506102cb6106bc3660046120f2565b611465565b3480156106cd57600080fd5b5061037260105481565b3480156106e357600080fd5b506102966106f2366004611f5e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561072c57600080fd5b506102cb61073b3660046120f2565b6114a2565b34801561074c57600080fd5b506102cb61075b366004611f43565b6114df565b34801561076c57600080fd5b5061030f61077b36600461213b565b611577565b60006001600160e01b031982166380ac58cd60e01b14806107b157506001600160e01b03198216635b5e139f60e01b145b806107cc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146108055760405162461bcd60e51b81526004016107fc906123cf565b60405180910390fd5b600c805460ff1916911515919091179055565b60606002805461082790612492565b80601f016020809104026020016040519081016040528092919081815260200182805461085390612492565b80156108a05780601f10610875576101008083540402835291602001916108a0565b820191906000526020600020905b81548152906001019060200180831161088357829003601f168201915b5050505050905090565b60006108b5826115a1565b6108d2576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600a80546108fb90612492565b80601f016020809104026020016040519081016040528092919081815260200182805461092790612492565b80156109745780601f1061094957610100808354040283529160200191610974565b820191906000526020600020905b81548152906001019060200180831161095757829003601f168201915b505050505081565b600061098782610c64565b9050806001600160a01b0316836001600160a01b031614156109bc5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906109dc57506109da81336106f2565b155b156109fa576040516367d9dca160e11b815260040160405180910390fd5b610a058383836115cc565b505050565b610a05838383611628565b60128160048110610a2557600080fd5b0154905081565b6008546001600160a01b03163314610a565760405162461bcd60e51b81526004016107fc906123cf565b604051600090339047908381818185875af1925050503d8060008114610a98576040519150601f19603f3d011682016040523d82523d6000602084013e610a9d565b606091505b5050905080610aab57600080fd5b50565b610a058383836040518060200160405280600081525061126b565b60606000610ad683610ca5565b67ffffffffffffffff811115610aee57610aee61253e565b604051908082528060200260200182016040528015610b17578160200160208202803683370190505b506000805491925080805b83811015610be957600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161580159282019290925290610b8a5750610be1565b80516001600160a01b031615610b9f57805192505b876001600160a01b0316836001600160a01b03161415610bdf5781868580600101965081518110610bd257610bd2612528565b6020026020010181815250505b505b600101610b22565b509295945050505050565b6008546001600160a01b03163314610c1e5760405162461bcd60e51b81526004016107fc906123cf565b600d55565b6008546001600160a01b03163314610c4d5760405162461bcd60e51b81526004016107fc906123cf565b8051610c60906009906020840190611e08565b5050565b6000610c6f82611818565b5192915050565b6008546001600160a01b03163314610ca05760405162461bcd60e51b81526004016107fc906123cf565b600e55565b60006001600160a01b038216610cce576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610d1e5760405162461bcd60e51b81526004016107fc906123cf565b610d286000611934565b565b6008546001600160a01b03163314610d545760405162461bcd60e51b81526004016107fc906123cf565b601091909155601155565b6008546001600160a01b03163314610d895760405162461bcd60e51b81526004016107fc906123cf565b600f55565b6000610d9d6001546000540390565b600c54909150429060ff1615610db257600080fd5b8060115411610df55760405162461bcd60e51b815260206004820152600f60248201526e283932b9b0b6329034b99037bb32b960891b60448201526064016107fc565b60008611610e0257600080fd5b600f54861115610e1157600080fd5b600e54610e1e8784612404565b1115610e3c5760405162461bcd60e51b81526004016107fc9061238b565b6008546001600160a01b031633146110055760005b601654811015610eed57336001600160a01b031660168281548110610e7857610e78612528565b6000918252602090912001546001600160a01b03161415610edb5760405162461bcd60e51b815260206004820152601a60248201527f5573656420616c6c206e667420666f722066726565206d696e7400000000000060448201526064016107fc565b80610ee5816124cd565b915050610e51565b50610f7684848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525060129250505060ff881660048110610f3b57610f3b612528565b01546040516bffffffffffffffffffffffff193360601b16602082015260340160405160208183030381529060405280519060200120611986565b610fc25760405162461bcd60e51b815260206004820152601760248201527f596f7520617265206e6f7420696e20746865206c69737400000000000000000060448201526064016107fc565b601680546001810182556000919091527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890180546001600160a01b031916331790555b61100f338761199c565b505050505050565b60606003805461082790612492565b600c5460ff16156110795760405162461bcd60e51b815260206004820152601660248201527f74686520636f6e7472616374206973207061757365640000000000000000000060448201526064016107fc565b60006110886001546000540390565b905061109c6008546001600160a01b031690565b6001600160a01b0316336001600160a01b03161461119057600082116111045760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e4654000000000060448201526064016107fc565b600f5482111561111357600080fd5b600e546111208383612404565b111561113e5760405162461bcd60e51b81526004016107fc9061238b565b81600d5461114c9190612430565b3410156111905760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b60448201526064016107fc565b610c60338361199c565b6001600160a01b0382163314156111c45760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331461125a5760405162461bcd60e51b81526004016107fc906123cf565b600c805461ff001916610100179055565b611276848484611628565b6001600160a01b0383163b151580156112985750611296848484846119b6565b155b156112b6576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600b80546108fb90612492565b60606112d4826115a1565b6113315760405162461bcd60e51b815260206004820152602860248201527f455243373231413a2055524920717565727920666f72206e6f6e657869737465604482015267373a103a37b5b2b760c11b60648201526084016107fc565b600c54610100900460ff166113d257600a805461134d90612492565b80601f016020809104026020016040519081016040528092919081815260200182805461137990612492565b80156113c65780601f1061139b576101008083540402835291602001916113c6565b820191906000526020600020905b8154815290600101906020018083116113a957829003601f168201915b50505050509050919050565b60006113dc611aae565b905060008151116113fc576040518060200160405280600081525061142a565b8061140684611abd565b600b60405160200161141a93929190612234565b6040516020818303038152906040525b9392505050565b6008546001600160a01b0316331461145b5760405162461bcd60e51b81526004016107fc906123cf565b610c60828261199c565b6008546001600160a01b0316331461148f5760405162461bcd60e51b81526004016107fc906123cf565b8051610c6090600b906020840190611e08565b6008546001600160a01b031633146114cc5760405162461bcd60e51b81526004016107fc906123cf565b8051610c6090600a906020840190611e08565b6008546001600160a01b031633146115095760405162461bcd60e51b81526004016107fc906123cf565b6001600160a01b03811661156e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107fc565b610aab81611934565b6016818154811061158757600080fd5b6000918252602090912001546001600160a01b0316905081565b60008054821080156107cc575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061163382611818565b9050836001600160a01b031681600001516001600160a01b03161461166a5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611688575061168885336106f2565b806116a3575033611698846108aa565b6001600160a01b0316145b9050806116c357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166116ea57604051633a954ecd60e21b815260040160405180910390fd5b6116f6600084876115cc565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166117cc5760005482146117cc578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051606081018252600080825260208201819052918101919091528160005481101561191b57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906119195780516001600160a01b0316156118af579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611914579392505050565b6118af565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826119938584611bbb565b14949350505050565b610c60828260405180602001604052806000815250611c2f565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119eb9033908990889088906004016122f8565b602060405180830381600087803b158015611a0557600080fd5b505af1925050508015611a35575060408051601f3d908101601f19168201909252611a32918101906120d5565b60015b611a90573d808015611a63576040519150601f19603f3d011682016040523d82523d6000602084013e611a68565b606091505b508051611a88576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461082790612492565b606081611ae15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611b0b5780611af5816124cd565b9150611b049050600a8361241c565b9150611ae5565b60008167ffffffffffffffff811115611b2657611b2661253e565b6040519080825280601f01601f191660200182016040528015611b50576020820181803683370190505b5090505b8415611aa657611b6560018361244f565b9150611b72600a866124e8565b611b7d906030612404565b60f81b818381518110611b9257611b92612528565b60200101906001600160f81b031916908160001a905350611bb4600a8661241c565b9450611b54565b600081815b8451811015611c27576000858281518110611bdd57611bdd612528565b60200260200101519050808311611c035760008381526020829052604090209250611c14565b600081815260208490526040902092505b5080611c1f816124cd565b915050611bc0565b509392505050565b610a0583838360016000546001600160a01b038516611c6057604051622e076360e81b815260040160405180910390fd5b83611c7e5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611d3057506001600160a01b0387163b15155b15611db9575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611d8160008884806001019550886119b6565b611d9e576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611d36578260005414611db457600080fd5b611dff565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611dba575b50600055611811565b828054611e1490612492565b90600052602060002090601f016020900481019282611e365760008555611e7c565b82601f10611e4f57805160ff1916838001178555611e7c565b82800160010185558215611e7c579182015b82811115611e7c578251825591602001919060010190611e61565b50611e88929150611e8c565b5090565b5b80821115611e885760008155600101611e8d565b600067ffffffffffffffff80841115611ebc57611ebc61253e565b604051601f8501601f19908116603f01168101908282118183101715611ee457611ee461253e565b81604052809350858152868686011115611efd57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611f2e57600080fd5b919050565b80358015158114611f2e57600080fd5b600060208284031215611f5557600080fd5b61142a82611f17565b60008060408385031215611f7157600080fd5b611f7a83611f17565b9150611f8860208401611f17565b90509250929050565b600080600060608486031215611fa657600080fd5b611faf84611f17565b9250611fbd60208501611f17565b9150604084013590509250925092565b60008060008060808587031215611fe357600080fd5b611fec85611f17565b9350611ffa60208601611f17565b925060408501359150606085013567ffffffffffffffff81111561201d57600080fd5b8501601f8101871361202e57600080fd5b61203d87823560208401611ea1565b91505092959194509250565b6000806040838503121561205c57600080fd5b61206583611f17565b9150611f8860208401611f33565b6000806040838503121561208657600080fd5b61208f83611f17565b946020939093013593505050565b6000602082840312156120af57600080fd5b61142a82611f33565b6000602082840312156120ca57600080fd5b813561142a81612554565b6000602082840312156120e757600080fd5b815161142a81612554565b60006020828403121561210457600080fd5b813567ffffffffffffffff81111561211b57600080fd5b8201601f8101841361212c57600080fd5b611aa684823560208401611ea1565b60006020828403121561214d57600080fd5b5035919050565b6000806040838503121561216757600080fd5b50508035926020909101359150565b6000806000806060858703121561218c57600080fd5b84359350602085013560ff811681146121a457600080fd5b9250604085013567ffffffffffffffff808211156121c157600080fd5b818701915087601f8301126121d557600080fd5b8135818111156121e457600080fd5b8860208260051b85010111156121f957600080fd5b95989497505060200194505050565b60008151808452612220816020860160208601612466565b601f01601f19169290920160200192915050565b6000845160206122478285838a01612466565b85519184019161225a8184848a01612466565b8554920191600090600181811c908083168061227757607f831692505b85831081141561229557634e487b7160e01b85526022600452602485fd5b8080156122a957600181146122ba576122e7565b60ff198516885283880195506122e7565b60008b81526020902060005b858110156122df5781548a8201529084019088016122c6565b505083880195505b50939b9a5050505050505050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261232a6080830184612208565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561236c57835183529284019291840191600101612350565b50909695505050505050565b60208152600061142a6020830184612208565b60208082526024908201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656040820152631959195960e21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115612417576124176124fc565b500190565b60008261242b5761242b612512565b500490565b600081600019048311821515161561244a5761244a6124fc565b500290565b600082821015612461576124616124fc565b500390565b60005b83811015612481578181015183820152602001612469565b838111156112b65750506000910152565b600181811c908216806124a657607f821691505b602082108114156124c757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124e1576124e16124fc565b5060010190565b6000826124f7576124f7612512565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610aab57600080fdfea2646970667358221220fef1fdec9a79e0a273d681c16aab00e9b8ac44bd0fb9cf64f9ec0048ad35a3ff64736f6c634300080700334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000653414e4e415300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003534e53000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d5a4e7664516f64466b39747446323446584e54657872666b78734a504e63314542364670776379546877684e2f706c75672e6a736f6e00

Deployed Bytecode

0x6080604052600436106102715760003560e01c806370a0823111610149578063b88d4fde116100c6578063da3ef23f1161008a578063f2c4ce1e11610064578063f2c4ce1e14610720578063f2fde38b14610740578063f93d8a0c1461076057600080fd5b8063da3ef23f146106a1578063dec55ade146106c1578063e985e9c5146106d757600080fd5b8063b88d4fde14610616578063c668286214610636578063c87b56dd1461064b578063d0679d341461066b578063d5abeb011461068b57600080fd5b80638da5cb5b1161010d5780638da5cb5b1461059b57806395d89b41146105b9578063a0712d68146105ce578063a22cb465146105e1578063a475b5dd1461060157600080fd5b806370a0823114610513578063715018a6146105335780637e9339ca146105485780637f00c7a61461056857806387f8b4101461058857600080fd5b80633c70b357116101f257806351830227116101b65780635e681741116101905780635e681741146104bd5780636352211e146104d35780636f8b44b0146104f357600080fd5b8063518302271461046457806355f804b3146104835780635c975abb146104a357600080fd5b80633c70b357146103cf5780633ccfd60b146103ef57806342842e0e146103f7578063438b63001461041757806344a0d68a1461044457600080fd5b8063095ea7b311610239578063095ea7b31461033c57806313faede61461035c57806318160ddd14610380578063239c70ae1461039957806323b872dd146103af57600080fd5b806301ffc9a71461027657806302329a29146102ab57806306fdde03146102cd578063081812fc146102ef578063081c8c4414610327575b600080fd5b34801561028257600080fd5b506102966102913660046120b8565b610780565b60405190151581526020015b60405180910390f35b3480156102b757600080fd5b506102cb6102c636600461209d565b6107d2565b005b3480156102d957600080fd5b506102e2610818565b6040516102a29190612378565b3480156102fb57600080fd5b5061030f61030a36600461213b565b6108aa565b6040516001600160a01b0390911681526020016102a2565b34801561033357600080fd5b506102e26108ee565b34801561034857600080fd5b506102cb610357366004612073565b61097c565b34801561036857600080fd5b50610372600d5481565b6040519081526020016102a2565b34801561038c57600080fd5b5060015460005403610372565b3480156103a557600080fd5b50610372600f5481565b3480156103bb57600080fd5b506102cb6103ca366004611f91565b610a0a565b3480156103db57600080fd5b506103726103ea36600461213b565b610a15565b6102cb610a2c565b34801561040357600080fd5b506102cb610412366004611f91565b610aae565b34801561042357600080fd5b50610437610432366004611f43565b610ac9565b6040516102a29190612334565b34801561045057600080fd5b506102cb61045f36600461213b565b610bf4565b34801561047057600080fd5b50600c5461029690610100900460ff1681565b34801561048f57600080fd5b506102cb61049e3660046120f2565b610c23565b3480156104af57600080fd5b50600c546102969060ff1681565b3480156104c957600080fd5b5061037260115481565b3480156104df57600080fd5b5061030f6104ee36600461213b565b610c64565b3480156104ff57600080fd5b506102cb61050e36600461213b565b610c76565b34801561051f57600080fd5b5061037261052e366004611f43565b610ca5565b34801561053f57600080fd5b506102cb610cf4565b34801561055457600080fd5b506102cb610563366004612154565b610d2a565b34801561057457600080fd5b506102cb61058336600461213b565b610d5f565b6102cb610596366004612176565b610d8e565b3480156105a757600080fd5b506008546001600160a01b031661030f565b3480156105c557600080fd5b506102e2611017565b6102cb6105dc36600461213b565b611026565b3480156105ed57600080fd5b506102cb6105fc366004612049565b61119a565b34801561060d57600080fd5b506102cb611230565b34801561062257600080fd5b506102cb610631366004611fcd565b61126b565b34801561064257600080fd5b506102e26112bc565b34801561065757600080fd5b506102e261066636600461213b565b6112c9565b34801561067757600080fd5b506102cb610686366004612073565b611431565b34801561069757600080fd5b50610372600e5481565b3480156106ad57600080fd5b506102cb6106bc3660046120f2565b611465565b3480156106cd57600080fd5b5061037260105481565b3480156106e357600080fd5b506102966106f2366004611f5e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561072c57600080fd5b506102cb61073b3660046120f2565b6114a2565b34801561074c57600080fd5b506102cb61075b366004611f43565b6114df565b34801561076c57600080fd5b5061030f61077b36600461213b565b611577565b60006001600160e01b031982166380ac58cd60e01b14806107b157506001600160e01b03198216635b5e139f60e01b145b806107cc57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146108055760405162461bcd60e51b81526004016107fc906123cf565b60405180910390fd5b600c805460ff1916911515919091179055565b60606002805461082790612492565b80601f016020809104026020016040519081016040528092919081815260200182805461085390612492565b80156108a05780601f10610875576101008083540402835291602001916108a0565b820191906000526020600020905b81548152906001019060200180831161088357829003601f168201915b5050505050905090565b60006108b5826115a1565b6108d2576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600a80546108fb90612492565b80601f016020809104026020016040519081016040528092919081815260200182805461092790612492565b80156109745780601f1061094957610100808354040283529160200191610974565b820191906000526020600020905b81548152906001019060200180831161095757829003601f168201915b505050505081565b600061098782610c64565b9050806001600160a01b0316836001600160a01b031614156109bc5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216148015906109dc57506109da81336106f2565b155b156109fa576040516367d9dca160e11b815260040160405180910390fd5b610a058383836115cc565b505050565b610a05838383611628565b60128160048110610a2557600080fd5b0154905081565b6008546001600160a01b03163314610a565760405162461bcd60e51b81526004016107fc906123cf565b604051600090339047908381818185875af1925050503d8060008114610a98576040519150601f19603f3d011682016040523d82523d6000602084013e610a9d565b606091505b5050905080610aab57600080fd5b50565b610a058383836040518060200160405280600081525061126b565b60606000610ad683610ca5565b67ffffffffffffffff811115610aee57610aee61253e565b604051908082528060200260200182016040528015610b17578160200160208202803683370190505b506000805491925080805b83811015610be957600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161580159282019290925290610b8a5750610be1565b80516001600160a01b031615610b9f57805192505b876001600160a01b0316836001600160a01b03161415610bdf5781868580600101965081518110610bd257610bd2612528565b6020026020010181815250505b505b600101610b22565b509295945050505050565b6008546001600160a01b03163314610c1e5760405162461bcd60e51b81526004016107fc906123cf565b600d55565b6008546001600160a01b03163314610c4d5760405162461bcd60e51b81526004016107fc906123cf565b8051610c60906009906020840190611e08565b5050565b6000610c6f82611818565b5192915050565b6008546001600160a01b03163314610ca05760405162461bcd60e51b81526004016107fc906123cf565b600e55565b60006001600160a01b038216610cce576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610d1e5760405162461bcd60e51b81526004016107fc906123cf565b610d286000611934565b565b6008546001600160a01b03163314610d545760405162461bcd60e51b81526004016107fc906123cf565b601091909155601155565b6008546001600160a01b03163314610d895760405162461bcd60e51b81526004016107fc906123cf565b600f55565b6000610d9d6001546000540390565b600c54909150429060ff1615610db257600080fd5b8060115411610df55760405162461bcd60e51b815260206004820152600f60248201526e283932b9b0b6329034b99037bb32b960891b60448201526064016107fc565b60008611610e0257600080fd5b600f54861115610e1157600080fd5b600e54610e1e8784612404565b1115610e3c5760405162461bcd60e51b81526004016107fc9061238b565b6008546001600160a01b031633146110055760005b601654811015610eed57336001600160a01b031660168281548110610e7857610e78612528565b6000918252602090912001546001600160a01b03161415610edb5760405162461bcd60e51b815260206004820152601a60248201527f5573656420616c6c206e667420666f722066726565206d696e7400000000000060448201526064016107fc565b80610ee5816124cd565b915050610e51565b50610f7684848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525060129250505060ff881660048110610f3b57610f3b612528565b01546040516bffffffffffffffffffffffff193360601b16602082015260340160405160208183030381529060405280519060200120611986565b610fc25760405162461bcd60e51b815260206004820152601760248201527f596f7520617265206e6f7420696e20746865206c69737400000000000000000060448201526064016107fc565b601680546001810182556000919091527fd833147d7dc355ba459fc788f669e58cfaf9dc25ddcd0702e87d69c7b51242890180546001600160a01b031916331790555b61100f338761199c565b505050505050565b60606003805461082790612492565b600c5460ff16156110795760405162461bcd60e51b815260206004820152601660248201527f74686520636f6e7472616374206973207061757365640000000000000000000060448201526064016107fc565b60006110886001546000540390565b905061109c6008546001600160a01b031690565b6001600160a01b0316336001600160a01b03161461119057600082116111045760405162461bcd60e51b815260206004820152601b60248201527f6e65656420746f206d696e74206174206c656173742031204e4654000000000060448201526064016107fc565b600f5482111561111357600080fd5b600e546111208383612404565b111561113e5760405162461bcd60e51b81526004016107fc9061238b565b81600d5461114c9190612430565b3410156111905760405162461bcd60e51b8152602060048201526012602482015271696e73756666696369656e742066756e647360701b60448201526064016107fc565b610c60338361199c565b6001600160a01b0382163314156111c45760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b0316331461125a5760405162461bcd60e51b81526004016107fc906123cf565b600c805461ff001916610100179055565b611276848484611628565b6001600160a01b0383163b151580156112985750611296848484846119b6565b155b156112b6576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b600b80546108fb90612492565b60606112d4826115a1565b6113315760405162461bcd60e51b815260206004820152602860248201527f455243373231413a2055524920717565727920666f72206e6f6e657869737465604482015267373a103a37b5b2b760c11b60648201526084016107fc565b600c54610100900460ff166113d257600a805461134d90612492565b80601f016020809104026020016040519081016040528092919081815260200182805461137990612492565b80156113c65780601f1061139b576101008083540402835291602001916113c6565b820191906000526020600020905b8154815290600101906020018083116113a957829003601f168201915b50505050509050919050565b60006113dc611aae565b905060008151116113fc576040518060200160405280600081525061142a565b8061140684611abd565b600b60405160200161141a93929190612234565b6040516020818303038152906040525b9392505050565b6008546001600160a01b0316331461145b5760405162461bcd60e51b81526004016107fc906123cf565b610c60828261199c565b6008546001600160a01b0316331461148f5760405162461bcd60e51b81526004016107fc906123cf565b8051610c6090600b906020840190611e08565b6008546001600160a01b031633146114cc5760405162461bcd60e51b81526004016107fc906123cf565b8051610c6090600a906020840190611e08565b6008546001600160a01b031633146115095760405162461bcd60e51b81526004016107fc906123cf565b6001600160a01b03811661156e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107fc565b610aab81611934565b6016818154811061158757600080fd5b6000918252602090912001546001600160a01b0316905081565b60008054821080156107cc575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b600061163382611818565b9050836001600160a01b031681600001516001600160a01b03161461166a5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611688575061168885336106f2565b806116a3575033611698846108aa565b6001600160a01b0316145b9050806116c357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0384166116ea57604051633a954ecd60e21b815260040160405180910390fd5b6116f6600084876115cc565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b429092169190910217835587018084529220805491939091166117cc5760005482146117cc578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60408051606081018252600080825260208201819052918101919091528160005481101561191b57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff161515918101829052906119195780516001600160a01b0316156118af579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215611914579392505050565b6118af565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826119938584611bbb565b14949350505050565b610c60828260405180602001604052806000815250611c2f565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906119eb9033908990889088906004016122f8565b602060405180830381600087803b158015611a0557600080fd5b505af1925050508015611a35575060408051601f3d908101601f19168201909252611a32918101906120d5565b60015b611a90573d808015611a63576040519150601f19603f3d011682016040523d82523d6000602084013e611a68565b606091505b508051611a88576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b60606009805461082790612492565b606081611ae15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611b0b5780611af5816124cd565b9150611b049050600a8361241c565b9150611ae5565b60008167ffffffffffffffff811115611b2657611b2661253e565b6040519080825280601f01601f191660200182016040528015611b50576020820181803683370190505b5090505b8415611aa657611b6560018361244f565b9150611b72600a866124e8565b611b7d906030612404565b60f81b818381518110611b9257611b92612528565b60200101906001600160f81b031916908160001a905350611bb4600a8661241c565b9450611b54565b600081815b8451811015611c27576000858281518110611bdd57611bdd612528565b60200260200101519050808311611c035760008381526020829052604090209250611c14565b600081815260208490526040902092505b5080611c1f816124cd565b915050611bc0565b509392505050565b610a0583838360016000546001600160a01b038516611c6057604051622e076360e81b815260040160405180910390fd5b83611c7e5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff19811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015611d3057506001600160a01b0387163b15155b15611db9575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611d8160008884806001019550886119b6565b611d9e576040516368d2bf6b60e11b815260040160405180910390fd5b80821415611d36578260005414611db457600080fd5b611dff565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a480821415611dba575b50600055611811565b828054611e1490612492565b90600052602060002090601f016020900481019282611e365760008555611e7c565b82601f10611e4f57805160ff1916838001178555611e7c565b82800160010185558215611e7c579182015b82811115611e7c578251825591602001919060010190611e61565b50611e88929150611e8c565b5090565b5b80821115611e885760008155600101611e8d565b600067ffffffffffffffff80841115611ebc57611ebc61253e565b604051601f8501601f19908116603f01168101908282118183101715611ee457611ee461253e565b81604052809350858152868686011115611efd57600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114611f2e57600080fd5b919050565b80358015158114611f2e57600080fd5b600060208284031215611f5557600080fd5b61142a82611f17565b60008060408385031215611f7157600080fd5b611f7a83611f17565b9150611f8860208401611f17565b90509250929050565b600080600060608486031215611fa657600080fd5b611faf84611f17565b9250611fbd60208501611f17565b9150604084013590509250925092565b60008060008060808587031215611fe357600080fd5b611fec85611f17565b9350611ffa60208601611f17565b925060408501359150606085013567ffffffffffffffff81111561201d57600080fd5b8501601f8101871361202e57600080fd5b61203d87823560208401611ea1565b91505092959194509250565b6000806040838503121561205c57600080fd5b61206583611f17565b9150611f8860208401611f33565b6000806040838503121561208657600080fd5b61208f83611f17565b946020939093013593505050565b6000602082840312156120af57600080fd5b61142a82611f33565b6000602082840312156120ca57600080fd5b813561142a81612554565b6000602082840312156120e757600080fd5b815161142a81612554565b60006020828403121561210457600080fd5b813567ffffffffffffffff81111561211b57600080fd5b8201601f8101841361212c57600080fd5b611aa684823560208401611ea1565b60006020828403121561214d57600080fd5b5035919050565b6000806040838503121561216757600080fd5b50508035926020909101359150565b6000806000806060858703121561218c57600080fd5b84359350602085013560ff811681146121a457600080fd5b9250604085013567ffffffffffffffff808211156121c157600080fd5b818701915087601f8301126121d557600080fd5b8135818111156121e457600080fd5b8860208260051b85010111156121f957600080fd5b95989497505060200194505050565b60008151808452612220816020860160208601612466565b601f01601f19169290920160200192915050565b6000845160206122478285838a01612466565b85519184019161225a8184848a01612466565b8554920191600090600181811c908083168061227757607f831692505b85831081141561229557634e487b7160e01b85526022600452602485fd5b8080156122a957600181146122ba576122e7565b60ff198516885283880195506122e7565b60008b81526020902060005b858110156122df5781548a8201529084019088016122c6565b505083880195505b50939b9a5050505050505050505050565b60006001600160a01b0380871683528086166020840152508360408301526080606083015261232a6080830184612208565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561236c57835183529284019291840191600101612350565b50909695505050505050565b60208152600061142a6020830184612208565b60208082526024908201527f6d6178206d696e7420616d6f756e74207065722073657373696f6e20657863656040820152631959195960e21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60008219821115612417576124176124fc565b500190565b60008261242b5761242b612512565b500490565b600081600019048311821515161561244a5761244a6124fc565b500290565b600082821015612461576124616124fc565b500390565b60005b83811015612481578181015183820152602001612469565b838111156112b65750506000910152565b600181811c908216806124a657607f821691505b602082108114156124c757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156124e1576124e16124fc565b5060010190565b6000826124f7576124f7612512565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114610aab57600080fdfea2646970667358221220fef1fdec9a79e0a273d681c16aab00e9b8ac44bd0fb9cf64f9ec0048ad35a3ff64736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000653414e4e415300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003534e53000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000012f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003f697066733a2f2f516d5a4e7664516f64466b39747446323446584e54657872666b78734a504e63314542364670776379546877684e2f706c75672e6a736f6e00

-----Decoded View---------------
Arg [0] : _name (string): SANNAS
Arg [1] : _symbol (string): SNS
Arg [2] : _initBaseURI (string): /
Arg [3] : _initNotRevealedUri (string): ipfs://QmZNvdQodFk9ttF24FXNTexrfkxsJPNc1EB6FpwcyThwhN/plug.json

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [5] : 53414e4e41530000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [7] : 534e530000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [9] : 2f00000000000000000000000000000000000000000000000000000000000000
Arg [10] : 000000000000000000000000000000000000000000000000000000000000003f
Arg [11] : 697066733a2f2f516d5a4e7664516f64466b39747446323446584e5465787266
Arg [12] : 6b78734a504e63314542364670776379546877684e2f706c75672e6a736f6e00


Deployed Bytecode Sourcemap

47186:5640:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29361:305;;;;;;;;;;-1:-1:-1;29361:305:0;;;;;:::i;:::-;;:::i;:::-;;;9208:14:1;;9201:22;9183:41;;9171:2;9156:18;29361:305:0;;;;;;;;51699:79;;;;;;;;;;-1:-1:-1;51699:79:0;;;;;:::i;:::-;;:::i;:::-;;32474:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;33977:204::-;;;;;;;;;;-1:-1:-1;33977:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7823:55:1;;;7805:74;;7793:2;7778:18;33977:204:0;7659:226:1;47288:28:0;;;;;;;;;;;;;:::i;33540:371::-;;;;;;;;;;-1:-1:-1;33540:371:0;;;;;:::i;:::-;;:::i;47435:32::-;;;;;;;;;;;;;;;;;;;13292:25:1;;;13280:2;13265:18;47435:32:0;13146:177:1;28610:303:0;;;;;;;;;;-1:-1:-1;28864:12:0;;28654:7;28848:13;:28;28610:303;;47512:33;;;;;;;;;;;;;;;;34842:170;;;;;;;;;;-1:-1:-1;34842:170:0;;;;;:::i;:::-;;:::i;47644:303::-;;;;;;;;;;-1:-1:-1;47644:303:0;;;;;:::i;:::-;;:::i;51786:168::-;;;:::i;35083:185::-;;;;;;;;;;-1:-1:-1;35083:185:0;;;;;:::i;:::-;;:::i;52000:823::-;;;;;;;;;;-1:-1:-1;52000:823:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50971:86::-;;;;;;;;;;-1:-1:-1;50971:86:0;;;;;:::i;:::-;;:::i;47400:28::-;;;;;;;;;;-1:-1:-1;47400:28:0;;;;;;;;;;;51451:104;;;;;;;;;;-1:-1:-1;51451:104:0;;;;;:::i;:::-;;:::i;47367:26::-;;;;;;;;;;-1:-1:-1;47367:26:0;;;;;;;;47598:37;;;;;;;;;;;;;;;;32282:125;;;;;;;;;;-1:-1:-1;32282:125:0;;;;;:::i;:::-;;:::i;50752:100::-;;;;;;;;;;-1:-1:-1;50752:100:0;;;;;:::i;:::-;;:::i;29730:206::-;;;;;;;;;;-1:-1:-1;29730:206:0;;;;;:::i;:::-;;:::i;7119:103::-;;;;;;;;;;;;;:::i;50591:153::-;;;;;;;;;;-1:-1:-1;50591:153:0;;;;;:::i;:::-;;:::i;51111:122::-;;;;;;;;;;-1:-1:-1;51111:122:0;;;;;:::i;:::-;;:::i;48964:920::-;;;;;;:::i;:::-;;:::i;6468:87::-;;;;;;;;;;-1:-1:-1;6541:6:0;;-1:-1:-1;;;;;6541:6:0;6468:87;;32643:104;;;;;;;;;;;;;:::i;48400:556::-;;;;;;:::i;:::-;;:::i;34253:287::-;;;;;;;;;;-1:-1:-1;34253:287:0;;;;;:::i;:::-;;:::i;50860:69::-;;;;;;;;;;;;;:::i;35339:369::-;;;;;;;;;;-1:-1:-1;35339:369:0;;;;;:::i;:::-;;:::i;47323:37::-;;;;;;;;;;;;;:::i;49893:558::-;;;;;;;;;;-1:-1:-1;49893:558:0;;;;;:::i;:::-;;:::i;50474:109::-;;;;;;;;;;-1:-1:-1;50474:109:0;;;;;:::i;:::-;;:::i;47474:31::-;;;;;;;;;;;;;;;;51563:128;;;;;;;;;;-1:-1:-1;51563:128:0;;;;;:::i;:::-;;:::i;47552:39::-;;;;;;;;;;;;;;;;34611:164;;;;;;;;;;-1:-1:-1;34611:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;34732:25:0;;;34708:4;34732:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;34611:164;51285:126;;;;;;;;;;-1:-1:-1;51285:126:0;;;;;:::i;:::-;;:::i;7377:201::-;;;;;;;;;;-1:-1:-1;7377:201:0;;;;;:::i;:::-;;:::i;47960:25::-;;;;;;;;;;-1:-1:-1;47960:25:0;;;;;:::i;:::-;;:::i;29361:305::-;29463:4;-1:-1:-1;;;;;;29500:40:0;;-1:-1:-1;;;29500:40:0;;:105;;-1:-1:-1;;;;;;;29557:48:0;;-1:-1:-1;;;29557:48:0;29500:105;:158;;;-1:-1:-1;;;;;;;;;;19361:40:0;;;29622:36;29480:178;29361:305;-1:-1:-1;;29361:305:0:o;51699:79::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;;;;;;;;;51755:6:::1;:15:::0;;-1:-1:-1;;51755:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;51699:79::o;32474:100::-;32528:13;32561:5;32554:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32474:100;:::o;33977:204::-;34045:7;34070:16;34078:7;34070;:16::i;:::-;34065:64;;34095:34;;-1:-1:-1;;;34095:34:0;;;;;;;;;;;34065:64;-1:-1:-1;34149:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;34149:24:0;;33977:204::o;47288:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33540:371::-;33613:13;33629:24;33645:7;33629:15;:24::i;:::-;33613:40;;33674:5;-1:-1:-1;;;;;33668:11:0;:2;-1:-1:-1;;;;;33668:11:0;;33664:48;;;33688:24;;-1:-1:-1;;;33688:24:0;;;;;;;;;;;33664:48;5272:10;-1:-1:-1;;;;;33729:21:0;;;;;;:63;;-1:-1:-1;33755:37:0;33772:5;5272:10;34611:164;:::i;33755:37::-;33754:38;33729:63;33725:138;;;33816:35;;-1:-1:-1;;;33816:35:0;;;;;;;;;;;33725:138;33875:28;33884:2;33888:7;33897:5;33875:8;:28::i;:::-;33602:309;33540:371;;:::o;34842:170::-;34976:28;34986:4;34992:2;34996:7;34976:9;:28::i;47644:303::-;;;;;;;;;;;;;;;-1:-1:-1;47644:303:0;:::o;51786:168::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;51861:58:::1;::::0;51843:12:::1;::::0;51869:10:::1;::::0;51893:21:::1;::::0;51843:12;51861:58;51843:12;51861:58;51893:21;51869:10;51861:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51842:77;;;51938:7;51930:16;;;::::0;::::1;;51831:123;51786:168::o:0;35083:185::-;35221:39;35238:4;35244:2;35248:7;35221:39;;;;;;;;;;;;:16;:39::i;52000:823::-;52087:16;52146:18;52181:17;52191:6;52181:9;:17::i;:::-;52167:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52167:32:0;-1:-1:-1;52215:11:0;52229:13;;52146:53;;-1:-1:-1;52215:11:0;;52331:447;52351:3;52347:1;:7;52331:447;;;52380:31;52414:14;;;:11;:14;;;;;;;;;52380:48;;;;;;;;;-1:-1:-1;;;;;52380:48:0;;;;-1:-1:-1;;;52380:48:0;;;;;;;;;;;-1:-1:-1;;;52380:48:0;;;;;;;;;;;;;;;;52447:73;;52492:8;;;52447:73;52542:14;;-1:-1:-1;;;;;52542:28:0;;52538:111;;52615:14;;;-1:-1:-1;52538:111:0;52692:6;-1:-1:-1;;;;;52671:27:0;:17;-1:-1:-1;;;;;52671:27:0;;52667:96;;;52742:1;52723;52725:13;;;;;;52723:16;;;;;;;;:::i;:::-;;;;;;:20;;;;;52667:96;52361:417;52331:447;52356:3;;52331:447;;;-1:-1:-1;52799:1:0;;52000:823;-1:-1:-1;;;;;52000:823:0:o;50971:86::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;51034:4:::1;:15:::0;50971:86::o;51451:104::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;51526:21;;::::1;::::0;:7:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;:::-;;51451:104:::0;:::o;32282:125::-;32346:7;32373:21;32386:7;32373:12;:21::i;:::-;:26;;32282:125;-1:-1:-1;;32282:125:0:o;50752:100::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;50822:9:::1;:22:::0;50752:100::o;29730:206::-;29794:7;-1:-1:-1;;;;;29818:19:0;;29814:60;;29846:28;;-1:-1:-1;;;29846:28:0;;;;;;;;;;;29814:60;-1:-1:-1;;;;;;29900:19:0;;;;;:12;:19;;;;;:27;;;;29730:206::o;7119:103::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;7184:30:::1;7211:1;7184:18;:30::i;:::-;7119:103::o:0;50591:153::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;50681:11:::1;:24:::0;;;;50716:9:::1;:20:::0;50591:153::o;51111:122::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;51192:13:::1;:33:::0;51111:122::o;48964:920::-;49076:14;49093:13;28864:12;;28654:7;28848:13;:28;;28610:303;49093:13;49174:6;;49076:30;;-1:-1:-1;49139:15:0;;49174:6;;49173:7;49165:16;;;;;;49212:11;49200:9;;:23;49192:51;;;;-1:-1:-1;;;49192:51:0;;9661:2:1;49192:51:0;;;9643:21:1;9700:2;9680:18;;;9673:30;-1:-1:-1;;;9719:18:1;;;9712:45;9774:18;;49192:51:0;9459:339:1;49192:51:0;49276:1;49262:11;:15;49254:24;;;;;;49312:13;;49297:11;:28;;49289:37;;;;;;49369:9;;49345:20;49354:11;49345:6;:20;:::i;:::-;:33;;49337:82;;;;-1:-1:-1;;;49337:82:0;;;;;;;:::i;:::-;6541:6;;-1:-1:-1;;;;;6541:6:0;49436:10;:21;49432:398;;49481:6;49476:138;49493:8;:15;49491:17;;49476:138;;;49557:10;-1:-1:-1;;;;;49542:25:0;:8;49551:1;49542:11;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;49542:11:0;:25;;49534:64;;;;-1:-1:-1;;;49534:64:0;;12290:2:1;49534:64:0;;;12272:21:1;12329:2;12309:18;;;12302:30;12368:28;12348:18;;;12341:56;12414:18;;49534:64:0;12088:350:1;49534:64:0;49510:3;;;;:::i;:::-;;;;49476:138;;;;49646:104;49665:12;;49646:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49687:10:0;;-1:-1:-1;;;49687:20:0;;;;;;;;;;:::i;:::-;;;49720:28;;-1:-1:-1;;49737:10:0;5832:2:1;5828:15;5824:53;49720:28:0;;;5812:66:1;5894:12;;49720:28:0;;;;;;;;;;;;49710:39;;;;;;49646:18;:104::i;:::-;49638:140;;;;-1:-1:-1;;;49638:140:0;;10412:2:1;49638:140:0;;;10394:21:1;10451:2;10431:18;;;10424:30;10490:25;10470:18;;;10463:53;10533:18;;49638:140:0;10210:347:1;49638:140:0;49793:8;:25;;;;;;;-1:-1:-1;49793:25:0;;;;;;;;-1:-1:-1;;;;;;49793:25:0;49807:10;49793:25;;;49432:398;49842:34;49852:10;49864:11;49842:9;:34::i;:::-;49065:819;;48964:920;;;;:::o;32643:104::-;32699:13;32732:7;32725:14;;;;;:::i;48400:556::-;48470:6;;;;48469:7;48461:42;;;;-1:-1:-1;;;48461:42:0;;11939:2:1;48461:42:0;;;11921:21:1;11978:2;11958:18;;;11951:30;12017:24;11997:18;;;11990:52;12059:18;;48461:42:0;11737:346:1;48461:42:0;48524:14;48541:13;28864:12;;28654:7;28848:13;:28;;28610:303;48541:13;48524:30;;48585:7;6541:6;;-1:-1:-1;;;;;6541:6:0;;6468:87;48585:7;-1:-1:-1;;;;;48571:21:0;:10;-1:-1:-1;;;;;48571:21:0;;48567:335;;48631:1;48617:11;:15;48609:55;;;;-1:-1:-1;;;48609:55:0;;12992:2:1;48609:55:0;;;12974:21:1;13031:2;13011:18;;;13004:30;13070:29;13050:18;;;13043:57;13117:18;;48609:55:0;12790:351:1;48609:55:0;48702:13;;48687:11;:28;;48679:37;;;;;;48763:9;;48739:20;48748:11;48739:6;:20;:::i;:::-;:33;;48731:82;;;;-1:-1:-1;;;48731:82:0;;;;;;;:::i;:::-;48856:11;48849:4;;:18;;;;:::i;:::-;48836:9;:31;;48828:62;;;;-1:-1:-1;;;48828:62:0;;12645:2:1;48828:62:0;;;12627:21:1;12684:2;12664:18;;;12657:30;-1:-1:-1;;;12703:18:1;;;12696:48;12761:18;;48828:62:0;12443:342:1;48828:62:0;48914:34;48924:10;48936:11;48914:9;:34::i;34253:287::-;-1:-1:-1;;;;;34352:24:0;;5272:10;34352:24;34348:54;;;34385:17;;-1:-1:-1;;;34385:17:0;;;;;;;;;;;34348:54;5272:10;34415:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;34415:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;34415:53:0;;;;;;;;;;34484:48;;9183:41:1;;;34415:42:0;;5272:10;34484:48;;9156:18:1;34484:48:0;;;;;;;34253:287;;:::o;50860:69::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;50906:8:::1;:15:::0;;-1:-1:-1;;50906:15:0::1;;;::::0;;50860:69::o;35339:369::-;35506:28;35516:4;35522:2;35526:7;35506:9;:28::i;:::-;-1:-1:-1;;;;;35549:13:0;;9464:19;:23;;35549:76;;;;;35569:56;35600:4;35606:2;35610:7;35619:5;35569:30;:56::i;:::-;35568:57;35549:76;35545:156;;;35649:40;;-1:-1:-1;;;35649:40:0;;;;;;;;;;;35545:156;35339:369;;;;:::o;47323:37::-;;;;;;;:::i;49893:558::-;50011:13;50060:16;50068:7;50060;:16::i;:::-;50042:98;;;;-1:-1:-1;;;50042:98:0;;11169:2:1;50042:98:0;;;11151:21:1;11208:2;11188:18;;;11181:30;11247:34;11227:18;;;11220:62;-1:-1:-1;;;11298:18:1;;;11291:38;11346:19;;50042:98:0;10967:404:1;50042:98:0;50164:8;;;;;;;50161:70;;50205:14;50198:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49893:558;;;:::o;50161:70::-;50243:28;50274:10;:8;:10::i;:::-;50243:41;;50333:1;50308:14;50302:28;:32;:141;;;;;;;;;;;;;;;;;50374:14;50390:18;:7;:16;:18::i;:::-;50410:13;50357:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50302:141;50295:148;49893:558;-1:-1:-1;;;49893:558:0:o;50474:109::-;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;50549:26:::1;50559:2;50563:11;50549:9;:26::i;51563:128::-:0;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;51650:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;51285:126::-:0;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;51371:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;7377:201::-:0;6541:6;;-1:-1:-1;;;;;6541:6:0;5272:10;6688:23;6680:68;;;;-1:-1:-1;;;6680:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7466:22:0;::::1;7458:73;;;::::0;-1:-1:-1;;;7458:73:0;;10005:2:1;7458:73:0::1;::::0;::::1;9987:21:1::0;10044:2;10024:18;;;10017:30;10083:34;10063:18;;;10056:62;-1:-1:-1;;;10134:18:1;;;10127:36;10180:19;;7458:73:0::1;9803:402:1::0;7458:73:0::1;7542:28;7561:8;7542:18;:28::i;47960:25::-:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47960:25:0;;-1:-1:-1;47960:25:0;:::o;35963:187::-;36020:4;36084:13;;36074:7;:23;36044:98;;;;-1:-1:-1;;36115:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;36115:27:0;;;;36114:28;;35963:187::o;44133:196::-;44248:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;44248:29:0;-1:-1:-1;;;;;44248:29:0;;;;;;;;;44293:28;;44248:24;;44293:28;;;;;;;44133:196;;;:::o;39076:2130::-;39191:35;39229:21;39242:7;39229:12;:21::i;:::-;39191:59;;39289:4;-1:-1:-1;;;;;39267:26:0;:13;:18;;;-1:-1:-1;;;;;39267:26:0;;39263:67;;39302:28;;-1:-1:-1;;;39302:28:0;;;;;;;;;;;39263:67;39343:22;5272:10;-1:-1:-1;;;;;39369:20:0;;;;:73;;-1:-1:-1;39406:36:0;39423:4;5272:10;34611:164;:::i;39406:36::-;39369:126;;;-1:-1:-1;5272:10:0;39459:20;39471:7;39459:11;:20::i;:::-;-1:-1:-1;;;;;39459:36:0;;39369:126;39343:153;;39514:17;39509:66;;39540:35;;-1:-1:-1;;;39540:35:0;;;;;;;;;;;39509:66;-1:-1:-1;;;;;39590:16:0;;39586:52;;39615:23;;-1:-1:-1;;;39615:23:0;;;;;;;;;;;39586:52;39759:35;39776:1;39780:7;39789:4;39759:8;:35::i;:::-;-1:-1:-1;;;;;40090:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;40090:31:0;;;;;;;-1:-1:-1;;40090:31:0;;;;;;;40136:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;40136:29:0;;;;;;;;;;;40216:20;;;:11;:20;;;;;;40251:18;;-1:-1:-1;;;;;;40284:49:0;;;;-1:-1:-1;;;40317:15:0;40284:49;;;;;;;;;;40607:11;;40667:24;;;;;40710:13;;40216:20;;40667:24;;40710:13;40706:384;;40920:13;;40905:11;:28;40901:174;;40958:20;;41027:28;;;;41001:54;;-1:-1:-1;;;41001:54:0;-1:-1:-1;;;;;;41001:54:0;;;-1:-1:-1;;;;;40958:20:0;;41001:54;;;;40901:174;40065:1036;;;41137:7;41133:2;-1:-1:-1;;;;;41118:27:0;41127:4;-1:-1:-1;;;;;41118:27:0;;;;;;;;;;;41156:42;39180:2026;;39076:2130;;;:::o;31111:1109::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;31222:7:0;31305:13;;31298:4;:20;31267:886;;;31339:31;31373:17;;;:11;:17;;;;;;;;;31339:51;;;;;;;;;-1:-1:-1;;;;;31339:51:0;;;;-1:-1:-1;;;31339:51:0;;;;;;;;;;;-1:-1:-1;;;31339:51:0;;;;;;;;;;;;;;31409:729;;31459:14;;-1:-1:-1;;;;;31459:28:0;;31455:101;;31523:9;31111:1109;-1:-1:-1;;;31111:1109:0:o;31455:101::-;-1:-1:-1;;;31898:6:0;31943:17;;;;:11;:17;;;;;;;;;31931:29;;;;;;;;;-1:-1:-1;;;;;31931:29:0;;;;;-1:-1:-1;;;31931:29:0;;;;;;;;;;;-1:-1:-1;;;31931:29:0;;;;;;;;;;;;;31991:28;31987:109;;32059:9;31111:1109;-1:-1:-1;;;31111:1109:0:o;31987:109::-;31858:261;;;31320:833;31267:886;32181:31;;-1:-1:-1;;;32181:31:0;;;;;;;;;;;7738:191;7831:6;;;-1:-1:-1;;;;;7848:17:0;;;-1:-1:-1;;;;;;7848:17:0;;;;;;;7881:40;;7831:6;;;7848:17;7831:6;;7881:40;;7812:16;;7881:40;7801:128;7738:191;:::o;923:190::-;1048:4;1101;1072:25;1085:5;1092:4;1072:12;:25::i;:::-;:33;;923:190;-1:-1:-1;;;;923:190:0:o;36158:104::-;36227:27;36237:2;36241:8;36227:27;;;;;;;;;;;;:9;:27::i;44821:667::-;45005:72;;-1:-1:-1;;;45005:72:0;;44984:4;;-1:-1:-1;;;;;45005:36:0;;;;;:72;;5272:10;;45056:4;;45062:7;;45071:5;;45005:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45005:72:0;;;;;;;;-1:-1:-1;;45005:72:0;;;;;;;;;;;;:::i;:::-;;;45001:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45239:13:0;;45235:235;;45285:40;;-1:-1:-1;;;45285:40:0;;;;;;;;;;;45235:235;45428:6;45422:13;45413:6;45409:2;45405:15;45398:38;45001:480;-1:-1:-1;;;;;;45124:55:0;-1:-1:-1;;;45124:55:0;;-1:-1:-1;45001:480:0;44821:667;;;;;;:::o;48284:108::-;48344:13;48377:7;48370:14;;;;;:::i;2754:723::-;2810:13;3031:10;3027:53;;-1:-1:-1;;3058:10:0;;;;;;;;;;;;-1:-1:-1;;;3058:10:0;;;;;2754:723::o;3027:53::-;3105:5;3090:12;3146:78;3153:9;;3146:78;;3179:8;;;;:::i;:::-;;-1:-1:-1;3202:10:0;;-1:-1:-1;3210:2:0;3202:10;;:::i;:::-;;;3146:78;;;3234:19;3266:6;3256:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3256:17:0;;3234:39;;3284:154;3291:10;;3284:154;;3318:11;3328:1;3318:11;;:::i;:::-;;-1:-1:-1;3387:10:0;3395:2;3387:5;:10;:::i;:::-;3374:24;;:2;:24;:::i;:::-;3361:39;;3344:6;3351;3344:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;3344:56:0;;;;;;;;-1:-1:-1;3415:11:0;3424:2;3415:11;;:::i;:::-;;;3284:154;;1475:675;1558:7;1601:4;1558:7;1616:497;1640:5;:12;1636:1;:16;1616:497;;;1674:20;1697:5;1703:1;1697:8;;;;;;;;:::i;:::-;;;;;;;1674:31;;1740:12;1724;:28;1720:382;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;1852:57;;1720:382;;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;2029:57;;1720:382;-1:-1:-1;1654:3:0;;;;:::i;:::-;;;;1616:497;;;-1:-1:-1;2130:12:0;1475:675;-1:-1:-1;;;1475:675:0:o;36625:163::-;36748:32;36754:2;36758:8;36768:5;36775:4;37186:20;37209:13;-1:-1:-1;;;;;37237:16:0;;37233:48;;37262:19;;-1:-1:-1;;;37262:19:0;;;;;;;;;;;37233:48;37296:13;37292:44;;37318:18;;-1:-1:-1;;;37318:18:0;;;;;;;;;;;37292:44;-1:-1:-1;;;;;37687:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;37746:49:0;;37687:44;;;;;;;;37746:49;;;;-1:-1:-1;;37687:44:0;;;;;;37746:49;;;;;;;;;;;;;;;;37812:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;37862:66:0;;;;-1:-1:-1;;;37912:15:0;37862:66;;;;;;;;;;37812:25;38009:23;;;38053:4;:23;;;;-1:-1:-1;;;;;;38061:13:0;;9464:19;:23;;38061:15;38049:641;;;38097:314;38128:38;;38153:12;;-1:-1:-1;;;;;38128:38:0;;;38145:1;;38128:38;;38145:1;;38128:38;38194:69;38233:1;38237:2;38241:14;;;;;;38257:5;38194:30;:69::i;:::-;38189:174;;38299:40;;-1:-1:-1;;;38299:40:0;;;;;;;;;;;38189:174;38406:3;38390:12;:19;;38097:314;;38492:12;38475:13;;:29;38471:43;;38506:8;;;38471:43;38049:641;;;38555:120;38586:40;;38611:14;;;;;-1:-1:-1;;;;;38586:40:0;;;38603:1;;38586:40;;38603:1;;38586:40;38670:3;38654:12;:19;;38555:120;;38049:641;-1:-1:-1;38704:13:0;:28;38754:60;35339:369;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:196::-;718:20;;-1:-1:-1;;;;;767:54:1;;757:65;;747:93;;836:1;833;826:12;747:93;650:196;;;:::o;851:160::-;916:20;;972:13;;965:21;955:32;;945:60;;1001:1;998;991:12;1016:186;1075:6;1128:2;1116:9;1107:7;1103:23;1099:32;1096:52;;;1144:1;1141;1134:12;1096:52;1167:29;1186:9;1167:29;:::i;1207:260::-;1275:6;1283;1336:2;1324:9;1315:7;1311:23;1307:32;1304:52;;;1352:1;1349;1342:12;1304:52;1375:29;1394:9;1375:29;:::i;:::-;1365:39;;1423:38;1457:2;1446:9;1442:18;1423:38;:::i;:::-;1413:48;;1207:260;;;;;:::o;1472:328::-;1549:6;1557;1565;1618:2;1606:9;1597:7;1593:23;1589:32;1586:52;;;1634:1;1631;1624:12;1586:52;1657:29;1676:9;1657:29;:::i;:::-;1647:39;;1705:38;1739:2;1728:9;1724:18;1705:38;:::i;:::-;1695:48;;1790:2;1779:9;1775:18;1762:32;1752:42;;1472:328;;;;;:::o;1805:666::-;1900:6;1908;1916;1924;1977:3;1965:9;1956:7;1952:23;1948:33;1945:53;;;1994:1;1991;1984:12;1945:53;2017:29;2036:9;2017:29;:::i;:::-;2007:39;;2065:38;2099:2;2088:9;2084:18;2065:38;:::i;:::-;2055:48;;2150:2;2139:9;2135:18;2122:32;2112:42;;2205:2;2194:9;2190:18;2177:32;2232:18;2224:6;2221:30;2218:50;;;2264:1;2261;2254:12;2218:50;2287:22;;2340:4;2332:13;;2328:27;-1:-1:-1;2318:55:1;;2369:1;2366;2359:12;2318:55;2392:73;2457:7;2452:2;2439:16;2434:2;2430;2426:11;2392:73;:::i;:::-;2382:83;;;1805:666;;;;;;;:::o;2476:254::-;2541:6;2549;2602:2;2590:9;2581:7;2577:23;2573:32;2570:52;;;2618:1;2615;2608:12;2570:52;2641:29;2660:9;2641:29;:::i;:::-;2631:39;;2689:35;2720:2;2709:9;2705:18;2689:35;:::i;2735:254::-;2803:6;2811;2864:2;2852:9;2843:7;2839:23;2835:32;2832:52;;;2880:1;2877;2870:12;2832:52;2903:29;2922:9;2903:29;:::i;:::-;2893:39;2979:2;2964:18;;;;2951:32;;-1:-1:-1;;;2735:254:1:o;2994:180::-;3050:6;3103:2;3091:9;3082:7;3078:23;3074:32;3071:52;;;3119:1;3116;3109:12;3071:52;3142:26;3158:9;3142:26;:::i;3179:245::-;3237:6;3290:2;3278:9;3269:7;3265:23;3261:32;3258:52;;;3306:1;3303;3296:12;3258:52;3345:9;3332:23;3364:30;3388:5;3364:30;:::i;3429:249::-;3498:6;3551:2;3539:9;3530:7;3526:23;3522:32;3519:52;;;3567:1;3564;3557:12;3519:52;3599:9;3593:16;3618:30;3642:5;3618:30;:::i;3683:450::-;3752:6;3805:2;3793:9;3784:7;3780:23;3776:32;3773:52;;;3821:1;3818;3811:12;3773:52;3861:9;3848:23;3894:18;3886:6;3883:30;3880:50;;;3926:1;3923;3916:12;3880:50;3949:22;;4002:4;3994:13;;3990:27;-1:-1:-1;3980:55:1;;4031:1;4028;4021:12;3980:55;4054:73;4119:7;4114:2;4101:16;4096:2;4092;4088:11;4054:73;:::i;4138:180::-;4197:6;4250:2;4238:9;4229:7;4225:23;4221:32;4218:52;;;4266:1;4263;4256:12;4218:52;-1:-1:-1;4289:23:1;;4138:180;-1:-1:-1;4138:180:1:o;4323:248::-;4391:6;4399;4452:2;4440:9;4431:7;4427:23;4423:32;4420:52;;;4468:1;4465;4458:12;4420:52;-1:-1:-1;;4491:23:1;;;4561:2;4546:18;;;4533:32;;-1:-1:-1;4323:248:1:o;4576:840::-;4678:6;4686;4694;4702;4755:2;4743:9;4734:7;4730:23;4726:32;4723:52;;;4771:1;4768;4761:12;4723:52;4807:9;4794:23;4784:33;;4867:2;4856:9;4852:18;4839:32;4911:4;4904:5;4900:16;4893:5;4890:27;4880:55;;4931:1;4928;4921:12;4880:55;4954:5;-1:-1:-1;5010:2:1;4995:18;;4982:32;5033:18;5063:14;;;5060:34;;;5090:1;5087;5080:12;5060:34;5128:6;5117:9;5113:22;5103:32;;5173:7;5166:4;5162:2;5158:13;5154:27;5144:55;;5195:1;5192;5185:12;5144:55;5235:2;5222:16;5261:2;5253:6;5250:14;5247:34;;;5277:1;5274;5267:12;5247:34;5330:7;5325:2;5315:6;5312:1;5308:14;5304:2;5300:23;5296:32;5293:45;5290:65;;;5351:1;5348;5341:12;5290:65;4576:840;;;;-1:-1:-1;;5382:2:1;5374:11;;-1:-1:-1;;;4576:840:1:o;5421:257::-;5462:3;5500:5;5494:12;5527:6;5522:3;5515:19;5543:63;5599:6;5592:4;5587:3;5583:14;5576:4;5569:5;5565:16;5543:63;:::i;:::-;5660:2;5639:15;-1:-1:-1;;5635:29:1;5626:39;;;;5667:4;5622:50;;5421:257;-1:-1:-1;;5421:257:1:o;5917:1527::-;6141:3;6179:6;6173:13;6205:4;6218:51;6262:6;6257:3;6252:2;6244:6;6240:15;6218:51;:::i;:::-;6332:13;;6291:16;;;;6354:55;6332:13;6291:16;6376:15;;;6354:55;:::i;:::-;6498:13;;6431:20;;;6471:1;;6558;6580:18;;;;6633;;;;6660:93;;6738:4;6728:8;6724:19;6712:31;;6660:93;6801:2;6791:8;6788:16;6768:18;6765:40;6762:167;;;-1:-1:-1;;;6828:33:1;;6884:4;6881:1;6874:15;6914:4;6835:3;6902:17;6762:167;6945:18;6972:110;;;;7096:1;7091:328;;;;6938:481;;6972:110;-1:-1:-1;;7007:24:1;;6993:39;;7052:20;;;;-1:-1:-1;6972:110:1;;7091:328;13401:1;13394:14;;;13438:4;13425:18;;7186:1;7200:169;7214:8;7211:1;7208:15;7200:169;;;7296:14;;7281:13;;;7274:37;7339:16;;;;7231:10;;7200:169;;;7204:3;;7400:8;7393:5;7389:20;7382:27;;6938:481;-1:-1:-1;7435:3:1;;5917:1527;-1:-1:-1;;;;;;;;;;;5917:1527:1:o;7890:511::-;8084:4;-1:-1:-1;;;;;8194:2:1;8186:6;8182:15;8171:9;8164:34;8246:2;8238:6;8234:15;8229:2;8218:9;8214:18;8207:43;;8286:6;8281:2;8270:9;8266:18;8259:34;8329:3;8324:2;8313:9;8309:18;8302:31;8350:45;8390:3;8379:9;8375:19;8367:6;8350:45;:::i;:::-;8342:53;7890:511;-1:-1:-1;;;;;;7890:511:1:o;8406:632::-;8577:2;8629:21;;;8699:13;;8602:18;;;8721:22;;;8548:4;;8577:2;8800:15;;;;8774:2;8759:18;;;8548:4;8843:169;8857:6;8854:1;8851:13;8843:169;;;8918:13;;8906:26;;8987:15;;;;8952:12;;;;8879:1;8872:9;8843:169;;;-1:-1:-1;9029:3:1;;8406:632;-1:-1:-1;;;;;;8406:632:1:o;9235:219::-;9384:2;9373:9;9366:21;9347:4;9404:44;9444:2;9433:9;9429:18;9421:6;9404:44;:::i;10562:400::-;10764:2;10746:21;;;10803:2;10783:18;;;10776:30;10842:34;10837:2;10822:18;;10815:62;-1:-1:-1;;;10908:2:1;10893:18;;10886:34;10952:3;10937:19;;10562:400::o;11376:356::-;11578:2;11560:21;;;11597:18;;;11590:30;11656:34;11651:2;11636:18;;11629:62;11723:2;11708:18;;11376:356::o;13454:128::-;13494:3;13525:1;13521:6;13518:1;13515:13;13512:39;;;13531:18;;:::i;:::-;-1:-1:-1;13567:9:1;;13454:128::o;13587:120::-;13627:1;13653;13643:35;;13658:18;;:::i;:::-;-1:-1:-1;13692:9:1;;13587:120::o;13712:168::-;13752:7;13818:1;13814;13810:6;13806:14;13803:1;13800:21;13795:1;13788:9;13781:17;13777:45;13774:71;;;13825:18;;:::i;:::-;-1:-1:-1;13865:9:1;;13712:168::o;13885:125::-;13925:4;13953:1;13950;13947:8;13944:34;;;13958:18;;:::i;:::-;-1:-1:-1;13995:9:1;;13885:125::o;14015:258::-;14087:1;14097:113;14111:6;14108:1;14105:13;14097:113;;;14187:11;;;14181:18;14168:11;;;14161:39;14133:2;14126:10;14097:113;;;14228:6;14225:1;14222:13;14219:48;;;-1:-1:-1;;14263:1:1;14245:16;;14238:27;14015:258::o;14278:380::-;14357:1;14353:12;;;;14400;;;14421:61;;14475:4;14467:6;14463:17;14453:27;;14421:61;14528:2;14520:6;14517:14;14497:18;14494:38;14491:161;;;14574:10;14569:3;14565:20;14562:1;14555:31;14609:4;14606:1;14599:15;14637:4;14634:1;14627:15;14491:161;;14278:380;;;:::o;14663:135::-;14702:3;-1:-1:-1;;14723:17:1;;14720:43;;;14743:18;;:::i;:::-;-1:-1:-1;14790:1:1;14779:13;;14663:135::o;14803:112::-;14835:1;14861;14851:35;;14866:18;;:::i;:::-;-1:-1:-1;14900:9:1;;14803:112::o;14920:127::-;14981:10;14976:3;14972:20;14969:1;14962:31;15012:4;15009:1;15002:15;15036:4;15033:1;15026:15;15052:127;15113:10;15108:3;15104:20;15101:1;15094:31;15144:4;15141:1;15134:15;15168:4;15165:1;15158:15;15184:127;15245:10;15240:3;15236:20;15233:1;15226:31;15276:4;15273:1;15266:15;15300:4;15297:1;15290:15;15316:127;15377:10;15372:3;15368:20;15365:1;15358:31;15408:4;15405:1;15398:15;15432:4;15429:1;15422:15;15448:131;-1:-1:-1;;;;;;15522:32:1;;15512:43;;15502:71;;15569:1;15566;15559:12

Swarm Source

ipfs://fef1fdec9a79e0a273d681c16aab00e9b8ac44bd0fb9cf64f9ec0048ad35a3ff
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.