ETH Price: $2,640.04 (+1.06%)

Token

Sad Hippo (SadHippo)
 

Overview

Max Total Supply

51 SadHippo

Holders

51

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
damai.eth
Balance
1 SadHippo
0xe29a5dbddf7c94238584dc0cc12913efed5643ae
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:
SadHippo

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: erc721a/contracts/IERC721A.sol


// ERC721A Contracts v4.2.2
// 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();

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

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

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

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

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

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

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

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

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

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

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

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

    // =============================================================
    //                           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.2
// 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 {
    // Reference type for token approval.
    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 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 {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _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]`.
        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 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 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 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.
            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`.
                )

                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 0x80 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

            // 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: contracts/Sad Hippo.sol


// Made by @Web3Club

pragma solidity ^0.8.4;


contract SadHippo is ERC721A {

    
    
    uint256 public constant USER_LIMIT = 1;
    uint256 public constant MAX_SUPPLY = 1813;


    constructor() ERC721A("Sad Hippo", "SadHippo") {}

    function mint(uint256 quantity) external {
        require(_totalMinted() + quantity <= MAX_SUPPLY, "Not more supply left");
        require(_numberMinted(msg.sender) + quantity <= USER_LIMIT, "User limit reached");
        // add allowlist verification here
        _mint(msg.sender, quantity);
    }
   
    function _baseURI() internal view virtual override returns (string memory) {
        return "ipfs://QmbaGhnQzkuzZh1ggNqQTn3SS48zvzsakMBP3FztniD8cm/";
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","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":"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":"USER_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600981526020017f53616420486970706f00000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f536164486970706f000000000000000000000000000000000000000000000000815250816002908051906020019062000096929190620000d3565b508060039080519060200190620000af929190620000d3565b50620000c0620000ce60201b60201c565b6000819055505050620001e8565b600090565b828054620000e19062000183565b90600052602060002090601f01602090048101928262000105576000855562000151565b82601f106200012057805160ff191683800117855562000151565b8280016001018555821562000151579182015b828111156200015057825182559160200191906001019062000133565b5b50905062000160919062000164565b5090565b5b808211156200017f57600081600090555060010162000165565b5090565b600060028204905060018216806200019c57607f821691505b60208210811415620001b357620001b2620001b9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b611df280620001f86000396000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80636352211e116100a2578063a22cb46511610071578063a22cb465146102b8578063b88d4fde146102d4578063c87b56dd146102f0578063e471ae0a14610320578063e985e9c51461033e5761010b565b80636352211e1461021e57806370a082311461024e57806395d89b411461027e578063a0712d681461029c5761010b565b806318160ddd116100de57806318160ddd146101aa57806323b872dd146101c857806332cb6b0c146101e457806342842e0e146102025761010b565b806301ffc9a71461011057806306fdde0314610140578063081812fc1461015e578063095ea7b31461018e575b600080fd5b61012a6004803603810190610125919061177e565b61036e565b604051610137919061199a565b60405180910390f35b610148610400565b60405161015591906119b5565b60405180910390f35b610178600480360381019061017391906117d0565b610492565b6040516101859190611933565b60405180910390f35b6101a860048036038101906101a39190611742565b610511565b005b6101b2610655565b6040516101bf9190611a17565b60405180910390f35b6101e260048036038101906101dd919061163c565b61066c565b005b6101ec610991565b6040516101f99190611a17565b60405180910390f35b61021c6004803603810190610217919061163c565b610997565b005b610238600480360381019061023391906117d0565b6109b7565b6040516102459190611933565b60405180910390f35b610268600480360381019061026391906115d7565b6109c9565b6040516102759190611a17565b60405180910390f35b610286610a82565b60405161029391906119b5565b60405180910390f35b6102b660048036038101906102b191906117d0565b610b14565b005b6102d260048036038101906102cd9190611706565b610bcf565b005b6102ee60048036038101906102e9919061168b565b610d47565b005b61030a600480360381019061030591906117d0565b610dba565b60405161031791906119b5565b60405180910390f35b610328610e59565b6040516103359190611a17565b60405180910390f35b61035860048036038101906103539190611600565b610e5e565b604051610365919061199a565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103c957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103f95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461040f90611bd7565b80601f016020809104026020016040519081016040528092919081815260200182805461043b90611bd7565b80156104885780601f1061045d57610100808354040283529160200191610488565b820191906000526020600020905b81548152906001019060200180831161046b57829003601f168201915b5050505050905090565b600061049d82610ef2565b6104d3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061051c826109b7565b90508073ffffffffffffffffffffffffffffffffffffffff1661053d610f51565b73ffffffffffffffffffffffffffffffffffffffff16146105a05761056981610564610f51565b610e5e565b61059f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061065f610f59565b6001546000540303905090565b600061067782610f5e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106de576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806106ea8461102c565b9150915061070081876106fb610f51565b611053565b61074c5761071586610710610f51565b610e5e565b61074b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156107b3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107c08686866001611097565b80156107cb57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506108998561087588888761109d565b7c0200000000000000000000000000000000000000000000000000000000176110c5565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561092157600060018501905060006004600083815260200190815260200160002054141561091f57600054811461091e578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461098986868660016110f0565b505050505050565b61071581565b6109b283838360405180602001604052806000815250610d47565b505050565b60006109c282610f5e565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a31576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b606060038054610a9190611bd7565b80601f0160208091040260200160405190810160405280929190818152602001828054610abd90611bd7565b8015610b0a5780601f10610adf57610100808354040283529160200191610b0a565b820191906000526020600020905b815481529060010190602001808311610aed57829003601f168201915b5050505050905090565b61071581610b206110f6565b610b2a9190611acb565b1115610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b62906119f7565b60405180910390fd5b600181610b7733611109565b610b819190611acb565b1115610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb9906119d7565b60405180910390fd5b610bcc3382611160565b50565b610bd7610f51565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c3c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610c49610f51565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610cf6610f51565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d3b919061199a565b60405180910390a35050565b610d5284848461066c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14610db457610d7d8484848461131d565b610db3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060610dc582610ef2565b610dfb576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610e0561147d565b9050600081511415610e265760405180602001604052806000815250610e51565b80610e308461149d565b604051602001610e4192919061190f565b6040516020818303038152906040525b915050919050565b600181565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600081610efd610f59565b11158015610f0c575060005482105b8015610f4a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080610f6d610f59565b11610ff557600054811015610ff45760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415610ff2575b6000811415610fe8576004600083600190039350838152602001908152602001600020549050610fbd565b8092505050611027565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86110b48686846114ed565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000611100610f59565b60005403905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008054905060008214156111a1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111ae6000848385611097565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061122583611216600086600061109d565b61121f856114f6565b176110c5565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146112c657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061128b565b506000821415611302576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061131860008483856110f0565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611343610f51565b8786866040518563ffffffff1660e01b8152600401611365949392919061194e565b602060405180830381600087803b15801561137f57600080fd5b505af19250505080156113b057506040513d601f19601f820116820180604052508101906113ad91906117a7565b60015b61142a573d80600081146113e0576040519150601f19603f3d011682016040523d82523d6000602084013e6113e5565b606091505b50600081511415611422576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060604051806060016040528060368152602001611d8760369139905090565b606060806040510190508060405280825b6001156114d957600183039250600a81066030018353600a81049050806114d4576114d9565b6114ae565b508181036020830392508083525050919050565b60009392505050565b60006001821460e11b9050919050565b600061151961151484611a57565b611a32565b90508281526020810184848401111561153157600080fd5b61153c848285611b95565b509392505050565b60008135905061155381611d2a565b92915050565b60008135905061156881611d41565b92915050565b60008135905061157d81611d58565b92915050565b60008151905061159281611d58565b92915050565b600082601f8301126115a957600080fd5b81356115b9848260208601611506565b91505092915050565b6000813590506115d181611d6f565b92915050565b6000602082840312156115e957600080fd5b60006115f784828501611544565b91505092915050565b6000806040838503121561161357600080fd5b600061162185828601611544565b925050602061163285828601611544565b9150509250929050565b60008060006060848603121561165157600080fd5b600061165f86828701611544565b935050602061167086828701611544565b9250506040611681868287016115c2565b9150509250925092565b600080600080608085870312156116a157600080fd5b60006116af87828801611544565b94505060206116c087828801611544565b93505060406116d1878288016115c2565b925050606085013567ffffffffffffffff8111156116ee57600080fd5b6116fa87828801611598565b91505092959194509250565b6000806040838503121561171957600080fd5b600061172785828601611544565b925050602061173885828601611559565b9150509250929050565b6000806040838503121561175557600080fd5b600061176385828601611544565b9250506020611774858286016115c2565b9150509250929050565b60006020828403121561179057600080fd5b600061179e8482850161156e565b91505092915050565b6000602082840312156117b957600080fd5b60006117c784828501611583565b91505092915050565b6000602082840312156117e257600080fd5b60006117f0848285016115c2565b91505092915050565b61180281611b21565b82525050565b61181181611b33565b82525050565b600061182282611a88565b61182c8185611a9e565b935061183c818560208601611ba4565b61184581611cc7565b840191505092915050565b600061185b82611a93565b6118658185611aaf565b9350611875818560208601611ba4565b61187e81611cc7565b840191505092915050565b600061189482611a93565b61189e8185611ac0565b93506118ae818560208601611ba4565b80840191505092915050565b60006118c7601283611aaf565b91506118d282611cd8565b602082019050919050565b60006118ea601483611aaf565b91506118f582611d01565b602082019050919050565b61190981611b8b565b82525050565b600061191b8285611889565b91506119278284611889565b91508190509392505050565b600060208201905061194860008301846117f9565b92915050565b600060808201905061196360008301876117f9565b61197060208301866117f9565b61197d6040830185611900565b818103606083015261198f8184611817565b905095945050505050565b60006020820190506119af6000830184611808565b92915050565b600060208201905081810360008301526119cf8184611850565b905092915050565b600060208201905081810360008301526119f0816118ba565b9050919050565b60006020820190508181036000830152611a10816118dd565b9050919050565b6000602082019050611a2c6000830184611900565b92915050565b6000611a3c611a4d565b9050611a488282611c09565b919050565b6000604051905090565b600067ffffffffffffffff821115611a7257611a71611c98565b5b611a7b82611cc7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000611ad682611b8b565b9150611ae183611b8b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611b1657611b15611c3a565b5b828201905092915050565b6000611b2c82611b6b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015611bc2578082015181840152602081019050611ba7565b83811115611bd1576000848401525b50505050565b60006002820490506001821680611bef57607f821691505b60208210811415611c0357611c02611c69565b5b50919050565b611c1282611cc7565b810181811067ffffffffffffffff82111715611c3157611c30611c98565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f55736572206c696d697420726561636865640000000000000000000000000000600082015250565b7f4e6f74206d6f726520737570706c79206c656674000000000000000000000000600082015250565b611d3381611b21565b8114611d3e57600080fd5b50565b611d4a81611b33565b8114611d5557600080fd5b50565b611d6181611b3f565b8114611d6c57600080fd5b50565b611d7881611b8b565b8114611d8357600080fd5b5056fe697066733a2f2f516d626147686e517a6b757a5a683167674e7151546e33535334387a767a73616b4d425033467a746e694438636d2fa26469706673582212203acee32b8ac91554d1a160f7c4b5e1e09a57249e429b914ff090a38865d39c3b64736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80636352211e116100a2578063a22cb46511610071578063a22cb465146102b8578063b88d4fde146102d4578063c87b56dd146102f0578063e471ae0a14610320578063e985e9c51461033e5761010b565b80636352211e1461021e57806370a082311461024e57806395d89b411461027e578063a0712d681461029c5761010b565b806318160ddd116100de57806318160ddd146101aa57806323b872dd146101c857806332cb6b0c146101e457806342842e0e146102025761010b565b806301ffc9a71461011057806306fdde0314610140578063081812fc1461015e578063095ea7b31461018e575b600080fd5b61012a6004803603810190610125919061177e565b61036e565b604051610137919061199a565b60405180910390f35b610148610400565b60405161015591906119b5565b60405180910390f35b610178600480360381019061017391906117d0565b610492565b6040516101859190611933565b60405180910390f35b6101a860048036038101906101a39190611742565b610511565b005b6101b2610655565b6040516101bf9190611a17565b60405180910390f35b6101e260048036038101906101dd919061163c565b61066c565b005b6101ec610991565b6040516101f99190611a17565b60405180910390f35b61021c6004803603810190610217919061163c565b610997565b005b610238600480360381019061023391906117d0565b6109b7565b6040516102459190611933565b60405180910390f35b610268600480360381019061026391906115d7565b6109c9565b6040516102759190611a17565b60405180910390f35b610286610a82565b60405161029391906119b5565b60405180910390f35b6102b660048036038101906102b191906117d0565b610b14565b005b6102d260048036038101906102cd9190611706565b610bcf565b005b6102ee60048036038101906102e9919061168b565b610d47565b005b61030a600480360381019061030591906117d0565b610dba565b60405161031791906119b5565b60405180910390f35b610328610e59565b6040516103359190611a17565b60405180910390f35b61035860048036038101906103539190611600565b610e5e565b604051610365919061199a565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806103c957506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806103f95750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461040f90611bd7565b80601f016020809104026020016040519081016040528092919081815260200182805461043b90611bd7565b80156104885780601f1061045d57610100808354040283529160200191610488565b820191906000526020600020905b81548152906001019060200180831161046b57829003601f168201915b5050505050905090565b600061049d82610ef2565b6104d3576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061051c826109b7565b90508073ffffffffffffffffffffffffffffffffffffffff1661053d610f51565b73ffffffffffffffffffffffffffffffffffffffff16146105a05761056981610564610f51565b610e5e565b61059f576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061065f610f59565b6001546000540303905090565b600061067782610f5e565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106de576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806106ea8461102c565b9150915061070081876106fb610f51565b611053565b61074c5761071586610710610f51565b610e5e565b61074b576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156107b3576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107c08686866001611097565b80156107cb57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506108998561087588888761109d565b7c0200000000000000000000000000000000000000000000000000000000176110c5565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416141561092157600060018501905060006004600083815260200190815260200160002054141561091f57600054811461091e578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461098986868660016110f0565b505050505050565b61071581565b6109b283838360405180602001604052806000815250610d47565b505050565b60006109c282610f5e565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610a31576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b606060038054610a9190611bd7565b80601f0160208091040260200160405190810160405280929190818152602001828054610abd90611bd7565b8015610b0a5780601f10610adf57610100808354040283529160200191610b0a565b820191906000526020600020905b815481529060010190602001808311610aed57829003601f168201915b5050505050905090565b61071581610b206110f6565b610b2a9190611acb565b1115610b6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b62906119f7565b60405180910390fd5b600181610b7733611109565b610b819190611acb565b1115610bc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb9906119d7565b60405180910390fd5b610bcc3382611160565b50565b610bd7610f51565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610c3c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610c49610f51565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610cf6610f51565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610d3b919061199a565b60405180910390a35050565b610d5284848461066c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14610db457610d7d8484848461131d565b610db3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060610dc582610ef2565b610dfb576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000610e0561147d565b9050600081511415610e265760405180602001604052806000815250610e51565b80610e308461149d565b604051602001610e4192919061190f565b6040516020818303038152906040525b915050919050565b600181565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600081610efd610f59565b11158015610f0c575060005482105b8015610f4a575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60008082905080610f6d610f59565b11610ff557600054811015610ff45760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415610ff2575b6000811415610fe8576004600083600190039350838152602001908152602001600020549050610fbd565b8092505050611027565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86110b48686846114ed565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6000611100610f59565b60005403905090565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008054905060008214156111a1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6111ae6000848385611097565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061122583611216600086600061109d565b61121f856114f6565b176110c5565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b8181146112c657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061128b565b506000821415611302576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061131860008483856110f0565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611343610f51565b8786866040518563ffffffff1660e01b8152600401611365949392919061194e565b602060405180830381600087803b15801561137f57600080fd5b505af19250505080156113b057506040513d601f19601f820116820180604052508101906113ad91906117a7565b60015b61142a573d80600081146113e0576040519150601f19603f3d011682016040523d82523d6000602084013e6113e5565b606091505b50600081511415611422576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060604051806060016040528060368152602001611d8760369139905090565b606060806040510190508060405280825b6001156114d957600183039250600a81066030018353600a81049050806114d4576114d9565b6114ae565b508181036020830392508083525050919050565b60009392505050565b60006001821460e11b9050919050565b600061151961151484611a57565b611a32565b90508281526020810184848401111561153157600080fd5b61153c848285611b95565b509392505050565b60008135905061155381611d2a565b92915050565b60008135905061156881611d41565b92915050565b60008135905061157d81611d58565b92915050565b60008151905061159281611d58565b92915050565b600082601f8301126115a957600080fd5b81356115b9848260208601611506565b91505092915050565b6000813590506115d181611d6f565b92915050565b6000602082840312156115e957600080fd5b60006115f784828501611544565b91505092915050565b6000806040838503121561161357600080fd5b600061162185828601611544565b925050602061163285828601611544565b9150509250929050565b60008060006060848603121561165157600080fd5b600061165f86828701611544565b935050602061167086828701611544565b9250506040611681868287016115c2565b9150509250925092565b600080600080608085870312156116a157600080fd5b60006116af87828801611544565b94505060206116c087828801611544565b93505060406116d1878288016115c2565b925050606085013567ffffffffffffffff8111156116ee57600080fd5b6116fa87828801611598565b91505092959194509250565b6000806040838503121561171957600080fd5b600061172785828601611544565b925050602061173885828601611559565b9150509250929050565b6000806040838503121561175557600080fd5b600061176385828601611544565b9250506020611774858286016115c2565b9150509250929050565b60006020828403121561179057600080fd5b600061179e8482850161156e565b91505092915050565b6000602082840312156117b957600080fd5b60006117c784828501611583565b91505092915050565b6000602082840312156117e257600080fd5b60006117f0848285016115c2565b91505092915050565b61180281611b21565b82525050565b61181181611b33565b82525050565b600061182282611a88565b61182c8185611a9e565b935061183c818560208601611ba4565b61184581611cc7565b840191505092915050565b600061185b82611a93565b6118658185611aaf565b9350611875818560208601611ba4565b61187e81611cc7565b840191505092915050565b600061189482611a93565b61189e8185611ac0565b93506118ae818560208601611ba4565b80840191505092915050565b60006118c7601283611aaf565b91506118d282611cd8565b602082019050919050565b60006118ea601483611aaf565b91506118f582611d01565b602082019050919050565b61190981611b8b565b82525050565b600061191b8285611889565b91506119278284611889565b91508190509392505050565b600060208201905061194860008301846117f9565b92915050565b600060808201905061196360008301876117f9565b61197060208301866117f9565b61197d6040830185611900565b818103606083015261198f8184611817565b905095945050505050565b60006020820190506119af6000830184611808565b92915050565b600060208201905081810360008301526119cf8184611850565b905092915050565b600060208201905081810360008301526119f0816118ba565b9050919050565b60006020820190508181036000830152611a10816118dd565b9050919050565b6000602082019050611a2c6000830184611900565b92915050565b6000611a3c611a4d565b9050611a488282611c09565b919050565b6000604051905090565b600067ffffffffffffffff821115611a7257611a71611c98565b5b611a7b82611cc7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000611ad682611b8b565b9150611ae183611b8b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611b1657611b15611c3a565b5b828201905092915050565b6000611b2c82611b6b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015611bc2578082015181840152602081019050611ba7565b83811115611bd1576000848401525b50505050565b60006002820490506001821680611bef57607f821691505b60208210811415611c0357611c02611c69565b5b50919050565b611c1282611cc7565b810181811067ffffffffffffffff82111715611c3157611c30611c98565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f55736572206c696d697420726561636865640000000000000000000000000000600082015250565b7f4e6f74206d6f726520737570706c79206c656674000000000000000000000000600082015250565b611d3381611b21565b8114611d3e57600080fd5b50565b611d4a81611b33565b8114611d5557600080fd5b50565b611d6181611b3f565b8114611d6c57600080fd5b50565b611d7881611b8b565b8114611d8357600080fd5b5056fe697066733a2f2f516d626147686e517a6b757a5a683167674e7151546e33535334387a767a73616b4d425033467a746e694438636d2fa26469706673582212203acee32b8ac91554d1a160f7c4b5e1e09a57249e429b914ff090a38865d39c3b64736f6c63430008040033

Deployed Bytecode Sourcemap

50917:681:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18435:639;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19337:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25820:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25261:400;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15088:323;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29527:2817;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51012:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32440:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20730:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16272:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19513:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51121:306;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26378:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33223:399;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19723:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50967:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26843:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18435:639;18520:4;18859:10;18844:25;;:11;:25;;;;:102;;;;18936:10;18921:25;;:11;:25;;;;18844:102;:179;;;;19013:10;18998:25;;:11;:25;;;;18844:179;18824:199;;18435:639;;;:::o;19337:100::-;19391:13;19424:5;19417:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19337:100;:::o;25820:218::-;25896:7;25921:16;25929:7;25921;:16::i;:::-;25916:64;;25946:34;;;;;;;;;;;;;;25916:64;26000:15;:24;26016:7;26000:24;;;;;;;;;;;:30;;;;;;;;;;;;25993:37;;25820:218;;;:::o;25261:400::-;25342:13;25358:16;25366:7;25358;:16::i;:::-;25342:32;;25414:5;25391:28;;:19;:17;:19::i;:::-;:28;;;25387:175;;25439:44;25456:5;25463:19;:17;:19::i;:::-;25439:16;:44::i;:::-;25434:128;;25511:35;;;;;;;;;;;;;;25434:128;25387:175;25607:2;25574:15;:24;25590:7;25574:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;25645:7;25641:2;25625:28;;25634:5;25625:28;;;;;;;;;;;;25261:400;;;:::o;15088:323::-;15149:7;15377:15;:13;:15::i;:::-;15362:12;;15346:13;;:28;:46;15339:53;;15088:323;:::o;29527:2817::-;29661:27;29691;29710:7;29691:18;:27::i;:::-;29661:57;;29776:4;29735:45;;29751:19;29735:45;;;29731:86;;29789:28;;;;;;;;;;;;;;29731:86;29831:27;29860:23;29887:35;29914:7;29887:26;:35::i;:::-;29830:92;;;;30022:68;30047:15;30064:4;30070:19;:17;:19::i;:::-;30022:24;:68::i;:::-;30017:180;;30110:43;30127:4;30133:19;:17;:19::i;:::-;30110:16;:43::i;:::-;30105:92;;30162:35;;;;;;;;;;;;;;30105:92;30017:180;30228:1;30214:16;;:2;:16;;;30210:52;;;30239:23;;;;;;;;;;;;;;30210:52;30275:43;30297:4;30303:2;30307:7;30316:1;30275:21;:43::i;:::-;30411:15;30408:2;;;30551:1;30530:19;30523:30;30408:2;30948:18;:24;30967:4;30948:24;;;;;;;;;;;;;;;;30946:26;;;;;;;;;;;;31017:18;:22;31036:2;31017:22;;;;;;;;;;;;;;;;31015:24;;;;;;;;;;;31339:146;31376:2;31425:45;31440:4;31446:2;31450:19;31425:14;:45::i;:::-;11487:8;31397:73;31339:18;:146::i;:::-;31310:17;:26;31328:7;31310:26;;;;;;;;;;;:175;;;;31656:1;11487:8;31605:19;:47;:52;31601:627;;;31678:19;31710:1;31700:7;:11;31678:33;;31867:1;31833:17;:30;31851:11;31833:30;;;;;;;;;;;;:35;31829:384;;;31971:13;;31956:11;:28;31952:242;;32151:19;32118:17;:30;32136:11;32118:30;;;;;;;;;;;:52;;;;31952:242;31829:384;31601:627;;32275:7;32271:2;32256:27;;32265:4;32256:27;;;;;;;;;;;;32294:42;32315:4;32321:2;32325:7;32334:1;32294:20;:42::i;:::-;29527:2817;;;;;;:::o;51012:41::-;51049:4;51012:41;:::o;32440:185::-;32578:39;32595:4;32601:2;32605:7;32578:39;;;;;;;;;;;;:16;:39::i;:::-;32440:185;;;:::o;20730:152::-;20802:7;20845:27;20864:7;20845:18;:27::i;:::-;20822:52;;20730:152;;;:::o;16272:233::-;16344:7;16385:1;16368:19;;:5;:19;;;16364:60;;;16396:28;;;;;;;;;;;;;;16364:60;10431:13;16442:18;:25;16461:5;16442:25;;;;;;;;;;;;;;;;:55;16435:62;;16272:233;;;:::o;19513:104::-;19569:13;19602:7;19595:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19513:104;:::o;51121:306::-;51049:4;51198:8;51181:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:39;;51173:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;51004:1;51292:8;51264:25;51278:10;51264:13;:25::i;:::-;:36;;;;:::i;:::-;:50;;51256:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;51392:27;51398:10;51410:8;51392:5;:27::i;:::-;51121:306;:::o;26378:308::-;26489:19;:17;:19::i;:::-;26477:31;;:8;:31;;;26473:61;;;26517:17;;;;;;;;;;;;;;26473:61;26599:8;26547:18;:39;26566:19;:17;:19::i;:::-;26547:39;;;;;;;;;;;;;;;:49;26587:8;26547:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26659:8;26623:55;;26638:19;:17;:19::i;:::-;26623:55;;;26669:8;26623:55;;;;;;:::i;:::-;;;;;;;;26378:308;;:::o;33223:399::-;33390:31;33403:4;33409:2;33413:7;33390:12;:31::i;:::-;33454:1;33436:2;:14;;;:19;33432:183;;33475:56;33506:4;33512:2;33516:7;33525:5;33475:30;:56::i;:::-;33470:145;;33559:40;;;;;;;;;;;;;;33470:145;33432:183;33223:399;;;;:::o;19723:318::-;19796:13;19827:16;19835:7;19827;:16::i;:::-;19822:59;;19852:29;;;;;;;;;;;;;;19822:59;19894:21;19918:10;:8;:10::i;:::-;19894:34;;19971:1;19952:7;19946:21;:26;;:87;;;;;;;;;;;;;;;;;19999:7;20008:18;20018:7;20008:9;:18::i;:::-;19982:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19946:87;19939:94;;;19723:318;;;:::o;50967:38::-;51004:1;50967:38;:::o;26843:164::-;26940:4;26964:18;:25;26983:5;26964:25;;;;;;;;;;;;;;;:35;26990:8;26964:35;;;;;;;;;;;;;;;;;;;;;;;;;26957:42;;26843:164;;;;:::o;27265:282::-;27330:4;27386:7;27367:15;:13;:15::i;:::-;:26;;:66;;;;;27420:13;;27410:7;:23;27367:66;:153;;;;;27519:1;11207:8;27471:17;:26;27489:7;27471:26;;;;;;;;;;;;:44;:49;27367:153;27347:173;;27265:282;;;:::o;49031:105::-;49091:7;49118:10;49111:17;;49031:105;:::o;14604:92::-;14660:7;14604:92;:::o;21885:1275::-;21952:7;21972:12;21987:7;21972:22;;22055:4;22036:15;:13;:15::i;:::-;:23;22032:1061;;22089:13;;22082:4;:20;22078:1015;;;22127:14;22144:17;:23;22162:4;22144:23;;;;;;;;;;;;22127:40;;22261:1;11207:8;22233:6;:24;:29;22229:845;;;22898:113;22915:1;22905:6;:11;22898:113;;;22958:17;:25;22976:6;;;;;;;22958:25;;;;;;;;;;;;22949:34;;22898:113;;;23044:6;23037:13;;;;;;22229:845;22078:1015;;22032:1061;23121:31;;;;;;;;;;;;;;21885:1275;;;;:::o;28428:479::-;28530:27;28559:23;28600:38;28641:15;:24;28657:7;28641:24;;;;;;;;;;;28600:65;;28812:18;28789:41;;28869:19;28863:26;28844:45;;28774:126;;;;:::o;27656:659::-;27805:11;27970:16;27963:5;27959:28;27950:37;;28130:16;28119:9;28115:32;28102:45;;28280:15;28269:9;28266:30;28258:5;28247:9;28244:20;28241:56;28231:66;;27838:470;;;;;:::o;34284:159::-;;;;;:::o;48340:311::-;48475:7;48495:16;11611:3;48521:19;:41;;48495:68;;11611:3;48589:31;48600:4;48606:2;48610:9;48589:10;:31::i;:::-;48581:40;;:62;;48574:69;;;48340:311;;;;;:::o;23708:450::-;23788:14;23956:16;23949:5;23945:28;23936:37;;24133:5;24119:11;24094:23;24090:41;24087:52;24080:5;24077:63;24067:73;;23824:327;;;;:::o;35108:158::-;;;;;:::o;15509:296::-;15564:7;15771:15;:13;:15::i;:::-;15755:13;;:31;15748:38;;15509:296;:::o;16587:178::-;16648:7;10431:13;10569:2;16676:18;:25;16695:5;16676:25;;;;;;;;;;;;;;;;:50;;16675:82;16668:89;;16587:178;;;:::o;36884:2454::-;36957:20;36980:13;;36957:36;;37020:1;37008:8;:13;37004:44;;;37030:18;;;;;;;;;;;;;;37004:44;37061:61;37091:1;37095:2;37099:12;37113:8;37061:21;:61::i;:::-;37605:1;10569:2;37575:1;:26;;37574:32;37562:8;:45;37536:18;:22;37555:2;37536:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;37884:139;37921:2;37975:33;37998:1;38002:2;38006:1;37975:14;:33::i;:::-;37942:30;37963:8;37942:20;:30::i;:::-;:66;37884:18;:139::i;:::-;37850:17;:31;37868:12;37850:31;;;;;;;;;;;:173;;;;38040:16;38071:11;38100:8;38085:12;:23;38071:37;;38355:16;38351:2;38347:25;38335:37;;38727:12;38687:8;38646:1;38584:25;38525:1;38464;38437:335;38852:1;38838:12;38834:20;38792:346;38893:3;38884:7;38881:16;38792:346;;39111:7;39101:8;39098:1;39071:25;39068:1;39065;39060:59;38946:1;38937:7;38933:15;38922:26;;38792:346;;;38796:77;39183:1;39171:8;:13;39167:45;;;39193:19;;;;;;;;;;;;;;39167:45;39245:3;39229:13;:19;;;;36884:2454;;39270:60;39299:1;39303:2;39307:12;39321:8;39270:20;:60::i;:::-;36884:2454;;;:::o;35706:716::-;35869:4;35915:2;35890:45;;;35936:19;:17;:19::i;:::-;35957:4;35963:7;35972:5;35890:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35886:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36190:1;36173:6;:13;:18;36169:235;;;36219:40;;;;;;;;;;;;;;36169:235;36362:6;36356:13;36347:6;36343:2;36339:15;36332:38;35886:529;36059:54;;;36049:64;;;:6;:64;;;;36042:71;;;35706:716;;;;;;:::o;51438:157::-;51498:13;51524:63;;;;;;;;;;;;;;;;;;;51438:157;:::o;49238:1581::-;49303:17;49728:4;49721;49715:11;49711:22;49704:29;;49820:3;49814:4;49807:17;49926:3;50165:5;50147:428;50173:1;50147:428;;;50213:1;50208:3;50204:11;50197:18;;50384:2;50378:4;50374:13;50370:2;50366:22;50361:3;50353:36;50478:2;50472:4;50468:13;50460:21;;50545:4;50535:2;;50553:5;;50535:2;50147:428;;;50151:21;50614:3;50609;50605:13;50729:4;50724:3;50720:14;50713:21;;50794:6;50789:3;50782:19;49342:1470;;;;;:::o;48041:147::-;48178:6;48041:147;;;;;:::o;24260:324::-;24330:14;24563:1;24553:8;24550:15;24524:24;24520:46;24510:56;;24432:145;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;544:5;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:137::-;685:5;723:6;710:20;701:29;;739:32;765:5;739:32;:::i;:::-;691:86;;;;:::o;783:141::-;839:5;870:6;864:13;855:22;;886:32;912:5;886:32;:::i;:::-;845:79;;;;:::o;943:271::-;998:5;1047:3;1040:4;1032:6;1028:17;1024:27;1014:2;;1065:1;1062;1055:12;1014:2;1105:6;1092:20;1130:78;1204:3;1196:6;1189:4;1181:6;1177:17;1130:78;:::i;:::-;1121:87;;1004:210;;;;;:::o;1220:139::-;1266:5;1304:6;1291:20;1282:29;;1320:33;1347:5;1320:33;:::i;:::-;1272:87;;;;:::o;1365:262::-;1424:6;1473:2;1461:9;1452:7;1448:23;1444:32;1441:2;;;1489:1;1486;1479:12;1441:2;1532:1;1557:53;1602:7;1593:6;1582:9;1578:22;1557:53;:::i;:::-;1547:63;;1503:117;1431:196;;;;:::o;1633:407::-;1701:6;1709;1758:2;1746:9;1737:7;1733:23;1729:32;1726:2;;;1774:1;1771;1764:12;1726:2;1817:1;1842:53;1887:7;1878:6;1867:9;1863:22;1842:53;:::i;:::-;1832:63;;1788:117;1944:2;1970:53;2015:7;2006:6;1995:9;1991:22;1970:53;:::i;:::-;1960:63;;1915:118;1716:324;;;;;:::o;2046:552::-;2123:6;2131;2139;2188:2;2176:9;2167:7;2163:23;2159:32;2156:2;;;2204:1;2201;2194:12;2156:2;2247:1;2272:53;2317:7;2308:6;2297:9;2293:22;2272:53;:::i;:::-;2262:63;;2218:117;2374:2;2400:53;2445:7;2436:6;2425:9;2421:22;2400:53;:::i;:::-;2390:63;;2345:118;2502:2;2528:53;2573:7;2564:6;2553:9;2549:22;2528:53;:::i;:::-;2518:63;;2473:118;2146:452;;;;;:::o;2604:809::-;2699:6;2707;2715;2723;2772:3;2760:9;2751:7;2747:23;2743:33;2740:2;;;2789:1;2786;2779:12;2740:2;2832:1;2857:53;2902:7;2893:6;2882:9;2878:22;2857:53;:::i;:::-;2847:63;;2803:117;2959:2;2985:53;3030:7;3021:6;3010:9;3006:22;2985:53;:::i;:::-;2975:63;;2930:118;3087:2;3113:53;3158:7;3149:6;3138:9;3134:22;3113:53;:::i;:::-;3103:63;;3058:118;3243:2;3232:9;3228:18;3215:32;3274:18;3266:6;3263:30;3260:2;;;3306:1;3303;3296:12;3260:2;3334:62;3388:7;3379:6;3368:9;3364:22;3334:62;:::i;:::-;3324:72;;3186:220;2730:683;;;;;;;:::o;3419:401::-;3484:6;3492;3541:2;3529:9;3520:7;3516:23;3512:32;3509:2;;;3557:1;3554;3547:12;3509:2;3600:1;3625:53;3670:7;3661:6;3650:9;3646:22;3625:53;:::i;:::-;3615:63;;3571:117;3727:2;3753:50;3795:7;3786:6;3775:9;3771:22;3753:50;:::i;:::-;3743:60;;3698:115;3499:321;;;;;:::o;3826:407::-;3894:6;3902;3951:2;3939:9;3930:7;3926:23;3922:32;3919:2;;;3967:1;3964;3957:12;3919:2;4010:1;4035:53;4080:7;4071:6;4060:9;4056:22;4035:53;:::i;:::-;4025:63;;3981:117;4137:2;4163:53;4208:7;4199:6;4188:9;4184:22;4163:53;:::i;:::-;4153:63;;4108:118;3909:324;;;;;:::o;4239:260::-;4297:6;4346:2;4334:9;4325:7;4321:23;4317:32;4314:2;;;4362:1;4359;4352:12;4314:2;4405:1;4430:52;4474:7;4465:6;4454:9;4450:22;4430:52;:::i;:::-;4420:62;;4376:116;4304:195;;;;:::o;4505:282::-;4574:6;4623:2;4611:9;4602:7;4598:23;4594:32;4591:2;;;4639:1;4636;4629:12;4591:2;4682:1;4707:63;4762:7;4753:6;4742:9;4738:22;4707:63;:::i;:::-;4697:73;;4653:127;4581:206;;;;:::o;4793:262::-;4852:6;4901:2;4889:9;4880:7;4876:23;4872:32;4869:2;;;4917:1;4914;4907:12;4869:2;4960:1;4985:53;5030:7;5021:6;5010:9;5006:22;4985:53;:::i;:::-;4975:63;;4931:117;4859:196;;;;:::o;5061:118::-;5148:24;5166:5;5148:24;:::i;:::-;5143:3;5136:37;5126:53;;:::o;5185:109::-;5266:21;5281:5;5266:21;:::i;:::-;5261:3;5254:34;5244:50;;:::o;5300:360::-;5386:3;5414:38;5446:5;5414:38;:::i;:::-;5468:70;5531:6;5526:3;5468:70;:::i;:::-;5461:77;;5547:52;5592:6;5587:3;5580:4;5573:5;5569:16;5547:52;:::i;:::-;5624:29;5646:6;5624:29;:::i;:::-;5619:3;5615:39;5608:46;;5390:270;;;;;:::o;5666:364::-;5754:3;5782:39;5815:5;5782:39;:::i;:::-;5837:71;5901:6;5896:3;5837:71;:::i;:::-;5830:78;;5917:52;5962:6;5957:3;5950:4;5943:5;5939:16;5917:52;:::i;:::-;5994:29;6016:6;5994:29;:::i;:::-;5989:3;5985:39;5978:46;;5758:272;;;;;:::o;6036:377::-;6142:3;6170:39;6203:5;6170:39;:::i;:::-;6225:89;6307:6;6302:3;6225:89;:::i;:::-;6218:96;;6323:52;6368:6;6363:3;6356:4;6349:5;6345:16;6323:52;:::i;:::-;6400:6;6395:3;6391:16;6384:23;;6146:267;;;;;:::o;6419:366::-;6561:3;6582:67;6646:2;6641:3;6582:67;:::i;:::-;6575:74;;6658:93;6747:3;6658:93;:::i;:::-;6776:2;6771:3;6767:12;6760:19;;6565:220;;;:::o;6791:366::-;6933:3;6954:67;7018:2;7013:3;6954:67;:::i;:::-;6947:74;;7030:93;7119:3;7030:93;:::i;:::-;7148:2;7143:3;7139:12;7132:19;;6937:220;;;:::o;7163:118::-;7250:24;7268:5;7250:24;:::i;:::-;7245:3;7238:37;7228:53;;:::o;7287:435::-;7467:3;7489:95;7580:3;7571:6;7489:95;:::i;:::-;7482:102;;7601:95;7692:3;7683:6;7601:95;:::i;:::-;7594:102;;7713:3;7706:10;;7471:251;;;;;:::o;7728:222::-;7821:4;7859:2;7848:9;7844:18;7836:26;;7872:71;7940:1;7929:9;7925:17;7916:6;7872:71;:::i;:::-;7826:124;;;;:::o;7956:640::-;8151:4;8189:3;8178:9;8174:19;8166:27;;8203:71;8271:1;8260:9;8256:17;8247:6;8203:71;:::i;:::-;8284:72;8352:2;8341:9;8337:18;8328:6;8284:72;:::i;:::-;8366;8434:2;8423:9;8419:18;8410:6;8366:72;:::i;:::-;8485:9;8479:4;8475:20;8470:2;8459:9;8455:18;8448:48;8513:76;8584:4;8575:6;8513:76;:::i;:::-;8505:84;;8156:440;;;;;;;:::o;8602:210::-;8689:4;8727:2;8716:9;8712:18;8704:26;;8740:65;8802:1;8791:9;8787:17;8778:6;8740:65;:::i;:::-;8694:118;;;;:::o;8818:313::-;8931:4;8969:2;8958:9;8954:18;8946:26;;9018:9;9012:4;9008:20;9004:1;8993:9;8989:17;8982:47;9046:78;9119:4;9110:6;9046:78;:::i;:::-;9038:86;;8936:195;;;;:::o;9137:419::-;9303:4;9341:2;9330:9;9326:18;9318:26;;9390:9;9384:4;9380:20;9376:1;9365:9;9361:17;9354:47;9418:131;9544:4;9418:131;:::i;:::-;9410:139;;9308:248;;;:::o;9562:419::-;9728:4;9766:2;9755:9;9751:18;9743:26;;9815:9;9809:4;9805:20;9801:1;9790:9;9786:17;9779:47;9843:131;9969:4;9843:131;:::i;:::-;9835:139;;9733:248;;;:::o;9987:222::-;10080:4;10118:2;10107:9;10103:18;10095:26;;10131:71;10199:1;10188:9;10184:17;10175:6;10131:71;:::i;:::-;10085:124;;;;:::o;10215:129::-;10249:6;10276:20;;:::i;:::-;10266:30;;10305:33;10333:4;10325:6;10305:33;:::i;:::-;10256:88;;;:::o;10350:75::-;10383:6;10416:2;10410:9;10400:19;;10390:35;:::o;10431:307::-;10492:4;10582:18;10574:6;10571:30;10568:2;;;10604:18;;:::i;:::-;10568:2;10642:29;10664:6;10642:29;:::i;:::-;10634:37;;10726:4;10720;10716:15;10708:23;;10497:241;;;:::o;10744:98::-;10795:6;10829:5;10823:12;10813:22;;10802:40;;;:::o;10848:99::-;10900:6;10934:5;10928:12;10918:22;;10907:40;;;:::o;10953:168::-;11036:11;11070:6;11065:3;11058:19;11110:4;11105:3;11101:14;11086:29;;11048:73;;;;:::o;11127:169::-;11211:11;11245:6;11240:3;11233:19;11285:4;11280:3;11276:14;11261:29;;11223:73;;;;:::o;11302:148::-;11404:11;11441:3;11426:18;;11416:34;;;;:::o;11456:305::-;11496:3;11515:20;11533:1;11515:20;:::i;:::-;11510:25;;11549:20;11567:1;11549:20;:::i;:::-;11544:25;;11703:1;11635:66;11631:74;11628:1;11625:81;11622:2;;;11709:18;;:::i;:::-;11622:2;11753:1;11750;11746:9;11739:16;;11500:261;;;;:::o;11767:96::-;11804:7;11833:24;11851:5;11833:24;:::i;:::-;11822:35;;11812:51;;;:::o;11869:90::-;11903:7;11946:5;11939:13;11932:21;11921:32;;11911:48;;;:::o;11965:149::-;12001:7;12041:66;12034:5;12030:78;12019:89;;12009:105;;;:::o;12120:126::-;12157:7;12197:42;12190:5;12186:54;12175:65;;12165:81;;;:::o;12252:77::-;12289:7;12318:5;12307:16;;12297:32;;;:::o;12335:154::-;12419:6;12414:3;12409;12396:30;12481:1;12472:6;12467:3;12463:16;12456:27;12386:103;;;:::o;12495:307::-;12563:1;12573:113;12587:6;12584:1;12581:13;12573:113;;;12672:1;12667:3;12663:11;12657:18;12653:1;12648:3;12644:11;12637:39;12609:2;12606:1;12602:10;12597:15;;12573:113;;;12704:6;12701:1;12698:13;12695:2;;;12784:1;12775:6;12770:3;12766:16;12759:27;12695:2;12544:258;;;;:::o;12808:320::-;12852:6;12889:1;12883:4;12879:12;12869:22;;12936:1;12930:4;12926:12;12957:18;12947:2;;13013:4;13005:6;13001:17;12991:27;;12947:2;13075;13067:6;13064:14;13044:18;13041:38;13038:2;;;13094:18;;:::i;:::-;13038:2;12859:269;;;;:::o;13134:281::-;13217:27;13239:4;13217:27;:::i;:::-;13209:6;13205:40;13347:6;13335:10;13332:22;13311:18;13299:10;13296:34;13293:62;13290:2;;;13358:18;;:::i;:::-;13290:2;13398:10;13394:2;13387:22;13177:238;;;:::o;13421:180::-;13469:77;13466:1;13459:88;13566:4;13563:1;13556:15;13590:4;13587:1;13580:15;13607:180;13655:77;13652:1;13645:88;13752:4;13749:1;13742:15;13776:4;13773:1;13766:15;13793:180;13841:77;13838:1;13831:88;13938:4;13935:1;13928:15;13962:4;13959:1;13952:15;13979:102;14020:6;14071:2;14067:7;14062:2;14055:5;14051:14;14047:28;14037:38;;14027:54;;;:::o;14087:168::-;14227:20;14223:1;14215:6;14211:14;14204:44;14193:62;:::o;14261:170::-;14401:22;14397:1;14389:6;14385:14;14378:46;14367:64;:::o;14437:122::-;14510:24;14528:5;14510:24;:::i;:::-;14503:5;14500:35;14490:2;;14549:1;14546;14539:12;14490:2;14480:79;:::o;14565:116::-;14635:21;14650:5;14635:21;:::i;:::-;14628:5;14625:32;14615:2;;14671:1;14668;14661:12;14615:2;14605:76;:::o;14687:120::-;14759:23;14776:5;14759:23;:::i;:::-;14752:5;14749:34;14739:2;;14797:1;14794;14787:12;14739:2;14729:78;:::o;14813:122::-;14886:24;14904:5;14886:24;:::i;:::-;14879:5;14876:35;14866:2;;14925:1;14922;14915:12;14866:2;14856:79;:::o

Swarm Source

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