ETH Price: $3,325.57 (-4.10%)

Token

Lucky Frens (LF)
 

Overview

Max Total Supply

5,888 LF

Holders

4,695

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
solito.eth
Balance
1 LF
0xd87697d737dd4e51347677fbcca92a2bb4c4c756
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:
LuckyFrensNFT

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-08
*/

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

// 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @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() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 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`,
     * 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,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` 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 payable;

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

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: erc721a/contracts/ERC721A.sol


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

pragma solidity ^0.8.4;


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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // 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 bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID 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`
    // - [232..255] `extraData`
    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 => TokenApprovalRef) private _tokenApprovals;

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @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 virtual 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 virtual 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 virtual 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 virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual 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 auxiliary 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 auxiliary 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 virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    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: [ERC165](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.
    }

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

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

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

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

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

    /**
     * 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 initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev 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;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // 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 `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns 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))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _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] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

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

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _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] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, 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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

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

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // 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++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @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 virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

// File: Lucky.sol


pragma solidity ^0.8.4;




contract LuckyFrensNFT is ERC721A, ERC2981, Ownable {

    string public baseURI;
    uint256 public MAX_SUPPLY = 5888;
    uint256 public MAX_WALLET_MINT = 5;
    uint256 public MINT_PRICE = 0.02 ether;

    constructor(string memory _newBaseURI) ERC721A("Lucky Frens", "LF") {
        baseURI = _newBaseURI;
        setRoyaltyInfo(msg.sender, 750);
        mintNFTs(100);
    }

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

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

    function setBaseURI (string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }


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

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

    function setMintPrice (uint256 _mintPrice) external onlyOwner {
        MINT_PRICE = _mintPrice;
    }

    function setMaxMintPerWallet (uint256 _maxMintNum) external onlyOwner {
        MAX_WALLET_MINT = _maxMintNum;
    }

    function mintNFTs(uint256 quantity) public payable {

        require(quantity > 0, "Quantity cannot be zero");
        require(_totalMinted() + quantity <= MAX_SUPPLY, 'All Minted');

        if (msg.sender != owner()) {
            require(balanceOf(msg.sender) + quantity  <= MAX_WALLET_MINT, 'Can only mint 5 NFTs per wallet');
            require(msg.value >= MINT_PRICE * quantity, 'Not enough ether');
        }

        _mint(msg.sender, quantity);
    }

    function supportsInterface(
        bytes4 interfaceId
    ) public view virtual override(ERC721A, ERC2981) returns (bool) {
        // Supports the following `interfaceId`s:
        // - IERC165: 0x01ffc9a7
        // - IERC721: 0x80ac58cd
        // - IERC721Metadata: 0x5b5e139f
        // - IERC2981: 0x2a55205a
        return 
            ERC721A.supportsInterface(interfaceId) || 
            ERC2981.supportsInterface(interfaceId);
    }

    function setRoyaltyInfo(address _receiver, uint96 _royaltyFees) public onlyOwner {
        _setDefaultRoyalty(_receiver, _royaltyFees); // in bips
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;

        require(balance > 0, 'Balance is 0');

        (bool sent,) = payable(owner()).call{value: balance}("");
        require(sent, "Failed to send Ether");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WALLET_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintNFTs","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintNum","type":"uint256"}],"name":"setMaxMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint96","name":"_royaltyFees","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052611700600c556005600d5566470de4df820000600e553480156200002757600080fd5b506040516200221f3803806200221f8339810160408190526200004a9162000593565b6040518060400160405280600b81526020016a4c75636b79204672656e7360a81b81525060405180604001604052806002815260200161262360f11b81525081600290816200009a9190620006f6565b506003620000a98282620006f6565b5050600160005550620000bc33620000ec565b600b620000ca8282620006f6565b50620000d9336102ee6200013e565b620000e5606462000158565b5062000816565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b62000148620002ea565b62000154828262000348565b5050565b60008111620001ae5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064015b60405180910390fd5b600c5481620001c06000546000190190565b620001cc9190620007d8565b1115620002095760405162461bcd60e51b815260206004820152600a602482015269105b1b08135a5b9d195960b21b6044820152606401620001a5565b600a546001600160a01b03163314620002db57600d54816200022b3362000449565b620002379190620007d8565b1115620002875760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c79206d696e742035204e465473207065722077616c6c6574006044820152606401620001a5565b80600e54620002979190620007f4565b341015620002db5760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b41032ba3432b960811b6044820152606401620001a5565b620002e7338262000498565b50565b600a546001600160a01b03163314620003465760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401620001a5565b565b6127106001600160601b0382161115620003b85760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401620001a5565b6001600160a01b038216620004105760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401620001a5565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b60006001600160a01b03821662000473576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6000805490829003620004be5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b17831790558284019083908390600080516020620021ff8339815191528180a4600183015b8181146200054d5780836000600080516020620021ff833981519152600080a460010162000524565b50816000036200056f57604051622e076360e81b815260040160405180910390fd5b60005550505050565b505050565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215620005a757600080fd5b82516001600160401b0380821115620005bf57600080fd5b818501915085601f830112620005d457600080fd5b815181811115620005e957620005e96200057d565b604051601f8201601f19908116603f011681019083821181831017156200061457620006146200057d565b8160405282815288868487010111156200062d57600080fd5b600093505b8284101562000651578484018601518185018701529285019262000632565b600086848301015280965050505050505092915050565b600181811c908216806200067d57607f821691505b6020821081036200069e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200057857600081815260208120601f850160051c81016020861015620006cd5750805b601f850160051c820191505b81811015620006ee57828155600101620006d9565b505050505050565b81516001600160401b038111156200071257620007126200057d565b6200072a8162000723845462000668565b84620006a4565b602080601f831160018114620007625760008415620007495750858301515b600019600386901b1c1916600185901b178555620006ee565b600085815260208120601f198616915b82811015620007935788860151825594840194600190910190840162000772565b5085821015620007b25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b80820180821115620007ee57620007ee620007c2565b92915050565b6000816000190483118215151615620008115762000811620007c2565b500290565b6119d980620008266000396000f3fe6080604052600436106101b75760003560e01c80636c0360eb116100ec578063afdf61341161008a578063c87b56dd11610064578063c87b56dd14610486578063e985e9c5146104a6578063f2fde38b146104c6578063f4a0a528146104e657600080fd5b8063afdf61341461043d578063b88d4fde1461045d578063c002d23d1461047057600080fd5b80637fe0d73d116100c65780637fe0d73d146103d45780638da5cb5b146103ea57806395d89b4114610408578063a22cb4651461041d57600080fd5b80636c0360eb1461038a57806370a082311461039f578063715018a6146103bf57600080fd5b80632a55205a116101595780633ccfd60b116101335780633ccfd60b1461032257806342842e0e1461033757806355f804b31461034a5780636352211e1461036a57600080fd5b80632a55205a146102ba57806332cb6b0c146102f95780633b4b13811461030f57600080fd5b8063081812fc11610195578063081812fc14610235578063095ea7b31461026d57806318160ddd1461028057806323b872dd146102a757600080fd5b806301ffc9a7146101bc57806302fa7c47146101f157806306fdde0314610213575b600080fd5b3480156101c857600080fd5b506101dc6101d73660046113b8565b610506565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b5061021161020c3660046113f1565b610526565b005b34801561021f57600080fd5b5061022861053c565b6040516101e89190611484565b34801561024157600080fd5b50610255610250366004611497565b6105ce565b6040516001600160a01b0390911681526020016101e8565b61021161027b3660046114b0565b610612565b34801561028c57600080fd5b5060015460005403600019015b6040519081526020016101e8565b6102116102b53660046114da565b6106b2565b3480156102c657600080fd5b506102da6102d5366004611516565b61084b565b604080516001600160a01b0390931683526020830191909152016101e8565b34801561030557600080fd5b50610299600c5481565b61021161031d366004611497565b6108f7565b34801561032e57600080fd5b50610211610a76565b6102116103453660046114da565b610b66565b34801561035657600080fd5b506102116103653660046115c4565b610b86565b34801561037657600080fd5b50610255610385366004611497565b610b9a565b34801561039657600080fd5b50610228610ba5565b3480156103ab57600080fd5b506102996103ba36600461160d565b610c33565b3480156103cb57600080fd5b50610211610c82565b3480156103e057600080fd5b50610299600d5481565b3480156103f657600080fd5b50600a546001600160a01b0316610255565b34801561041457600080fd5b50610228610c96565b34801561042957600080fd5b50610211610438366004611628565b610ca5565b34801561044957600080fd5b50610211610458366004611497565b610d11565b61021161046b366004611659565b610d1e565b34801561047c57600080fd5b50610299600e5481565b34801561049257600080fd5b506102286104a1366004611497565b610d68565b3480156104b257600080fd5b506101dc6104c13660046116d5565b610dec565b3480156104d257600080fd5b506102116104e136600461160d565b610e1a565b3480156104f257600080fd5b50610211610501366004611497565b610e90565b600061051182610e9d565b80610520575061052082610eeb565b92915050565b61052e610f20565b6105388282610f7a565b5050565b60606002805461054b90611708565b80601f016020809104026020016040519081016040528092919081815260200182805461057790611708565b80156105c45780601f10610599576101008083540402835291602001916105c4565b820191906000526020600020905b8154815290600101906020018083116105a757829003601f168201915b5050505050905090565b60006105d982611077565b6105f6576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061061d82610b9a565b9050336001600160a01b03821614610656576106398133610dec565b610656576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006106bd826110ac565b9050836001600160a01b0316816001600160a01b0316146106f05760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b0388169091141761073d576107208633610dec565b61073d57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661076457604051633a954ecd60e21b815260040160405180910390fd5b801561076f57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610801576001840160008181526004602052604081205490036107ff5760005481146107ff5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916108c05750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090612710906108df906001600160601b031687611758565b6108e99190611777565b915196919550909350505050565b6000811161094c5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064015b60405180910390fd5b600c548161095d6000546000190190565b6109679190611799565b11156109a25760405162461bcd60e51b815260206004820152600a602482015269105b1b08135a5b9d195960b21b6044820152606401610943565b600a546001600160a01b03163314610a6957600d54816109c133610c33565b6109cb9190611799565b1115610a195760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c79206d696e742035204e465473207065722077616c6c6574006044820152606401610943565b80600e54610a279190611758565b341015610a695760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b41032ba3432b960811b6044820152606401610943565b610a733382611122565b50565b610a7e610f20565b4780610abb5760405162461bcd60e51b815260206004820152600c60248201526b042616c616e636520697320360a41b6044820152606401610943565b6000610acf600a546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610b19576040519150601f19603f3d011682016040523d82523d6000602084013e610b1e565b606091505b50509050806105385760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610943565b610b8183838360405180602001604052806000815250610d1e565b505050565b610b8e610f20565b600b61053882826117f2565b6000610520826110ac565b600b8054610bb290611708565b80601f0160208091040260200160405190810160405280929190818152602001828054610bde90611708565b8015610c2b5780601f10610c0057610100808354040283529160200191610c2b565b820191906000526020600020905b815481529060010190602001808311610c0e57829003601f168201915b505050505081565b60006001600160a01b038216610c5c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b610c8a610f20565b610c946000611220565b565b60606003805461054b90611708565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d19610f20565b600d55565b610d298484846106b2565b6001600160a01b0383163b15610d6257610d4584848484611272565b610d62576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610d7382611077565b610d9057604051630a14c4b560e41b815260040160405180910390fd5b600b8054610d9d90611708565b9050600003610dbb5760405180602001604052806000815250610520565b600b610dc68361135e565b604051602001610dd79291906118b2565b60405160208183030381529060405292915050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b610e22610f20565b6001600160a01b038116610e875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610943565b610a7381611220565b610e98610f20565b600e55565b60006301ffc9a760e01b6001600160e01b031983161480610ece57506380ac58cd60e01b6001600160e01b03198316145b806105205750506001600160e01b031916635b5e139f60e01b1490565b60006001600160e01b0319821663152a902d60e11b148061052057506301ffc9a760e01b6001600160e01b0319831614610520565b600a546001600160a01b03163314610c945760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610943565b6127106001600160601b0382161115610fe85760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610943565b6001600160a01b03821661103e5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610943565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b60008160011115801561108b575060005482105b8015610520575050600090815260046020526040902054600160e01b161590565b60008180600111611109576000548110156111095760008181526004602052604081205490600160e01b82169003611107575b806000036111005750600019016000818152600460205260409020546110df565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b60008054908290036111475760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146111f657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016111be565b508160000361121757604051622e076360e81b815260040160405180910390fd5b60005550505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906112a7903390899088908890600401611949565b6020604051808303816000875af19250505080156112e2575060408051601f3d908101601f191682019092526112df91810190611986565b60015b611340573d808015611310576040519150601f19603f3d011682016040523d82523d6000602084013e611315565b606091505b508051600003611338576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806113785750819003601f19909101908152919050565b6001600160e01b031981168114610a7357600080fd5b6000602082840312156113ca57600080fd5b8135611100816113a2565b80356001600160a01b03811681146113ec57600080fd5b919050565b6000806040838503121561140457600080fd5b61140d836113d5565b915060208301356001600160601b038116811461142957600080fd5b809150509250929050565b60005b8381101561144f578181015183820152602001611437565b50506000910152565b60008151808452611470816020860160208601611434565b601f01601f19169290920160200192915050565b6020815260006111006020830184611458565b6000602082840312156114a957600080fd5b5035919050565b600080604083850312156114c357600080fd5b6114cc836113d5565b946020939093013593505050565b6000806000606084860312156114ef57600080fd5b6114f8846113d5565b9250611506602085016113d5565b9150604084013590509250925092565b6000806040838503121561152957600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561156957611569611538565b604051601f8501601f19908116603f0116810190828211818310171561159157611591611538565b816040528093508581528686860111156115aa57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156115d657600080fd5b813567ffffffffffffffff8111156115ed57600080fd5b8201601f810184136115fe57600080fd5b6113568482356020840161154e565b60006020828403121561161f57600080fd5b611100826113d5565b6000806040838503121561163b57600080fd5b611644836113d5565b91506020830135801515811461142957600080fd5b6000806000806080858703121561166f57600080fd5b611678856113d5565b9350611686602086016113d5565b925060408501359150606085013567ffffffffffffffff8111156116a957600080fd5b8501601f810187136116ba57600080fd5b6116c98782356020840161154e565b91505092959194509250565b600080604083850312156116e857600080fd5b6116f1836113d5565b91506116ff602084016113d5565b90509250929050565b600181811c9082168061171c57607f821691505b60208210810361173c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561177257611772611742565b500290565b60008261179457634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561052057610520611742565b601f821115610b8157600081815260208120601f850160051c810160208610156117d35750805b601f850160051c820191505b81811015610843578281556001016117df565b815167ffffffffffffffff81111561180c5761180c611538565b6118208161181a8454611708565b846117ac565b602080601f831160018114611855576000841561183d5750858301515b600019600386901b1c1916600185901b178555610843565b600085815260208120601f198616915b8281101561188457888601518255948401946001909101908401611865565b50858210156118a25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008084546118c081611708565b600182811680156118d857600181146118ed5761191c565b60ff198416875282151583028701945061191c565b8860005260208060002060005b858110156119135781548a8201529084019082016118fa565b50505082870194505b505050508351611930818360208801611434565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061197c90830184611458565b9695505050505050565b60006020828403121561199857600080fd5b8151611100816113a256fea2646970667358221220298ae5da16e6995eda1938201e466053c99f65aca1651bd98eb43a98ed85b43a64736f6c63430008100033ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d626d55355a6e414c7343766b55704c564851414a4b48566b6e54654a57465376704e31396f614d79346b50702f00000000000000000000

Deployed Bytecode

0x6080604052600436106101b75760003560e01c80636c0360eb116100ec578063afdf61341161008a578063c87b56dd11610064578063c87b56dd14610486578063e985e9c5146104a6578063f2fde38b146104c6578063f4a0a528146104e657600080fd5b8063afdf61341461043d578063b88d4fde1461045d578063c002d23d1461047057600080fd5b80637fe0d73d116100c65780637fe0d73d146103d45780638da5cb5b146103ea57806395d89b4114610408578063a22cb4651461041d57600080fd5b80636c0360eb1461038a57806370a082311461039f578063715018a6146103bf57600080fd5b80632a55205a116101595780633ccfd60b116101335780633ccfd60b1461032257806342842e0e1461033757806355f804b31461034a5780636352211e1461036a57600080fd5b80632a55205a146102ba57806332cb6b0c146102f95780633b4b13811461030f57600080fd5b8063081812fc11610195578063081812fc14610235578063095ea7b31461026d57806318160ddd1461028057806323b872dd146102a757600080fd5b806301ffc9a7146101bc57806302fa7c47146101f157806306fdde0314610213575b600080fd5b3480156101c857600080fd5b506101dc6101d73660046113b8565b610506565b60405190151581526020015b60405180910390f35b3480156101fd57600080fd5b5061021161020c3660046113f1565b610526565b005b34801561021f57600080fd5b5061022861053c565b6040516101e89190611484565b34801561024157600080fd5b50610255610250366004611497565b6105ce565b6040516001600160a01b0390911681526020016101e8565b61021161027b3660046114b0565b610612565b34801561028c57600080fd5b5060015460005403600019015b6040519081526020016101e8565b6102116102b53660046114da565b6106b2565b3480156102c657600080fd5b506102da6102d5366004611516565b61084b565b604080516001600160a01b0390931683526020830191909152016101e8565b34801561030557600080fd5b50610299600c5481565b61021161031d366004611497565b6108f7565b34801561032e57600080fd5b50610211610a76565b6102116103453660046114da565b610b66565b34801561035657600080fd5b506102116103653660046115c4565b610b86565b34801561037657600080fd5b50610255610385366004611497565b610b9a565b34801561039657600080fd5b50610228610ba5565b3480156103ab57600080fd5b506102996103ba36600461160d565b610c33565b3480156103cb57600080fd5b50610211610c82565b3480156103e057600080fd5b50610299600d5481565b3480156103f657600080fd5b50600a546001600160a01b0316610255565b34801561041457600080fd5b50610228610c96565b34801561042957600080fd5b50610211610438366004611628565b610ca5565b34801561044957600080fd5b50610211610458366004611497565b610d11565b61021161046b366004611659565b610d1e565b34801561047c57600080fd5b50610299600e5481565b34801561049257600080fd5b506102286104a1366004611497565b610d68565b3480156104b257600080fd5b506101dc6104c13660046116d5565b610dec565b3480156104d257600080fd5b506102116104e136600461160d565b610e1a565b3480156104f257600080fd5b50610211610501366004611497565b610e90565b600061051182610e9d565b80610520575061052082610eeb565b92915050565b61052e610f20565b6105388282610f7a565b5050565b60606002805461054b90611708565b80601f016020809104026020016040519081016040528092919081815260200182805461057790611708565b80156105c45780601f10610599576101008083540402835291602001916105c4565b820191906000526020600020905b8154815290600101906020018083116105a757829003601f168201915b5050505050905090565b60006105d982611077565b6105f6576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b600061061d82610b9a565b9050336001600160a01b03821614610656576106398133610dec565b610656576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006106bd826110ac565b9050836001600160a01b0316816001600160a01b0316146106f05760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b0388169091141761073d576107208633610dec565b61073d57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b03851661076457604051633a954ecd60e21b815260040160405180910390fd5b801561076f57600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003610801576001840160008181526004602052604081205490036107ff5760005481146107ff5760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916108c05750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090612710906108df906001600160601b031687611758565b6108e99190611777565b915196919550909350505050565b6000811161094c5760405162461bcd60e51b815260206004820152601760248201527f5175616e746974792063616e6e6f74206265207a65726f00000000000000000060448201526064015b60405180910390fd5b600c548161095d6000546000190190565b6109679190611799565b11156109a25760405162461bcd60e51b815260206004820152600a602482015269105b1b08135a5b9d195960b21b6044820152606401610943565b600a546001600160a01b03163314610a6957600d54816109c133610c33565b6109cb9190611799565b1115610a195760405162461bcd60e51b815260206004820152601f60248201527f43616e206f6e6c79206d696e742035204e465473207065722077616c6c6574006044820152606401610943565b80600e54610a279190611758565b341015610a695760405162461bcd60e51b815260206004820152601060248201526f2737ba1032b737bab3b41032ba3432b960811b6044820152606401610943565b610a733382611122565b50565b610a7e610f20565b4780610abb5760405162461bcd60e51b815260206004820152600c60248201526b042616c616e636520697320360a41b6044820152606401610943565b6000610acf600a546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610b19576040519150601f19603f3d011682016040523d82523d6000602084013e610b1e565b606091505b50509050806105385760405162461bcd60e51b81526020600482015260146024820152732330b4b632b2103a379039b2b7321022ba3432b960611b6044820152606401610943565b610b8183838360405180602001604052806000815250610d1e565b505050565b610b8e610f20565b600b61053882826117f2565b6000610520826110ac565b600b8054610bb290611708565b80601f0160208091040260200160405190810160405280929190818152602001828054610bde90611708565b8015610c2b5780601f10610c0057610100808354040283529160200191610c2b565b820191906000526020600020905b815481529060010190602001808311610c0e57829003601f168201915b505050505081565b60006001600160a01b038216610c5c576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b610c8a610f20565b610c946000611220565b565b60606003805461054b90611708565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d19610f20565b600d55565b610d298484846106b2565b6001600160a01b0383163b15610d6257610d4584848484611272565b610d62576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060610d7382611077565b610d9057604051630a14c4b560e41b815260040160405180910390fd5b600b8054610d9d90611708565b9050600003610dbb5760405180602001604052806000815250610520565b600b610dc68361135e565b604051602001610dd79291906118b2565b60405160208183030381529060405292915050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b610e22610f20565b6001600160a01b038116610e875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610943565b610a7381611220565b610e98610f20565b600e55565b60006301ffc9a760e01b6001600160e01b031983161480610ece57506380ac58cd60e01b6001600160e01b03198316145b806105205750506001600160e01b031916635b5e139f60e01b1490565b60006001600160e01b0319821663152a902d60e11b148061052057506301ffc9a760e01b6001600160e01b0319831614610520565b600a546001600160a01b03163314610c945760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610943565b6127106001600160601b0382161115610fe85760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610943565b6001600160a01b03821661103e5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610943565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b60008160011115801561108b575060005482105b8015610520575050600090815260046020526040902054600160e01b161590565b60008180600111611109576000548110156111095760008181526004602052604081205490600160e01b82169003611107575b806000036111005750600019016000818152600460205260409020546110df565b9392505050565b505b604051636f96cda160e11b815260040160405180910390fd5b60008054908290036111475760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b8181146111f657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016111be565b508160000361121757604051622e076360e81b815260040160405180910390fd5b60005550505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906112a7903390899088908890600401611949565b6020604051808303816000875af19250505080156112e2575060408051601f3d908101601f191682019092526112df91810190611986565b60015b611340573d808015611310576040519150601f19603f3d011682016040523d82523d6000602084013e611315565b606091505b508051600003611338576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a9004806113785750819003601f19909101908152919050565b6001600160e01b031981168114610a7357600080fd5b6000602082840312156113ca57600080fd5b8135611100816113a2565b80356001600160a01b03811681146113ec57600080fd5b919050565b6000806040838503121561140457600080fd5b61140d836113d5565b915060208301356001600160601b038116811461142957600080fd5b809150509250929050565b60005b8381101561144f578181015183820152602001611437565b50506000910152565b60008151808452611470816020860160208601611434565b601f01601f19169290920160200192915050565b6020815260006111006020830184611458565b6000602082840312156114a957600080fd5b5035919050565b600080604083850312156114c357600080fd5b6114cc836113d5565b946020939093013593505050565b6000806000606084860312156114ef57600080fd5b6114f8846113d5565b9250611506602085016113d5565b9150604084013590509250925092565b6000806040838503121561152957600080fd5b50508035926020909101359150565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff8084111561156957611569611538565b604051601f8501601f19908116603f0116810190828211818310171561159157611591611538565b816040528093508581528686860111156115aa57600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156115d657600080fd5b813567ffffffffffffffff8111156115ed57600080fd5b8201601f810184136115fe57600080fd5b6113568482356020840161154e565b60006020828403121561161f57600080fd5b611100826113d5565b6000806040838503121561163b57600080fd5b611644836113d5565b91506020830135801515811461142957600080fd5b6000806000806080858703121561166f57600080fd5b611678856113d5565b9350611686602086016113d5565b925060408501359150606085013567ffffffffffffffff8111156116a957600080fd5b8501601f810187136116ba57600080fd5b6116c98782356020840161154e565b91505092959194509250565b600080604083850312156116e857600080fd5b6116f1836113d5565b91506116ff602084016113d5565b90509250929050565b600181811c9082168061171c57607f821691505b60208210810361173c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561177257611772611742565b500290565b60008261179457634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111561052057610520611742565b601f821115610b8157600081815260208120601f850160051c810160208610156117d35750805b601f850160051c820191505b81811015610843578281556001016117df565b815167ffffffffffffffff81111561180c5761180c611538565b6118208161181a8454611708565b846117ac565b602080601f831160018114611855576000841561183d5750858301515b600019600386901b1c1916600185901b178555610843565b600085815260208120601f198616915b8281101561188457888601518255948401946001909101908401611865565b50858210156118a25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008084546118c081611708565b600182811680156118d857600181146118ed5761191c565b60ff198416875282151583028701945061191c565b8860005260208060002060005b858110156119135781548a8201529084019082016118fa565b50505082870194505b505050508351611930818360208801611434565b64173539b7b760d91b9101908152600501949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061197c90830184611458565b9695505050505050565b60006020828403121561199857600080fd5b8151611100816113a256fea2646970667358221220298ae5da16e6995eda1938201e466053c99f65aca1651bd98eb43a98ed85b43a64736f6c63430008100033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d626d55355a6e414c7343766b55704c564851414a4b48566b6e54654a57465376704e31396f614d79346b50702f00000000000000000000

-----Decoded View---------------
Arg [0] : _newBaseURI (string): ipfs://QmbmU5ZnALsCvkUpLVHQAJKHVknTeJWFSvpN19oaMy4kPp/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d626d55355a6e414c7343766b55704c564851414a4b4856
Arg [3] : 6b6e54654a57465376704e31396f614d79346b50702f00000000000000000000


Deployed Bytecode Sourcemap

62082:2611:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63805:455;;;;;;;;;;-1:-1:-1;63805:455:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;63805:455:0;;;;;;;;64268:154;;;;;;;;;;-1:-1:-1;64268:154:0;;;;;:::i;:::-;;:::i;:::-;;29896:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;36387:218::-;;;;;;;;;;-1:-1:-1;36387:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2246:32:1;;;2228:51;;2216:2;2201:18;36387:218:0;2082:203:1;35820:408:0;;;;;;:::i;:::-;;:::i;25647:323::-;;;;;;;;;;-1:-1:-1;62564:1:0;25921:12;25708:7;25905:13;:28;-1:-1:-1;;25905:46:0;25647:323;;;2695:25:1;;;2683:2;2668:18;25647:323:0;2549:177:1;40026:2825:0;;;;;;:::i;:::-;;:::i;4500:442::-;;;;;;;;;;-1:-1:-1;4500:442:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3509:32:1;;;3491:51;;3573:2;3558:18;;3551:34;;;;3464:18;4500:442:0;3317:274:1;62171:32:0;;;;;;;;;;;;;;;;63324:473;;;;;;:::i;:::-;;:::i;64430:258::-;;;;;;;;;;;;;:::i;42947:193::-;;;;;;:::i;:::-;;:::i;62689:105::-;;;;;;;;;;-1:-1:-1;62689:105:0;;;;;:::i;:::-;;:::i;31289:152::-;;;;;;;;;;-1:-1:-1;31289:152:0;;;;;:::i;:::-;;:::i;62143:21::-;;;;;;;;;;;;;:::i;26831:233::-;;;;;;;;;;-1:-1:-1;26831:233:0;;;;;:::i;:::-;;:::i;9773:103::-;;;;;;;;;;;;;:::i;62210:34::-;;;;;;;;;;;;;;;;9125:87;;;;;;;;;;-1:-1:-1;9198:6:0;;-1:-1:-1;;;;;9198:6:0;9125:87;;30072:104;;;;;;;;;;;;;:::i;36945:234::-;;;;;;;;;;-1:-1:-1;36945:234:0;;;;;:::i;:::-;;:::i;63198:118::-;;;;;;;;;;-1:-1:-1;63198:118:0;;;;;:::i;:::-;;:::i;43738:407::-;;;;;;:::i;:::-;;:::i;62251:38::-;;;;;;;;;;;;;;;;62804:274;;;;;;;;;;-1:-1:-1;62804:274:0;;;;;:::i;:::-;;:::i;37336:164::-;;;;;;;;;;-1:-1:-1;37336:164:0;;;;;:::i;:::-;;:::i;10031:201::-;;;;;;;;;;-1:-1:-1;10031:201:0;;;;;:::i;:::-;;:::i;63086:104::-;;;;;;;;;;-1:-1:-1;63086:104:0;;;;;:::i;:::-;;:::i;63805:455::-;63924:4;64158:38;64184:11;64158:25;:38::i;:::-;:94;;;;64214:38;64240:11;64214:25;:38::i;:::-;64137:115;63805:455;-1:-1:-1;;63805:455:0:o;64268:154::-;9011:13;:11;:13::i;:::-;64360:43:::1;64379:9;64390:12;64360:18;:43::i;:::-;64268:154:::0;;:::o;29896:100::-;29950:13;29983:5;29976:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29896:100;:::o;36387:218::-;36463:7;36488:16;36496:7;36488;:16::i;:::-;36483:64;;36513:34;;-1:-1:-1;;;36513:34:0;;;;;;;;;;;36483:64;-1:-1:-1;36567:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;36567:30:0;;36387:218::o;35820:408::-;35909:13;35925:16;35933:7;35925;:16::i;:::-;35909:32;-1:-1:-1;60153:10:0;-1:-1:-1;;;;;35958:28:0;;;35954:175;;36006:44;36023:5;60153:10;37336:164;:::i;36006:44::-;36001:128;;36078:35;;-1:-1:-1;;;36078:35:0;;;;;;;;;;;36001:128;36141:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;36141:35:0;-1:-1:-1;;;;;36141:35:0;;;;;;;;;36192:28;;36141:24;;36192:28;;;;;;;35898:330;35820:408;;:::o;40026:2825::-;40168:27;40198;40217:7;40198:18;:27::i;:::-;40168:57;;40283:4;-1:-1:-1;;;;;40242:45:0;40258:19;-1:-1:-1;;;;;40242:45:0;;40238:86;;40296:28;;-1:-1:-1;;;40296:28:0;;;;;;;;;;;40238:86;40338:27;39134:24;;;:15;:24;;;;;39362:26;;60153:10;38759:30;;;-1:-1:-1;;;;;38452:28:0;;38737:20;;;38734:56;40524:180;;40617:43;40634:4;60153:10;37336:164;:::i;40617:43::-;40612:92;;40669:35;;-1:-1:-1;;;40669:35:0;;;;;;;;;;;40612:92;-1:-1:-1;;;;;40721:16:0;;40717:52;;40746:23;;-1:-1:-1;;;40746:23:0;;;;;;;;;;;40717:52;40918:15;40915:160;;;41058:1;41037:19;41030:30;40915:160;-1:-1:-1;;;;;41455:24:0;;;;;;;:18;:24;;;;;;41453:26;;-1:-1:-1;;41453:26:0;;;41524:22;;;;;;;;;41522:24;;-1:-1:-1;41522:24:0;;;34678:11;34653:23;34649:41;34636:63;-1:-1:-1;;;34636:63:0;41817:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;42112:47:0;;:52;;42108:627;;42217:1;42207:11;;42185:19;42340:30;;;:17;:30;;;;;;:35;;42336:384;;42478:13;;42463:11;:28;42459:242;;42625:30;;;;:17;:30;;;;;:52;;;42459:242;42166:569;42108:627;42782:7;42778:2;-1:-1:-1;;;;;42763:27:0;42772:4;-1:-1:-1;;;;;42763:27:0;;;;;;;;;;;42801:42;40157:2694;;;40026:2825;;;:::o;4500:442::-;4597:7;4655:27;;;:17;:27;;;;;;;;4626:56;;;;;;;;;-1:-1:-1;;;;;4626:56:0;;;;;-1:-1:-1;;;4626:56:0;;;-1:-1:-1;;;;;4626:56:0;;;;;;;;4597:7;;4695:92;;-1:-1:-1;4746:29:0;;;;;;;;;4756:19;4746:29;-1:-1:-1;;;;;4746:29:0;;;;-1:-1:-1;;;4746:29:0;;-1:-1:-1;;;;;4746:29:0;;;;;4695:92;4837:23;;;;4799:21;;5308:5;;4824:36;;-1:-1:-1;;;;;4824:36:0;:10;:36;:::i;:::-;4823:58;;;;:::i;:::-;4902:16;;;;;-1:-1:-1;4500:442:0;;-1:-1:-1;;;;4500:442:0:o;63324:473::-;63407:1;63396:8;:12;63388:48;;;;-1:-1:-1;;;63388:48:0;;7415:2:1;63388:48:0;;;7397:21:1;7454:2;7434:18;;;7427:30;7493:25;7473:18;;;7466:53;7536:18;;63388:48:0;;;;;;;;;63484:10;;63472:8;63455:14;26123:7;26314:13;-1:-1:-1;;26314:31:0;;26068:296;63455:14;:25;;;;:::i;:::-;:39;;63447:62;;;;-1:-1:-1;;;63447:62:0;;7897:2:1;63447:62:0;;;7879:21:1;7936:2;7916:18;;;7909:30;-1:-1:-1;;;7955:18:1;;;7948:40;8005:18;;63447:62:0;7695:334:1;63447:62:0;9198:6;;-1:-1:-1;;;;;9198:6:0;63526:10;:21;63522:228;;63609:15;;63596:8;63572:21;63582:10;63572:9;:21::i;:::-;:32;;;;:::i;:::-;:52;;63564:96;;;;-1:-1:-1;;;63564:96:0;;8236:2:1;63564:96:0;;;8218:21:1;8275:2;8255:18;;;8248:30;8314:33;8294:18;;;8287:61;8365:18;;63564:96:0;8034:355:1;63564:96:0;63709:8;63696:10;;:21;;;;:::i;:::-;63683:9;:34;;63675:63;;;;-1:-1:-1;;;63675:63:0;;8596:2:1;63675:63:0;;;8578:21:1;8635:2;8615:18;;;8608:30;-1:-1:-1;;;8654:18:1;;;8647:46;8710:18;;63675:63:0;8394:340:1;63675:63:0;63762:27;63768:10;63780:8;63762:5;:27::i;:::-;63324:473;:::o;64430:258::-;9011:13;:11;:13::i;:::-;64493:21:::1;64535:11:::0;64527:36:::1;;;::::0;-1:-1:-1;;;64527:36:0;;8941:2:1;64527:36:0::1;::::0;::::1;8923:21:1::0;8980:2;8960:18;;;8953:30;-1:-1:-1;;;8999:18:1;;;8992:42;9051:18;;64527:36:0::1;8739:336:1::0;64527:36:0::1;64577:9;64599:7;9198:6:::0;;-1:-1:-1;;;;;9198:6:0;;9125:87;64599:7:::1;-1:-1:-1::0;;;;;64591:21:0::1;64620:7;64591:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64576:56;;;64651:4;64643:37;;;::::0;-1:-1:-1;;;64643:37:0;;9492:2:1;64643:37:0::1;::::0;::::1;9474:21:1::0;9531:2;9511:18;;;9504:30;-1:-1:-1;;;9550:18:1;;;9543:50;9610:18;;64643:37:0::1;9290:344:1::0;42947:193:0;43093:39;43110:4;43116:2;43120:7;43093:39;;;;;;;;;;;;:16;:39::i;:::-;42947:193;;;:::o;62689:105::-;9011:13;:11;:13::i;:::-;62765:7:::1;:21;62775:11:::0;62765:7;:21:::1;:::i;31289:152::-:0;31361:7;31404:27;31423:7;31404:18;:27::i;62143:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26831:233::-;26903:7;-1:-1:-1;;;;;26927:19:0;;26923:60;;26955:28;;-1:-1:-1;;;26955:28:0;;;;;;;;;;;26923:60;-1:-1:-1;;;;;;27001:25:0;;;;;:18;:25;;;;;;20990:13;27001:55;;26831:233::o;9773:103::-;9011:13;:11;:13::i;:::-;9838:30:::1;9865:1;9838:18;:30::i;:::-;9773:103::o:0;30072:104::-;30128:13;30161:7;30154:14;;;;;:::i;36945:234::-;60153:10;37040:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;37040:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;37040:60:0;;;;;;;;;;37116:55;;540:41:1;;;37040:49:0;;60153:10;37116:55;;513:18:1;37116:55:0;;;;;;;36945:234;;:::o;63198:118::-;9011:13;:11;:13::i;:::-;63279:15:::1;:29:::0;63198:118::o;43738:407::-;43913:31;43926:4;43932:2;43936:7;43913:12;:31::i;:::-;-1:-1:-1;;;;;43959:14:0;;;:19;43955:183;;43998:56;44029:4;44035:2;44039:7;44048:5;43998:30;:56::i;:::-;43993:145;;44082:40;;-1:-1:-1;;;44082:40:0;;;;;;;;;;;43993:145;43738:407;;;;:::o;62804:274::-;62869:13;62900:16;62908:7;62900;:16::i;:::-;62895:59;;62925:29;;-1:-1:-1;;;62925:29:0;;;;;;;;;;;62895:59;62980:7;62974:21;;;;;:::i;:::-;;;62999:1;62974:26;:96;;;;;;;;;;;;;;;;;63027:7;63036:18;63046:7;63036:9;:18::i;:::-;63010:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62967:103;62804:274;-1:-1:-1;;62804:274:0:o;37336:164::-;-1:-1:-1;;;;;37457:25:0;;;37433:4;37457:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;37336:164::o;10031:201::-;9011:13;:11;:13::i;:::-;-1:-1:-1;;;;;10120:22:0;::::1;10112:73;;;::::0;-1:-1:-1;;;10112:73:0;;13237:2:1;10112:73:0::1;::::0;::::1;13219:21:1::0;13276:2;13256:18;;;13249:30;13315:34;13295:18;;;13288:62;-1:-1:-1;;;13366:18:1;;;13359:36;13412:19;;10112:73:0::1;13035:402:1::0;10112:73:0::1;10196:28;10215:8;10196:18;:28::i;63086:104::-:0;9011:13;:11;:13::i;:::-;63159:10:::1;:23:::0;63086:104::o;28994:639::-;29079:4;-1:-1:-1;;;;;;;;;29403:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;29480:25:0;;;29403:102;:179;;;-1:-1:-1;;;;;;;;29557:25:0;-1:-1:-1;;;29557:25:0;;28994:639::o;4230:215::-;4332:4;-1:-1:-1;;;;;;4356:41:0;;-1:-1:-1;;;4356:41:0;;:81;;-1:-1:-1;;;;;;;;;;1891:40:0;;;4401:36;1782:157;9290:132;9198:6;;-1:-1:-1;;;;;9198:6:0;60153:10;9354:23;9346:68;;;;-1:-1:-1;;;9346:68:0;;13644:2:1;9346:68:0;;;13626:21:1;;;13663:18;;;13656:30;13722:34;13702:18;;;13695:62;13774:18;;9346:68:0;13442:356:1;5592:332:0;5308:5;-1:-1:-1;;;;;5695:33:0;;;;5687:88;;;;-1:-1:-1;;;5687:88:0;;14005:2:1;5687:88:0;;;13987:21:1;14044:2;14024:18;;;14017:30;14083:34;14063:18;;;14056:62;-1:-1:-1;;;14134:18:1;;;14127:40;14184:19;;5687:88:0;13803:406:1;5687:88:0;-1:-1:-1;;;;;5794:22:0;;5786:60;;;;-1:-1:-1;;;5786:60:0;;14416:2:1;5786:60:0;;;14398:21:1;14455:2;14435:18;;;14428:30;14494:27;14474:18;;;14467:55;14539:18;;5786:60:0;14214:349:1;5786:60:0;5881:35;;;;;;;;;-1:-1:-1;;;;;5881:35:0;;;;;;-1:-1:-1;;;;;5881:35:0;;;;;;;;;;-1:-1:-1;;;5859:57:0;;;;:19;:57;5592:332::o;37758:282::-;37823:4;37879:7;62564:1;37860:26;;:66;;;;;37913:13;;37903:7;:23;37860:66;:153;;;;-1:-1:-1;;37964:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;37964:44:0;:49;;37758:282::o;32444:1275::-;32511:7;32546;;62564:1;32595:23;32591:1061;;32648:13;;32641:4;:20;32637:1015;;;32686:14;32703:23;;;:17;:23;;;;;;;-1:-1:-1;;;32792:24:0;;:29;;32788:845;;33457:113;33464:6;33474:1;33464:11;33457:113;;-1:-1:-1;;;33535:6:0;33517:25;;;;:17;:25;;;;;;33457:113;;;33603:6;32444:1275;-1:-1:-1;;;32444:1275:0:o;32788:845::-;32663:989;32637:1015;33680:31;;-1:-1:-1;;;33680:31:0;;;;;;;;;;;47407:2966;47480:20;47503:13;;;47531;;;47527:44;;47553:18;;-1:-1:-1;;;47553:18:0;;;;;;;;;;;47527:44;-1:-1:-1;;;;;48059:22:0;;;;;;:18;:22;;;;21128:2;48059:22;;;:71;;48097:32;48085:45;;48059:71;;;48373:31;;;:17;:31;;;;;-1:-1:-1;35109:15:0;;35083:24;35079:46;34678:11;34653:23;34649:41;34646:52;34636:63;;48373:173;;48608:23;;;;48373:31;;48059:22;;49373:25;48059:22;;49226:335;49887:1;49873:12;49869:20;49827:346;49928:3;49919:7;49916:16;49827:346;;50146:7;50136:8;50133:1;50106:25;50103:1;50100;50095:59;49981:1;49968:15;49827:346;;;49831:77;50206:8;50218:1;50206:13;50202:45;;50228:19;;-1:-1:-1;;;50228:19:0;;;;;;;;;;;50202:45;50264:13;:19;-1:-1:-1;42947:193:0;;;:::o;10392:191::-;10485:6;;;-1:-1:-1;;;;;10502:17:0;;;-1:-1:-1;;;;;;10502:17:0;;;;;;;10535:40;;10485:6;;;10502:17;10485:6;;10535:40;;10466:16;;10535:40;10455:128;10392:191;:::o;46229:716::-;46413:88;;-1:-1:-1;;;46413:88:0;;46392:4;;-1:-1:-1;;;;;46413:45:0;;;;;:88;;60153:10;;46480:4;;46486:7;;46495:5;;46413:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46413:88:0;;;;;;;;-1:-1:-1;;46413:88:0;;;;;;;;;;;;:::i;:::-;;;46409:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46696:6;:13;46713:1;46696:18;46692:235;;46742:40;;-1:-1:-1;;;46742:40:0;;;;;;;;;;;46692:235;46885:6;46879:13;46870:6;46866:2;46862:15;46855:38;46409:529;-1:-1:-1;;;;;;46572:64:0;-1:-1:-1;;;46572:64:0;;-1:-1:-1;46409:529:0;46229:716;;;;;;:::o;60273:1745::-;60338:17;60772:4;60765;60759:11;60755:22;60864:1;60858:4;60851:15;60939:4;60936:1;60932:12;60925:19;;;61021:1;61016:3;61009:14;61125:3;61364:5;61346:428;61412:1;61407:3;61403:11;61396:18;;61583:2;61577:4;61573:13;61569:2;61565:22;61560:3;61552:36;61677:2;61667:13;;61734:25;61346:428;61734:25;-1:-1:-1;61804:13:0;;;-1:-1:-1;;61919:14:0;;;61981:19;;;61919:14;60273:1745;-1:-1:-1;60273:1745:0: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:366::-;837:6;845;898:2;886:9;877:7;873:23;869:32;866:52;;;914:1;911;904:12;866:52;937:29;956:9;937:29;:::i;:::-;927:39;;1016:2;1005:9;1001:18;988:32;-1:-1:-1;;;;;1053:5:1;1049:38;1042:5;1039:49;1029:77;;1102:1;1099;1092:12;1029:77;1125:5;1115:15;;;770:366;;;;;:::o;1141:250::-;1226:1;1236:113;1250:6;1247:1;1244:13;1236:113;;;1326:11;;;1320:18;1307:11;;;1300:39;1272:2;1265:10;1236:113;;;-1:-1:-1;;1383:1:1;1365:16;;1358:27;1141:250::o;1396:271::-;1438:3;1476:5;1470:12;1503:6;1498:3;1491:19;1519:76;1588:6;1581:4;1576:3;1572:14;1565:4;1558:5;1554:16;1519:76;:::i;:::-;1649:2;1628:15;-1:-1:-1;;1624:29:1;1615:39;;;;1656:4;1611:50;;1396:271;-1:-1:-1;;1396:271:1:o;1672:220::-;1821:2;1810:9;1803:21;1784:4;1841:45;1882:2;1871:9;1867:18;1859:6;1841:45;:::i;1897:180::-;1956:6;2009:2;1997:9;1988:7;1984:23;1980:32;1977:52;;;2025:1;2022;2015:12;1977:52;-1:-1:-1;2048:23:1;;1897:180;-1:-1:-1;1897:180:1:o;2290:254::-;2358:6;2366;2419:2;2407:9;2398:7;2394:23;2390:32;2387:52;;;2435:1;2432;2425:12;2387:52;2458:29;2477:9;2458:29;:::i;:::-;2448:39;2534:2;2519:18;;;;2506:32;;-1:-1:-1;;;2290:254:1:o;2731:328::-;2808:6;2816;2824;2877:2;2865:9;2856:7;2852:23;2848:32;2845:52;;;2893:1;2890;2883:12;2845:52;2916:29;2935:9;2916:29;:::i;:::-;2906:39;;2964:38;2998:2;2987:9;2983:18;2964:38;:::i;:::-;2954:48;;3049:2;3038:9;3034:18;3021:32;3011:42;;2731:328;;;;;:::o;3064:248::-;3132:6;3140;3193:2;3181:9;3172:7;3168:23;3164:32;3161:52;;;3209:1;3206;3199:12;3161:52;-1:-1:-1;;3232:23:1;;;3302:2;3287:18;;;3274:32;;-1:-1:-1;3064:248:1:o;3596:127::-;3657:10;3652:3;3648:20;3645:1;3638:31;3688:4;3685:1;3678:15;3712:4;3709:1;3702:15;3728:632;3793:5;3823:18;3864:2;3856:6;3853:14;3850:40;;;3870:18;;:::i;:::-;3945:2;3939:9;3913:2;3999:15;;-1:-1:-1;;3995:24:1;;;4021:2;3991:33;3987:42;3975:55;;;4045:18;;;4065:22;;;4042:46;4039:72;;;4091:18;;:::i;:::-;4131:10;4127:2;4120:22;4160:6;4151:15;;4190:6;4182;4175:22;4230:3;4221:6;4216:3;4212:16;4209:25;4206:45;;;4247:1;4244;4237:12;4206:45;4297:6;4292:3;4285:4;4277:6;4273:17;4260:44;4352:1;4345:4;4336:6;4328;4324:19;4320:30;4313:41;;;;3728:632;;;;;:::o;4365:451::-;4434:6;4487:2;4475:9;4466:7;4462:23;4458:32;4455:52;;;4503:1;4500;4493:12;4455:52;4543:9;4530:23;4576:18;4568:6;4565:30;4562:50;;;4608:1;4605;4598:12;4562:50;4631:22;;4684:4;4676:13;;4672:27;-1:-1:-1;4662:55:1;;4713:1;4710;4703:12;4662:55;4736:74;4802:7;4797:2;4784:16;4779:2;4775;4771:11;4736:74;:::i;4821:186::-;4880:6;4933:2;4921:9;4912:7;4908:23;4904:32;4901:52;;;4949:1;4946;4939:12;4901:52;4972:29;4991:9;4972:29;:::i;5012:347::-;5077:6;5085;5138:2;5126:9;5117:7;5113:23;5109:32;5106:52;;;5154:1;5151;5144:12;5106:52;5177:29;5196:9;5177:29;:::i;:::-;5167:39;;5256:2;5245:9;5241:18;5228:32;5303:5;5296:13;5289:21;5282:5;5279:32;5269:60;;5325:1;5322;5315:12;5364:667;5459:6;5467;5475;5483;5536:3;5524:9;5515:7;5511:23;5507:33;5504:53;;;5553:1;5550;5543:12;5504:53;5576:29;5595:9;5576:29;:::i;:::-;5566:39;;5624:38;5658:2;5647:9;5643:18;5624:38;:::i;:::-;5614:48;;5709:2;5698:9;5694:18;5681:32;5671:42;;5764:2;5753:9;5749:18;5736:32;5791:18;5783:6;5780:30;5777:50;;;5823:1;5820;5813:12;5777:50;5846:22;;5899:4;5891:13;;5887:27;-1:-1:-1;5877:55:1;;5928:1;5925;5918:12;5877:55;5951:74;6017:7;6012:2;5999:16;5994:2;5990;5986:11;5951:74;:::i;:::-;5941:84;;;5364:667;;;;;;;:::o;6036:260::-;6104:6;6112;6165:2;6153:9;6144:7;6140:23;6136:32;6133:52;;;6181:1;6178;6171:12;6133:52;6204:29;6223:9;6204:29;:::i;:::-;6194:39;;6252:38;6286:2;6275:9;6271:18;6252:38;:::i;:::-;6242:48;;6036:260;;;;;:::o;6301:380::-;6380:1;6376:12;;;;6423;;;6444:61;;6498:4;6490:6;6486:17;6476:27;;6444:61;6551:2;6543:6;6540:14;6520:18;6517:38;6514:161;;6597:10;6592:3;6588:20;6585:1;6578:31;6632:4;6629:1;6622:15;6660:4;6657:1;6650:15;6514:161;;6301:380;;;:::o;6686:127::-;6747:10;6742:3;6738:20;6735:1;6728:31;6778:4;6775:1;6768:15;6802:4;6799:1;6792:15;6818:168;6858:7;6924:1;6920;6916:6;6912:14;6909:1;6906:21;6901:1;6894:9;6887:17;6883:45;6880:71;;;6931:18;;:::i;:::-;-1:-1:-1;6971:9:1;;6818:168::o;6991:217::-;7031:1;7057;7047:132;;7101:10;7096:3;7092:20;7089:1;7082:31;7136:4;7133:1;7126:15;7164:4;7161:1;7154:15;7047:132;-1:-1:-1;7193:9:1;;6991:217::o;7565:125::-;7630:9;;;7651:10;;;7648:36;;;7664:18;;:::i;9765:545::-;9867:2;9862:3;9859:11;9856:448;;;9903:1;9928:5;9924:2;9917:17;9973:4;9969:2;9959:19;10043:2;10031:10;10027:19;10024:1;10020:27;10014:4;10010:38;10079:4;10067:10;10064:20;10061:47;;;-1:-1:-1;10102:4:1;10061:47;10157:2;10152:3;10148:12;10145:1;10141:20;10135:4;10131:31;10121:41;;10212:82;10230:2;10223:5;10220:13;10212:82;;;10275:17;;;10256:1;10245:13;10212:82;;10486:1352;10612:3;10606:10;10639:18;10631:6;10628:30;10625:56;;;10661:18;;:::i;:::-;10690:97;10780:6;10740:38;10772:4;10766:11;10740:38;:::i;:::-;10734:4;10690:97;:::i;:::-;10842:4;;10906:2;10895:14;;10923:1;10918:663;;;;11625:1;11642:6;11639:89;;;-1:-1:-1;11694:19:1;;;11688:26;11639:89;-1:-1:-1;;10443:1:1;10439:11;;;10435:24;10431:29;10421:40;10467:1;10463:11;;;10418:57;11741:81;;10888:944;;10918:663;9712:1;9705:14;;;9749:4;9736:18;;-1:-1:-1;;10954:20:1;;;11072:236;11086:7;11083:1;11080:14;11072:236;;;11175:19;;;11169:26;11154:42;;11267:27;;;;11235:1;11223:14;;;;11102:19;;11072:236;;;11076:3;11336:6;11327:7;11324:19;11321:201;;;11397:19;;;11391:26;-1:-1:-1;;11480:1:1;11476:14;;;11492:3;11472:24;11468:37;11464:42;11449:58;11434:74;;11321:201;-1:-1:-1;;;;;11568:1:1;11552:14;;;11548:22;11535:36;;-1:-1:-1;10486:1352:1:o;11843:1187::-;12120:3;12149:1;12182:6;12176:13;12212:36;12238:9;12212:36;:::i;:::-;12267:1;12284:18;;;12311:133;;;;12458:1;12453:356;;;;12277:532;;12311:133;-1:-1:-1;;12344:24:1;;12332:37;;12417:14;;12410:22;12398:35;;12389:45;;;-1:-1:-1;12311:133:1;;12453:356;12484:6;12481:1;12474:17;12514:4;12559:2;12556:1;12546:16;12584:1;12598:165;12612:6;12609:1;12606:13;12598:165;;;12690:14;;12677:11;;;12670:35;12733:16;;;;12627:10;;12598:165;;;12602:3;;;12792:6;12787:3;12783:16;12776:23;;12277:532;;;;;12840:6;12834:13;12856:68;12915:8;12910:3;12903:4;12895:6;12891:17;12856:68;:::i;:::-;-1:-1:-1;;;12946:18:1;;12973:22;;;13022:1;13011:13;;11843:1187;-1:-1:-1;;;;11843:1187:1:o;14568:489::-;-1:-1:-1;;;;;14837:15:1;;;14819:34;;14889:15;;14884:2;14869:18;;14862:43;14936:2;14921:18;;14914:34;;;14984:3;14979:2;14964:18;;14957:31;;;14762:4;;15005:46;;15031:19;;15023:6;15005:46;:::i;:::-;14997:54;14568:489;-1:-1:-1;;;;;;14568:489:1:o;15062:249::-;15131:6;15184:2;15172:9;15163:7;15159:23;15155:32;15152:52;;;15200:1;15197;15190:12;15152:52;15232:9;15226:16;15251:30;15275:5;15251:30;:::i

Swarm Source

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