ETH Price: $3,354.16 (-3.00%)

Token

Atem NFT Passport (ATEM)
 

Overview

Max Total Supply

0 ATEM

Holders

3,415

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ATEM
0xf55e65e4fABcCcFE7EE1FcDB01e89993d32f5B17
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

5000 limited edition Atem NFTs for our early users to experience one-stop solutions combining decentralized communities and social trades.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
AtemNFTPassportV3

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-05
*/

// Sources flattened with hardhat v2.1.2 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

 

 

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]

 

 

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

 

 

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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


// File @openzeppelin/contracts/utils/[email protected]

 

 

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]

 

 

/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File @openzeppelin/contracts/utils/[email protected]

 

 

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}


// File @openzeppelin/contracts/utils/introspection/[email protected]

 

 

/**
 * @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/[email protected]

 

 







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping (uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping (address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor (string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _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 {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]

 

 


/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}


// File @openzeppelin/contracts/access/[email protected]

 

 

/**
 * @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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

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


// File @openzeppelin/contracts/utils/cryptography/[email protected]

 

 

/**
 * @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) {
        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 = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }

        // Check if the computed hash (root) is equal to the provided root
        return computedHash == root;
    }
}


// File contracts/CounterWithSet.sol

 

 

/**
 * @title CounterWithSet
 * @author modified from Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library CounterWithSet {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }
    
    function setValue(Counter storage counter, uint256 newValue) internal {
        require(newValue > 0, "Counter: insufficient value");
        counter._value = newValue;
    }
}


// File contracts/AtemNFTPassportV3.sol

 
 





contract AtemNFTPassportV3 is Ownable, ERC721Burnable {
    using CounterWithSet for CounterWithSet.Counter;

    string private _baseTokenURI;
    bytes32 public whitelistRoot;
    
    uint256 immutable public maxSupply;
    mapping(address => bool) isClaimed;

    uint256 saleIdOffset;
    uint256 public numReserved;

    CounterWithSet.Counter private _supplyTracker;

    constructor(string memory name, string memory symbol, uint256 supply, uint256 reserved, bytes32 merkleroot)
    ERC721(name, symbol)
    {
        whitelistRoot = merkleroot;
        maxSupply = supply;
        numReserved = reserved;
    }

    function _safeMint(address to, uint256 tokenId) internal override {
        _safeMint(to, tokenId, "");
    }

    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal override{
        require(_supplyTracker.current() < maxSupply - numReserved, "Sold out");
        super._safeMint(to, tokenId, _data);
        _supplyTracker.increment();
    }
    
    function _baseURI() internal view virtual override(ERC721) returns (string memory) {
        return _baseTokenURI;
    }

    function checkClaimed(address account) public view returns (bool){
        return isClaimed[account];
    }

    /**
     * This function is implemented for our *active* Airdrop. Must be called before the whitelist mining. Omitted all trackers and requirement check to save gas. Immediately set the saleIdOffset and supplyTracker after finishing the Airdrop. 
     * Process: Deploy with invalid merkleroot => airdropMint => setSupplyTracker => setSaleIdoffset => setMerkleRoot with valid merkleroot
     */
    function airdropMint(address to, uint256 tokenId) onlyOwner external {
        // No ERC721Receiver check
        super._mint(to, tokenId);
    }

    function mint(address to) onlyOwner external {
        // We cannot just use balanceOf to create the new tokenId because tokens
        // can be burned (destroyed), so we need a separate counter.
        _safeMint(to, _supplyTracker.current() + saleIdOffset);
    }

    function claim(bytes32[] calldata proof)
    external
    {
        address account = _msgSender();
        require(_verify(_leaf(account), proof), "Invalid merkle proof");
        require(!checkClaimed(account), "Already claimed");
        _safeMint(account, _supplyTracker.current() + saleIdOffset);
        isClaimed[account] = true;
    }

    /** Merkle tree helpers */
    
    function _leaf(address account)
    internal pure returns (bytes32)
    {
        return keccak256(abi.encodePacked(account));
    }

    function _verify(bytes32 leaf, bytes32[] memory proof)
    internal view returns (bool)
    {
        return MerkleProof.verify(proof, whitelistRoot, leaf);
    }

    /** Setters */ 

    function setMerkleRoot(bytes32 newRoot) onlyOwner external {
        whitelistRoot = newRoot;
    }

    function setSaleIdOffset(uint256 value) onlyOwner external {
        saleIdOffset = value;
    }

    function setSupplyTracker(uint256 value) onlyOwner external {
        _supplyTracker.setValue(value);
    }

    function setBaseTokenURI(string calldata newBaseURI) onlyOwner external {
        _baseTokenURI = newBaseURI;
    }

    function setNumReserved(uint256 value) onlyOwner external {
        numReserved = value;
    }



    /** ---  */

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual override(ERC721) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"reserved","type":"uint256"},{"internalType":"bytes32","name":"merkleroot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"airdropMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"checkClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"newRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setNumReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setSaleIdOffset","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setSupplyTracker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"whitelistRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"}]

