ETH Price: $2,515.25 (+2.16%)

Token

Lottery Pass (LP)
 

Overview

Max Total Supply

285 LP

Holders

85

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
capodicapi.eth
Balance
10 LP
0x956124621bbc5f8eba2a4c1282a3f15e74814fb0
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
NFT

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-05-31
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

    // ==============================
    //            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);

    // ==============================
    //            IERC721
    // ==============================

    /**
     * @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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);

    // ==============================
    //        IERC721Metadata
    // ==============================

    /**
     * @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);
}

/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

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

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

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

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

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count. 
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

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

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

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

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

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

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

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

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

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

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

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

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}




contract NFT is ERC721A, Ownable {
    // 1 Slot - gas saving
    uint32 public maxSupply = 5555;
    uint16 public maxNFTPerAddress = 20;
    uint64 public price = 0.02 ether;
    // 1 Slot - gas saving

    bool public isSaleOpen;
    string private notRevealedURI_;
    string private baseURI_;
    string private baseExtension_;

    constructor(string memory _notRevealedURI) ERC721A("Lottery Pass", "LP") {
        notRevealedURI_ = _notRevealedURI;

        // First 1 NFT to the team
        _safeMint(msg.sender, 1);
    }

    function mint(uint256 quantity) external payable {
        require(isSaleOpen, "sale is not started yet");
        require(tx.origin == msg.sender, "can not be called by a contract");
        require(quantity == 1 || quantity == 5 || quantity == 10 || quantity == 20, "invalid amount");
        require(totalSupply() + quantity <= maxSupply, "amount exceeds max supply");
        require(balanceOf(msg.sender) + quantity <= maxNFTPerAddress, "amount exceeds your allocation");
        require(msg.value >= quantity * price, "unsufficient payment");

        _safeMint(msg.sender, quantity);
    }

    function tokenURI(uint256 tokenId) public view override returns(string memory) {
        if(!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = baseURI_;
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId), baseExtension_)) : notRevealedURI_;
    }

    function _startTokenId() internal pure override returns(uint256) {
        return 1;
    }

    // Only Owner Functions
    function withdraw(uint256 _amount) external onlyOwner {
        payable(msg.sender).transfer(_amount);
    }

    function setNotRevealedURI(string memory _newURI) external onlyOwner {
        notRevealedURI_ = _newURI;
    }

    function setBaseURI(string memory _newURI) external onlyOwner {
        baseURI_ = _newURI;
    }

    function setBaseExtension(string memory _newExtension) external onlyOwner {
        baseExtension_ = _newExtension;
    }

    function toggleSaleOpen() external onlyOwner {
        isSaleOpen = !isSaleOpen;
    }

    function setMaxSupply(uint32 _newSupply) external onlyOwner {
        maxSupply = _newSupply;
    }

    function setMaxNFTPerAddress(uint16 _newMaxAmount) external onlyOwner {
        maxNFTPerAddress = _newMaxAmount;
    }

    function setPrice(uint64 _newPrice) external onlyOwner {
        price = _newPrice;
    }

    function ownerMint(address _to, uint256 _amount) external onlyOwner {
        _safeMint(_to, _amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"isSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNFTPerAddress","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"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":"_newExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newMaxAmount","type":"uint16"}],"name":"setMaxNFTPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_newSupply","type":"uint32"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_newPrice","type":"uint64"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSaleOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600880546414000015b360a01b65ffffffffffff60a01b19909116179055600980546001600160401b03191666470de4df8200001790553480156200004857600080fd5b50604051620022fd380380620022fd8339810160408190526200006b91620004da565b6040518060400160405280600c81526020016b4c6f7474657279205061737360a01b8152506040518060400160405280600281526020016104c560f41b8152508160029080519060200190620000c3929190620003ef565b508051620000d9906003906020840190620003ef565b5050600160005550620000ec3362000116565b80516200010190600a906020840190620003ef565b506200010f33600162000168565b5062000657565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200018a8282604051806020016040528060008152506200018e60201b60201c565b5050565b6000546001600160a01b038416620001b857604051622e076360e81b815260040160405180910390fd5b82600003620001da5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15620002a6575b60405182906001600160a01b03881690600090600080516020620022dd833981519152908290a460018201916200026b90600090889087620002fb565b62000289576040516368d2bf6b60e11b815260040160405180910390fd5b8082106200022e578260005414620002a057600080fd5b620002db565b5b6040516001830192906001600160a01b03881690600090600080516020620022dd833981519152908290a4808210620002a7575b506000908155620002f5908583866001600160e01b038516565b50505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906200033290339089908890889060040162000592565b6020604051808303816000875af192505050801562000370575060408051601f3d908101601f191682019092526200036d91810190620005e8565b60015b620003d2573d808015620003a1576040519150601f19603f3d011682016040523d82523d6000602084013e620003a6565b606091505b508051600003620003ca576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b828054620003fd906200061b565b90600052602060002090601f0160209004810192826200042157600085556200046c565b82601f106200043c57805160ff19168380011785556200046c565b828001600101855582156200046c579182015b828111156200046c5782518255916020019190600101906200044f565b506200047a9291506200047e565b5090565b5b808211156200047a57600081556001016200047f565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620004c8578181015183820152602001620004ae565b83811115620002f55750506000910152565b600060208284031215620004ed57600080fd5b81516001600160401b03808211156200050557600080fd5b818401915084601f8301126200051a57600080fd5b8151818111156200052f576200052f62000495565b604051601f8201601f19908116603f011681019083821181831017156200055a576200055a62000495565b816040528281528760208487010111156200057457600080fd5b62000587836020830160208801620004ab565b979650505050505050565b600060018060a01b038087168352808616602084015250836040830152608060608301528251806080840152620005d18160a0850160208701620004ab565b601f01601f19169190910160a00195945050505050565b600060208284031215620005fb57600080fd5b81516001600160e01b0319811681146200061457600080fd5b9392505050565b600181811c908216806200063057607f821691505b6020821081036200065157634e487b7160e01b600052602260045260246000fd5b50919050565b611c7680620006676000396000f3fe6080604052600436106101d85760003560e01c806377b6cb0e11610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461058e578063f2c4ce1e146105d7578063f2fde38b146105f7578063f9da32241461061757600080fd5b8063b88d4fde146104f5578063c87b56dd14610515578063d5abeb0114610535578063da3ef23f1461056e57600080fd5b806395d89b41116100d157806395d89b4114610473578063a035b1fe14610488578063a0712d68146104c2578063a22cb465146104d557600080fd5b806377b6cb0e146103eb578063837aea6c1461040b5780638393634c146104405780638da5cb5b1461045557600080fd5b806323b872dd1161017a57806355f804b31161014957806355f804b3146103765780636352211e1461039657806370a08231146103b6578063715018a6146103d657600080fd5b806323b872dd146102f65780632e1a7d4d1461031657806342842e0e14610336578063484b973c1461035657600080fd5b8063095ea7b3116101b6578063095ea7b31461026c57806318160ddd1461028e5780631a081330146102b5578063229c2048146102d657600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063081812fc14610234575b600080fd5b3480156101e957600080fd5b506101fd6101f83660046116f5565b610637565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b50610227610689565b604051610209919061176a565b34801561024057600080fd5b5061025461024f36600461177d565b61071b565b6040516001600160a01b039091168152602001610209565b34801561027857600080fd5b5061028c6102873660046117b2565b61075f565b005b34801561029a57600080fd5b5060015460005403600019015b604051908152602001610209565b3480156102c157600080fd5b506009546101fd90600160401b900460ff1681565b3480156102e257600080fd5b5061028c6102f13660046117dc565b610831565b34801561030257600080fd5b5061028c610311366004611806565b610888565b34801561032257600080fd5b5061028c61033136600461177d565b610898565b34801561034257600080fd5b5061028c610351366004611806565b6108f3565b34801561036257600080fd5b5061028c6103713660046117b2565b61090e565b34801561038257600080fd5b5061028c6103913660046118ce565b610942565b3480156103a257600080fd5b506102546103b136600461177d565b61097f565b3480156103c257600080fd5b506102a76103d1366004611917565b61098a565b3480156103e257600080fd5b5061028c6109d9565b3480156103f757600080fd5b5061028c610406366004611932565b610a0f565b34801561041757600080fd5b5060085461042d90600160c01b900461ffff1681565b60405161ffff9091168152602001610209565b34801561044c57600080fd5b5061028c610a5b565b34801561046157600080fd5b506008546001600160a01b0316610254565b34801561047f57600080fd5b50610227610aab565b34801561049457600080fd5b506009546104a99067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610209565b61028c6104d036600461177d565b610aba565b3480156104e157600080fd5b5061028c6104f0366004611956565b610d1a565b34801561050157600080fd5b5061028c610510366004611992565b610daf565b34801561052157600080fd5b5061022761053036600461177d565b610df9565b34801561054157600080fd5b5060085461055990600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610209565b34801561057a57600080fd5b5061028c6105893660046118ce565b610f7e565b34801561059a57600080fd5b506101fd6105a9366004611a0e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156105e357600080fd5b5061028c6105f23660046118ce565b610fbb565b34801561060357600080fd5b5061028c610612366004611917565b610ff8565b34801561062357600080fd5b5061028c610632366004611a41565b611090565b60006301ffc9a760e01b6001600160e01b03198316148061066857506380ac58cd60e01b6001600160e01b03198316145b806106835750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461069890611a67565b80601f01602080910402602001604051908101604052809291908181526020018280546106c490611a67565b80156107115780601f106106e657610100808354040283529160200191610711565b820191906000526020600020905b8154815290600101906020018083116106f457829003601f168201915b5050505050905090565b6000610726826110e0565b610743576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061076a82611115565b9050806001600160a01b0316836001600160a01b03160361079e5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146107d5576107b881336105a9565b6107d5576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b031633146108645760405162461bcd60e51b815260040161085b90611aa1565b60405180910390fd5b6009805467ffffffffffffffff191667ffffffffffffffff92909216919091179055565b610893838383611184565b505050565b6008546001600160a01b031633146108c25760405162461bcd60e51b815260040161085b90611aa1565b604051339082156108fc029083906000818181858888f193505050501580156108ef573d6000803e3d6000fd5b5050565b61089383838360405180602001604052806000815250610daf565b6008546001600160a01b031633146109385760405162461bcd60e51b815260040161085b90611aa1565b6108ef828261132b565b6008546001600160a01b0316331461096c5760405162461bcd60e51b815260040161085b90611aa1565b80516108ef90600b906020840190611646565b600061068382611115565b60006001600160a01b0382166109b3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610a035760405162461bcd60e51b815260040161085b90611aa1565b610a0d6000611345565b565b6008546001600160a01b03163314610a395760405162461bcd60e51b815260040161085b90611aa1565b6008805461ffff909216600160c01b0261ffff60c01b19909216919091179055565b6008546001600160a01b03163314610a855760405162461bcd60e51b815260040161085b90611aa1565b6009805468ff0000000000000000198116600160401b9182900460ff1615909102179055565b60606003805461069890611a67565b600954600160401b900460ff16610b135760405162461bcd60e51b815260206004820152601760248201527f73616c65206973206e6f74207374617274656420796574000000000000000000604482015260640161085b565b323314610b625760405162461bcd60e51b815260206004820152601f60248201527f63616e206e6f742062652063616c6c6564206279206120636f6e747261637400604482015260640161085b565b8060011480610b715750806005145b80610b7c575080600a145b80610b875750806014145b610bc45760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015260640161085b565b600854600160a01b900463ffffffff1681610be86001546000546000199190030190565b610bf29190611aec565b1115610c405760405162461bcd60e51b815260206004820152601960248201527f616d6f756e742065786365656473206d617820737570706c7900000000000000604482015260640161085b565b600854600160c01b900461ffff1681610c583361098a565b610c629190611aec565b1115610cb05760405162461bcd60e51b815260206004820152601e60248201527f616d6f756e74206578636565647320796f757220616c6c6f636174696f6e0000604482015260640161085b565b600954610cc79067ffffffffffffffff1682611b04565b341015610d0d5760405162461bcd60e51b81526020600482015260146024820152731d5b9cdd59999a58da595b9d081c185e5b595b9d60621b604482015260640161085b565b610d17338261132b565b50565b336001600160a01b03831603610d435760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610dba848484611184565b6001600160a01b0383163b15610df357610dd684848484611397565b610df3576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610e04826110e0565b610e2157604051630a14c4b560e41b815260040160405180910390fd5b6000600b8054610e3090611a67565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5c90611a67565b8015610ea95780601f10610e7e57610100808354040283529160200191610ea9565b820191906000526020600020905b815481529060010190602001808311610e8c57829003601f168201915b505050505090508051600003610f4957600a8054610ec690611a67565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef290611a67565b8015610f3f5780601f10610f1457610100808354040283529160200191610f3f565b820191906000526020600020905b815481529060010190602001808311610f2257829003601f168201915b5050505050610f77565b80610f5384611483565b600c604051602001610f6793929190611b23565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314610fa85760405162461bcd60e51b815260040161085b90611aa1565b80516108ef90600c906020840190611646565b6008546001600160a01b03163314610fe55760405162461bcd60e51b815260040161085b90611aa1565b80516108ef90600a906020840190611646565b6008546001600160a01b031633146110225760405162461bcd60e51b815260040161085b90611aa1565b6001600160a01b0381166110875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161085b565b610d1781611345565b6008546001600160a01b031633146110ba5760405162461bcd60e51b815260040161085b90611aa1565b6008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b6000816001111580156110f4575060005482105b8015610683575050600090815260046020526040902054600160e01b161590565b6000818060011161116b5760005481101561116b5760008181526004602052604081205490600160e01b82169003611169575b80600003610f77575060001901600081815260046020526040902054611148565b505b604051636f96cda160e11b815260040160405180910390fd5b600061118f82611115565b9050836001600160a01b0316816001600160a01b0316146111c25760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806111e057506111e085336105a9565b806111fb5750336111f08461071b565b6001600160a01b0316145b90508061121b57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661124257604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b87178117909155831690036112e3576001830160008181526004602052604081205490036112e15760005481146112e15760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6108ef8282604051806020016040528060008152506114d2565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906113cc903390899088908890600401611be6565b6020604051808303816000875af1925050508015611407575060408051601f3d908101601f1916820190925261140491810190611c23565b60015b611465573d808015611435576040519150601f19603f3d011682016040523d82523d6000602084013e61143a565b606091505b50805160000361145d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b604080516080810191829052607f0190826030600a8206018353600a90045b80156114c057600183039250600a81066030018353600a90046114a2565b50819003601f19909101908152919050565b6000546001600160a01b0384166114fb57604051622e076360e81b815260040160405180910390fd5b8260000361151c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b156115f1575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46115ba6000878480600101955087611397565b6115d7576040516368d2bf6b60e11b815260040160405180910390fd5b80821061156f5782600054146115ec57600080fd5b611636565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106115f2575b506000908155610df39085838684565b82805461165290611a67565b90600052602060002090601f01602090048101928261167457600085556116ba565b82601f1061168d57805160ff19168380011785556116ba565b828001600101855582156116ba579182015b828111156116ba57825182559160200191906001019061169f565b506116c69291506116ca565b5090565b5b808211156116c657600081556001016116cb565b6001600160e01b031981168114610d1757600080fd5b60006020828403121561170757600080fd5b8135610f77816116df565b60005b8381101561172d578181015183820152602001611715565b83811115610df35750506000910152565b60008151808452611756816020860160208601611712565b601f01601f19169290920160200192915050565b602081526000610f77602083018461173e565b60006020828403121561178f57600080fd5b5035919050565b80356001600160a01b03811681146117ad57600080fd5b919050565b600080604083850312156117c557600080fd5b6117ce83611796565b946020939093013593505050565b6000602082840312156117ee57600080fd5b813567ffffffffffffffff81168114610f7757600080fd5b60008060006060848603121561181b57600080fd5b61182484611796565b925061183260208501611796565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561187357611873611842565b604051601f8501601f19908116603f0116810190828211818310171561189b5761189b611842565b816040528093508581528686860111156118b457600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156118e057600080fd5b813567ffffffffffffffff8111156118f757600080fd5b8201601f8101841361190857600080fd5b61147b84823560208401611858565b60006020828403121561192957600080fd5b610f7782611796565b60006020828403121561194457600080fd5b813561ffff81168114610f7757600080fd5b6000806040838503121561196957600080fd5b61197283611796565b91506020830135801515811461198757600080fd5b809150509250929050565b600080600080608085870312156119a857600080fd5b6119b185611796565b93506119bf60208601611796565b925060408501359150606085013567ffffffffffffffff8111156119e257600080fd5b8501601f810187136119f357600080fd5b611a0287823560208401611858565b91505092959194509250565b60008060408385031215611a2157600080fd5b611a2a83611796565b9150611a3860208401611796565b90509250929050565b600060208284031215611a5357600080fd5b813563ffffffff81168114610f7757600080fd5b600181811c90821680611a7b57607f821691505b602082108103611a9b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611aff57611aff611ad6565b500190565b6000816000190483118215151615611b1e57611b1e611ad6565b500290565b600084516020611b368285838a01611712565b855191840191611b498184848a01611712565b8554920191600090600181811c9080831680611b6657607f831692505b8583108103611b8357634e487b7160e01b85526022600452602485fd5b808015611b975760018114611ba857611bd5565b60ff19851688528388019550611bd5565b60008b81526020902060005b85811015611bcd5781548a820152908401908801611bb4565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611c199083018461173e565b9695505050505050565b600060208284031215611c3557600080fd5b8151610f77816116df56fea264697066735822122070e7413a67c154ea950dfa0106b574061ea188550de78c7711a7fd58e9cec08864736f6c634300080d0033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f516d6433546f4b6d39754e344c5759525572575932504c626466616a385a7372356254676a646e726575684642522f6d657461646174612e6a736f6e0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101d85760003560e01c806377b6cb0e11610102578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461058e578063f2c4ce1e146105d7578063f2fde38b146105f7578063f9da32241461061757600080fd5b8063b88d4fde146104f5578063c87b56dd14610515578063d5abeb0114610535578063da3ef23f1461056e57600080fd5b806395d89b41116100d157806395d89b4114610473578063a035b1fe14610488578063a0712d68146104c2578063a22cb465146104d557600080fd5b806377b6cb0e146103eb578063837aea6c1461040b5780638393634c146104405780638da5cb5b1461045557600080fd5b806323b872dd1161017a57806355f804b31161014957806355f804b3146103765780636352211e1461039657806370a08231146103b6578063715018a6146103d657600080fd5b806323b872dd146102f65780632e1a7d4d1461031657806342842e0e14610336578063484b973c1461035657600080fd5b8063095ea7b3116101b6578063095ea7b31461026c57806318160ddd1461028e5780631a081330146102b5578063229c2048146102d657600080fd5b806301ffc9a7146101dd57806306fdde0314610212578063081812fc14610234575b600080fd5b3480156101e957600080fd5b506101fd6101f83660046116f5565b610637565b60405190151581526020015b60405180910390f35b34801561021e57600080fd5b50610227610689565b604051610209919061176a565b34801561024057600080fd5b5061025461024f36600461177d565b61071b565b6040516001600160a01b039091168152602001610209565b34801561027857600080fd5b5061028c6102873660046117b2565b61075f565b005b34801561029a57600080fd5b5060015460005403600019015b604051908152602001610209565b3480156102c157600080fd5b506009546101fd90600160401b900460ff1681565b3480156102e257600080fd5b5061028c6102f13660046117dc565b610831565b34801561030257600080fd5b5061028c610311366004611806565b610888565b34801561032257600080fd5b5061028c61033136600461177d565b610898565b34801561034257600080fd5b5061028c610351366004611806565b6108f3565b34801561036257600080fd5b5061028c6103713660046117b2565b61090e565b34801561038257600080fd5b5061028c6103913660046118ce565b610942565b3480156103a257600080fd5b506102546103b136600461177d565b61097f565b3480156103c257600080fd5b506102a76103d1366004611917565b61098a565b3480156103e257600080fd5b5061028c6109d9565b3480156103f757600080fd5b5061028c610406366004611932565b610a0f565b34801561041757600080fd5b5060085461042d90600160c01b900461ffff1681565b60405161ffff9091168152602001610209565b34801561044c57600080fd5b5061028c610a5b565b34801561046157600080fd5b506008546001600160a01b0316610254565b34801561047f57600080fd5b50610227610aab565b34801561049457600080fd5b506009546104a99067ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610209565b61028c6104d036600461177d565b610aba565b3480156104e157600080fd5b5061028c6104f0366004611956565b610d1a565b34801561050157600080fd5b5061028c610510366004611992565b610daf565b34801561052157600080fd5b5061022761053036600461177d565b610df9565b34801561054157600080fd5b5060085461055990600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610209565b34801561057a57600080fd5b5061028c6105893660046118ce565b610f7e565b34801561059a57600080fd5b506101fd6105a9366004611a0e565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b3480156105e357600080fd5b5061028c6105f23660046118ce565b610fbb565b34801561060357600080fd5b5061028c610612366004611917565b610ff8565b34801561062357600080fd5b5061028c610632366004611a41565b611090565b60006301ffc9a760e01b6001600160e01b03198316148061066857506380ac58cd60e01b6001600160e01b03198316145b806106835750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461069890611a67565b80601f01602080910402602001604051908101604052809291908181526020018280546106c490611a67565b80156107115780601f106106e657610100808354040283529160200191610711565b820191906000526020600020905b8154815290600101906020018083116106f457829003601f168201915b5050505050905090565b6000610726826110e0565b610743576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061076a82611115565b9050806001600160a01b0316836001600160a01b03160361079e5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146107d5576107b881336105a9565b6107d5576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b031633146108645760405162461bcd60e51b815260040161085b90611aa1565b60405180910390fd5b6009805467ffffffffffffffff191667ffffffffffffffff92909216919091179055565b610893838383611184565b505050565b6008546001600160a01b031633146108c25760405162461bcd60e51b815260040161085b90611aa1565b604051339082156108fc029083906000818181858888f193505050501580156108ef573d6000803e3d6000fd5b5050565b61089383838360405180602001604052806000815250610daf565b6008546001600160a01b031633146109385760405162461bcd60e51b815260040161085b90611aa1565b6108ef828261132b565b6008546001600160a01b0316331461096c5760405162461bcd60e51b815260040161085b90611aa1565b80516108ef90600b906020840190611646565b600061068382611115565b60006001600160a01b0382166109b3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b03163314610a035760405162461bcd60e51b815260040161085b90611aa1565b610a0d6000611345565b565b6008546001600160a01b03163314610a395760405162461bcd60e51b815260040161085b90611aa1565b6008805461ffff909216600160c01b0261ffff60c01b19909216919091179055565b6008546001600160a01b03163314610a855760405162461bcd60e51b815260040161085b90611aa1565b6009805468ff0000000000000000198116600160401b9182900460ff1615909102179055565b60606003805461069890611a67565b600954600160401b900460ff16610b135760405162461bcd60e51b815260206004820152601760248201527f73616c65206973206e6f74207374617274656420796574000000000000000000604482015260640161085b565b323314610b625760405162461bcd60e51b815260206004820152601f60248201527f63616e206e6f742062652063616c6c6564206279206120636f6e747261637400604482015260640161085b565b8060011480610b715750806005145b80610b7c575080600a145b80610b875750806014145b610bc45760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b604482015260640161085b565b600854600160a01b900463ffffffff1681610be86001546000546000199190030190565b610bf29190611aec565b1115610c405760405162461bcd60e51b815260206004820152601960248201527f616d6f756e742065786365656473206d617820737570706c7900000000000000604482015260640161085b565b600854600160c01b900461ffff1681610c583361098a565b610c629190611aec565b1115610cb05760405162461bcd60e51b815260206004820152601e60248201527f616d6f756e74206578636565647320796f757220616c6c6f636174696f6e0000604482015260640161085b565b600954610cc79067ffffffffffffffff1682611b04565b341015610d0d5760405162461bcd60e51b81526020600482015260146024820152731d5b9cdd59999a58da595b9d081c185e5b595b9d60621b604482015260640161085b565b610d17338261132b565b50565b336001600160a01b03831603610d435760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610dba848484611184565b6001600160a01b0383163b15610df357610dd684848484611397565b610df3576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610e04826110e0565b610e2157604051630a14c4b560e41b815260040160405180910390fd5b6000600b8054610e3090611a67565b80601f0160208091040260200160405190810160405280929190818152602001828054610e5c90611a67565b8015610ea95780601f10610e7e57610100808354040283529160200191610ea9565b820191906000526020600020905b815481529060010190602001808311610e8c57829003601f168201915b505050505090508051600003610f4957600a8054610ec690611a67565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef290611a67565b8015610f3f5780601f10610f1457610100808354040283529160200191610f3f565b820191906000526020600020905b815481529060010190602001808311610f2257829003601f168201915b5050505050610f77565b80610f5384611483565b600c604051602001610f6793929190611b23565b6040516020818303038152906040525b9392505050565b6008546001600160a01b03163314610fa85760405162461bcd60e51b815260040161085b90611aa1565b80516108ef90600c906020840190611646565b6008546001600160a01b03163314610fe55760405162461bcd60e51b815260040161085b90611aa1565b80516108ef90600a906020840190611646565b6008546001600160a01b031633146110225760405162461bcd60e51b815260040161085b90611aa1565b6001600160a01b0381166110875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161085b565b610d1781611345565b6008546001600160a01b031633146110ba5760405162461bcd60e51b815260040161085b90611aa1565b6008805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b6000816001111580156110f4575060005482105b8015610683575050600090815260046020526040902054600160e01b161590565b6000818060011161116b5760005481101561116b5760008181526004602052604081205490600160e01b82169003611169575b80600003610f77575060001901600081815260046020526040902054611148565b505b604051636f96cda160e11b815260040160405180910390fd5b600061118f82611115565b9050836001600160a01b0316816001600160a01b0316146111c25760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806111e057506111e085336105a9565b806111fb5750336111f08461071b565b6001600160a01b0316145b90508061121b57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661124257604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b87178117909155831690036112e3576001830160008181526004602052604081205490036112e15760005481146112e15760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6108ef8282604051806020016040528060008152506114d2565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906113cc903390899088908890600401611be6565b6020604051808303816000875af1925050508015611407575060408051601f3d908101601f1916820190925261140491810190611c23565b60015b611465573d808015611435576040519150601f19603f3d011682016040523d82523d6000602084013e61143a565b606091505b50805160000361145d576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b604080516080810191829052607f0190826030600a8206018353600a90045b80156114c057600183039250600a81066030018353600a90046114a2565b50819003601f19909101908152919050565b6000546001600160a01b0384166114fb57604051622e076360e81b815260040160405180910390fd5b8260000361151c5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b156115f1575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46115ba6000878480600101955087611397565b6115d7576040516368d2bf6b60e11b815260040160405180910390fd5b80821061156f5782600054146115ec57600080fd5b611636565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a48082106115f2575b506000908155610df39085838684565b82805461165290611a67565b90600052602060002090601f01602090048101928261167457600085556116ba565b82601f1061168d57805160ff19168380011785556116ba565b828001600101855582156116ba579182015b828111156116ba57825182559160200191906001019061169f565b506116c69291506116ca565b5090565b5b808211156116c657600081556001016116cb565b6001600160e01b031981168114610d1757600080fd5b60006020828403121561170757600080fd5b8135610f77816116df565b60005b8381101561172d578181015183820152602001611715565b83811115610df35750506000910152565b60008151808452611756816020860160208601611712565b601f01601f19169290920160200192915050565b602081526000610f77602083018461173e565b60006020828403121561178f57600080fd5b5035919050565b80356001600160a01b03811681146117ad57600080fd5b919050565b600080604083850312156117c557600080fd5b6117ce83611796565b946020939093013593505050565b6000602082840312156117ee57600080fd5b813567ffffffffffffffff81168114610f7757600080fd5b60008060006060848603121561181b57600080fd5b61182484611796565b925061183260208501611796565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561187357611873611842565b604051601f8501601f19908116603f0116810190828211818310171561189b5761189b611842565b816040528093508581528686860111156118b457600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156118e057600080fd5b813567ffffffffffffffff8111156118f757600080fd5b8201601f8101841361190857600080fd5b61147b84823560208401611858565b60006020828403121561192957600080fd5b610f7782611796565b60006020828403121561194457600080fd5b813561ffff81168114610f7757600080fd5b6000806040838503121561196957600080fd5b61197283611796565b91506020830135801515811461198757600080fd5b809150509250929050565b600080600080608085870312156119a857600080fd5b6119b185611796565b93506119bf60208601611796565b925060408501359150606085013567ffffffffffffffff8111156119e257600080fd5b8501601f810187136119f357600080fd5b611a0287823560208401611858565b91505092959194509250565b60008060408385031215611a2157600080fd5b611a2a83611796565b9150611a3860208401611796565b90509250929050565b600060208284031215611a5357600080fd5b813563ffffffff81168114610f7757600080fd5b600181811c90821680611a7b57607f821691505b602082108103611a9b57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115611aff57611aff611ad6565b500190565b6000816000190483118215151615611b1e57611b1e611ad6565b500290565b600084516020611b368285838a01611712565b855191840191611b498184848a01611712565b8554920191600090600181811c9080831680611b6657607f831692505b8583108103611b8357634e487b7160e01b85526022600452602485fd5b808015611b975760018114611ba857611bd5565b60ff19851688528388019550611bd5565b60008b81526020902060005b85811015611bcd5781548a820152908401908801611bb4565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611c199083018461173e565b9695505050505050565b600060208284031215611c3557600080fd5b8151610f77816116df56fea264697066735822122070e7413a67c154ea950dfa0106b574061ea188550de78c7711a7fd58e9cec08864736f6c634300080d0033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f516d6433546f4b6d39754e344c5759525572575932504c626466616a385a7372356254676a646e726575684642522f6d657461646174612e6a736f6e0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _notRevealedURI (string): ipfs://Qmd3ToKm9uN4LWYRUrWY2PLbdfaj8Zsr5bTgjdnreuhFBR/metadata.json

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [2] : 697066733a2f2f516d6433546f4b6d39754e344c5759525572575932504c6264
Arg [3] : 66616a385a7372356254676a646e726575684642522f6d657461646174612e6a
Arg [4] : 736f6e0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

41299:2664:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16019:615;;;;;;;;;;-1:-1:-1;16019:615:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;16019:615:0;;;;;;;;21032:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23100:204::-;;;;;;;;;;-1:-1:-1;23100:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;23100:204:0;1528:203:1;22560:474:0;;;;;;;;;;-1:-1:-1;22560:474:0;;;;;:::i;:::-;;:::i;:::-;;15073:315;;;;;;;;;;-1:-1:-1;42894:1:0;15339:12;15126:7;15323:13;:28;-1:-1:-1;;15323:46:0;15073:315;;;2319:25:1;;;2307:2;2292:18;15073:315:0;2173:177:1;41515:22:0;;;;;;;;;;-1:-1:-1;41515:22:0;;;;-1:-1:-1;;;41515:22:0;;;;;;43751:91;;;;;;;;;;-1:-1:-1;43751:91:0;;;;;:::i;:::-;;:::i;23986:170::-;;;;;;;;;;-1:-1:-1;23986:170:0;;;;;:::i;:::-;;:::i;42940:110::-;;;;;;;;;;-1:-1:-1;42940:110:0;;;;;:::i;:::-;;:::i;24227:185::-;;;;;;;;;;-1:-1:-1;24227:185:0;;;;;:::i;:::-;;:::i;43850:110::-;;;;;;;;;;-1:-1:-1;43850:110:0;;;;;:::i;:::-;;:::i;43179:99::-;;;;;;;;;;-1:-1:-1;43179:99:0;;;;;:::i;:::-;;:::i;20821:144::-;;;;;;;;;;-1:-1:-1;20821:144:0;;;;;:::i;:::-;;:::i;16698:224::-;;;;;;;;;;-1:-1:-1;16698:224:0;;;;;:::i;:::-;;:::i;2384:103::-;;;;;;;;;;;;;:::i;43622:121::-;;;;;;;;;;-1:-1:-1;43622:121:0;;;;;:::i;:::-;;:::i;41404:35::-;;;;;;;;;;-1:-1:-1;41404:35:0;;;;-1:-1:-1;;;41404:35:0;;;;;;;;;4844:6:1;4832:19;;;4814:38;;4802:2;4787:18;41404:35:0;4670:188:1;43417:88:0;;;;;;;;;;;;;:::i;1733:87::-;;;;;;;;;;-1:-1:-1;1806:6:0;;-1:-1:-1;;;;;1806:6:0;1733:87;;21201:104;;;;;;;;;;;;;:::i;41446:32::-;;;;;;;;;;-1:-1:-1;41446:32:0;;;;;;;;;;;5037:18:1;5025:31;;;5007:50;;4995:2;4980:18;41446:32:0;4863:200:1;41855:605:0;;;;;;:::i;:::-;;:::i;23376:308::-;;;;;;;;;;-1:-1:-1;23376:308:0;;;;;:::i;:::-;;:::i;24483:396::-;;;;;;;;;;-1:-1:-1;24483:396:0;;;;;:::i;:::-;;:::i;42468:335::-;;;;;;;;;;-1:-1:-1;42468:335:0;;;;;:::i;:::-;;:::i;41367:30::-;;;;;;;;;;-1:-1:-1;41367:30:0;;;;-1:-1:-1;;;41367:30:0;;;;;;;;;6266:10:1;6254:23;;;6236:42;;6224:2;6209:18;41367:30:0;6092:192:1;43286:123:0;;;;;;;;;;-1:-1:-1;43286:123:0;;;;;:::i;:::-;;:::i;23755:164::-;;;;;;;;;;-1:-1:-1;23755:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;23876:25:0;;;23852:4;23876:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23755:164;43058:113;;;;;;;;;;-1:-1:-1;43058:113:0;;;;;:::i;:::-;;:::i;2642:201::-;;;;;;;;;;-1:-1:-1;2642:201:0;;;;;:::i;:::-;;:::i;43513:101::-;;;;;;;;;;-1:-1:-1;43513:101:0;;;;;:::i;:::-;;:::i;16019:615::-;16104:4;-1:-1:-1;;;;;;;;;16404:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;16481:25:0;;;16404:102;:179;;;-1:-1:-1;;;;;;;;;;16558:25:0;;;16404:179;16384:199;16019:615;-1:-1:-1;;16019:615:0:o;21032:100::-;21086:13;21119:5;21112:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21032:100;:::o;23100:204::-;23168:7;23193:16;23201:7;23193;:16::i;:::-;23188:64;;23218:34;;-1:-1:-1;;;23218:34:0;;;;;;;;;;;23188:64;-1:-1:-1;23272:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23272:24:0;;23100:204::o;22560:474::-;22633:13;22665:27;22684:7;22665:18;:27::i;:::-;22633:61;;22715:5;-1:-1:-1;;;;;22709:11:0;:2;-1:-1:-1;;;;;22709:11:0;;22705:48;;22729:24;;-1:-1:-1;;;22729:24:0;;;;;;;;;;;22705:48;39203:10;-1:-1:-1;;;;;22770:28:0;;;22766:175;;22818:44;22835:5;39203:10;23755:164;:::i;22818:44::-;22813:128;;22890:35;;-1:-1:-1;;;22890:35:0;;;;;;;;;;;22813:128;22953:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;22953:29:0;-1:-1:-1;;;;;22953:29:0;;;;;;;;;22998:28;;22953:24;;22998:28;;;;;;;22622:412;22560:474;;:::o;43751:91::-;1806:6;;-1:-1:-1;;;;;1806:6:0;39203:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;;;;;;;;;43817:5:::1;:17:::0;;-1:-1:-1;;43817:17:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;43751:91::o;23986:170::-;24120:28;24130:4;24136:2;24140:7;24120:9;:28::i;:::-;23986:170;;;:::o;42940:110::-;1806:6;;-1:-1:-1;;;;;1806:6:0;39203:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;43005:37:::1;::::0;43013:10:::1;::::0;43005:37;::::1;;;::::0;43034:7;;43005:37:::1;::::0;;;43034:7;43013:10;43005:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;42940:110:::0;:::o;24227:185::-;24365:39;24382:4;24388:2;24392:7;24365:39;;;;;;;;;;;;:16;:39::i;43850:110::-;1806:6;;-1:-1:-1;;;;;1806:6:0;39203:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;43929:23:::1;43939:3;43944:7;43929:9;:23::i;43179:99::-:0;1806:6;;-1:-1:-1;;;;;1806:6:0;39203:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;43252:18;;::::1;::::0;:8:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;20821:144::-:0;20885:7;20928:27;20947:7;20928:18;:27::i;16698:224::-;16762:7;-1:-1:-1;;;;;16786:19:0;;16782:60;;16814:28;;-1:-1:-1;;;16814:28:0;;;;;;;;;;;16782:60;-1:-1:-1;;;;;;16860:25:0;;;;;:18;:25;;;;;;12037:13;16860:54;;16698:224::o;2384:103::-;1806:6;;-1:-1:-1;;;;;1806:6:0;39203:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;2449:30:::1;2476:1;2449:18;:30::i;:::-;2384:103::o:0;43622:121::-;1806:6;;-1:-1:-1;;;;;1806:6:0;39203:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;43703:16:::1;:32:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;43703:32:0::1;-1:-1:-1::0;;;;43703:32:0;;::::1;::::0;;;::::1;::::0;;43622:121::o;43417:88::-;1806:6;;-1:-1:-1;;;;;1806:6:0;39203:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;43487:10:::1;::::0;;-1:-1:-1;;43473:24:0;::::1;-1:-1:-1::0;;;43487:10:0;;;::::1;;;43486:11;43473:24:::0;;::::1;;::::0;;43417:88::o;21201:104::-;21257:13;21290:7;21283:14;;;;;:::i;41855:605::-;41923:10;;-1:-1:-1;;;41923:10:0;;;;41915:46;;;;-1:-1:-1;;;41915:46:0;;7783:2:1;41915:46:0;;;7765:21:1;7822:2;7802:18;;;7795:30;7861:25;7841:18;;;7834:53;7904:18;;41915:46:0;7581:347:1;41915:46:0;41980:9;41993:10;41980:23;41972:67;;;;-1:-1:-1;;;41972:67:0;;8135:2:1;41972:67:0;;;8117:21:1;8174:2;8154:18;;;8147:30;8213:33;8193:18;;;8186:61;8264:18;;41972:67:0;7933:355:1;41972:67:0;42058:8;42070:1;42058:13;:30;;;;42075:8;42087:1;42075:13;42058:30;:48;;;;42092:8;42104:2;42092:14;42058:48;:66;;;;42110:8;42122:2;42110:14;42058:66;42050:93;;;;-1:-1:-1;;;42050:93:0;;8495:2:1;42050:93:0;;;8477:21:1;8534:2;8514:18;;;8507:30;-1:-1:-1;;;8553:18:1;;;8546:44;8607:18;;42050:93:0;8293:338:1;42050:93:0;42190:9;;-1:-1:-1;;;42190:9:0;;;;42178:8;42162:13;42894:1;15339:12;15126:7;15323:13;-1:-1:-1;;15323:28:0;;;:46;;15073:315;42162:13;:24;;;;:::i;:::-;:37;;42154:75;;;;-1:-1:-1;;;42154:75:0;;9103:2:1;42154:75:0;;;9085:21:1;9142:2;9122:18;;;9115:30;9181:27;9161:18;;;9154:55;9226:18;;42154:75:0;8901:349:1;42154:75:0;42284:16;;-1:-1:-1;;;42284:16:0;;;;42272:8;42248:21;42258:10;42248:9;:21::i;:::-;:32;;;;:::i;:::-;:52;;42240:95;;;;-1:-1:-1;;;42240:95:0;;9457:2:1;42240:95:0;;;9439:21:1;9496:2;9476:18;;;9469:30;9535:32;9515:18;;;9508:60;9585:18;;42240:95:0;9255:354:1;42240:95:0;42378:5;;42367:16;;42378:5;;42367:8;:16;:::i;:::-;42354:9;:29;;42346:62;;;;-1:-1:-1;;;42346:62:0;;9989:2:1;42346:62:0;;;9971:21:1;10028:2;10008:18;;;10001:30;-1:-1:-1;;;10047:18:1;;;10040:50;10107:18;;42346:62:0;9787:344:1;42346:62:0;42421:31;42431:10;42443:8;42421:9;:31::i;:::-;41855:605;:::o;23376:308::-;39203:10;-1:-1:-1;;;;;23475:31:0;;;23471:61;;23515:17;;-1:-1:-1;;;23515:17:0;;;;;;;;;;;23471:61;39203:10;23545:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;23545:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;23545:60:0;;;;;;;;;;23621:55;;540:41:1;;;23545:49:0;;39203:10;23621:55;;513:18:1;23621:55:0;;;;;;;23376:308;;:::o;24483:396::-;24650:28;24660:4;24666:2;24670:7;24650:9;:28::i;:::-;-1:-1:-1;;;;;24693:14:0;;;:19;24689:183;;24732:56;24763:4;24769:2;24773:7;24782:5;24732:30;:56::i;:::-;24727:145;;24816:40;;-1:-1:-1;;;24816:40:0;;;;;;;;;;;24727:145;24483:396;;;;:::o;42468:335::-;42532:13;42562:16;42570:7;42562;:16::i;:::-;42558:58;;42587:29;;-1:-1:-1;;;42587:29:0;;;;;;;;;;;42558:58;42629:21;42653:8;42629:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42685:7;42679:21;42704:1;42679:26;:116;;42780:15;42679:116;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42732:7;42741:18;42751:7;42741:9;:18::i;:::-;42761:14;42715:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42679:116;42672:123;42468:335;-1:-1:-1;;;42468:335:0:o;43286:123::-;1806:6;;-1:-1:-1;;;;;1806:6:0;39203:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;43371:30;;::::1;::::0;:14:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;43058:113::-:0;1806:6;;-1:-1:-1;;;;;1806:6:0;39203:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;43138:25;;::::1;::::0;:15:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;2642:201::-:0;1806:6;;-1:-1:-1;;;;;1806:6:0;39203:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2731:22:0;::::1;2723:73;;;::::0;-1:-1:-1;;;2723:73:0;;11996:2:1;2723:73:0::1;::::0;::::1;11978:21:1::0;12035:2;12015:18;;;12008:30;12074:34;12054:18;;;12047:62;-1:-1:-1;;;12125:18:1;;;12118:36;12171:19;;2723:73:0::1;11794:402:1::0;2723:73:0::1;2807:28;2826:8;2807:18;:28::i;43513:101::-:0;1806:6;;-1:-1:-1;;;;;1806:6:0;39203:10;1953:23;1945:68;;;;-1:-1:-1;;;1945:68:0;;;;;;;:::i;:::-;43584:9:::1;:22:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;43584:22:0::1;-1:-1:-1::0;;;;43584:22:0;;::::1;::::0;;;::::1;::::0;;43513:101::o;25134:273::-;25191:4;25247:7;42894:1;25228:26;;:66;;;;;25281:13;;25271:7;:23;25228:66;:152;;;;-1:-1:-1;;25332:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;25332:43:0;:48;;25134:273::o;18336:1129::-;18403:7;18438;;42894:1;18487:23;18483:915;;18540:13;;18533:4;:20;18529:869;;;18578:14;18595:23;;;:17;:23;;;;;;;-1:-1:-1;;;18684:23:0;;:28;;18680:699;;19203:113;19210:6;19220:1;19210:11;19203:113;;-1:-1:-1;;;19281:6:0;19263:25;;;;:17;:25;;;;;;19203:113;;18680:699;18555:843;18529:869;19426:31;;-1:-1:-1;;;19426:31:0;;;;;;;;;;;30373:2515;30488:27;30518;30537:7;30518:18;:27::i;:::-;30488:57;;30603:4;-1:-1:-1;;;;;30562:45:0;30578:19;-1:-1:-1;;;;;30562:45:0;;30558:86;;30616:28;;-1:-1:-1;;;30616:28:0;;;;;;;;;;;30558:86;30657:22;39203:10;-1:-1:-1;;;;;30683:27:0;;;;:87;;-1:-1:-1;30727:43:0;30744:4;39203:10;23755:164;:::i;30727:43::-;30683:147;;;-1:-1:-1;39203:10:0;30787:20;30799:7;30787:11;:20::i;:::-;-1:-1:-1;;;;;30787:43:0;;30683:147;30657:174;;30849:17;30844:66;;30875:35;;-1:-1:-1;;;30875:35:0;;;;;;;;;;;30844:66;-1:-1:-1;;;;;30925:16:0;;30921:52;;30950:23;;-1:-1:-1;;;30950:23:0;;;;;;;;;;;30921:52;31102:24;;;;:15;:24;;;;;;;;31095:31;;-1:-1:-1;;;;;;31095:31:0;;;-1:-1:-1;;;;;31494:24:0;;;;;:18;:24;;;;;31492:26;;-1:-1:-1;;31492:26:0;;;31563:22;;;;;;;31561:24;;-1:-1:-1;31561:24:0;;;31856:26;;;:17;:26;;;;;-1:-1:-1;;;31944:15:0;12691:3;31944:41;31902:84;;:128;;31856:174;;;32150:46;;:51;;32146:626;;32254:1;32244:11;;32222:19;32377:30;;;:17;:30;;;;;;:35;;32373:384;;32515:13;;32500:11;:28;32496:242;;32662:30;;;;:17;:30;;;;;:52;;;32496:242;32203:569;32146:626;32819:7;32815:2;-1:-1:-1;;;;;32800:27:0;32809:4;-1:-1:-1;;;;;32800:27:0;;;;;;;;;;;30477:2411;;30373:2515;;;:::o;25491:104::-;25560:27;25570:2;25574:8;25560:27;;;;;;;;;;;;:9;:27::i;3003:191::-;3096:6;;;-1:-1:-1;;;;;3113:17:0;;;-1:-1:-1;;;;;;3113:17:0;;;;;;;3146:40;;3096:6;;;3113:17;3096:6;;3146:40;;3077:16;;3146:40;3066:128;3003:191;:::o;36585:716::-;36769:88;;-1:-1:-1;;;36769:88:0;;36748:4;;-1:-1:-1;;;;;36769:45:0;;;;;:88;;39203:10;;36836:4;;36842:7;;36851:5;;36769:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36769:88:0;;;;;;;;-1:-1:-1;;36769:88:0;;;;;;;;;;;;:::i;:::-;;;36765:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37052:6;:13;37069:1;37052:18;37048:235;;37098:40;;-1:-1:-1;;;37098:40:0;;;;;;;;;;;37048:235;37241:6;37235:13;37226:6;37222:2;37218:15;37211:38;36765:529;-1:-1:-1;;;;;;36928:64:0;-1:-1:-1;;;36928:64:0;;-1:-1:-1;36765:529:0;36585:716;;;;;;:::o;39327:1959::-;39798:4;39792:11;;39805:3;39788:21;;39883:17;;;;40580:11;;;40459:5;40712:2;40726;40716:13;;40708:22;40580:11;40695:36;40767:2;40757:13;;40350:682;40786:4;40350:682;;;40961:1;40956:3;40952:11;40945:18;;41012:2;41006:4;41002:13;40998:2;40994:22;40989:3;40981:36;40882:2;40872:13;;40350:682;;;-1:-1:-1;41074:13:0;;;-1:-1:-1;;41189:12:0;;;41249:19;;;41189:12;39327:1959;-1:-1:-1;39327:1959:0:o;25968:2236::-;26091:20;26114:13;-1:-1:-1;;;;;26142:16:0;;26138:48;;26167:19;;-1:-1:-1;;;26167:19:0;;;;;;;;;;;26138:48;26201:8;26213:1;26201:13;26197:44;;26223:18;;-1:-1:-1;;;26223:18:0;;;;;;;;;;;26197:44;-1:-1:-1;;;;;26790:22:0;;;;;;:18;:22;;;;12174:2;26790:22;;;:70;;26828:31;26816:44;;26790:70;;;27103:31;;;:17;:31;;;;;27196:15;12691:3;27196:41;27154:84;;-1:-1:-1;27274:13:0;;12954:3;27259:56;27154:162;27103:213;;:31;;27397:23;;;;27441:14;:19;27437:635;;27481:313;27512:38;;27537:12;;-1:-1:-1;;;;;27512:38:0;;;27529:1;;27512:38;;27529:1;;27512:38;27578:69;27617:1;27621:2;27625:14;;;;;;27641:5;27578:30;:69::i;:::-;27573:174;;27683:40;;-1:-1:-1;;;27683:40:0;;;;;;;;;;;27573:174;27789:3;27774:12;:18;27481:313;;27875:12;27858:13;;:29;27854:43;;27889:8;;;27854:43;27437:635;;;27938:119;27969:40;;27994:14;;;;;-1:-1:-1;;;;;27969:40:0;;;27986:1;;27969:40;;27986:1;;27969:40;28052:3;28037:12;:18;27938:119;;27437:635;-1:-1:-1;28086:13:0;:28;;;28136:60;;28169:2;28173:12;28187:8;28136:60;:::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;2355:284::-;2413:6;2466:2;2454:9;2445:7;2441:23;2437:32;2434:52;;;2482:1;2479;2472:12;2434:52;2521:9;2508:23;2571:18;2564:5;2560:30;2553:5;2550:41;2540:69;;2605:1;2602;2595:12;2644:328;2721:6;2729;2737;2790:2;2778:9;2769:7;2765:23;2761:32;2758:52;;;2806:1;2803;2796:12;2758:52;2829:29;2848:9;2829:29;:::i;:::-;2819:39;;2877:38;2911:2;2900:9;2896:18;2877:38;:::i;:::-;2867:48;;2962:2;2951:9;2947:18;2934:32;2924:42;;2644:328;;;;;:::o;2977:127::-;3038:10;3033:3;3029:20;3026:1;3019:31;3069:4;3066:1;3059:15;3093:4;3090:1;3083:15;3109:632;3174:5;3204:18;3245:2;3237:6;3234:14;3231:40;;;3251:18;;:::i;:::-;3326:2;3320:9;3294:2;3380:15;;-1:-1:-1;;3376:24:1;;;3402:2;3372:33;3368:42;3356:55;;;3426:18;;;3446:22;;;3423:46;3420:72;;;3472:18;;:::i;:::-;3512:10;3508:2;3501:22;3541:6;3532:15;;3571:6;3563;3556:22;3611:3;3602:6;3597:3;3593:16;3590:25;3587:45;;;3628:1;3625;3618:12;3587:45;3678:6;3673:3;3666:4;3658:6;3654:17;3641:44;3733:1;3726:4;3717:6;3709;3705:19;3701:30;3694:41;;;;3109:632;;;;;:::o;3746:451::-;3815:6;3868:2;3856:9;3847:7;3843:23;3839:32;3836:52;;;3884:1;3881;3874:12;3836:52;3924:9;3911:23;3957:18;3949:6;3946:30;3943:50;;;3989:1;3986;3979:12;3943:50;4012:22;;4065:4;4057:13;;4053:27;-1:-1:-1;4043:55:1;;4094:1;4091;4084:12;4043:55;4117:74;4183:7;4178:2;4165:16;4160:2;4156;4152:11;4117:74;:::i;4202:186::-;4261:6;4314:2;4302:9;4293:7;4289:23;4285:32;4282:52;;;4330:1;4327;4320:12;4282:52;4353:29;4372:9;4353:29;:::i;4393:272::-;4451:6;4504:2;4492:9;4483:7;4479:23;4475:32;4472:52;;;4520:1;4517;4510:12;4472:52;4559:9;4546:23;4609:6;4602:5;4598:18;4591:5;4588:29;4578:57;;4631:1;4628;4621:12;5068:347;5133:6;5141;5194:2;5182:9;5173:7;5169:23;5165:32;5162:52;;;5210:1;5207;5200:12;5162:52;5233:29;5252:9;5233:29;:::i;:::-;5223:39;;5312:2;5301:9;5297:18;5284:32;5359:5;5352:13;5345:21;5338:5;5335:32;5325:60;;5381:1;5378;5371:12;5325:60;5404:5;5394:15;;;5068:347;;;;;:::o;5420:667::-;5515:6;5523;5531;5539;5592:3;5580:9;5571:7;5567:23;5563:33;5560:53;;;5609:1;5606;5599:12;5560:53;5632:29;5651:9;5632:29;:::i;:::-;5622:39;;5680:38;5714:2;5703:9;5699:18;5680:38;:::i;:::-;5670:48;;5765:2;5754:9;5750:18;5737:32;5727:42;;5820:2;5809:9;5805:18;5792:32;5847:18;5839:6;5836:30;5833:50;;;5879:1;5876;5869:12;5833:50;5902:22;;5955:4;5947:13;;5943:27;-1:-1:-1;5933:55:1;;5984:1;5981;5974:12;5933:55;6007:74;6073:7;6068:2;6055:16;6050:2;6046;6042:11;6007:74;:::i;:::-;5997:84;;;5420:667;;;;;;;:::o;6289:260::-;6357:6;6365;6418:2;6406:9;6397:7;6393:23;6389:32;6386:52;;;6434:1;6431;6424:12;6386:52;6457:29;6476:9;6457:29;:::i;:::-;6447:39;;6505:38;6539:2;6528:9;6524:18;6505:38;:::i;:::-;6495:48;;6289:260;;;;;:::o;6554:276::-;6612:6;6665:2;6653:9;6644:7;6640:23;6636:32;6633:52;;;6681:1;6678;6671:12;6633:52;6720:9;6707:23;6770:10;6763:5;6759:22;6752:5;6749:33;6739:61;;6796:1;6793;6786:12;6835:380;6914:1;6910:12;;;;6957;;;6978:61;;7032:4;7024:6;7020:17;7010:27;;6978:61;7085:2;7077:6;7074:14;7054:18;7051:38;7048:161;;7131:10;7126:3;7122:20;7119:1;7112:31;7166:4;7163:1;7156:15;7194:4;7191:1;7184:15;7048:161;;6835:380;;;:::o;7220:356::-;7422:2;7404:21;;;7441:18;;;7434:30;7500:34;7495:2;7480:18;;7473:62;7567:2;7552:18;;7220:356::o;8636:127::-;8697:10;8692:3;8688:20;8685:1;8678:31;8728:4;8725:1;8718:15;8752:4;8749:1;8742:15;8768:128;8808:3;8839:1;8835:6;8832:1;8829:13;8826:39;;;8845:18;;:::i;:::-;-1:-1:-1;8881:9:1;;8768:128::o;9614:168::-;9654:7;9720:1;9716;9712:6;9708:14;9705:1;9702:21;9697:1;9690:9;9683:17;9679:45;9676:71;;;9727:18;;:::i;:::-;-1:-1:-1;9767:9:1;;9614:168::o;10262:1527::-;10486:3;10524:6;10518:13;10550:4;10563:51;10607:6;10602:3;10597:2;10589:6;10585:15;10563:51;:::i;:::-;10677:13;;10636:16;;;;10699:55;10677:13;10636:16;10721:15;;;10699:55;:::i;:::-;10843:13;;10776:20;;;10816:1;;10903;10925:18;;;;10978;;;;11005:93;;11083:4;11073:8;11069:19;11057:31;;11005:93;11146:2;11136:8;11133:16;11113:18;11110:40;11107:167;;-1:-1:-1;;;11173:33:1;;11229:4;11226:1;11219:15;11259:4;11180:3;11247:17;11107:167;11290:18;11317:110;;;;11441:1;11436:328;;;;11283:481;;11317:110;-1:-1:-1;;11352:24:1;;11338:39;;11397:20;;;;-1:-1:-1;11317:110:1;;11436:328;10209:1;10202:14;;;10246:4;10233:18;;11531:1;11545:169;11559:8;11556:1;11553:15;11545:169;;;11641:14;;11626:13;;;11619:37;11684:16;;;;11576:10;;11545:169;;;11549:3;;11745:8;11738:5;11734:20;11727:27;;11283:481;-1:-1:-1;11780:3:1;;10262:1527;-1:-1:-1;;;;;;;;;;;10262:1527:1:o;12201:489::-;-1:-1:-1;;;;;12470:15:1;;;12452:34;;12522:15;;12517:2;12502:18;;12495:43;12569:2;12554:18;;12547:34;;;12617:3;12612:2;12597:18;;12590:31;;;12395:4;;12638:46;;12664:19;;12656:6;12638:46;:::i;:::-;12630:54;12201:489;-1:-1:-1;;;;;;12201:489:1:o;12695:249::-;12764:6;12817:2;12805:9;12796:7;12792:23;12788:32;12785:52;;;12833:1;12830;12823:12;12785:52;12865:9;12859:16;12884:30;12908:5;12884:30;:::i

Swarm Source

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