ETH Price: $2,635.95 (-1.02%)

Token

LaFrenchie (LAF)
 

Overview

Max Total Supply

1,000 LAF

Holders

74

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
3 LAF
0x7412C3542766b69ef61e983DF09f4525974AF68b
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:
LaFrenchie

Compiler Version
v0.8.14+commit.80d49f37

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-28
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

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

// File: erc721a/contracts/ERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


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

// File: contracts/Lafrenchie.sol


pragma solidity ^0.8.14;





contract LaFrenchie is ERC721A, Ownable{
    using Strings for uint256;

    uint256 public constant MAX_SUPPLY = 1000;
    uint256 public constant MAX_PUBLIC_MINT = 3;
    uint256 public constant MAX_WHITELIST_MINT = 3;
    uint256 public constant PUBLIC_SALE_PRICE = 0.0369 ether;
    uint256 public constant WHITELIST_SALE_PRICE = 0.03 ether;

    string private  baseTokenUri;
    string public   placeholderTokenUri;

    //deploy smart contract, toggle WL, toggle WL when done, toggle publicSale 
    //2 days later toggle reveal
    bool public isRevealed;
    bool public pause;
    bool public teamMinted;

    enum Mode {
        TEAM,
        PRESALE,
        PUBLIC,
        FINAL
    }

    Mode public mode = Mode.TEAM;

    bytes32 private merkleRoot;

    mapping(address => uint256) public totalPublicMint;
    mapping(address => uint256) public totalWhitelistMint;

    constructor(bytes32 merkleroot_, string memory placeholderTokenUri_) ERC721A("LaFrenchie", "LAF"){
        merkleRoot = merkleroot_;
        placeholderTokenUri = placeholderTokenUri_;
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "cannot be called by a contract");
        _;
    }

    function finalMint(address to, uint256 _quantity) external onlyOwner {
        require(!pause, "sale is paused");
        require(mode == Mode.FINAL, "final mode is not active");
        require(_quantity <= MAX_SUPPLY - totalSupply(), "beyond max supply");
        _safeMint(to, _quantity);
    }

    function safeMint(uint256 _quantity) external payable callerIsUser {
        require(!pause, "sale is paused");
        require(mode == Mode.PUBLIC, "public sale is not active");
        require((totalSupply() + _quantity) <= MAX_SUPPLY, "beyond max supply");
        require((totalPublicMint[msg.sender] +_quantity) <= MAX_PUBLIC_MINT, "already minted 3 times!");
        require(msg.value >= (PUBLIC_SALE_PRICE * _quantity), "below");

        totalPublicMint[msg.sender] += _quantity;
        _safeMint(msg.sender, _quantity);
    }

    function whitelistMint(bytes32[] memory _merkleProof, uint256 _quantity) external payable callerIsUser {
        require(!pause, "sale is paused");
        require(mode == Mode.PRESALE, "wl sale is not active");
        require((totalSupply() + _quantity) <= MAX_SUPPLY, "Cannot mint beyond max supply");
        require((totalWhitelistMint[msg.sender] + _quantity)  <= MAX_WHITELIST_MINT, "Cannot mint beyond whitelist max mint!");
        require(msg.value == (WHITELIST_SALE_PRICE * _quantity), "payment is below the price");
        //Create leaf node
        bytes32 sender = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, merkleRoot, sender), "you are not whitelisted");

        totalWhitelistMint[msg.sender] += _quantity;
        _safeMint(msg.sender, _quantity);
    }

    function teamMint() external onlyOwner {
        require(!pause, "sale is paused");
        require(mode == Mode.TEAM, "team mint is not active");

        teamMinted = true;
        _safeMint(msg.sender, 10);
    }

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

    //Return uri for certain token
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        if(!isRevealed){
            return bytes(placeholderTokenUri).length > 0 ? string(abi.encodePacked(placeholderTokenUri, tokenId.toString(), ".json")) : "";
        }
        
        return bytes(baseTokenUri).length > 0 ? string(abi.encodePacked(baseTokenUri, tokenId.toString(), ".json")) : "";
    }

    function setTokenUri(string memory _baseTokenUri) external onlyOwner {
        baseTokenUri = _baseTokenUri;
    }

    function setPlaceHolderUri(string memory _placeholderTokenUri) external onlyOwner {
        placeholderTokenUri = _placeholderTokenUri;
    }

    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function getMerkleRoot() external view returns (bytes32){
        return merkleRoot;
    }

    function togglePause() external onlyOwner {
        pause = !pause;
    }

    function toggleReveal() external onlyOwner {
        isRevealed = !isRevealed;
    }

    function setMode(Mode mode_) external onlyOwner {
        mode = mode_;
    }

    function withdraw() external onlyOwner{
        payable(msg.sender).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"merkleroot_","type":"bytes32"},{"internalType":"string","name":"placeholderTokenUri_","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":[],"name":"MAX_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WHITELIST_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"finalMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mode","outputs":[{"internalType":"enum LaFrenchie.Mode","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeholderTokenUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"safeMint","outputs":[],"stateMutability":"payable","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":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum LaFrenchie.Mode","name":"mode_","type":"uint8"}],"name":"setMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_placeholderTokenUri","type":"string"}],"name":"setPlaceHolderUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenUri","type":"string"}],"name":"setTokenUri","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":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleReveal","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":[{"internalType":"address","name":"","type":"address"}],"name":"totalPublicMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalWhitelistMint","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":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600b805463ff000000191690553480156200001e57600080fd5b5060405162002740380380620027408339810160408190526200004191620001e7565b604080518082018252600a8152694c614672656e6368696560b01b6020808301918252835180850190945260038452622620a360e91b9084015281519192916200008e916002916200012b565b508051620000a49060039060208401906200012b565b50506000805550620000b633620000d9565b600c8290558051620000d090600a9060208401906200012b565b5050506200030d565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200013990620002d1565b90600052602060002090601f0160209004810192826200015d5760008555620001a8565b82601f106200017857805160ff1916838001178555620001a8565b82800160010185558215620001a8579182015b82811115620001a85782518255916020019190600101906200018b565b50620001b6929150620001ba565b5090565b5b80821115620001b65760008155600101620001bb565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215620001fb57600080fd5b8251602080850151919350906001600160401b03808211156200021d57600080fd5b818601915086601f8301126200023257600080fd5b815181811115620002475762000247620001d1565b604051601f8201601f19908116603f01168101908382118183101715620002725762000272620001d1565b8160405282815289868487010111156200028b57600080fd5b600093505b82841015620002af578484018601518185018701529285019262000290565b82841115620002c15760008684830101525b8096505050505050509250929050565b600181811c90821680620002e657607f821691505b6020821081036200030757634e487b7160e01b600052602260045260246000fd5b50919050565b612423806200031d6000396000f3fe6080604052600436106102465760003560e01c80635b8ad42911610139578063ad3ec799116100b6578063c08dfd3c1161007a578063c08dfd3c14610510578063c4ae31681461067c578063c87b56dd14610691578063e8b5498d146106b1578063e985e9c5146106d1578063f2fde38b1461071a57600080fd5b8063ad3ec799146105ec578063b0962c531461060c578063b88d4fde1461062c578063ba7a86b81461064c578063bc912e1a1461066157600080fd5b80637cb64759116100fd5780637cb647591461055a5780638456cb591461057a5780638da5cb5b1461059957806395d89b41146105b7578063a22cb465146105cc57600080fd5b80635b8ad429146104db5780636352211e146104f057806365f130971461051057806370a0823114610525578063715018a61461054557600080fd5b806323b872dd116101c75780633ccfd60b1161018b5780633ccfd60b1461046257806342842e0e1461047757806349590657146104975780634cf5f7a4146104ac57806354214f69146104c157600080fd5b806323b872dd146103d85780632904e6d9146103f8578063295a52121461040b57806331c864e81461043957806332cb6b0c1461044c57600080fd5b8063081812fc1161020e578063081812fc1461031a578063095ea7b31461035257806318160ddd146103725780631c16521c1461038b57806321175b4a146103b857600080fd5b806301ffc9a71461024b5780630345e3cb146102805780630675b7c6146102bb57806306fdde03146102dd57806307e89ec0146102ff575b600080fd5b34801561025757600080fd5b5061026b610266366004611d39565b61073a565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102ad61029b366004611d72565b600e6020526000908152604090205481565b604051908152602001610277565b3480156102c757600080fd5b506102db6102d6366004611e2c565b61078c565b005b3480156102e957600080fd5b506102f26107d6565b6040516102779190611ecd565b34801561030b57600080fd5b506102ad6683185ac036400081565b34801561032657600080fd5b5061033a610335366004611ee0565b610868565b6040516001600160a01b039091168152602001610277565b34801561035e57600080fd5b506102db61036d366004611ef9565b6108ac565b34801561037e57600080fd5b50600154600054036102ad565b34801561039757600080fd5b506102ad6103a6366004611d72565b600d6020526000908152604090205481565b3480156103c457600080fd5b506102db6103d3366004611f23565b61097e565b3480156103e457600080fd5b506102db6103f3366004611f44565b6109d5565b6102db610406366004611f80565b6109e5565b34801561041757600080fd5b50600b5461042c906301000000900460ff1681565b6040516102779190612042565b6102db610447366004611ee0565b610cc5565b34801561045857600080fd5b506102ad6103e881565b34801561046e57600080fd5b506102db610eec565b34801561048357600080fd5b506102db610492366004611f44565b610f42565b3480156104a357600080fd5b50600c546102ad565b3480156104b857600080fd5b506102f2610f5d565b3480156104cd57600080fd5b50600b5461026b9060ff1681565b3480156104e757600080fd5b506102db610feb565b3480156104fc57600080fd5b5061033a61050b366004611ee0565b611029565b34801561051c57600080fd5b506102ad600381565b34801561053157600080fd5b506102ad610540366004611d72565b611034565b34801561055157600080fd5b506102db611083565b34801561056657600080fd5b506102db610575366004611ee0565b6110b9565b34801561058657600080fd5b50600b5461026b90610100900460ff1681565b3480156105a557600080fd5b506008546001600160a01b031661033a565b3480156105c357600080fd5b506102f26110e8565b3480156105d857600080fd5b506102db6105e736600461206a565b6110f7565b3480156105f857600080fd5b506102db610607366004611ef9565b61118c565b34801561061857600080fd5b506102db610627366004611e2c565b6112ab565b34801561063857600080fd5b506102db6106473660046120a6565b6112e8565b34801561065857600080fd5b506102db611332565b34801561066d57600080fd5b506102ad666a94d74f43000081565b34801561068857600080fd5b506102db61140d565b34801561069d57600080fd5b506102f26106ac366004611ee0565b611454565b3480156106bd57600080fd5b50600b5461026b9062010000900460ff1681565b3480156106dd57600080fd5b5061026b6106ec366004612122565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561072657600080fd5b506102db610735366004611d72565b61155f565b60006301ffc9a760e01b6001600160e01b03198316148061076b57506380ac58cd60e01b6001600160e01b03198316145b806107865750635b5e139f60e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146107bf5760405162461bcd60e51b81526004016107b690612155565b60405180910390fd5b80516107d2906009906020840190611c8a565b5050565b6060600280546107e59061218a565b80601f01602080910402602001604051908101604052809291908181526020018280546108119061218a565b801561085e5780601f106108335761010080835404028352916020019161085e565b820191906000526020600020905b81548152906001019060200180831161084157829003601f168201915b5050505050905090565b6000610873826115f7565b610890576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108b78261161e565b9050806001600160a01b0316836001600160a01b0316036108eb5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146109225761090581336106ec565b610922576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b031633146109a85760405162461bcd60e51b81526004016107b690612155565b600b805482919063ff000000191663010000008360038111156109cd576109cd61202c565b021790555050565b6109e083838361168c565b505050565b323314610a345760405162461bcd60e51b815260206004820152601e60248201527f63616e6e6f742062652063616c6c6564206279206120636f6e7472616374000060448201526064016107b6565b600b54610100900460ff1615610a5c5760405162461bcd60e51b81526004016107b6906121c4565b6001600b546301000000900460ff166003811115610a7c57610a7c61202c565b14610ac15760405162461bcd60e51b8152602060048201526015602482015274776c2073616c65206973206e6f742061637469766560581b60448201526064016107b6565b6103e881610ad26001546000540390565b610adc9190612202565b1115610b2a5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74206d696e74206265796f6e64206d617820737570706c7900000060448201526064016107b6565b336000908152600e6020526040902054600390610b48908390612202565b1115610ba55760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f74206d696e74206265796f6e642077686974656c697374206d6178604482015265206d696e742160d01b60648201526084016107b6565b610bb681666a94d74f43000061221a565b3414610c045760405162461bcd60e51b815260206004820152601a60248201527f7061796d656e742069732062656c6f772074686520707269636500000000000060448201526064016107b6565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610c4a83600c5483611833565b610c965760405162461bcd60e51b815260206004820152601760248201527f796f7520617265206e6f742077686974656c697374656400000000000000000060448201526064016107b6565b336000908152600e602052604081208054849290610cb5908490612202565b909155506109e090503383611849565b323314610d145760405162461bcd60e51b815260206004820152601e60248201527f63616e6e6f742062652063616c6c6564206279206120636f6e7472616374000060448201526064016107b6565b600b54610100900460ff1615610d3c5760405162461bcd60e51b81526004016107b6906121c4565b6002600b546301000000900460ff166003811115610d5c57610d5c61202c565b14610da95760405162461bcd60e51b815260206004820152601960248201527f7075626c69632073616c65206973206e6f74206163746976650000000000000060448201526064016107b6565b6103e881610dba6001546000540390565b610dc49190612202565b1115610e065760405162461bcd60e51b81526020600482015260116024820152706265796f6e64206d617820737570706c7960781b60448201526064016107b6565b336000908152600d6020526040902054600390610e24908390612202565b1115610e725760405162461bcd60e51b815260206004820152601760248201527f616c7265616479206d696e74656420332074696d65732100000000000000000060448201526064016107b6565b610e83816683185ac036400061221a565b341015610eba5760405162461bcd60e51b815260206004820152600560248201526462656c6f7760d81b60448201526064016107b6565b336000908152600d602052604081208054839290610ed9908490612202565b90915550610ee990503382611849565b50565b6008546001600160a01b03163314610f165760405162461bcd60e51b81526004016107b690612155565b60405133904780156108fc02916000818181858888f19350505050158015610ee9573d6000803e3d6000fd5b6109e0838383604051806020016040528060008152506112e8565b600a8054610f6a9061218a565b80601f0160208091040260200160405190810160405280929190818152602001828054610f969061218a565b8015610fe35780601f10610fb857610100808354040283529160200191610fe3565b820191906000526020600020905b815481529060010190602001808311610fc657829003601f168201915b505050505081565b6008546001600160a01b031633146110155760405162461bcd60e51b81526004016107b690612155565b600b805460ff19811660ff90911615179055565b60006107868261161e565b60006001600160a01b03821661105d576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146110ad5760405162461bcd60e51b81526004016107b690612155565b6110b76000611863565b565b6008546001600160a01b031633146110e35760405162461bcd60e51b81526004016107b690612155565b600c55565b6060600380546107e59061218a565b336001600160a01b038316036111205760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146111b65760405162461bcd60e51b81526004016107b690612155565b600b54610100900460ff16156111de5760405162461bcd60e51b81526004016107b6906121c4565b6003600b546301000000900460ff1660038111156111fe576111fe61202c565b1461124b5760405162461bcd60e51b815260206004820152601860248201527f66696e616c206d6f6465206973206e6f7420616374697665000000000000000060448201526064016107b6565b6001546000540361125e906103e8612239565b8111156112a15760405162461bcd60e51b81526020600482015260116024820152706265796f6e64206d617820737570706c7960781b60448201526064016107b6565b6107d28282611849565b6008546001600160a01b031633146112d55760405162461bcd60e51b81526004016107b690612155565b80516107d290600a906020840190611c8a565b6112f384848461168c565b6001600160a01b0383163b1561132c5761130f848484846118b5565b61132c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b0316331461135c5760405162461bcd60e51b81526004016107b690612155565b600b54610100900460ff16156113845760405162461bcd60e51b81526004016107b6906121c4565b6000600b546301000000900460ff1660038111156113a4576113a461202c565b146113f15760405162461bcd60e51b815260206004820152601760248201527f7465616d206d696e74206973206e6f742061637469766500000000000000000060448201526064016107b6565b600b805462ff00001916620100001790556110b733600a611849565b6008546001600160a01b031633146114375760405162461bcd60e51b81526004016107b690612155565b600b805461ff001981166101009182900460ff1615909102179055565b606061145f826115f7565b6114c35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107b6565b600b5460ff16611529576000600a80546114dc9061218a565b9050116114f85760405180602001604052806000815250610786565b600a611503836119a1565b60405160200161151492919061226c565b60405160208183030381529060405292915050565b6000600980546115389061218a565b9050116115545760405180602001604052806000815250610786565b6009611503836119a1565b6008546001600160a01b031633146115895760405162461bcd60e51b81526004016107b690612155565b6001600160a01b0381166115ee5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b6565b610ee981611863565b6000805482108015610786575050600090815260046020526040902054600160e01b161590565b6000816000548110156116735760008181526004602052604081205490600160e01b82169003611671575b8060000361166a575060001901600081815260046020526040902054611649565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b60006116978261161e565b9050836001600160a01b0316816001600160a01b0316146116ca5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806116e857506116e885336106ec565b806117035750336116f884610868565b6001600160a01b0316145b90508061172357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661174a57604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b87178117909155831690036117eb576001830160008181526004602052604081205490036117e95760005481146117e95760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6000826118408584611aa2565b14949350505050565b6107d2828260405180602001604052806000815250611b16565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906118ea903390899088908890600401612326565b6020604051808303816000875af1925050508015611925575060408051601f3d908101601f1916820190925261192291810190612363565b60015b611983573d808015611953576040519150601f19603f3d011682016040523d82523d6000602084013e611958565b606091505b50805160000361197b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036119c85750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119f257806119dc81612380565b91506119eb9050600a836123af565b91506119cc565b60008167ffffffffffffffff811115611a0d57611a0d611d8d565b6040519080825280601f01601f191660200182016040528015611a37576020820181803683370190505b5090505b841561199957611a4c600183612239565b9150611a59600a866123c3565b611a64906030612202565b60f81b818381518110611a7957611a796123d7565b60200101906001600160f81b031916908160001a905350611a9b600a866123af565b9450611a3b565b600081815b8451811015611b0e576000858281518110611ac457611ac46123d7565b60200260200101519050808311611aea5760008381526020829052604090209250611afb565b600081815260208490526040902092505b5080611b0681612380565b915050611aa7565b509392505050565b6000546001600160a01b038416611b3f57604051622e076360e81b815260040160405180910390fd5b82600003611b605760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15611c35575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611bfe60008784806001019550876118b5565b611c1b576040516368d2bf6b60e11b815260040160405180910390fd5b808210611bb3578260005414611c3057600080fd5b611c7a565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611c36575b50600090815561132c9085838684565b828054611c969061218a565b90600052602060002090601f016020900481019282611cb85760008555611cfe565b82601f10611cd157805160ff1916838001178555611cfe565b82800160010185558215611cfe579182015b82811115611cfe578251825591602001919060010190611ce3565b50611d0a929150611d0e565b5090565b5b80821115611d0a5760008155600101611d0f565b6001600160e01b031981168114610ee957600080fd5b600060208284031215611d4b57600080fd5b813561166a81611d23565b80356001600160a01b0381168114611d6d57600080fd5b919050565b600060208284031215611d8457600080fd5b61166a82611d56565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611dcc57611dcc611d8d565b604052919050565b600067ffffffffffffffff831115611dee57611dee611d8d565b611e01601f8401601f1916602001611da3565b9050828152838383011115611e1557600080fd5b828260208301376000602084830101529392505050565b600060208284031215611e3e57600080fd5b813567ffffffffffffffff811115611e5557600080fd5b8201601f81018413611e6657600080fd5b61199984823560208401611dd4565b60005b83811015611e90578181015183820152602001611e78565b8381111561132c5750506000910152565b60008151808452611eb9816020860160208601611e75565b601f01601f19169290920160200192915050565b60208152600061166a6020830184611ea1565b600060208284031215611ef257600080fd5b5035919050565b60008060408385031215611f0c57600080fd5b611f1583611d56565b946020939093013593505050565b600060208284031215611f3557600080fd5b81356004811061166a57600080fd5b600080600060608486031215611f5957600080fd5b611f6284611d56565b9250611f7060208501611d56565b9150604084013590509250925092565b60008060408385031215611f9357600080fd5b823567ffffffffffffffff80821115611fab57600080fd5b818501915085601f830112611fbf57600080fd5b8135602082821115611fd357611fd3611d8d565b8160051b9250611fe4818401611da3565b8281529284018101928181019089851115611ffe57600080fd5b948201945b8486101561201c57853582529482019490820190612003565b9997909101359750505050505050565b634e487b7160e01b600052602160045260246000fd5b602081016004831061206457634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561207d57600080fd5b61208683611d56565b91506020830135801515811461209b57600080fd5b809150509250929050565b600080600080608085870312156120bc57600080fd5b6120c585611d56565b93506120d360208601611d56565b925060408501359150606085013567ffffffffffffffff8111156120f657600080fd5b8501601f8101871361210757600080fd5b61211687823560208401611dd4565b91505092959194509250565b6000806040838503121561213557600080fd5b61213e83611d56565b915061214c60208401611d56565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061219e57607f821691505b6020821081036121be57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600e908201526d1cd85b19481a5cc81c185d5cd95960921b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612215576122156121ec565b500190565b6000816000190483118215151615612234576122346121ec565b500290565b60008282101561224b5761224b6121ec565b500390565b60008151612262818560208601611e75565b9290920192915050565b600080845481600182811c91508083168061228857607f831692505b602080841082036122a757634e487b7160e01b86526022600452602486fd5b8180156122bb57600181146122cc576122f9565b60ff198616895284890196506122f9565b60008b81526020902060005b868110156122f15781548b8201529085019083016122d8565b505084890196505b50505050505061231d61230c8286612250565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061235990830184611ea1565b9695505050505050565b60006020828403121561237557600080fd5b815161166a81611d23565b600060018201612392576123926121ec565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826123be576123be612399565b500490565b6000826123d2576123d2612399565b500690565b634e487b7160e01b600052603260045260246000fdfea264697066735822122056bbc36b09cd712bb61c1aafdd8c6f3a88145ece9a4829317dcec47ebf42302a64736f6c634300080e003377d7192a8df1843edefd5349843335d64a1e79ab81f8defbdfc6ae2cedf62f2900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d54315976614b4835424a7a51783254526d7a4b50347069514b66425869444a52714c705a61757065626e62440000000000000000000000

Deployed Bytecode

0x6080604052600436106102465760003560e01c80635b8ad42911610139578063ad3ec799116100b6578063c08dfd3c1161007a578063c08dfd3c14610510578063c4ae31681461067c578063c87b56dd14610691578063e8b5498d146106b1578063e985e9c5146106d1578063f2fde38b1461071a57600080fd5b8063ad3ec799146105ec578063b0962c531461060c578063b88d4fde1461062c578063ba7a86b81461064c578063bc912e1a1461066157600080fd5b80637cb64759116100fd5780637cb647591461055a5780638456cb591461057a5780638da5cb5b1461059957806395d89b41146105b7578063a22cb465146105cc57600080fd5b80635b8ad429146104db5780636352211e146104f057806365f130971461051057806370a0823114610525578063715018a61461054557600080fd5b806323b872dd116101c75780633ccfd60b1161018b5780633ccfd60b1461046257806342842e0e1461047757806349590657146104975780634cf5f7a4146104ac57806354214f69146104c157600080fd5b806323b872dd146103d85780632904e6d9146103f8578063295a52121461040b57806331c864e81461043957806332cb6b0c1461044c57600080fd5b8063081812fc1161020e578063081812fc1461031a578063095ea7b31461035257806318160ddd146103725780631c16521c1461038b57806321175b4a146103b857600080fd5b806301ffc9a71461024b5780630345e3cb146102805780630675b7c6146102bb57806306fdde03146102dd57806307e89ec0146102ff575b600080fd5b34801561025757600080fd5b5061026b610266366004611d39565b61073a565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102ad61029b366004611d72565b600e6020526000908152604090205481565b604051908152602001610277565b3480156102c757600080fd5b506102db6102d6366004611e2c565b61078c565b005b3480156102e957600080fd5b506102f26107d6565b6040516102779190611ecd565b34801561030b57600080fd5b506102ad6683185ac036400081565b34801561032657600080fd5b5061033a610335366004611ee0565b610868565b6040516001600160a01b039091168152602001610277565b34801561035e57600080fd5b506102db61036d366004611ef9565b6108ac565b34801561037e57600080fd5b50600154600054036102ad565b34801561039757600080fd5b506102ad6103a6366004611d72565b600d6020526000908152604090205481565b3480156103c457600080fd5b506102db6103d3366004611f23565b61097e565b3480156103e457600080fd5b506102db6103f3366004611f44565b6109d5565b6102db610406366004611f80565b6109e5565b34801561041757600080fd5b50600b5461042c906301000000900460ff1681565b6040516102779190612042565b6102db610447366004611ee0565b610cc5565b34801561045857600080fd5b506102ad6103e881565b34801561046e57600080fd5b506102db610eec565b34801561048357600080fd5b506102db610492366004611f44565b610f42565b3480156104a357600080fd5b50600c546102ad565b3480156104b857600080fd5b506102f2610f5d565b3480156104cd57600080fd5b50600b5461026b9060ff1681565b3480156104e757600080fd5b506102db610feb565b3480156104fc57600080fd5b5061033a61050b366004611ee0565b611029565b34801561051c57600080fd5b506102ad600381565b34801561053157600080fd5b506102ad610540366004611d72565b611034565b34801561055157600080fd5b506102db611083565b34801561056657600080fd5b506102db610575366004611ee0565b6110b9565b34801561058657600080fd5b50600b5461026b90610100900460ff1681565b3480156105a557600080fd5b506008546001600160a01b031661033a565b3480156105c357600080fd5b506102f26110e8565b3480156105d857600080fd5b506102db6105e736600461206a565b6110f7565b3480156105f857600080fd5b506102db610607366004611ef9565b61118c565b34801561061857600080fd5b506102db610627366004611e2c565b6112ab565b34801561063857600080fd5b506102db6106473660046120a6565b6112e8565b34801561065857600080fd5b506102db611332565b34801561066d57600080fd5b506102ad666a94d74f43000081565b34801561068857600080fd5b506102db61140d565b34801561069d57600080fd5b506102f26106ac366004611ee0565b611454565b3480156106bd57600080fd5b50600b5461026b9062010000900460ff1681565b3480156106dd57600080fd5b5061026b6106ec366004612122565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561072657600080fd5b506102db610735366004611d72565b61155f565b60006301ffc9a760e01b6001600160e01b03198316148061076b57506380ac58cd60e01b6001600160e01b03198316145b806107865750635b5e139f60e01b6001600160e01b03198316145b92915050565b6008546001600160a01b031633146107bf5760405162461bcd60e51b81526004016107b690612155565b60405180910390fd5b80516107d2906009906020840190611c8a565b5050565b6060600280546107e59061218a565b80601f01602080910402602001604051908101604052809291908181526020018280546108119061218a565b801561085e5780601f106108335761010080835404028352916020019161085e565b820191906000526020600020905b81548152906001019060200180831161084157829003601f168201915b5050505050905090565b6000610873826115f7565b610890576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108b78261161e565b9050806001600160a01b0316836001600160a01b0316036108eb5760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b038216146109225761090581336106ec565b610922576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b031633146109a85760405162461bcd60e51b81526004016107b690612155565b600b805482919063ff000000191663010000008360038111156109cd576109cd61202c565b021790555050565b6109e083838361168c565b505050565b323314610a345760405162461bcd60e51b815260206004820152601e60248201527f63616e6e6f742062652063616c6c6564206279206120636f6e7472616374000060448201526064016107b6565b600b54610100900460ff1615610a5c5760405162461bcd60e51b81526004016107b6906121c4565b6001600b546301000000900460ff166003811115610a7c57610a7c61202c565b14610ac15760405162461bcd60e51b8152602060048201526015602482015274776c2073616c65206973206e6f742061637469766560581b60448201526064016107b6565b6103e881610ad26001546000540390565b610adc9190612202565b1115610b2a5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74206d696e74206265796f6e64206d617820737570706c7900000060448201526064016107b6565b336000908152600e6020526040902054600390610b48908390612202565b1115610ba55760405162461bcd60e51b815260206004820152602660248201527f43616e6e6f74206d696e74206265796f6e642077686974656c697374206d6178604482015265206d696e742160d01b60648201526084016107b6565b610bb681666a94d74f43000061221a565b3414610c045760405162461bcd60e51b815260206004820152601a60248201527f7061796d656e742069732062656c6f772074686520707269636500000000000060448201526064016107b6565b6040516bffffffffffffffffffffffff193360601b166020820152600090603401604051602081830303815290604052805190602001209050610c4a83600c5483611833565b610c965760405162461bcd60e51b815260206004820152601760248201527f796f7520617265206e6f742077686974656c697374656400000000000000000060448201526064016107b6565b336000908152600e602052604081208054849290610cb5908490612202565b909155506109e090503383611849565b323314610d145760405162461bcd60e51b815260206004820152601e60248201527f63616e6e6f742062652063616c6c6564206279206120636f6e7472616374000060448201526064016107b6565b600b54610100900460ff1615610d3c5760405162461bcd60e51b81526004016107b6906121c4565b6002600b546301000000900460ff166003811115610d5c57610d5c61202c565b14610da95760405162461bcd60e51b815260206004820152601960248201527f7075626c69632073616c65206973206e6f74206163746976650000000000000060448201526064016107b6565b6103e881610dba6001546000540390565b610dc49190612202565b1115610e065760405162461bcd60e51b81526020600482015260116024820152706265796f6e64206d617820737570706c7960781b60448201526064016107b6565b336000908152600d6020526040902054600390610e24908390612202565b1115610e725760405162461bcd60e51b815260206004820152601760248201527f616c7265616479206d696e74656420332074696d65732100000000000000000060448201526064016107b6565b610e83816683185ac036400061221a565b341015610eba5760405162461bcd60e51b815260206004820152600560248201526462656c6f7760d81b60448201526064016107b6565b336000908152600d602052604081208054839290610ed9908490612202565b90915550610ee990503382611849565b50565b6008546001600160a01b03163314610f165760405162461bcd60e51b81526004016107b690612155565b60405133904780156108fc02916000818181858888f19350505050158015610ee9573d6000803e3d6000fd5b6109e0838383604051806020016040528060008152506112e8565b600a8054610f6a9061218a565b80601f0160208091040260200160405190810160405280929190818152602001828054610f969061218a565b8015610fe35780601f10610fb857610100808354040283529160200191610fe3565b820191906000526020600020905b815481529060010190602001808311610fc657829003601f168201915b505050505081565b6008546001600160a01b031633146110155760405162461bcd60e51b81526004016107b690612155565b600b805460ff19811660ff90911615179055565b60006107868261161e565b60006001600160a01b03821661105d576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6008546001600160a01b031633146110ad5760405162461bcd60e51b81526004016107b690612155565b6110b76000611863565b565b6008546001600160a01b031633146110e35760405162461bcd60e51b81526004016107b690612155565b600c55565b6060600380546107e59061218a565b336001600160a01b038316036111205760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6008546001600160a01b031633146111b65760405162461bcd60e51b81526004016107b690612155565b600b54610100900460ff16156111de5760405162461bcd60e51b81526004016107b6906121c4565b6003600b546301000000900460ff1660038111156111fe576111fe61202c565b1461124b5760405162461bcd60e51b815260206004820152601860248201527f66696e616c206d6f6465206973206e6f7420616374697665000000000000000060448201526064016107b6565b6001546000540361125e906103e8612239565b8111156112a15760405162461bcd60e51b81526020600482015260116024820152706265796f6e64206d617820737570706c7960781b60448201526064016107b6565b6107d28282611849565b6008546001600160a01b031633146112d55760405162461bcd60e51b81526004016107b690612155565b80516107d290600a906020840190611c8a565b6112f384848461168c565b6001600160a01b0383163b1561132c5761130f848484846118b5565b61132c576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b0316331461135c5760405162461bcd60e51b81526004016107b690612155565b600b54610100900460ff16156113845760405162461bcd60e51b81526004016107b6906121c4565b6000600b546301000000900460ff1660038111156113a4576113a461202c565b146113f15760405162461bcd60e51b815260206004820152601760248201527f7465616d206d696e74206973206e6f742061637469766500000000000000000060448201526064016107b6565b600b805462ff00001916620100001790556110b733600a611849565b6008546001600160a01b031633146114375760405162461bcd60e51b81526004016107b690612155565b600b805461ff001981166101009182900460ff1615909102179055565b606061145f826115f7565b6114c35760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016107b6565b600b5460ff16611529576000600a80546114dc9061218a565b9050116114f85760405180602001604052806000815250610786565b600a611503836119a1565b60405160200161151492919061226c565b60405160208183030381529060405292915050565b6000600980546115389061218a565b9050116115545760405180602001604052806000815250610786565b6009611503836119a1565b6008546001600160a01b031633146115895760405162461bcd60e51b81526004016107b690612155565b6001600160a01b0381166115ee5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107b6565b610ee981611863565b6000805482108015610786575050600090815260046020526040902054600160e01b161590565b6000816000548110156116735760008181526004602052604081205490600160e01b82169003611671575b8060000361166a575060001901600081815260046020526040902054611649565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b60006116978261161e565b9050836001600160a01b0316816001600160a01b0316146116ca5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b03861614806116e857506116e885336106ec565b806117035750336116f884610868565b6001600160a01b0316145b90508061172357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03841661174a57604051633a954ecd60e21b815260040160405180910390fd5b600083815260066020908152604080832080546001600160a01b03191690556001600160a01b038881168452600583528184208054600019019055871683528083208054600101905585835260049091528120600160e11b4260a01b87178117909155831690036117eb576001830160008181526004602052604081205490036117e95760005481146117e95760008181526004602052604090208390555b505b82846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050505050565b6000826118408584611aa2565b14949350505050565b6107d2828260405180602001604052806000815250611b16565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906118ea903390899088908890600401612326565b6020604051808303816000875af1925050508015611925575060408051601f3d908101601f1916820190925261192291810190612363565b60015b611983573d808015611953576040519150601f19603f3d011682016040523d82523d6000602084013e611958565b606091505b50805160000361197b576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036119c85750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119f257806119dc81612380565b91506119eb9050600a836123af565b91506119cc565b60008167ffffffffffffffff811115611a0d57611a0d611d8d565b6040519080825280601f01601f191660200182016040528015611a37576020820181803683370190505b5090505b841561199957611a4c600183612239565b9150611a59600a866123c3565b611a64906030612202565b60f81b818381518110611a7957611a796123d7565b60200101906001600160f81b031916908160001a905350611a9b600a866123af565b9450611a3b565b600081815b8451811015611b0e576000858281518110611ac457611ac46123d7565b60200260200101519050808311611aea5760008381526020829052604090209250611afb565b600081815260208490526040902092505b5080611b0681612380565b915050611aa7565b509392505050565b6000546001600160a01b038416611b3f57604051622e076360e81b815260040160405180910390fd5b82600003611b605760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03841660008181526005602090815260408083208054680100000000000000018902019055848352600490915290204260a01b86176001861460e11b1790558190818501903b15611c35575b60405182906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4611bfe60008784806001019550876118b5565b611c1b576040516368d2bf6b60e11b815260040160405180910390fd5b808210611bb3578260005414611c3057600080fd5b611c7a565b5b6040516001830192906001600160a01b038816906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808210611c36575b50600090815561132c9085838684565b828054611c969061218a565b90600052602060002090601f016020900481019282611cb85760008555611cfe565b82601f10611cd157805160ff1916838001178555611cfe565b82800160010185558215611cfe579182015b82811115611cfe578251825591602001919060010190611ce3565b50611d0a929150611d0e565b5090565b5b80821115611d0a5760008155600101611d0f565b6001600160e01b031981168114610ee957600080fd5b600060208284031215611d4b57600080fd5b813561166a81611d23565b80356001600160a01b0381168114611d6d57600080fd5b919050565b600060208284031215611d8457600080fd5b61166a82611d56565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611dcc57611dcc611d8d565b604052919050565b600067ffffffffffffffff831115611dee57611dee611d8d565b611e01601f8401601f1916602001611da3565b9050828152838383011115611e1557600080fd5b828260208301376000602084830101529392505050565b600060208284031215611e3e57600080fd5b813567ffffffffffffffff811115611e5557600080fd5b8201601f81018413611e6657600080fd5b61199984823560208401611dd4565b60005b83811015611e90578181015183820152602001611e78565b8381111561132c5750506000910152565b60008151808452611eb9816020860160208601611e75565b601f01601f19169290920160200192915050565b60208152600061166a6020830184611ea1565b600060208284031215611ef257600080fd5b5035919050565b60008060408385031215611f0c57600080fd5b611f1583611d56565b946020939093013593505050565b600060208284031215611f3557600080fd5b81356004811061166a57600080fd5b600080600060608486031215611f5957600080fd5b611f6284611d56565b9250611f7060208501611d56565b9150604084013590509250925092565b60008060408385031215611f9357600080fd5b823567ffffffffffffffff80821115611fab57600080fd5b818501915085601f830112611fbf57600080fd5b8135602082821115611fd357611fd3611d8d565b8160051b9250611fe4818401611da3565b8281529284018101928181019089851115611ffe57600080fd5b948201945b8486101561201c57853582529482019490820190612003565b9997909101359750505050505050565b634e487b7160e01b600052602160045260246000fd5b602081016004831061206457634e487b7160e01b600052602160045260246000fd5b91905290565b6000806040838503121561207d57600080fd5b61208683611d56565b91506020830135801515811461209b57600080fd5b809150509250929050565b600080600080608085870312156120bc57600080fd5b6120c585611d56565b93506120d360208601611d56565b925060408501359150606085013567ffffffffffffffff8111156120f657600080fd5b8501601f8101871361210757600080fd5b61211687823560208401611dd4565b91505092959194509250565b6000806040838503121561213557600080fd5b61213e83611d56565b915061214c60208401611d56565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061219e57607f821691505b6020821081036121be57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600e908201526d1cd85b19481a5cc81c185d5cd95960921b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008219821115612215576122156121ec565b500190565b6000816000190483118215151615612234576122346121ec565b500290565b60008282101561224b5761224b6121ec565b500390565b60008151612262818560208601611e75565b9290920192915050565b600080845481600182811c91508083168061228857607f831692505b602080841082036122a757634e487b7160e01b86526022600452602486fd5b8180156122bb57600181146122cc576122f9565b60ff198616895284890196506122f9565b60008b81526020902060005b868110156122f15781548b8201529085019083016122d8565b505084890196505b50505050505061231d61230c8286612250565b64173539b7b760d91b815260050190565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061235990830184611ea1565b9695505050505050565b60006020828403121561237557600080fd5b815161166a81611d23565b600060018201612392576123926121ec565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826123be576123be612399565b500490565b6000826123d2576123d2612399565b500690565b634e487b7160e01b600052603260045260246000fdfea264697066735822122056bbc36b09cd712bb61c1aafdd8c6f3a88145ece9a4829317dcec47ebf42302a64736f6c634300080e0033

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

77d7192a8df1843edefd5349843335d64a1e79ab81f8defbdfc6ae2cedf62f2900000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000035697066733a2f2f516d54315976614b4835424a7a51783254526d7a4b50347069514b66425869444a52714c705a61757065626e62440000000000000000000000

-----Decoded View---------------
Arg [0] : merkleroot_ (bytes32): 0x77d7192a8df1843edefd5349843335d64a1e79ab81f8defbdfc6ae2cedf62f29
Arg [1] : placeholderTokenUri_ (string): ipfs://QmT1YvaKH5BJzQx2TRmzKP4piQKfBXiDJRqLpZaupebnbD

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 77d7192a8df1843edefd5349843335d64a1e79ab81f8defbdfc6ae2cedf62f29
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000035
Arg [3] : 697066733a2f2f516d54315976614b4835424a7a51783254526d7a4b50347069
Arg [4] : 514b66425869444a52714c705a61757065626e62440000000000000000000000


Deployed Bytecode Sourcemap

46687:4707:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21338:615;;;;;;;;;;-1:-1:-1;21338:615:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;21338:615:0;;;;;;;;47545:53;;;;;;;;;;-1:-1:-1;47545:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1107:25:1;;;1095:2;1080:18;47545:53:0;961:177:1;50530:116:0;;;;;;;;;;-1:-1:-1;50530:116:0;;;;;:::i;:::-;;:::i;:::-;;26351:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;46918:56::-;;;;;;;;;;;;46962:12;46918:56;;28419:204;;;;;;;;;;-1:-1:-1;28419:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3545:32:1;;;3527:51;;3515:2;3500:18;28419:204:0;3381:203:1;27879:474:0;;;;;;;;;;-1:-1:-1;27879:474:0;;;;;:::i;:::-;;:::i;20392:315::-;;;;;;;;;;-1:-1:-1;20658:12:0;;20445:7;20642:13;:28;20392:315;;47488:50;;;;;;;;;;-1:-1:-1;47488:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;51196:79;;;;;;;;;;-1:-1:-1;51196:79:0;;;;;:::i;:::-;;:::i;29305:170::-;;;;;;;;;;-1:-1:-1;29305:170:0;;;;;:::i;:::-;;:::i;48799:833::-;;;;;;:::i;:::-;;:::i;47416:28::-;;;;;;;;;;-1:-1:-1;47416:28:0;;;;;;;;;;;;;;;;;;:::i;48247:544::-;;;;;;:::i;:::-;;:::i;46767:41::-;;;;;;;;;;;;46804:4;46767:41;;51283:108;;;;;;;;;;;;;:::i;29546:185::-;;;;;;;;;;-1:-1:-1;29546:185:0;;;;;:::i;:::-;;:::i;50919:92::-;;;;;;;;;;-1:-1:-1;50993:10:0;;50919:92;;47082:35;;;;;;;;;;;;;:::i;47241:22::-;;;;;;;;;;-1:-1:-1;47241:22:0;;;;;;;;51102:86;;;;;;;;;;;;;:::i;26140:144::-;;;;;;;;;;-1:-1:-1;26140:144:0;;;;;:::i;:::-;;:::i;46815:43::-;;;;;;;;;;;;46857:1;46815:43;;22017:224;;;;;;;;;;-1:-1:-1;22017:224:0;;;;;:::i;:::-;;:::i;4763:103::-;;;;;;;;;;;;;:::i;50805:106::-;;;;;;;;;;-1:-1:-1;50805:106:0;;;;;:::i;:::-;;:::i;47270:17::-;;;;;;;;;;-1:-1:-1;47270:17:0;;;;;;;;;;;4112:87;;;;;;;;;;-1:-1:-1;4185:6:0;;-1:-1:-1;;;;;4185:6:0;4112:87;;26520:104;;;;;;;;;;;;;:::i;28695:308::-;;;;;;;;;;-1:-1:-1;28695:308:0;;;;;:::i;:::-;;:::i;47937:302::-;;;;;;;;;;-1:-1:-1;47937:302:0;;;;;:::i;:::-;;:::i;50654:143::-;;;;;;;;;;-1:-1:-1;50654:143:0;;;;;:::i;:::-;;:::i;29802:396::-;;;;;;;;;;-1:-1:-1;29802:396:0;;;;;:::i;:::-;;:::i;49640:221::-;;;;;;;;;;;;;:::i;46981:57::-;;;;;;;;;;;;47028:10;46981:57;;51019:75;;;;;;;;;;;;;:::i;50026:496::-;;;;;;;;;;-1:-1:-1;50026:496:0;;;;;:::i;:::-;;:::i;47294:22::-;;;;;;;;;;-1:-1:-1;47294:22:0;;;;;;;;;;;29074:164;;;;;;;;;;-1:-1:-1;29074:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29195:25:0;;;29171:4;29195:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29074:164;5021:201;;;;;;;;;;-1:-1:-1;5021:201:0;;;;;:::i;:::-;;:::i;21338:615::-;21423:4;-1:-1:-1;;;;;;;;;21723:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;21800:25:0;;;21723:102;:179;;;-1:-1:-1;;;;;;;;;;21877:25:0;;;21723:179;21703:199;21338:615;-1:-1:-1;;21338:615:0:o;50530:116::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;;;;;;;;;50610:28;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;:::-;;50530:116:::0;:::o;26351:100::-;26405:13;26438:5;26431:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26351:100;:::o;28419:204::-;28487:7;28512:16;28520:7;28512;:16::i;:::-;28507:64;;28537:34;;-1:-1:-1;;;28537:34:0;;;;;;;;;;;28507:64;-1:-1:-1;28591:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28591:24:0;;28419:204::o;27879:474::-;27952:13;27984:27;28003:7;27984:18;:27::i;:::-;27952:61;;28034:5;-1:-1:-1;;;;;28028:11:0;:2;-1:-1:-1;;;;;28028:11:0;;28024:48;;28048:24;;-1:-1:-1;;;28048:24:0;;;;;;;;;;;28024:48;2916:10;-1:-1:-1;;;;;28089:28:0;;;28085:175;;28137:44;28154:5;2916:10;29074:164;:::i;28137:44::-;28132:128;;28209:35;;-1:-1:-1;;;28209:35:0;;;;;;;;;;;28132:128;28272:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;28272:29:0;-1:-1:-1;;;;;28272:29:0;;;;;;;;;28317:28;;28272:24;;28317:28;;;;;;;27941:412;27879:474;;:::o;51196:79::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;51255:4:::1;:12:::0;;51262:5;;51255:4;-1:-1:-1;;51255:12:0::1;::::0;51262:5;51255:4:::1;:12:::0;::::1;;;;;;:::i;:::-;;;;;;51196:79:::0;:::o;29305:170::-;29439:28;29449:4;29455:2;29459:7;29439:9;:28::i;:::-;29305:170;;;:::o;48799:833::-;47851:9;47864:10;47851:23;47843:66;;;;-1:-1:-1;;;47843:66:0;;8550:2:1;47843:66:0;;;8532:21:1;8589:2;8569:18;;;8562:30;8628:32;8608:18;;;8601:60;8678:18;;47843:66:0;8348:354:1;47843:66:0;48922:5:::1;::::0;::::1;::::0;::::1;;;48921:6;48913:33;;;;-1:-1:-1::0;;;48913:33:0::1;;;;;;;:::i;:::-;48973:12;48965:4;::::0;;;::::1;;;;:20:::0;::::1;;;;;;:::i;:::-;;48957:54;;;::::0;-1:-1:-1;;;48957:54:0;;9252:2:1;48957:54:0::1;::::0;::::1;9234:21:1::0;9291:2;9271:18;;;9264:30;-1:-1:-1;;;9310:18:1;;;9303:51;9371:18;;48957:54:0::1;9050:345:1::0;48957:54:0::1;46804:4;49047:9;49031:13;20658:12:::0;;20445:7;20642:13;:28;;20392:315;49031:13:::1;:25;;;;:::i;:::-;49030:41;;49022:83;;;::::0;-1:-1:-1;;;49022:83:0;;9867:2:1;49022:83:0::1;::::0;::::1;9849:21:1::0;9906:2;9886:18;;;9879:30;9945:31;9925:18;;;9918:59;9994:18;;49022:83:0::1;9665:353:1::0;49022:83:0::1;49144:10;49125:30;::::0;;;:18:::1;:30;::::0;;;;;46910:1:::1;::::0;49125:42:::1;::::0;49158:9;;49125:42:::1;:::i;:::-;49124:67;;49116:118;;;::::0;-1:-1:-1;;;49116:118:0;;10225:2:1;49116:118:0::1;::::0;::::1;10207:21:1::0;10264:2;10244:18;;;10237:30;10303:34;10283:18;;;10276:62;-1:-1:-1;;;10354:18:1;;;10347:36;10400:19;;49116:118:0::1;10023:402:1::0;49116:118:0::1;49267:32;49290:9:::0;47028:10:::1;49267:32;:::i;:::-;49253:9;:47;49245:86;;;::::0;-1:-1:-1;;;49245:86:0;;10805:2:1;49245:86:0::1;::::0;::::1;10787:21:1::0;10844:2;10824:18;;;10817:30;10883:28;10863:18;;;10856:56;10929:18;;49245:86:0::1;10603:350:1::0;49245:86:0::1;49397:28;::::0;-1:-1:-1;;49414:10:0::1;11107:2:1::0;11103:15;11099:53;49397:28:0::1;::::0;::::1;11087:66:1::0;49370:14:0::1;::::0;11169:12:1;;49397:28:0::1;;;;;;;;;;;;49387:39;;;;;;49370:56;;49445:52;49464:12;49478:10;;49490:6;49445:18;:52::i;:::-;49437:88;;;::::0;-1:-1:-1;;;49437:88:0;;11394:2:1;49437:88:0::1;::::0;::::1;11376:21:1::0;11433:2;11413:18;;;11406:30;11472:25;11452:18;;;11445:53;11515:18;;49437:88:0::1;11192:347:1::0;49437:88:0::1;49557:10;49538:30;::::0;;;:18:::1;:30;::::0;;;;:43;;49572:9;;49538:30;:43:::1;::::0;49572:9;;49538:43:::1;:::i;:::-;::::0;;;-1:-1:-1;49592:32:0::1;::::0;-1:-1:-1;49602:10:0::1;49614:9:::0;49592::::1;:32::i;48247:544::-:0;47851:9;47864:10;47851:23;47843:66;;;;-1:-1:-1;;;47843:66:0;;8550:2:1;47843:66:0;;;8532:21:1;8589:2;8569:18;;;8562:30;8628:32;8608:18;;;8601:60;8678:18;;47843:66:0;8348:354:1;47843:66:0;48334:5:::1;::::0;::::1;::::0;::::1;;;48333:6;48325:33;;;;-1:-1:-1::0;;;48325:33:0::1;;;;;;;:::i;:::-;48385:11;48377:4;::::0;;;::::1;;;;:19:::0;::::1;;;;;;:::i;:::-;;48369:57;;;::::0;-1:-1:-1;;;48369:57:0;;11746:2:1;48369:57:0::1;::::0;::::1;11728:21:1::0;11785:2;11765:18;;;11758:30;11824:27;11804:18;;;11797:55;11869:18;;48369:57:0::1;11544:349:1::0;48369:57:0::1;46804:4;48462:9;48446:13;20658:12:::0;;20445:7;20642:13;:28;;20392:315;48446:13:::1;:25;;;;:::i;:::-;48445:41;;48437:71;;;::::0;-1:-1:-1;;;48437:71:0;;12100:2:1;48437:71:0::1;::::0;::::1;12082:21:1::0;12139:2;12119:18;;;12112:30;-1:-1:-1;;;12158:18:1;;;12151:47;12215:18;;48437:71:0::1;11898:341:1::0;48437:71:0::1;48544:10;48528:27;::::0;;;:15:::1;:27;::::0;;;;;46857:1:::1;::::0;48528:38:::1;::::0;48557:9;;48528:38:::1;:::i;:::-;48527:59;;48519:95;;;::::0;-1:-1:-1;;;48519:95:0;;12446:2:1;48519:95:0::1;::::0;::::1;12428:21:1::0;12485:2;12465:18;;;12458:30;12524:25;12504:18;;;12497:53;12567:18;;48519:95:0::1;12244:347:1::0;48519:95:0::1;48647:29;48667:9:::0;46962:12:::1;48647:29;:::i;:::-;48633:9;:44;;48625:62;;;::::0;-1:-1:-1;;;48625:62:0;;12798:2:1;48625:62:0::1;::::0;::::1;12780:21:1::0;12837:1;12817:18;;;12810:29;-1:-1:-1;;;12855:18:1;;;12848:35;12900:18;;48625:62:0::1;12596:328:1::0;48625:62:0::1;48716:10;48700:27;::::0;;;:15:::1;:27;::::0;;;;:40;;48731:9;;48700:27;:40:::1;::::0;48731:9;;48700:40:::1;:::i;:::-;::::0;;;-1:-1:-1;48751:32:0::1;::::0;-1:-1:-1;48761:10:0::1;48773:9:::0;48751::::1;:32::i;:::-;48247:544:::0;:::o;51283:108::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;51332:51:::1;::::0;51340:10:::1;::::0;51361:21:::1;51332:51:::0;::::1;;;::::0;::::1;::::0;;;51361:21;51340:10;51332:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;29546:185:::0;29684:39;29701:4;29707:2;29711:7;29684:39;;;;;;;;;;;;:16;:39::i;47082:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51102:86::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;51170:10:::1;::::0;;-1:-1:-1;;51156:24:0;::::1;51170:10;::::0;;::::1;51169:11;51156:24;::::0;;51102:86::o;26140:144::-;26204:7;26247:27;26266:7;26247:18;:27::i;22017:224::-;22081:7;-1:-1:-1;;;;;22105:19:0;;22101:60;;22133:28;;-1:-1:-1;;;22133:28:0;;;;;;;;;;;22101:60;-1:-1:-1;;;;;;22179:25:0;;;;;:18;:25;;;;;;17356:13;22179:54;;22017:224::o;4763:103::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;4828:30:::1;4855:1;4828:18;:30::i;:::-;4763:103::o:0;50805:106::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;50879:10:::1;:24:::0;50805:106::o;26520:104::-;26576:13;26609:7;26602:14;;;;;:::i;28695:308::-;2916:10;-1:-1:-1;;;;;28794:31:0;;;28790:61;;28834:17;;-1:-1:-1;;;28834:17:0;;;;;;;;;;;28790:61;2916:10;28864:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;28864:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;28864:60:0;;;;;;;;;;28940:55;;540:41:1;;;28864:49:0;;2916:10;28940:55;;513:18:1;28940:55:0;;;;;;;28695:308;;:::o;47937:302::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;48026:5:::1;::::0;::::1;::::0;::::1;;;48025:6;48017:33;;;;-1:-1:-1::0;;;48017:33:0::1;;;;;;;:::i;:::-;48077:10;48069:4;::::0;;;::::1;;;;:18:::0;::::1;;;;;;:::i;:::-;;48061:55;;;::::0;-1:-1:-1;;;48061:55:0;;13131:2:1;48061:55:0::1;::::0;::::1;13113:21:1::0;13170:2;13150:18;;;13143:30;13209:26;13189:18;;;13182:54;13253:18;;48061:55:0::1;12929:348:1::0;48061:55:0::1;20658:12:::0;;20445:7;20642:13;:28;48148:26:::1;::::0;46804:4:::1;48148:26;:::i;:::-;48135:9;:39;;48127:69;;;::::0;-1:-1:-1;;;48127:69:0;;12100:2:1;48127:69:0::1;::::0;::::1;12082:21:1::0;12139:2;12119:18;;;12112:30;-1:-1:-1;;;12158:18:1;;;12151:47;12215:18;;48127:69:0::1;11898:341:1::0;48127:69:0::1;48207:24;48217:2;48221:9;48207;:24::i;50654:143::-:0;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;50747:42;;::::1;::::0;:19:::1;::::0;:42:::1;::::0;::::1;::::0;::::1;:::i;29802:396::-:0;29969:28;29979:4;29985:2;29989:7;29969:9;:28::i;:::-;-1:-1:-1;;;;;30012:14:0;;;:19;30008:183;;30051:56;30082:4;30088:2;30092:7;30101:5;30051:30;:56::i;:::-;30046:145;;30135:40;;-1:-1:-1;;;30135:40:0;;;;;;;;;;;30046:145;29802:396;;;;:::o;49640:221::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;49699:5:::1;::::0;::::1;::::0;::::1;;;49698:6;49690:33;;;;-1:-1:-1::0;;;49690:33:0::1;;;;;;;:::i;:::-;49750:9;49742:4;::::0;;;::::1;;;;:17:::0;::::1;;;;;;:::i;:::-;;49734:53;;;::::0;-1:-1:-1;;;49734:53:0;;13614:2:1;49734:53:0::1;::::0;::::1;13596:21:1::0;13653:2;13633:18;;;13626:30;13692:25;13672:18;;;13665:53;13735:18;;49734:53:0::1;13412:347:1::0;49734:53:0::1;49800:10;:17:::0;;-1:-1:-1;;49800:17:0::1;::::0;::::1;::::0;;49828:25:::1;49838:10;49850:2;49828:9;:25::i;51019:75::-:0;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;51081:5:::1;::::0;;-1:-1:-1;;51072:14:0;::::1;51081:5;::::0;;;::::1;;;51080:6;51072:14:::0;;::::1;;::::0;;51019:75::o;50026:496::-;50099:13;50133:16;50141:7;50133;:16::i;:::-;50125:76;;;;-1:-1:-1;;;50125:76:0;;13966:2:1;50125:76:0;;;13948:21:1;14005:2;13985:18;;;13978:30;14044:34;14024:18;;;14017:62;-1:-1:-1;;;14095:18:1;;;14088:45;14150:19;;50125:76:0;13764:411:1;50125:76:0;50218:10;;;;50214:168;;50287:1;50257:19;50251:33;;;;;:::i;:::-;;;:37;:119;;;;;;;;;;;;;;;;;50315:19;50336:18;:7;:16;:18::i;:::-;50298:66;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50244:126;50026:496;-1:-1:-1;;50026:496:0:o;50214:168::-;50438:1;50415:12;50409:26;;;;;:::i;:::-;;;:30;:105;;;;;;;;;;;;;;;;;50466:12;50480:18;:7;:16;:18::i;5021:201::-;4185:6;;-1:-1:-1;;;;;4185:6:0;2916:10;4332:23;4324:68;;;;-1:-1:-1;;;4324:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;5110:22:0;::::1;5102:73;;;::::0;-1:-1:-1;;;5102:73:0;;16122:2:1;5102:73:0::1;::::0;::::1;16104:21:1::0;16161:2;16141:18;;;16134:30;16200:34;16180:18;;;16173:62;-1:-1:-1;;;16251:18:1;;;16244:36;16297:19;;5102:73:0::1;15920:402:1::0;5102:73:0::1;5186:28;5205:8;5186:18;:28::i;30453:273::-:0;30510:4;30600:13;;30590:7;:23;30547:152;;;;-1:-1:-1;;30651:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;30651:43:0;:48;;30453:273::o;23655:1129::-;23722:7;23757;23859:13;;23852:4;:20;23848:869;;;23897:14;23914:23;;;:17;:23;;;;;;;-1:-1:-1;;;24003:23:0;;:28;;23999:699;;24522:113;24529:6;24539:1;24529:11;24522:113;;-1:-1:-1;;;24600:6:0;24582:25;;;;:17;:25;;;;;;24522:113;;;24668:6;23655:1129;-1:-1:-1;;;23655:1129:0:o;23999:699::-;23874:843;23848:869;24745:31;;-1:-1:-1;;;24745:31:0;;;;;;;;;;;35692:2515;35807:27;35837;35856:7;35837:18;:27::i;:::-;35807:57;;35922:4;-1:-1:-1;;;;;35881:45:0;35897:19;-1:-1:-1;;;;;35881:45:0;;35877:86;;35935:28;;-1:-1:-1;;;35935:28:0;;;;;;;;;;;35877:86;35976:22;2916:10;-1:-1:-1;;;;;36002:27:0;;;;:87;;-1:-1:-1;36046:43:0;36063:4;2916:10;29074:164;:::i;36046:43::-;36002:147;;;-1:-1:-1;2916:10:0;36106:20;36118:7;36106:11;:20::i;:::-;-1:-1:-1;;;;;36106:43:0;;36002:147;35976:174;;36168:17;36163:66;;36194:35;;-1:-1:-1;;;36194:35:0;;;;;;;;;;;36163:66;-1:-1:-1;;;;;36244:16:0;;36240:52;;36269:23;;-1:-1:-1;;;36269:23:0;;;;;;;;;;;36240:52;36421:24;;;;:15;:24;;;;;;;;36414:31;;-1:-1:-1;;;;;;36414:31:0;;;-1:-1:-1;;;;;36813:24:0;;;;;:18;:24;;;;;36811:26;;-1:-1:-1;;36811:26:0;;;36882:22;;;;;;;36880:24;;-1:-1:-1;36880:24:0;;;37175:26;;;:17;:26;;;;;-1:-1:-1;;;37263:15:0;18010:3;37263:41;37221:84;;:128;;37175:174;;;37469:46;;:51;;37465:626;;37573:1;37563:11;;37541:19;37696:30;;;:17;:30;;;;;;:35;;37692:384;;37834:13;;37819:11;:28;37815:242;;37981:30;;;;:17;:30;;;;;:52;;;37815:242;37522:569;37465:626;38138:7;38134:2;-1:-1:-1;;;;;38119:27:0;38128:4;-1:-1:-1;;;;;38119:27:0;;;;;;;;;;;35796:2411;;35692:2515;;;:::o;6800:190::-;6925:4;6978;6949:25;6962:5;6969:4;6949:12;:25::i;:::-;:33;;6800:190;-1:-1:-1;;;;6800:190:0:o;30810:104::-;30879:27;30889:2;30893:8;30879:27;;;;;;;;;;;;:9;:27::i;5382:191::-;5475:6;;;-1:-1:-1;;;;;5492:17:0;;;-1:-1:-1;;;;;;5492:17:0;;;;;;;5525:40;;5475:6;;;5492:17;5475:6;;5525:40;;5456:16;;5525:40;5445:128;5382:191;:::o;41904:716::-;42088:88;;-1:-1:-1;;;42088:88:0;;42067:4;;-1:-1:-1;;;;;42088:45:0;;;;;:88;;2916:10;;42155:4;;42161:7;;42170:5;;42088:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42088:88:0;;;;;;;;-1:-1:-1;;42088:88:0;;;;;;;;;;;;:::i;:::-;;;42084:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42371:6;:13;42388:1;42371:18;42367:235;;42417:40;;-1:-1:-1;;;42417:40:0;;;;;;;;;;;42367:235;42560:6;42554:13;42545:6;42541:2;42537:15;42530:38;42084:529;-1:-1:-1;;;;;;42247:64:0;-1:-1:-1;;;42247:64:0;;-1:-1:-1;42084:529:0;41904:716;;;;;;:::o;398:723::-;454:13;675:5;684:1;675:10;671:53;;-1:-1:-1;;702:10:0;;;;;;;;;;;;-1:-1:-1;;;702:10:0;;;;;398:723::o;671:53::-;749:5;734:12;790:78;797:9;;790:78;;823:8;;;;:::i;:::-;;-1:-1:-1;846:10:0;;-1:-1:-1;854:2:0;846:10;;:::i;:::-;;;790:78;;;878:19;910:6;900:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;900:17:0;;878:39;;928:154;935:10;;928:154;;962:11;972:1;962:11;;:::i;:::-;;-1:-1:-1;1031:10:0;1039:2;1031:5;:10;:::i;:::-;1018:24;;:2;:24;:::i;:::-;1005:39;;988:6;995;988:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;988:56:0;;;;;;;;-1:-1:-1;1059:11:0;1068:2;1059:11;;:::i;:::-;;;928:154;;7351:675;7434:7;7477:4;7434:7;7492:497;7516:5;:12;7512:1;:16;7492:497;;;7550:20;7573:5;7579:1;7573:8;;;;;;;;:::i;:::-;;;;;;;7550:31;;7616:12;7600;:28;7596:382;;8102:13;8152:15;;;8188:4;8181:15;;;8235:4;8219:21;;7728:57;;7596:382;;;8102:13;8152:15;;;8188:4;8181:15;;;8235:4;8219:21;;7905:57;;7596:382;-1:-1:-1;7530:3:0;;;;:::i;:::-;;;;7492:497;;;-1:-1:-1;8006:12:0;7351:675;-1:-1:-1;;;7351:675:0:o;31287:2236::-;31410:20;31433:13;-1:-1:-1;;;;;31461:16:0;;31457:48;;31486:19;;-1:-1:-1;;;31486:19:0;;;;;;;;;;;31457:48;31520:8;31532:1;31520:13;31516:44;;31542:18;;-1:-1:-1;;;31542:18:0;;;;;;;;;;;31516:44;-1:-1:-1;;;;;32109:22:0;;;;;;:18;:22;;;;17493:2;32109:22;;;:70;;32147:31;32135:44;;32109:70;;;32422:31;;;:17;:31;;;;;32515:15;18010:3;32515:41;32473:84;;-1:-1:-1;32593:13:0;;18273:3;32578:56;32473:162;32422:213;;:31;;32716:23;;;;32760:14;:19;32756:635;;32800:313;32831:38;;32856:12;;-1:-1:-1;;;;;32831:38:0;;;32848:1;;32831:38;;32848:1;;32831:38;32897:69;32936:1;32940:2;32944:14;;;;;;32960:5;32897:30;:69::i;:::-;32892:174;;33002:40;;-1:-1:-1;;;33002:40:0;;;;;;;;;;;32892:174;33108:3;33093:12;:18;32800:313;;33194:12;33177:13;;:29;33173:43;;33208:8;;;33173:43;32756:635;;;33257:119;33288:40;;33313:14;;;;;-1:-1:-1;;;;;33288:40:0;;;33305:1;;33288:40;;33305:1;;33288:40;33371:3;33356:12;:18;33257:119;;32756:635;-1:-1:-1;33405:13:0;:28;;;33455:60;;33488:2;33492:12;33506:8;33455: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:173::-;660:20;;-1:-1:-1;;;;;709:31:1;;699:42;;689:70;;755:1;752;745:12;689:70;592:173;;;:::o;770:186::-;829:6;882:2;870:9;861:7;857:23;853:32;850:52;;;898:1;895;888:12;850:52;921:29;940:9;921:29;:::i;1143:127::-;1204:10;1199:3;1195:20;1192:1;1185:31;1235:4;1232:1;1225:15;1259:4;1256:1;1249:15;1275:275;1346:2;1340:9;1411:2;1392:13;;-1:-1:-1;;1388:27:1;1376:40;;1446:18;1431:34;;1467:22;;;1428:62;1425:88;;;1493:18;;:::i;:::-;1529:2;1522:22;1275:275;;-1:-1:-1;1275:275:1:o;1555:407::-;1620:5;1654:18;1646:6;1643:30;1640:56;;;1676:18;;:::i;:::-;1714:57;1759:2;1738:15;;-1:-1:-1;;1734:29:1;1765:4;1730:40;1714:57;:::i;:::-;1705:66;;1794:6;1787:5;1780:21;1834:3;1825:6;1820:3;1816:16;1813:25;1810:45;;;1851:1;1848;1841:12;1810:45;1900:6;1895:3;1888:4;1881:5;1877:16;1864:43;1954:1;1947:4;1938:6;1931:5;1927:18;1923:29;1916:40;1555:407;;;;;:::o;1967:451::-;2036:6;2089:2;2077:9;2068:7;2064:23;2060:32;2057:52;;;2105:1;2102;2095:12;2057:52;2145:9;2132:23;2178:18;2170:6;2167:30;2164:50;;;2210:1;2207;2200:12;2164:50;2233:22;;2286:4;2278:13;;2274:27;-1:-1:-1;2264:55:1;;2315:1;2312;2305:12;2264:55;2338:74;2404:7;2399:2;2386:16;2381:2;2377;2373:11;2338:74;:::i;2423:258::-;2495:1;2505:113;2519:6;2516:1;2513:13;2505:113;;;2595:11;;;2589:18;2576:11;;;2569:39;2541:2;2534:10;2505:113;;;2636:6;2633:1;2630:13;2627:48;;;-1:-1:-1;;2671:1:1;2653:16;;2646:27;2423:258::o;2686:269::-;2739:3;2777:5;2771:12;2804:6;2799:3;2792:19;2820:63;2876:6;2869:4;2864:3;2860:14;2853:4;2846:5;2842:16;2820:63;:::i;:::-;2937:2;2916:15;-1:-1:-1;;2912:29:1;2903:39;;;;2944:4;2899:50;;2686:269;-1:-1:-1;;2686:269:1:o;2960:231::-;3109:2;3098:9;3091:21;3072:4;3129:56;3181:2;3170:9;3166:18;3158:6;3129:56;:::i;3196:180::-;3255:6;3308:2;3296:9;3287:7;3283:23;3279:32;3276:52;;;3324:1;3321;3314:12;3276:52;-1:-1:-1;3347:23:1;;3196:180;-1:-1:-1;3196:180:1:o;3589:254::-;3657:6;3665;3718:2;3706:9;3697:7;3693:23;3689:32;3686:52;;;3734:1;3731;3724:12;3686:52;3757:29;3776:9;3757:29;:::i;:::-;3747:39;3833:2;3818:18;;;;3805:32;;-1:-1:-1;;;3589:254:1:o;3848:265::-;3916:6;3969:2;3957:9;3948:7;3944:23;3940:32;3937:52;;;3985:1;3982;3975:12;3937:52;4024:9;4011:23;4063:1;4056:5;4053:12;4043:40;;4079:1;4076;4069:12;4118:328;4195:6;4203;4211;4264:2;4252:9;4243:7;4239:23;4235:32;4232:52;;;4280:1;4277;4270:12;4232:52;4303:29;4322:9;4303:29;:::i;:::-;4293:39;;4351:38;4385:2;4374:9;4370:18;4351:38;:::i;:::-;4341:48;;4436:2;4425:9;4421:18;4408:32;4398:42;;4118:328;;;;;:::o;4451:1016::-;4544:6;4552;4605:2;4593:9;4584:7;4580:23;4576:32;4573:52;;;4621:1;4618;4611:12;4573:52;4661:9;4648:23;4690:18;4731:2;4723:6;4720:14;4717:34;;;4747:1;4744;4737:12;4717:34;4785:6;4774:9;4770:22;4760:32;;4830:7;4823:4;4819:2;4815:13;4811:27;4801:55;;4852:1;4849;4842:12;4801:55;4888:2;4875:16;4910:4;4933:2;4929;4926:10;4923:36;;;4939:18;;:::i;:::-;4985:2;4982:1;4978:10;4968:20;;5008:28;5032:2;5028;5024:11;5008:28;:::i;:::-;5070:15;;;5140:11;;;5136:20;;;5101:12;;;;5168:19;;;5165:39;;;5200:1;5197;5190:12;5165:39;5224:11;;;;5244:142;5260:6;5255:3;5252:15;5244:142;;;5326:17;;5314:30;;5277:12;;;;5364;;;;5244:142;;;5405:5;5442:18;;;;5429:32;;-1:-1:-1;;;;;;;4451:1016:1:o;5472:127::-;5533:10;5528:3;5524:20;5521:1;5514:31;5564:4;5561:1;5554:15;5588:4;5585:1;5578:15;5604:337;5745:2;5730:18;;5778:1;5767:13;;5757:144;;5823:10;5818:3;5814:20;5811:1;5804:31;5858:4;5855:1;5848:15;5886:4;5883:1;5876:15;5757:144;5910:25;;;5604:337;:::o;6313:347::-;6378:6;6386;6439:2;6427:9;6418:7;6414:23;6410:32;6407:52;;;6455:1;6452;6445:12;6407:52;6478:29;6497:9;6478:29;:::i;:::-;6468:39;;6557:2;6546:9;6542:18;6529:32;6604:5;6597:13;6590:21;6583:5;6580:32;6570:60;;6626:1;6623;6616:12;6570:60;6649:5;6639:15;;;6313:347;;;;;:::o;6665:667::-;6760:6;6768;6776;6784;6837:3;6825:9;6816:7;6812:23;6808:33;6805:53;;;6854:1;6851;6844:12;6805:53;6877:29;6896:9;6877:29;:::i;:::-;6867:39;;6925:38;6959:2;6948:9;6944:18;6925:38;:::i;:::-;6915:48;;7010:2;6999:9;6995:18;6982:32;6972:42;;7065:2;7054:9;7050:18;7037:32;7092:18;7084:6;7081:30;7078:50;;;7124:1;7121;7114:12;7078:50;7147:22;;7200:4;7192:13;;7188:27;-1:-1:-1;7178:55:1;;7229:1;7226;7219:12;7178:55;7252:74;7318:7;7313:2;7300:16;7295:2;7291;7287:11;7252:74;:::i;:::-;7242:84;;;6665:667;;;;;;;:::o;7337:260::-;7405:6;7413;7466:2;7454:9;7445:7;7441:23;7437:32;7434:52;;;7482:1;7479;7472:12;7434:52;7505:29;7524:9;7505:29;:::i;:::-;7495:39;;7553:38;7587:2;7576:9;7572:18;7553:38;:::i;:::-;7543:48;;7337:260;;;;;:::o;7602:356::-;7804:2;7786:21;;;7823:18;;;7816:30;7882:34;7877:2;7862:18;;7855:62;7949:2;7934:18;;7602:356::o;7963:380::-;8042:1;8038:12;;;;8085;;;8106:61;;8160:4;8152:6;8148:17;8138:27;;8106:61;8213:2;8205:6;8202:14;8182:18;8179:38;8176:161;;8259:10;8254:3;8250:20;8247:1;8240:31;8294:4;8291:1;8284:15;8322:4;8319:1;8312:15;8176:161;;7963:380;;;:::o;8707:338::-;8909:2;8891:21;;;8948:2;8928:18;;;8921:30;-1:-1:-1;;;8982:2:1;8967:18;;8960:44;9036:2;9021:18;;8707:338::o;9400:127::-;9461:10;9456:3;9452:20;9449:1;9442:31;9492:4;9489:1;9482:15;9516:4;9513:1;9506:15;9532:128;9572:3;9603:1;9599:6;9596:1;9593:13;9590:39;;;9609:18;;:::i;:::-;-1:-1:-1;9645:9:1;;9532:128::o;10430:168::-;10470:7;10536:1;10532;10528:6;10524:14;10521:1;10518:21;10513:1;10506:9;10499:17;10495:45;10492:71;;;10543:18;;:::i;:::-;-1:-1:-1;10583:9:1;;10430:168::o;13282:125::-;13322:4;13350:1;13347;13344:8;13341:34;;;13355:18;;:::i;:::-;-1:-1:-1;13392:9:1;;13282:125::o;14306:185::-;14348:3;14386:5;14380:12;14401:52;14446:6;14441:3;14434:4;14427:5;14423:16;14401:52;:::i;:::-;14469:16;;;;;14306:185;-1:-1:-1;;14306:185:1:o;14614:1301::-;14891:3;14920:1;14953:6;14947:13;14983:3;15005:1;15033:9;15029:2;15025:18;15015:28;;15093:2;15082:9;15078:18;15115;15105:61;;15159:4;15151:6;15147:17;15137:27;;15105:61;15185:2;15233;15225:6;15222:14;15202:18;15199:38;15196:165;;-1:-1:-1;;;15260:33:1;;15316:4;15313:1;15306:15;15346:4;15267:3;15334:17;15196:165;15377:18;15404:104;;;;15522:1;15517:320;;;;15370:467;;15404:104;-1:-1:-1;;15437:24:1;;15425:37;;15482:16;;;;-1:-1:-1;15404:104:1;;15517:320;14253:1;14246:14;;;14290:4;14277:18;;15612:1;15626:165;15640:6;15637:1;15634:13;15626:165;;;15718:14;;15705:11;;;15698:35;15761:16;;;;15655:10;;15626:165;;;15630:3;;15820:6;15815:3;15811:16;15804:23;;15370:467;;;;;;;15853:56;15878:30;15904:3;15896:6;15878:30;:::i;:::-;-1:-1:-1;;;14556:20:1;;14601:1;14592:11;;14496:113;15853:56;15846:63;14614:1301;-1:-1:-1;;;;;14614:1301:1:o;16327:500::-;-1:-1:-1;;;;;16596:15:1;;;16578:34;;16648:15;;16643:2;16628:18;;16621:43;16695:2;16680:18;;16673:34;;;16743:3;16738:2;16723:18;;16716:31;;;16521:4;;16764:57;;16801:19;;16793:6;16764:57;:::i;:::-;16756:65;16327:500;-1:-1:-1;;;;;;16327:500:1:o;16832:249::-;16901:6;16954:2;16942:9;16933:7;16929:23;16925:32;16922:52;;;16970:1;16967;16960:12;16922:52;17002:9;16996:16;17021:30;17045:5;17021:30;:::i;17086:135::-;17125:3;17146:17;;;17143:43;;17166:18;;:::i;:::-;-1:-1:-1;17213:1:1;17202:13;;17086:135::o;17226:127::-;17287:10;17282:3;17278:20;17275:1;17268:31;17318:4;17315:1;17308:15;17342:4;17339:1;17332:15;17358:120;17398:1;17424;17414:35;;17429:18;;:::i;:::-;-1:-1:-1;17463:9:1;;17358:120::o;17483:112::-;17515:1;17541;17531:35;;17546:18;;:::i;:::-;-1:-1:-1;17580:9:1;;17483:112::o;17600:127::-;17661:10;17656:3;17652:20;17649:1;17642:31;17692:4;17689:1;17682:15;17716:4;17713:1;17706:15

Swarm Source

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