60a06040523480156200001157600080fd5b506040516200219b3803806200219b83398101604081905262000034916200022f565b600080546001600160a01b03191633908117825560405187928792918291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35081516200008e906001906020850190620000bc565b508051620000a4906002906020840190620000bc565b505050600855608091909152600b5550620002f09050565b828054620000ca90620002b4565b90600052602060002090601f016020900481019282620000ee576000855562000139565b82601f106200010957805160ff191683800117855562000139565b8280016001018555821562000139579182015b82811115620001395782518255916020019190600101906200011c565b50620001479291506200014b565b5090565b5b808211156200014757600081556001016200014c565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200018a57600080fd5b81516001600160401b0380821115620001a757620001a762000162565b604051601f8301601f19908116603f01168101908282118183101715620001d257620001d262000162565b81604052838152602092508683858801011115620001ef57600080fd5b600091505b83821015620002135785820183015181830184015290820190620001f4565b83821115620002255760008385830101525b9695505050505050565b600080600080600060a086880312156200024857600080fd5b85516001600160401b03808211156200026057600080fd5b6200026e89838a0162000178565b965060208801519150808211156200028557600080fd5b50620002948882890162000178565b60408801516060890151608090990151979a919950979695509350505050565b600181811c90821680620002c957607f821691505b602082108103620002ea57634e487b7160e01b600052602260045260246000fd5b50919050565b608051611e8862000313600039600081816103f301526115870152611e886000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063b150a6f6116100a2578063d4c9a70f11610071578063d4c9a70f146103c2578063d5abeb01146103ee578063e985e9c514610415578063f2fde38b1461045157600080fd5b8063b150a6f614610380578063b391c50814610389578063b88d4fde1461039c578063c87b56dd146103af57600080fd5b80638da5cb5b116100de5780638da5cb5b1461034157806395d89b4114610352578063a22cb4651461035a578063ac7132071461036d57600080fd5b806370a0823114610313578063715018a6146103265780637cb647591461032e57600080fd5b80633726bc281161017157806342966c681161014b57806342966c68146102c75780635333b21b146102da5780636352211e146102ed5780636a6278421461030057600080fd5b80633726bc281461028a578063386bfc981461029d57806342842e0e146102b457600080fd5b8063095ea7b3116101ad578063095ea7b31461023c57806322ad06701461025157806323b872dd1461026457806330176e131461027757600080fd5b806301ffc9a7146101d457806306fdde03146101fc578063081812fc14610211575b600080fd5b6101e76101e2366004611891565b610464565b60405190151581526020015b60405180910390f35b610204610475565b6040516101f39190611906565b61022461021f366004611919565b610507565b6040516001600160a01b0390911681526020016101f3565b61024f61024a36600461194e565b6105a1565b005b61024f61025f36600461194e565b6106b6565b61024f610272366004611978565b6106ee565b61024f6102853660046119b4565b610720565b61024f610298366004611919565b610756565b6102a660085481565b6040519081526020016101f3565b61024f6102c2366004611978565b610785565b61024f6102d5366004611919565b6107a0565b61024f6102e8366004611919565b61081a565b6102246102fb366004611919565b61084f565b61024f61030e366004611a26565b6108c6565b6102a6610321366004611a26565b61090f565b61024f610996565b61024f61033c366004611919565b610a0a565b6000546001600160a01b0316610224565b610204610a39565b61024f610368366004611a41565b610a48565b61024f61037b366004611919565b610b0c565b6102a6600b5481565b61024f610397366004611a7d565b610b3b565b61024f6103aa366004611af6565b610c8f565b6102046103bd366004611919565b610cc7565b6101e76103d0366004611a26565b6001600160a01b031660009081526009602052604090205460ff1690565b6102a67f000000000000000000000000000000000000000000000000000000000000000081565b6101e7610423366004611bd2565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61024f61045f366004611a26565b610da2565b600061046f82610e8c565b92915050565b60606001805461048490611c05565b80601f01602080910402602001604051908101604052809291908181526020018280546104b090611c05565b80156104fd5780601f106104d2576101008083540402835291602001916104fd565b820191906000526020600020905b8154815290600101906020018083116104e057829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166105855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006105ac8261084f565b9050806001600160a01b0316836001600160a01b0316036106195760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161057c565b336001600160a01b038216148061063557506106358133610423565b6106a75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161057c565b6106b18383610edc565b505050565b6000546001600160a01b031633146106e05760405162461bcd60e51b815260040161057c90611c3f565b6106ea8282610f4a565b5050565b6106f9335b8261108c565b6107155760405162461bcd60e51b815260040161057c90611c74565b6106b1838383611183565b6000546001600160a01b0316331461074a5760405162461bcd60e51b815260040161057c90611c3f565b6106b1600783836117e2565b6000546001600160a01b031633146107805760405162461bcd60e51b815260040161057c90611c3f565b600a55565b6106b183838360405180602001604052806000815250610c8f565b6107a9336106f3565b61080e5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b606482015260840161057c565b61081781611323565b50565b6000546001600160a01b031633146108445760405162461bcd60e51b815260040161057c90611c3f565b610817600c826113be565b6000818152600360205260408120546001600160a01b03168061046f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161057c565b6000546001600160a01b031633146108f05760405162461bcd60e51b815260040161057c90611c3f565b61081781600a54610900600c5490565b61090a9190611cdb565b611412565b60006001600160a01b03821661097a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161057c565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146109c05760405162461bcd60e51b815260040161057c90611c3f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610a345760405162461bcd60e51b815260040161057c90611c3f565b600855565b60606002805461048490611c05565b336001600160a01b03831603610aa05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161057c565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314610b365760405162461bcd60e51b815260040161057c90611c3f565b600b55565b33610bbb610b82826040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061142c92505050565b610bfe5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21036b2b935b63290383937b7b360611b604482015260640161057c565b6001600160a01b03811660009081526009602052604090205460ff1615610c595760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015260640161057c565b610c6981600a54610900600c5490565b6001600160a01b03166000908152600960205260409020805460ff191660011790555050565b610c99338361108c565b610cb55760405162461bcd60e51b815260040161057c90611c74565b610cc18484848461143b565b50505050565b6000818152600360205260409020546060906001600160a01b0316610d465760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161057c565b6000610d5061146e565b90506000815111610d705760405180602001604052806000815250610d9b565b80610d7a8461147d565b604051602001610d8b929190611cf3565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314610dcc5760405162461bcd60e51b815260040161057c90611c3f565b6001600160a01b038116610e315760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161057c565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480610ebd57506001600160e01b03198216635b5e139f60e01b145b8061046f57506301ffc9a760e01b6001600160e01b031983161461046f565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f118261084f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001600160a01b038216610fa05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161057c565b6000818152600360205260409020546001600160a01b0316156110055760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161057c565b6001600160a01b038216600090815260046020526040812080546001929061102e908490611cdb565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818152600360205260408120546001600160a01b03166111055760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161057c565b60006111108361084f565b9050806001600160a01b0316846001600160a01b0316148061114b5750836001600160a01b031661114084610507565b6001600160a01b0316145b8061117b57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166111968261084f565b6001600160a01b0316146111fe5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161057c565b6001600160a01b0382166112605760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161057c565b61126b600082610edc565b6001600160a01b0383166000908152600460205260408120805460019290611294908490611d22565b90915550506001600160a01b03821660009081526004602052604081208054600192906112c2908490611cdb565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061132e8261084f565b905061133b600083610edc565b6001600160a01b0381166000908152600460205260408120805460019290611364908490611d22565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000811161140e5760405162461bcd60e51b815260206004820152601b60248201527f436f756e7465723a20696e73756666696369656e742076616c75650000000000604482015260640161057c565b9055565b6106ea82826040518060200160405280600081525061157e565b6000610d9b82600854856115ff565b611446848484611183565b611452848484846116ae565b610cc15760405162461bcd60e51b815260040161057c90611d39565b60606007805461048490611c05565b6060816000036114a45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156114ce57806114b881611d8b565b91506114c79050600a83611dba565b91506114a8565b60008167ffffffffffffffff8111156114e9576114e9611ae0565b6040519080825280601f01601f191660200182016040528015611513576020820181803683370190505b5090505b841561117b57611528600183611d22565b9150611535600a86611dce565b611540906030611cdb565b60f81b81838151811061155557611555611de2565b60200101906001600160f81b031916908160001a905350611577600a86611dba565b9450611517565b600b546115ab907f0000000000000000000000000000000000000000000000000000000000000000611d22565b600c54106115e65760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b604482015260640161057c565b6115f18383836117af565b6106b1600c80546001019055565b600081815b85518110156116a357600086828151811061162157611621611de2565b60200260200101519050808311611663576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611690565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061169b81611d8b565b915050611604565b509092149392505050565b60006001600160a01b0384163b156117a457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906116f2903390899088908890600401611df8565b6020604051808303816000875af192505050801561172d575060408051601f3d908101601f1916820190925261172a91810190611e35565b60015b61178a573d80801561175b576040519150601f19603f3d011682016040523d82523d6000602084013e611760565b606091505b5080516000036117825760405162461bcd60e51b815260040161057c90611d39565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061117b565b506001949350505050565b6117b98383610f4a565b6117c660008484846116ae565b6106b15760405162461bcd60e51b815260040161057c90611d39565b8280546117ee90611c05565b90600052602060002090601f0160209004810192826118105760008555611856565b82601f106118295782800160ff19823516178555611856565b82800160010185558215611856579182015b8281111561185657823582559160200191906001019061183b565b50611862929150611866565b5090565b5b808211156118625760008155600101611867565b6001600160e01b03198116811461081757600080fd5b6000602082840312156118a357600080fd5b8135610d9b8161187b565b60005b838110156118c95781810151838201526020016118b1565b83811115610cc15750506000910152565b600081518084526118f28160208601602086016118ae565b601f01601f19169290920160200192915050565b602081526000610d9b60208301846118da565b60006020828403121561192b57600080fd5b5035919050565b80356001600160a01b038116811461194957600080fd5b919050565b6000806040838503121561196157600080fd5b61196a83611932565b946020939093013593505050565b60008060006060848603121561198d57600080fd5b61199684611932565b92506119a460208501611932565b9150604084013590509250925092565b600080602083850312156119c757600080fd5b823567ffffffffffffffff808211156119df57600080fd5b818501915085601f8301126119f357600080fd5b813581811115611a0257600080fd5b866020828501011115611a1457600080fd5b60209290920196919550909350505050565b600060208284031215611a3857600080fd5b610d9b82611932565b60008060408385031215611a5457600080fd5b611a5d83611932565b915060208301358015158114611a7257600080fd5b809150509250929050565b60008060208385031215611a9057600080fd5b823567ffffffffffffffff80821115611aa857600080fd5b818501915085601f830112611abc57600080fd5b813581811115611acb57600080fd5b8660208260051b8501011115611a1457600080fd5b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215611b0c57600080fd5b611b1585611932565b9350611b2360208601611932565b925060408501359150606085013567ffffffffffffffff80821115611b4757600080fd5b818701915087601f830112611b5b57600080fd5b813581811115611b6d57611b6d611ae0565b604051601f8201601f19908116603f01168101908382118183101715611b9557611b95611ae0565b816040528281528a6020848701011115611bae57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611be557600080fd5b611bee83611932565b9150611bfc60208401611932565b90509250929050565b600181811c90821680611c1957607f821691505b602082108103611c3957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611cee57611cee611cc5565b500190565b60008351611d058184602088016118ae565b835190830190611d198183602088016118ae565b01949350505050565b600082821015611d3457611d34611cc5565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060018201611d9d57611d9d611cc5565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611dc957611dc9611da4565b500490565b600082611ddd57611ddd611da4565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611e2b908301846118da565b9695505050505050565b600060208284031215611e4757600080fd5b8151610d9b8161187b56fea26469706673582212200116933f4ec569c88e4cc2b5ea9543b0e79b209b6ff66ff87bd1cf30e828d62d64736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000c83eb0983f06a1f6f3e6b6505169f4d3ac8d90f50f3072fed44aacc734bc5b868800000000000000000000000000000000000000000000000000000000000000114174656d204e46542050617373706f727400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044154454d00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c806370a0823111610104578063b150a6f6116100a2578063d4c9a70f11610071578063d4c9a70f146103c2578063d5abeb01146103ee578063e985e9c514610415578063f2fde38b1461045157600080fd5b8063b150a6f614610380578063b391c50814610389578063b88d4fde1461039c578063c87b56dd146103af57600080fd5b80638da5cb5b116100de5780638da5cb5b1461034157806395d89b4114610352578063a22cb4651461035a578063ac7132071461036d57600080fd5b806370a0823114610313578063715018a6146103265780637cb647591461032e57600080fd5b80633726bc281161017157806342966c681161014b57806342966c68146102c75780635333b21b146102da5780636352211e146102ed5780636a6278421461030057600080fd5b80633726bc281461028a578063386bfc981461029d57806342842e0e146102b457600080fd5b8063095ea7b3116101ad578063095ea7b31461023c57806322ad06701461025157806323b872dd1461026457806330176e131461027757600080fd5b806301ffc9a7146101d457806306fdde03146101fc578063081812fc14610211575b600080fd5b6101e76101e2366004611891565b610464565b60405190151581526020015b60405180910390f35b610204610475565b6040516101f39190611906565b61022461021f366004611919565b610507565b6040516001600160a01b0390911681526020016101f3565b61024f61024a36600461194e565b6105a1565b005b61024f61025f36600461194e565b6106b6565b61024f610272366004611978565b6106ee565b61024f6102853660046119b4565b610720565b61024f610298366004611919565b610756565b6102a660085481565b6040519081526020016101f3565b61024f6102c2366004611978565b610785565b61024f6102d5366004611919565b6107a0565b61024f6102e8366004611919565b61081a565b6102246102fb366004611919565b61084f565b61024f61030e366004611a26565b6108c6565b6102a6610321366004611a26565b61090f565b61024f610996565b61024f61033c366004611919565b610a0a565b6000546001600160a01b0316610224565b610204610a39565b61024f610368366004611a41565b610a48565b61024f61037b366004611919565b610b0c565b6102a6600b5481565b61024f610397366004611a7d565b610b3b565b61024f6103aa366004611af6565b610c8f565b6102046103bd366004611919565b610cc7565b6101e76103d0366004611a26565b6001600160a01b031660009081526009602052604090205460ff1690565b6102a67f000000000000000000000000000000000000000000000000000000000000138881565b6101e7610423366004611bd2565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b61024f61045f366004611a26565b610da2565b600061046f82610e8c565b92915050565b60606001805461048490611c05565b80601f01602080910402602001604051908101604052809291908181526020018280546104b090611c05565b80156104fd5780601f106104d2576101008083540402835291602001916104fd565b820191906000526020600020905b8154815290600101906020018083116104e057829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b03166105855760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b60006105ac8261084f565b9050806001600160a01b0316836001600160a01b0316036106195760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161057c565b336001600160a01b038216148061063557506106358133610423565b6106a75760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161057c565b6106b18383610edc565b505050565b6000546001600160a01b031633146106e05760405162461bcd60e51b815260040161057c90611c3f565b6106ea8282610f4a565b5050565b6106f9335b8261108c565b6107155760405162461bcd60e51b815260040161057c90611c74565b6106b1838383611183565b6000546001600160a01b0316331461074a5760405162461bcd60e51b815260040161057c90611c3f565b6106b1600783836117e2565b6000546001600160a01b031633146107805760405162461bcd60e51b815260040161057c90611c3f565b600a55565b6106b183838360405180602001604052806000815250610c8f565b6107a9336106f3565b61080e5760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b606482015260840161057c565b61081781611323565b50565b6000546001600160a01b031633146108445760405162461bcd60e51b815260040161057c90611c3f565b610817600c826113be565b6000818152600360205260408120546001600160a01b03168061046f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161057c565b6000546001600160a01b031633146108f05760405162461bcd60e51b815260040161057c90611c3f565b61081781600a54610900600c5490565b61090a9190611cdb565b611412565b60006001600160a01b03821661097a5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161057c565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146109c05760405162461bcd60e51b815260040161057c90611c3f565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610a345760405162461bcd60e51b815260040161057c90611c3f565b600855565b60606002805461048490611c05565b336001600160a01b03831603610aa05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161057c565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314610b365760405162461bcd60e51b815260040161057c90611c3f565b600b55565b33610bbb610b82826040516bffffffffffffffffffffffff19606083901b166020820152600090603401604051602081830303815290604052805190602001209050919050565b84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061142c92505050565b610bfe5760405162461bcd60e51b815260206004820152601460248201527324b73b30b634b21036b2b935b63290383937b7b360611b604482015260640161057c565b6001600160a01b03811660009081526009602052604090205460ff1615610c595760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b604482015260640161057c565b610c6981600a54610900600c5490565b6001600160a01b03166000908152600960205260409020805460ff191660011790555050565b610c99338361108c565b610cb55760405162461bcd60e51b815260040161057c90611c74565b610cc18484848461143b565b50505050565b6000818152600360205260409020546060906001600160a01b0316610d465760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161057c565b6000610d5061146e565b90506000815111610d705760405180602001604052806000815250610d9b565b80610d7a8461147d565b604051602001610d8b929190611cf3565b6040516020818303038152906040525b9392505050565b6000546001600160a01b03163314610dcc5760405162461bcd60e51b815260040161057c90611c3f565b6001600160a01b038116610e315760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161057c565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480610ebd57506001600160e01b03198216635b5e139f60e01b145b8061046f57506301ffc9a760e01b6001600160e01b031983161461046f565b600081815260056020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f118261084f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6001600160a01b038216610fa05760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161057c565b6000818152600360205260409020546001600160a01b0316156110055760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161057c565b6001600160a01b038216600090815260046020526040812080546001929061102e908490611cdb565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000818152600360205260408120546001600160a01b03166111055760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161057c565b60006111108361084f565b9050806001600160a01b0316846001600160a01b0316148061114b5750836001600160a01b031661114084610507565b6001600160a01b0316145b8061117b57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166111968261084f565b6001600160a01b0316146111fe5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161057c565b6001600160a01b0382166112605760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161057c565b61126b600082610edc565b6001600160a01b0383166000908152600460205260408120805460019290611294908490611d22565b90915550506001600160a01b03821660009081526004602052604081208054600192906112c2908490611cdb565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600061132e8261084f565b905061133b600083610edc565b6001600160a01b0381166000908152600460205260408120805460019290611364908490611d22565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6000811161140e5760405162461bcd60e51b815260206004820152601b60248201527f436f756e7465723a20696e73756666696369656e742076616c75650000000000604482015260640161057c565b9055565b6106ea82826040518060200160405280600081525061157e565b6000610d9b82600854856115ff565b611446848484611183565b611452848484846116ae565b610cc15760405162461bcd60e51b815260040161057c90611d39565b60606007805461048490611c05565b6060816000036114a45750506040805180820190915260018152600360fc1b602082015290565b8160005b81156114ce57806114b881611d8b565b91506114c79050600a83611dba565b91506114a8565b60008167ffffffffffffffff8111156114e9576114e9611ae0565b6040519080825280601f01601f191660200182016040528015611513576020820181803683370190505b5090505b841561117b57611528600183611d22565b9150611535600a86611dce565b611540906030611cdb565b60f81b81838151811061155557611555611de2565b60200101906001600160f81b031916908160001a905350611577600a86611dba565b9450611517565b600b546115ab907f0000000000000000000000000000000000000000000000000000000000001388611d22565b600c54106115e65760405162461bcd60e51b815260206004820152600860248201526714dbdb19081bdd5d60c21b604482015260640161057c565b6115f18383836117af565b6106b1600c80546001019055565b600081815b85518110156116a357600086828151811061162157611621611de2565b60200260200101519050808311611663576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250611690565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b508061169b81611d8b565b915050611604565b509092149392505050565b60006001600160a01b0384163b156117a457604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906116f2903390899088908890600401611df8565b6020604051808303816000875af192505050801561172d575060408051601f3d908101601f1916820190925261172a91810190611e35565b60015b61178a573d80801561175b576040519150601f19603f3d011682016040523d82523d6000602084013e611760565b606091505b5080516000036117825760405162461bcd60e51b815260040161057c90611d39565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061117b565b506001949350505050565b6117b98383610f4a565b6117c660008484846116ae565b6106b15760405162461bcd60e51b815260040161057c90611d39565b8280546117ee90611c05565b90600052602060002090601f0160209004810192826118105760008555611856565b82601f106118295782800160ff19823516178555611856565b82800160010185558215611856579182015b8281111561185657823582559160200191906001019061183b565b50611862929150611866565b5090565b5b808211156118625760008155600101611867565b6001600160e01b03198116811461081757600080fd5b6000602082840312156118a357600080fd5b8135610d9b8161187b565b60005b838110156118c95781810151838201526020016118b1565b83811115610cc15750506000910152565b600081518084526118f28160208601602086016118ae565b601f01601f19169290920160200192915050565b602081526000610d9b60208301846118da565b60006020828403121561192b57600080fd5b5035919050565b80356001600160a01b038116811461194957600080fd5b919050565b6000806040838503121561196157600080fd5b61196a83611932565b946020939093013593505050565b60008060006060848603121561198d57600080fd5b61199684611932565b92506119a460208501611932565b9150604084013590509250925092565b600080602083850312156119c757600080fd5b823567ffffffffffffffff808211156119df57600080fd5b818501915085601f8301126119f357600080fd5b813581811115611a0257600080fd5b866020828501011115611a1457600080fd5b60209290920196919550909350505050565b600060208284031215611a3857600080fd5b610d9b82611932565b60008060408385031215611a5457600080fd5b611a5d83611932565b915060208301358015158114611a7257600080fd5b809150509250929050565b60008060208385031215611a9057600080fd5b823567ffffffffffffffff80821115611aa857600080fd5b818501915085601f830112611abc57600080fd5b813581811115611acb57600080fd5b8660208260051b8501011115611a1457600080fd5b634e487b7160e01b600052604160045260246000fd5b60008060008060808587031215611b0c57600080fd5b611b1585611932565b9350611b2360208601611932565b925060408501359150606085013567ffffffffffffffff80821115611b4757600080fd5b818701915087601f830112611b5b57600080fd5b813581811115611b6d57611b6d611ae0565b604051601f8201601f19908116603f01168101908382118183101715611b9557611b95611ae0565b816040528281528a6020848701011115611bae57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611be557600080fd5b611bee83611932565b9150611bfc60208401611932565b90509250929050565b600181811c90821680611c1957607f821691505b602082108103611c3957634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611cee57611cee611cc5565b500190565b60008351611d058184602088016118ae565b835190830190611d198183602088016118ae565b01949350505050565b600082821015611d3457611d34611cc5565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600060018201611d9d57611d9d611cc5565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082611dc957611dc9611da4565b500490565b600082611ddd57611ddd611da4565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611e2b908301846118da565b9695505050505050565b600060208284031215611e4757600080fd5b8151610d9b8161187b56fea26469706673582212200116933f4ec569c88e4cc2b5ea9543b0e79b209b6ff66ff87bd1cf30e828d62d64736f6c634300080d0033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000138800000000000000000000000000000000000000000000000000000000000000c83eb0983f06a1f6f3e6b6505169f4d3ac8d90f50f3072fed44aacc734bc5b868800000000000000000000000000000000000000000000000000000000000000114174656d204e46542050617373706f727400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044154454d00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Atem NFT Passport
Arg [1] : symbol (string): ATEM
Arg [2] : supply (uint256): 5000
Arg [3] : reserved (uint256): 200
Arg [4] : merkleroot (bytes32): 0x3eb0983f06a1f6f3e6b6505169f4d3ac8d90f50f3072fed44aacc734bc5b8688

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001388
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [4] : 3eb0983f06a1f6f3e6b6505169f4d3ac8d90f50f3072fed44aacc734bc5b8688
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [6] : 4174656d204e46542050617373706f7274000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 4154454d00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

38524:3792:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42144:161;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;42144:161:0;;;;;;;;21487:100;;;:::i;:::-;;;;;;;:::i;22947:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;22947:221:0;1528:203:1;22484:397:0;;;;;;:::i;:::-;;:::i;:::-;;40210:148;;;;;;:::i;:::-;;:::i;23837:305::-;;;;;;:::i;:::-;;:::i;41713:117::-;;;;;;:::i;:::-;;:::i;41490:98::-;;;;;;:::i;:::-;;:::i;38676:28::-;;;;;;;;;3249:25:1;;;3237:2;3222:18;38676:28:0;3103:177:1;24213:151:0;;;;;;:::i;:::-;;:::i;32801:245::-;;;;;;:::i;:::-;;:::i;41596:109::-;;;;;;:::i;:::-;;:::i;21181:239::-;;;;;;:::i;:::-;;:::i;40366:270::-;;;;;;:::i;:::-;;:::i;20911:208::-;;;;;;:::i;:::-;;:::i;34785:148::-;;;:::i;41381:101::-;;;;;;:::i;:::-;;:::i;34134:87::-;34180:7;34207:6;-1:-1:-1;;;;;34207:6:0;34134:87;;21656:104;;;:::i;23240:295::-;;;;;;:::i;:::-;;:::i;41838:96::-;;;;;;:::i;:::-;;:::i;38828:26::-;;;;;;40644:350;;;;;;:::i;:::-;;:::i;24435:285::-;;;;;;:::i;:::-;;:::i;21831:360::-;;;;;;:::i;:::-;;:::i;39690:109::-;;;;;;:::i;:::-;-1:-1:-1;;;;;39773:18:0;39750:4;39773:18;;;:9;:18;;;;;;;;;39690:109;38717:34;;;;;23606:164;;;;;;:::i;:::-;-1:-1:-1;;;;;23727:25:0;;;23703:4;23727:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23606:164;35088:244;;;;;;:::i;:::-;;:::i;42144:161::-;42237:4;42261:36;42285:11;42261:23;:36::i;:::-;42254:43;42144:161;-1:-1:-1;;42144:161:0:o;21487:100::-;21541:13;21574:5;21567:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21487:100;:::o;22947:221::-;23023:7;26276:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26276:16:0;23043:73;;;;-1:-1:-1;;;23043:73:0;;6942:2:1;23043:73:0;;;6924:21:1;6981:2;6961:18;;;6954:30;7020:34;7000:18;;;6993:62;-1:-1:-1;;;7071:18:1;;;7064:42;7123:19;;23043:73:0;;;;;;;;;-1:-1:-1;23136:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23136:24:0;;22947:221::o;22484:397::-;22565:13;22581:23;22596:7;22581:14;:23::i;:::-;22565:39;;22629:5;-1:-1:-1;;;;;22623:11:0;:2;-1:-1:-1;;;;;22623:11:0;;22615:57;;;;-1:-1:-1;;;22615:57:0;;7355:2:1;22615:57:0;;;7337:21:1;7394:2;7374:18;;;7367:30;7433:34;7413:18;;;7406:62;-1:-1:-1;;;7484:18:1;;;7477:31;7525:19;;22615:57:0;7153:397:1;22615:57:0;15966:10;-1:-1:-1;;;;;22693:21:0;;;;:62;;-1:-1:-1;22718:37:0;22735:5;15966:10;23606:164;:::i;22718:37::-;22685:154;;;;-1:-1:-1;;;22685:154:0;;7757:2:1;22685:154:0;;;7739:21:1;7796:2;7776:18;;;7769:30;7835:34;7815:18;;;7808:62;7906:26;7886:18;;;7879:54;7950:19;;22685:154:0;7555:420:1;22685:154:0;22852:21;22861:2;22865:7;22852:8;:21::i;:::-;22554:327;22484:397;;:::o;40210:148::-;34180:7;34207:6;-1:-1:-1;;;;;34207:6:0;15966:10;34354:23;34346:68;;;;-1:-1:-1;;;34346:68:0;;;;;;;:::i;:::-;40326:24:::1;40338:2;40342:7;40326:11;:24::i;:::-;40210:148:::0;;:::o;23837:305::-;23998:41;15966:10;24017:12;24031:7;23998:18;:41::i;:::-;23990:103;;;;-1:-1:-1;;;23990:103:0;;;;;;;:::i;:::-;24106:28;24116:4;24122:2;24126:7;24106:9;:28::i;41713:117::-;34180:7;34207:6;-1:-1:-1;;;;;34207:6:0;15966:10;34354:23;34346:68;;;;-1:-1:-1;;;34346:68:0;;;;;;;:::i;:::-;41796:26:::1;:13;41812:10:::0;;41796:26:::1;:::i;41490:98::-:0;34180:7;34207:6;-1:-1:-1;;;;;34207:6:0;15966:10;34354:23;34346:68;;;;-1:-1:-1;;;34346:68:0;;;;;;;:::i;:::-;41560:12:::1;:20:::0;41490:98::o;24213:151::-;24317:39;24334:4;24340:2;24344:7;24317:39;;;;;;;;;;;;:16;:39::i;32801:245::-;32919:41;15966:10;32938:12;15886:98;32919:41;32911:102;;;;-1:-1:-1;;;32911:102:0;;8961:2:1;32911:102:0;;;8943:21:1;9000:2;8980:18;;;8973:30;9039:34;9019:18;;;9012:62;-1:-1:-1;;;9090:18:1;;;9083:46;9146:19;;32911:102:0;8759:412:1;32911:102:0;33024:14;33030:7;33024:5;:14::i;:::-;32801:245;:::o;41596:109::-;34180:7;34207:6;-1:-1:-1;;;;;34207:6:0;15966:10;34354:23;34346:68;;;;-1:-1:-1;;;34346:68:0;;;;;;;:::i;:::-;41667:30:::1;:14;41691:5:::0;41667:23:::1;:30::i;21181:239::-:0;21253:7;21289:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21289:16:0;;21316:73;;;;-1:-1:-1;;;21316:73:0;;9378:2:1;21316:73:0;;;9360:21:1;9417:2;9397:18;;;9390:30;9456:34;9436:18;;;9429:62;-1:-1:-1;;;9507:18:1;;;9500:39;9556:19;;21316:73:0;9176:405:1;40366:270:0;34180:7;34207:6;-1:-1:-1;;;;;34207:6:0;15966:10;34354:23;34346:68;;;;-1:-1:-1;;;34346:68:0;;;;;;;:::i;:::-;40574:54:::1;40584:2;40615:12;;40588:24;:14;37867::::0;;37775:114;40588:24:::1;:39;;;;:::i;:::-;40574:9;:54::i;20911:208::-:0;20983:7;-1:-1:-1;;;;;21011:19:0;;21003:74;;;;-1:-1:-1;;;21003:74:0;;10053:2:1;21003:74:0;;;10035:21:1;10092:2;10072:18;;;10065:30;10131:34;10111:18;;;10104:62;-1:-1:-1;;;10182:18:1;;;10175:40;10232:19;;21003:74:0;9851:406:1;21003:74:0;-1:-1:-1;;;;;;21095:16:0;;;;;:9;:16;;;;;;;20911:208::o;34785:148::-;34180:7;34207:6;-1:-1:-1;;;;;34207:6:0;15966:10;34354:23;34346:68;;;;-1:-1:-1;;;34346:68:0;;;;;;;:::i;:::-;34892:1:::1;34876:6:::0;;34855:40:::1;::::0;-1:-1:-1;;;;;34876:6:0;;::::1;::::0;34855:40:::1;::::0;34892:1;;34855:40:::1;34923:1;34906:19:::0;;-1:-1:-1;;;;;;34906:19:0::1;::::0;;34785:148::o;41381:101::-;34180:7;34207:6;-1:-1:-1;;;;;34207:6:0;15966:10;34354:23;34346:68;;;;-1:-1:-1;;;34346:68:0;;;;;;;:::i;:::-;41451:13:::1;:23:::0;41381:101::o;21656:104::-;21712:13;21745:7;21738:14;;;;;:::i;23240:295::-;15966:10;-1:-1:-1;;;;;23343:24:0;;;23335:62;;;;-1:-1:-1;;;23335:62:0;;10464:2:1;23335:62:0;;;10446:21:1;10503:2;10483:18;;;10476:30;10542:27;10522:18;;;10515:55;10587:18;;23335:62:0;10262:349:1;23335:62:0;15966:10;23410:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23410:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23410:53:0;;;;;;;;;;23479:48;;540:41:1;;;23410:42:0;;15966:10;23479:48;;513:18:1;23479:48:0;;;;;;;23240:295;;:::o;41838:96::-;34180:7;34207:6;-1:-1:-1;;;;;34207:6:0;15966:10;34354:23;34346:68;;;;-1:-1:-1;;;34346:68:0;;;;;;;:::i;:::-;41907:11:::1;:19:::0;41838:96::o;40644:350::-;15966:10;40764:30;40772:14;15966:10;41142:25;;-1:-1:-1;;15188:2:1;15184:15;;;15180:53;41142:25:0;;;15168:66:1;41100:7:0;;15250:12:1;;41142:25:0;;;;;;;;;;;;41132:36;;;;;;41125:43;;41040:136;;;;40772:14;40788:5;;40764:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40764:7:0;;-1:-1:-1;;;40764:30:0:i;:::-;40756:63;;;;-1:-1:-1;;;40756:63:0;;10818:2:1;40756:63:0;;;10800:21:1;10857:2;10837:18;;;10830:30;-1:-1:-1;;;10876:18:1;;;10869:50;10936:18;;40756:63:0;10616:344:1;40756:63:0;-1:-1:-1;;;;;39773:18:0;;39750:4;39773:18;;;:9;:18;;;;;;;;40838:22;40830:50;;;;-1:-1:-1;;;40830:50:0;;11167:2:1;40830:50:0;;;11149:21:1;11206:2;11186:18;;;11179:30;-1:-1:-1;;;11225:18:1;;;11218:45;11280:18;;40830:50:0;10965:339:1;40830:50:0;40891:59;40901:7;40937:12;;40910:24;:14;37867;;37775:114;40891:59;-1:-1:-1;;;;;40961:18:0;;;;;:9;:18;;;;;:25;;-1:-1:-1;;40961:25:0;40982:4;40961:25;;;-1:-1:-1;;40644:350:0:o;24435:285::-;24567:41;15966:10;24600:7;24567:18;:41::i;:::-;24559:103;;;;-1:-1:-1;;;24559:103:0;;;;;;;:::i;:::-;24673:39;24687:4;24693:2;24697:7;24706:5;24673:13;:39::i;:::-;24435:285;;;;:::o;21831:360::-;26252:4;26276:16;;;:7;:16;;;;;;21904:13;;-1:-1:-1;;;;;26276:16:0;21930:76;;;;-1:-1:-1;;;21930:76:0;;11511:2:1;21930:76:0;;;11493:21:1;11550:2;11530:18;;;11523:30;11589:34;11569:18;;;11562:62;-1:-1:-1;;;11640:18:1;;;11633:45;11695:19;;21930:76:0;11309:411:1;21930:76:0;22019:21;22043:10;:8;:10::i;:::-;22019:34;;22095:1;22077:7;22071:21;:25;:112;;;;;;;;;;;;;;;;;22136:7;22145:18;:7;:16;:18::i;:::-;22119:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22071:112;22064:119;21831:360;-1:-1:-1;;;21831:360:0:o;35088:244::-;34180:7;34207:6;-1:-1:-1;;;;;34207:6:0;15966:10;34354:23;34346:68;;;;-1:-1:-1;;;34346:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35177:22:0;::::1;35169:73;;;::::0;-1:-1:-1;;;35169:73:0;;12402:2:1;35169:73:0::1;::::0;::::1;12384:21:1::0;12441:2;12421:18;;;12414:30;12480:34;12460:18;;;12453:62;-1:-1:-1;;;12531:18:1;;;12524:36;12577:19;;35169:73:0::1;12200:402:1::0;35169:73:0::1;35279:6;::::0;;35258:38:::1;::::0;-1:-1:-1;;;;;35258:38:0;;::::1;::::0;35279:6;::::1;::::0;35258:38:::1;::::0;::::1;35307:6;:17:::0;;-1:-1:-1;;;;;;35307:17:0::1;-1:-1:-1::0;;;;;35307:17:0;;;::::1;::::0;;;::::1;::::0;;35088:244::o;20555:292::-;20657:4;-1:-1:-1;;;;;;20681:40:0;;-1:-1:-1;;;20681:40:0;;:105;;-1:-1:-1;;;;;;;20738:48:0;;-1:-1:-1;;;20738:48:0;20681:105;:158;;;-1:-1:-1;;;;;;;;;;19177:40:0;;;20803:36;19068:157;30064:174;30139:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30139:29:0;-1:-1:-1;;;;;30139:29:0;;;;;;;;:24;;30193:23;30139:24;30193:14;:23::i;:::-;-1:-1:-1;;;;;30184:46:0;;;;;;;;;;;30064:174;;:::o;28094:382::-;-1:-1:-1;;;;;28174:16:0;;28166:61;;;;-1:-1:-1;;;28166:61:0;;12809:2:1;28166:61:0;;;12791:21:1;;;12828:18;;;12821:30;12887:34;12867:18;;;12860:62;12939:18;;28166:61:0;12607:356:1;28166:61:0;26252:4;26276:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26276:16:0;:30;28238:58;;;;-1:-1:-1;;;28238:58:0;;13170:2:1;28238:58:0;;;13152:21:1;13209:2;13189:18;;;13182:30;13248;13228:18;;;13221:58;13296:18;;28238:58:0;12968:352:1;28238:58:0;-1:-1:-1;;;;;28367:13:0;;;;;;:9;:13;;;;;:18;;28384:1;;28367:13;:18;;28384:1;;28367:18;:::i;:::-;;;;-1:-1:-1;;28396:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28396:21:0;-1:-1:-1;;;;;28396:21:0;;;;;;;;28435:33;;28396:16;;;28435:33;;28396:16;;28435:33;28094:382;;:::o;26481:348::-;26574:4;26276:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26276:16:0;26591:73;;;;-1:-1:-1;;;26591:73:0;;13527:2:1;26591:73:0;;;13509:21:1;13566:2;13546:18;;;13539:30;13605:34;13585:18;;;13578:62;-1:-1:-1;;;13656:18:1;;;13649:42;13708:19;;26591:73:0;13325:408:1;26591:73:0;26675:13;26691:23;26706:7;26691:14;:23::i;:::-;26675:39;;26744:5;-1:-1:-1;;;;;26733:16:0;:7;-1:-1:-1;;;;;26733:16:0;;:51;;;;26777:7;-1:-1:-1;;;;;26753:31:0;:20;26765:7;26753:11;:20::i;:::-;-1:-1:-1;;;;;26753:31:0;;26733:51;:87;;;-1:-1:-1;;;;;;23727:25:0;;;23703:4;23727:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;26788:32;26725:96;26481:348;-1:-1:-1;;;;26481:348:0:o;29402:544::-;29527:4;-1:-1:-1;;;;;29500:31:0;:23;29515:7;29500:14;:23::i;:::-;-1:-1:-1;;;;;29500:31:0;;29492:85;;;;-1:-1:-1;;;29492:85:0;;13940:2:1;29492:85:0;;;13922:21:1;13979:2;13959:18;;;13952:30;14018:34;13998:18;;;13991:62;-1:-1:-1;;;14069:18:1;;;14062:39;14118:19;;29492:85:0;13738:405:1;29492:85:0;-1:-1:-1;;;;;29596:16:0;;29588:65;;;;-1:-1:-1;;;29588:65:0;;14350:2:1;29588:65:0;;;14332:21:1;14389:2;14369:18;;;14362:30;14428:34;14408:18;;;14401:62;-1:-1:-1;;;14479:18:1;;;14472:34;14523:19;;29588:65:0;14148:400:1;29588:65:0;29770:29;29787:1;29791:7;29770:8;:29::i;:::-;-1:-1:-1;;;;;29812:15:0;;;;;;:9;:15;;;;;:20;;29831:1;;29812:15;:20;;29831:1;;29812:20;:::i;:::-;;;;-1:-1:-1;;;;;;;29843:13:0;;;;;;:9;:13;;;;;:18;;29860:1;;29843:13;:18;;29860:1;;29843:18;:::i;:::-;;;;-1:-1:-1;;29872:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;29872:21:0;-1:-1:-1;;;;;29872:21:0;;;;;;;;;29911:27;;29872:16;;29911:27;;;;;;;29402:544;;;:::o;28705:360::-;28765:13;28781:23;28796:7;28781:14;:23::i;:::-;28765:39;;28906:29;28923:1;28927:7;28906:8;:29::i;:::-;-1:-1:-1;;;;;28948:16:0;;;;;;:9;:16;;;;;:21;;28968:1;;28948:16;:21;;28968:1;;28948:21;:::i;:::-;;;;-1:-1:-1;;28987:16:0;;;;:7;:16;;;;;;28980:23;;-1:-1:-1;;;;;;28980:23:0;;;29021:36;28995:7;;28987:16;-1:-1:-1;;;;;29021:36:0;;;;;28987:16;;29021:36;28754:311;28705:360;:::o;38279:177::-;38379:1;38368:8;:12;38360:52;;;;-1:-1:-1;;;38360:52:0;;14885:2:1;38360:52:0;;;14867:21:1;14924:2;14904:18;;;14897:30;14963:29;14943:18;;;14936:57;15010:18;;38360:52:0;14683:351:1;38360:52:0;38423:25;;38279:177::o;39171:111::-;39248:26;39258:2;39262:7;39248:26;;;;;;;;;;;;:9;:26::i;41184:166::-;41267:4;41296:46;41315:5;41322:13;;41337:4;41296:18;:46::i;25602:272::-;25716:28;25726:4;25732:2;25736:7;25716:9;:28::i;:::-;25763:48;25786:4;25792:2;25796:7;25805:5;25763:22;:48::i;:::-;25755:111;;;;-1:-1:-1;;;25755:111:0;;;;;;;:::i;39560:122::-;39628:13;39661;39654:20;;;;;:::i;16528:723::-;16584:13;16805:5;16814:1;16805:10;16801:53;;-1:-1:-1;;16832:10:0;;;;;;;;;;;;-1:-1:-1;;;16832:10:0;;;;;16528:723::o;16801:53::-;16879:5;16864:12;16920:78;16927:9;;16920:78;;16953:8;;;;:::i;:::-;;-1:-1:-1;16976:10:0;;-1:-1:-1;16984:2:0;16976:10;;:::i;:::-;;;16920:78;;;17008:19;17040:6;17030:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17030:17:0;;17008:39;;17058:154;17065:10;;17058:154;;17092:11;17102:1;17092:11;;:::i;:::-;;-1:-1:-1;17161:10:0;17169:2;17161:5;:10;:::i;:::-;17148:24;;:2;:24;:::i;:::-;17135:39;;17118:6;17125;17118:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17118:56:0;;;;;;;;-1:-1:-1;17189:11:0;17198:2;17189:11;;:::i;:::-;;;17058:154;;39290:258;39433:11;;39421:23;;:9;:23;:::i;:::-;39394:14;37867;39394:50;39386:71;;;;-1:-1:-1;;;39386:71:0;;16540:2:1;39386:71:0;;;16522:21:1;16579:1;16559:18;;;16552:29;-1:-1:-1;;;16597:18:1;;;16590:38;16645:18;;39386:71:0;16338:331:1;39386:71:0;39468:35;39484:2;39488:7;39497:5;39468:15;:35::i;:::-;39514:26;:14;37986:19;;38004:1;37986:19;;;37897:127;36163:796;36254:4;36294;36254;36311:525;36335:5;:12;36331:1;:16;36311:525;;;36369:20;36392:5;36398:1;36392:8;;;;;;;;:::i;:::-;;;;;;;36369:31;;36437:12;36421;:28;36417:408;;36574:44;;;;;;16831:19:1;;;16866:12;;;16859:28;;;16903:12;;36574:44:0;;;;;;;;;;;;36564:55;;;;;;36549:70;;36417:408;;;36764:44;;;;;;16831:19:1;;;16866:12;;;16859:28;;;16903:12;;36764:44:0;;;;;;;;;;;;36754:55;;;;;;36739:70;;36417:408;-1:-1:-1;36349:3:0;;;;:::i;:::-;;;;36311:525;;;-1:-1:-1;36931:20:0;;;;36163:796;-1:-1:-1;;;36163:796:0:o;30803:843::-;30924:4;-1:-1:-1;;;;;30950:13:0;;8383:20;8422:8;30946:693;;30986:72;;-1:-1:-1;;;30986:72:0;;-1:-1:-1;;;;;30986:36:0;;;;;:72;;15966:10;;31037:4;;31043:7;;31052:5;;30986:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30986:72:0;;;;;;;;-1:-1:-1;;30986:72:0;;;;;;;;;;;;:::i;:::-;;;30982:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31232:6;:13;31249:1;31232:18;31228:341;;31275:60;;-1:-1:-1;;;31275:60:0;;;;;;;:::i;31228:341::-;31519:6;31513:13;31504:6;31500:2;31496:15;31489:38;30982:602;-1:-1:-1;;;;;;31109:55:0;-1:-1:-1;;;31109:55:0;;-1:-1:-1;31102:62:0;;30946:693;-1:-1:-1;31623:4:0;30803:843;;;;;;:::o;27508:250::-;27604:18;27610:2;27614:7;27604:5;:18::i;:::-;27641:54;27672:1;27676:2;27680:7;27689:5;27641:22;:54::i;:::-;27633:117;;;;-1:-1:-1;;;27633:117:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2173:328::-;2250:6;2258;2266;2319:2;2307:9;2298:7;2294:23;2290:32;2287:52;;;2335:1;2332;2325:12;2287:52;2358:29;2377:9;2358:29;:::i;:::-;2348:39;;2406:38;2440:2;2429:9;2425:18;2406:38;:::i;:::-;2396:48;;2491:2;2480:9;2476:18;2463:32;2453:42;;2173:328;;;;;:::o;2506:592::-;2577:6;2585;2638:2;2626:9;2617:7;2613:23;2609:32;2606:52;;;2654:1;2651;2644:12;2606:52;2694:9;2681:23;2723:18;2764:2;2756:6;2753:14;2750:34;;;2780:1;2777;2770:12;2750:34;2818:6;2807:9;2803:22;2793:32;;2863:7;2856:4;2852:2;2848:13;2844:27;2834:55;;2885:1;2882;2875:12;2834:55;2925:2;2912:16;2951:2;2943:6;2940:14;2937:34;;;2967:1;2964;2957:12;2937:34;3012:7;3007:2;2998:6;2994:2;2990:15;2986:24;2983:37;2980:57;;;3033:1;3030;3023:12;2980:57;3064:2;3056:11;;;;;3086:6;;-1:-1:-1;2506:592:1;;-1:-1:-1;;;;2506:592:1:o;3285:186::-;3344:6;3397:2;3385:9;3376:7;3372:23;3368:32;3365:52;;;3413:1;3410;3403:12;3365:52;3436:29;3455:9;3436:29;:::i;3843:347::-;3908:6;3916;3969:2;3957:9;3948:7;3944:23;3940:32;3937:52;;;3985:1;3982;3975:12;3937:52;4008:29;4027:9;4008:29;:::i;:::-;3998:39;;4087:2;4076:9;4072:18;4059:32;4134:5;4127:13;4120:21;4113:5;4110:32;4100:60;;4156:1;4153;4146:12;4100:60;4179:5;4169:15;;;3843:347;;;;;:::o;4195:615::-;4281:6;4289;4342:2;4330:9;4321:7;4317:23;4313:32;4310:52;;;4358:1;4355;4348:12;4310:52;4398:9;4385:23;4427:18;4468:2;4460:6;4457:14;4454:34;;;4484:1;4481;4474:12;4454:34;4522:6;4511:9;4507:22;4497:32;;4567:7;4560:4;4556:2;4552:13;4548:27;4538:55;;4589:1;4586;4579:12;4538:55;4629:2;4616:16;4655:2;4647:6;4644:14;4641:34;;;4671:1;4668;4661:12;4641:34;4724:7;4719:2;4709:6;4706:1;4702:14;4698:2;4694:23;4690:32;4687:45;4684:65;;;4745:1;4742;4735:12;4815:127;4876:10;4871:3;4867:20;4864:1;4857:31;4907:4;4904:1;4897:15;4931:4;4928:1;4921:15;4947:1138;5042:6;5050;5058;5066;5119:3;5107:9;5098:7;5094:23;5090:33;5087:53;;;5136:1;5133;5126:12;5087:53;5159:29;5178:9;5159:29;:::i;:::-;5149:39;;5207:38;5241:2;5230:9;5226:18;5207:38;:::i;:::-;5197:48;;5292:2;5281:9;5277:18;5264:32;5254:42;;5347:2;5336:9;5332:18;5319:32;5370:18;5411:2;5403:6;5400:14;5397:34;;;5427:1;5424;5417:12;5397:34;5465:6;5454:9;5450:22;5440:32;;5510:7;5503:4;5499:2;5495:13;5491:27;5481:55;;5532:1;5529;5522:12;5481:55;5568:2;5555:16;5590:2;5586;5583:10;5580:36;;;5596:18;;:::i;:::-;5671:2;5665:9;5639:2;5725:13;;-1:-1:-1;;5721:22:1;;;5745:2;5717:31;5713:40;5701:53;;;5769:18;;;5789:22;;;5766:46;5763:72;;;5815:18;;:::i;:::-;5855:10;5851:2;5844:22;5890:2;5882:6;5875:18;5930:7;5925:2;5920;5916;5912:11;5908:20;5905:33;5902:53;;;5951:1;5948;5941:12;5902:53;6007:2;6002;5998;5994:11;5989:2;5981:6;5977:15;5964:46;6052:1;6047:2;6042;6034:6;6030:15;6026:24;6019:35;6073:6;6063:16;;;;;;;4947:1138;;;;;;;:::o;6090:260::-;6158:6;6166;6219:2;6207:9;6198:7;6194:23;6190:32;6187:52;;;6235:1;6232;6225:12;6187:52;6258:29;6277:9;6258:29;:::i;:::-;6248:39;;6306:38;6340:2;6329:9;6325:18;6306:38;:::i;:::-;6296:48;;6090:260;;;;;:::o;6355:380::-;6434:1;6430:12;;;;6477;;;6498:61;;6552:4;6544:6;6540:17;6530:27;;6498:61;6605:2;6597:6;6594:14;6574:18;6571:38;6568:161;;6651:10;6646:3;6642:20;6639:1;6632:31;6686:4;6683:1;6676:15;6714:4;6711:1;6704:15;6568:161;;6355:380;;;:::o;7980:356::-;8182:2;8164:21;;;8201:18;;;8194:30;8260:34;8255:2;8240:18;;8233:62;8327:2;8312:18;;7980:356::o;8341:413::-;8543:2;8525:21;;;8582:2;8562:18;;;8555:30;8621:34;8616:2;8601:18;;8594:62;-1:-1:-1;;;8687:2:1;8672:18;;8665:47;8744:3;8729:19;;8341:413::o;9586:127::-;9647:10;9642:3;9638:20;9635:1;9628:31;9678:4;9675:1;9668:15;9702:4;9699:1;9692:15;9718:128;9758:3;9789:1;9785:6;9782:1;9779:13;9776:39;;;9795:18;;:::i;:::-;-1:-1:-1;9831:9:1;;9718:128::o;11725:470::-;11904:3;11942:6;11936:13;11958:53;12004:6;11999:3;11992:4;11984:6;11980:17;11958:53;:::i;:::-;12074:13;;12033:16;;;;12096:57;12074:13;12033:16;12130:4;12118:17;;12096:57;:::i;:::-;12169:20;;11725:470;-1:-1:-1;;;;11725:470:1:o;14553:125::-;14593:4;14621:1;14618;14615:8;14612:34;;;14626:18;;:::i;:::-;-1:-1:-1;14663:9:1;;14553:125::o;15273:414::-;15475:2;15457:21;;;15514:2;15494:18;;;15487:30;15553:34;15548:2;15533:18;;15526:62;-1:-1:-1;;;15619:2:1;15604:18;;15597:48;15677:3;15662:19;;15273:414::o;15692:135::-;15731:3;15752:17;;;15749:43;;15772:18;;:::i;:::-;-1:-1:-1;15819:1:1;15808:13;;15692:135::o;15832:127::-;15893:10;15888:3;15884:20;15881:1;15874:31;15924:4;15921:1;15914:15;15948:4;15945:1;15938:15;15964:120;16004:1;16030;16020:35;;16035:18;;:::i;:::-;-1:-1:-1;16069:9:1;;15964:120::o;16089:112::-;16121:1;16147;16137:35;;16152:18;;:::i;:::-;-1:-1:-1;16186:9:1;;16089:112::o;16206:127::-;16267:10;16262:3;16258:20;16255:1;16248:31;16298:4;16295:1;16288:15;16322:4;16319:1;16312:15;16926:489;-1:-1:-1;;;;;17195:15:1;;;17177:34;;17247:15;;17242:2;17227:18;;17220:43;17294:2;17279:18;;17272:34;;;17342:3;17337:2;17322:18;;17315:31;;;17120:4;;17363:46;;17389:19;;17381:6;17363:46;:::i;:::-;17355:54;16926:489;-1:-1:-1;;;;;;16926:489:1:o;17420:249::-;17489:6;17542:2;17530:9;17521:7;17517:23;17513:32;17510:52;;;17558:1;17555;17548:12;17510:52;17590:9;17584:16;17609:30;17633:5;17609:30;:::i

Swarm Source

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