ETH Price: $3,264.96 (-2.70%)

Token

Dopamine Party NFTs (PARTY)
 

Overview

Max Total Supply

543 PARTY

Holders

543

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
komodokitty.eth
0x65088C68878c4c31448d46d63ADcd3e700339076
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:
DopaminePartyNFT

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : DopaminePartyNFT.sol
pragma solidity ^0.8.15;

////////////////////////////////////////////////////////////////////////////////
///              ░▒█▀▀▄░█▀▀█░▒█▀▀█░█▀▀▄░▒█▀▄▀█░▄█░░▒█▄░▒█░▒█▀▀▀              ///
///              ░▒█░▒█░█▄▀█░▒█▄▄█▒█▄▄█░▒█▒█▒█░░█▒░▒█▒█▒█░▒█▀▀▀              ///
///              ░▒█▄▄█░█▄▄█░▒█░░░▒█░▒█░▒█░░▒█░▄█▄░▒█░░▀█░▒█▄▄▄              ///
////////////////////////////////////////////////////////////////////////////////

import {ERC1155NT} from "../erc1155/ERC1155NT.sol";
import {IDopaminePartyNFT} from "../interfaces/IDopaminePartyNFT.sol";

/// @title Dopamine Party NFTs
/// @notice Dopamine Party NFTs are non-transferable ERC-1155s given to
///  attendees of Dopamine's various IRL or virtual events & parties. This
///  ERC-1155 implementation additionally supports per NFT type supply tracking
///  and minting through airdrops or merkle allowlist claims. Each NFT type
///  uniquely identifies a specific party, thus attendees may own 1 max of each.
contract DopaminePartyNFT is ERC1155NT, IDopaminePartyNFT {

    string public name = "Dopamine Party NFTs";

    string public symbol = "PARTY";

    /// @notice The address administering NFT distributions and metadata.
    address public owner;

    /// @notice The URI each NFT initially points to for metadata resolution.
    /// @dev Before URI finalization, `uri()` resolves to "{baseURI}/{id}".
    string public baseURI;

    /// @notice Maps the id of an NFT type to its finalized metadata URI.
    /// @dev After URI finalization, `uri()` resolves to "{tokenURI[id]}".
    mapping(uint256 => string) public tokenURI;

    /// @notice Gets for a specific NFT type its total supply.
    mapping(uint256 => uint256) public totalSupply;

    // Merkle roots for each NFT type (null if NFT type is not claimable).
    mapping(uint256 => bytes32) private _allowlist;

    // Counter for tracking the current NFT type id.
    uint256 private _id;

    /// @dev Restricts a function call to address `owner`.
    modifier onlyOwner() {
        if (msg.sender != owner) {
            revert OwnerOnly();
        }
        _;
    }

    /// @notice Initializes contract with given base URI and sender as owner.
    /// @param baseURI_ The base URI address involved in fetching NFT metadata.
    constructor(string memory baseURI_) {
        baseURI = baseURI_;
        emit BaseURISet(baseURI);

        owner = msg.sender;
        emit OwnerChanged(address(0), owner);
    }

    /// @inheritdoc IDopaminePartyNFT
    function setBaseURI(string calldata newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
        emit BaseURISet(newBaseURI);
    }

    /// @inheritdoc IDopaminePartyNFT
    function setOwner(address newOwner) external onlyOwner {
        emit OwnerChanged(owner, newOwner);
        owner = newOwner;
    }

    /// @inheritdoc IDopaminePartyNFT
    function setTokenURI(uint256 id, string calldata newTokenURI)
        external
        onlyOwner
    {
        if (id >= _id) {
            revert TokenNonExistent();
        }
        if (bytes(tokenURI[id]).length != 0) {
            revert TokenImmutable();
        }
        tokenURI[id] = newTokenURI;
        emit TokenURISet(id, newTokenURI);
    }

    /// @notice Returns the metadata URI for NFT type with id `id`.
    /// @param id The id of the type of NFT being queried.
    function uri(uint256 id) external view returns (string memory) {
        if (totalSupply[id] == 0) {
            revert TokenNonExistent();
        }

        if (bytes(tokenURI[id]).length == 0) {
            return string(abi.encodePacked(baseURI, _toString(id)));
        } else {
            return tokenURI[id];
        }
    }

    /// @inheritdoc IDopaminePartyNFT
    function allowlist(uint256 id, bytes32 allowlistRoot) external onlyOwner {
        if (id > _id) {
            revert TokenNonExistent();
        }

        // Retroactive claim changes are disallowed once metadata is immutable.
        if (bytes(tokenURI[id]).length != 0) {
            revert TokenImmutable();
        }

        _allowlist[id] = allowlistRoot;
        if (id == _id) {
            _id += 1;
            emit PartyNFTCreated(id, allowlistRoot);
        } else {
            emit PartyNFTUpdated(id, allowlistRoot);
        }
    }

    /// @inheritdoc IDopaminePartyNFT
    function airdrop(uint256 id, address[] calldata addresses)
        external
        onlyOwner
    {
        if (id > _id) {
            revert TokenNonExistent();
        }

        // Retroactive airdrops are disallowed once metadata is immutable.
        if (bytes(tokenURI[id]).length != 0) {
            revert TokenImmutable();
        }

        if (id == _id) {
            _id += 1;
            emit PartyNFTCreated(id, "");
        } else {
            emit PartyNFTUpdated(id, "");
        }

        uint256 numAddresses = addresses.length;
        for (uint256 i = 0; i < numAddresses; i++) {
            _mint(addresses[i], id);
        }
        totalSupply[id] += numAddresses;
    }

    // @inheritdoc IDopaminePartyNFT
    function claim(bytes32[] calldata proof, uint256 id) external {
        bytes32 tokenAllowlist = _allowlist[id];
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));

        if (!_verify(tokenAllowlist, proof, leaf)) {
            revert ProofInvalid();
        }

        _mint(msg.sender, id);
        totalSupply[id]++;
    }

    /// @dev Checks whether `leaf` is part of merkle tree rooted at `merkleRoot`
    ///  using proof `proof`. Merkle tree generation and proof construction is
    ///  done using the following JS library: github.com/miguelmota/merkletreejs
    /// @param merkleRoot The hexlified merkle root as a bytes32 data type.
    /// @param proof The abi-encoded proof formatted as a bytes32 array.
    /// @param leaf The leaf node being checked (uses keccak-256 hashing).
    /// @return True if `leaf` is in `merkleRoot`-rooted tree, False otherwise.
    function _verify(
        bytes32 merkleRoot,
        bytes32[] memory proof,
        bytes32 leaf
    ) private pure returns (bool) {
        bytes32 hash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (hash <= proofElement) {
                hash = keccak256(abi.encodePacked(hash, proofElement));
            } else {
                hash = keccak256(abi.encodePacked(proofElement, hash));
            }
        }
        return hash == merkleRoot;
    }

    /// @dev Converts a uint256 into a string.
    function _toString(uint256 value) private pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
}

File 2 of 8 : ERC1155NT.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.13;

////////////////////////////////////////////////////////////////////////////////
///              ░▒█▀▀▄░█▀▀█░▒█▀▀█░█▀▀▄░▒█▀▄▀█░▄█░░▒█▄░▒█░▒█▀▀▀              ///
///              ░▒█░▒█░█▄▀█░▒█▄▄█▒█▄▄█░▒█▒█▒█░░█▒░▒█▒█▒█░▒█▀▀▀              ///
///              ░▒█▄▄█░█▄▄█░▒█░░░▒█░▒█░▒█░░▒█░▄█▄░▒█░░▀█░▒█▄▄▄              ///
////////////////////////////////////////////////////////////////////////////////

import {IERC1155} from "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import {IERC1155Receiver} from "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";

import {IERC1155NTErrors} from "../interfaces/IERC1155NTErrors.sol";

/// @title Dopamine non-transferable ERC-1155 contract
/// @notice This is a minimal ERC-1155 implementation that does not support
///  transfers outside of minting, throwing in all such cases.
contract ERC1155NT is IERC1155, IERC1155NTErrors {

    /// @notice Gets for an address the number of NFTs owned of a specific type.
    mapping(address => mapping(uint256 => uint256)) public balanceOf;

    /// @notice EIP-165 identifiers for all supported interfaces.
    bytes4 private constant _ERC165_INTERFACE_ID = 0x01ffc9a7;
    bytes4 private constant _ERC1155_INTERFACE_ID = 0xd9b67a26;
    bytes4 private constant _ERC1155_METADATA_INTERFACE_ID = 0x0e89341c;

    /// @notice Transfers an NFT from a source to a destination address.
    ///  WARNING: This will always throw as transfers are unsupported.
    function safeTransferFrom(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual {
        revert TokenNonTransferable();
    }

    /// @notice Transfers multiple NFTs from a source to a destination address.
    ///  WARNING: This will always throw as transfers are unsupported.
    function safeBatchTransferFrom(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual {
        revert TokenNonTransferable();
    }

    /// @notice Retrieves balances of multiple account / NFT type pairs.
    /// @param owners List of NFT owner addresses.
    /// @param ids List of ids of NFT types.
    /// @return balances List of balances corresponding to the owner / id pairs.
    function balanceOfBatch(address[] memory owners, uint256[] memory ids)
        public
        view
        virtual
        returns (uint256[] memory balances)
    {
        if (owners.length != ids.length) {
            revert ArityMismatch();
        }

        balances = new uint256[](owners.length);
        unchecked {
            for (uint256 i = 0; i < owners.length; ++i) {
                balances[i] = balanceOf[owners[i]][ids[i]];
            }
        }
    }

    /// @notice Checks if an operator is an authorized operator for an owner.
    ///  WARNING: This will always return false as operators are unsupported.
    function isApprovedForAll(address, address)
        external
        view
        virtual
        returns (bool)
    {
        return false;
    }

    /// @notice Sets the operator for the sender address.
    ///  WARNING: This will always throw as operators are unsupported.
    function setApprovalForAll(address, bool) public virtual {
        revert TokenNonTransferable();
    }

    /// @notice Checks if interface of identifier `id` is supported.
    /// @param id The ERC-165 interface identifier.
    /// @return True if interface id `id` is supported, False otherwise.
    function supportsInterface(bytes4 id) public pure virtual returns (bool) {
        return
            id == _ERC165_INTERFACE_ID ||
            id == _ERC1155_INTERFACE_ID ||
            id == _ERC1155_METADATA_INTERFACE_ID;
    }

    /// @notice Mints NFT of type `id` to address `to`.
    /// @param to Address receiving the minted NFT.
    /// @param id The id of the NFT type being minted.
    function _mint(address to, uint256 id) internal virtual {
        if (balanceOf[to][id] == 1) {
            revert TokenAlreadyMinted();
        }
        balanceOf[to][id] = 1;
        emit TransferSingle(msg.sender, address(0), to, id, 1);

        if (
            to.code.length != 0 &&
            IERC1155Receiver(to).onERC1155Received(
                msg.sender,
                address(0),
                id,
                1,
                ""
            ) !=
            IERC1155Receiver.onERC1155Received.selector
        ) {
            revert SafeTransferUnsupported();
        } else if (to == address(0)) {
            revert ReceiverInvalid();
        }
    }
}

File 3 of 8 : IDopaminePartyNFT.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.15;

////////////////////////////////////////////////////////////////////////////////
///              ░▒█▀▀▄░█▀▀█░▒█▀▀█░█▀▀▄░▒█▀▄▀█░▄█░░▒█▄░▒█░▒█▀▀▀              ///
///              ░▒█░▒█░█▄▀█░▒█▄▄█▒█▄▄█░▒█▒█▒█░░█▒░▒█▒█▒█░▒█▀▀▀              ///
///              ░▒█▄▄█░█▄▄█░▒█░░░▒█░▒█░▒█░░▒█░▄█▄░▒█░░▀█░▒█▄▄▄              ///
////////////////////////////////////////////////////////////////////////////////

import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

import {IDopaminePartyNFTEventsAndErrors} from "../interfaces/IDopaminePartyNFTEventsAndErrors.sol";

/// @title Dopamine Party NFT Interface
interface IDopaminePartyNFT is IDopaminePartyNFTEventsAndErrors {

    /// @notice returns the URI of the specified token
    /// @param id The queried token id.
    function uri(uint256 id) external returns (string memory);

    /// @notice Sets the base URI to `newBaseURI`.
    /// @param newBaseURI The new base metadata URI to set for the collection.
    /// @dev This function is only callable by the owner address.
    function setBaseURI(string calldata newBaseURI) external;

    /// @notice Sets the final metadata URI for NFT type `id` to `uri`.
    /// @dev This function is only callable by the owner address, and reverts
    ///  if the specified NFT of type `id` does not exist.
    /// @param id The id of the NFT whose final metadata URI is being set.
    /// @param newTokenURI The finalized IPFS / Arweave metadata URI.
    function setTokenURI(uint256 id, string calldata newTokenURI) external;

    /// @notice Sets the owner address to `newOwner`.
    /// @param newOwner The address of the new owner.
    /// @dev This function is only callable by the owner address.
    function setOwner(address newOwner) external;

    /// @notice Creates for NFT type `id` an allowlist for claiming.
    /// @dev This function is only callable by the contract owner.
    /// @param id The id of the NFT being made claimable.
    /// @param allowlistRoot The merkle root of the allowlist for this NFT type.
    function allowlist(uint256 id, bytes32 allowlistRoot) external;

    /// @notice Mints NFTs of type `id` to all specified addresses `addresses`.
    /// @dev This function is only callable by the contract owner.
    /// @param id The id of the NFT type being minted.
    /// @param addresses The list of addresses receiving the minted NFT.
    function airdrop(uint256 id, address[] calldata addresses) external;

    /// @notice Mints allowlisted NFT of type `id` to the sender address if
    ///  merkle proof `proof` proves they were allowlisted for that NFT type.
    /// @dev Reverts if invalid proof is provided or claimer isn't allowlisted.
    /// The allowlist is formed using sender addresses as leaves.
    /// @param proof The Merkle proof of the claim as a bytes32 array.
    /// @param id The id of the Dopamine party NFT being claimed.
    function claim(
        bytes32[] calldata proof,
        uint256 id
    ) external;
}

File 4 of 8 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 5 of 8 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 6 of 8 : IERC1155NTErrors.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.13;

////////////////////////////////////////////////////////////////////////////////
///              ░▒█▀▀▄░█▀▀█░▒█▀▀█░█▀▀▄░▒█▀▄▀█░▄█░░▒█▄░▒█░▒█▀▀▀              ///
///              ░▒█░▒█░█▄▀█░▒█▄▄█▒█▄▄█░▒█▒█▒█░░█▒░▒█▒█▒█░▒█▀▀▀              ///
///              ░▒█▄▄█░█▄▄█░▒█░░░▒█░▒█░▒█░░▒█░▄█▄░▒█░░▀█░▒█▄▄▄              ///
////////////////////////////////////////////////////////////////////////////////

/// @title ERC1155NT Errors Interface
interface IERC1155NTErrors {

    /// @notice Mismatch between input arrays.
    error ArityMismatch();

    /// @notice Receiving address cannot be the zero address.
    error ReceiverInvalid();

    /// @notice Receiving contract does not implement the ERC-721 wallet interface.
    error SafeTransferUnsupported();

    /// @notice Token has already been minted.
    error TokenAlreadyMinted();

    /// @notice Token may not be transferred.
    error TokenNonTransferable();

}

File 7 of 8 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 8 of 8 : IDopaminePartyNFTEventsAndErrors.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.15;

////////////////////////////////////////////////////////////////////////////////
///              ░▒█▀▀▄░█▀▀█░▒█▀▀█░█▀▀▄░▒█▀▄▀█░▄█░░▒█▄░▒█░▒█▀▀▀              ///
///              ░▒█░▒█░█▄▀█░▒█▄▄█▒█▄▄█░▒█▒█▒█░░█▒░▒█▒█▒█░▒█▀▀▀              ///
///              ░▒█▄▄█░█▄▄█░▒█░░░▒█░▒█░▒█░░▒█░▄█▄░▒█░░▀█░▒█▄▄▄              ///
////////////////////////////////////////////////////////////////////////////////

/// @title Dopamine Party NFT Events & Errors Interface
interface IDopaminePartyNFTEventsAndErrors {

    /// @notice Emits when the Dopamine tab base URI is set to `baseURI`.
    /// @param baseURI The base URI of the Dopamine tab contract, as a string.
    event BaseURISet(string baseURI);

    /// @notice Emits when NFT type of id `id` has its URI set to `tokenURI`.
    /// @param id  The id of the type of NFT whose URI was set.
    /// @param tokenURI The metadata URI of the token, as a string.
    event TokenURISet(uint256 id, string tokenURI);

    /// @notice Emits when owner is changed from `oldOwner` to `newOwner`.
    /// @param oldOwner The address of the previous owner.
    /// @param newOwner The address of the new owner.
    event OwnerChanged(address indexed oldOwner, address indexed newOwner);

    /// @notice Emits when a new party NFT type is created.
    /// @param id The id of the new party NFT type.
    /// @param allowlistRoot The merkle root, if any, for minting to claimants.
    event PartyNFTCreated(
        uint256 indexed id,
        bytes32 allowlistRoot
    );

    /// @notice Emits when an existing party NFT type is updated.
    /// @param id The id of the party NFT type.
    /// @param allowlistRoot The updated merkle root, if any, of the allowlist.
    event PartyNFTUpdated(
        uint256 indexed id,
        bytes32 allowlistRoot
    );

    /// @notice Claim drop identifier is invalid.
    error ClaimInvalid();

    /// @notice Function callable only by the owner.
    error OwnerOnly();

    /// @notice Proof for claim is invalid.
    error ProofInvalid();

    /// @notice NFT of the specified type does not exist.
    error TokenNonExistent();

    /// @notice NFTs of the specified type may not be minted or modified.
    error TokenImmutable();

}

Settings
{
  "remappings": [
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "ds-test/=lib/ds-test/src/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "src/=src/",
    "src/=src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ArityMismatch","type":"error"},{"inputs":[],"name":"ClaimInvalid","type":"error"},{"inputs":[],"name":"OwnerOnly","type":"error"},{"inputs":[],"name":"ProofInvalid","type":"error"},{"inputs":[],"name":"ReceiverInvalid","type":"error"},{"inputs":[],"name":"SafeTransferUnsupported","type":"error"},{"inputs":[],"name":"TokenAlreadyMinted","type":"error"},{"inputs":[],"name":"TokenImmutable","type":"error"},{"inputs":[],"name":"TokenNonExistent","type":"error"},{"inputs":[],"name":"TokenNonTransferable","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"BaseURISet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"allowlistRoot","type":"bytes32"}],"name":"PartyNFTCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"allowlistRoot","type":"bytes32"}],"name":"PartyNFTUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"string","name":"tokenURI","type":"string"}],"name":"TokenURISet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes32","name":"allowlistRoot","type":"bytes32"}],"name":"allowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"newTokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"id","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60c0604052601360809081527f446f70616d696e65205061727479204e4654730000000000000000000000000060a0526001906200003e9082620001d0565b50604080518082019091526005815264504152545960d81b60208201526002906200006a9082620001d0565b503480156200007857600080fd5b5060405162001d0138038062001d018339810160408190526200009b916200029c565b6004620000a98282620001d0565b507ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f66004604051620000dc919062000378565b60405180910390a1600380546001600160a01b031916339081179091556040516000907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c908290a3506200040b565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200015657607f821691505b6020821081036200017757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001cb57600081815260208120601f850160051c81016020861015620001a65750805b601f850160051c820191505b81811015620001c757828155600101620001b2565b5050505b505050565b81516001600160401b03811115620001ec57620001ec6200012b565b6200020481620001fd845462000141565b846200017d565b602080601f8311600181146200023c5760008415620002235750858301515b600019600386901b1c1916600185901b178555620001c7565b600085815260208120601f198616915b828110156200026d578886015182559484019460019091019084016200024c565b50858210156200028c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020808385031215620002b057600080fd5b82516001600160401b0380821115620002c857600080fd5b818501915085601f830112620002dd57600080fd5b815181811115620002f257620002f26200012b565b604051601f8201601f19908116603f011681019083821181831017156200031d576200031d6200012b565b8160405282815288868487010111156200033657600080fd5b600093505b828410156200035a57848401860151818501870152928501926200033b565b828411156200036c5760008684830101525b98975050505050505050565b60006020808352600084546200038e8162000141565b80848701526040600180841660008114620003b25760018114620003cd57620003fd565b60ff1985168984015283151560051b890183019550620003fd565b896000528660002060005b85811015620003f55781548b8201860152908301908801620003d8565b8a0184019650505b509398975050505050505050565b6118e6806200041b6000396000f3fe608060405234801561001057600080fd5b506004361061012b5760003560e01c806355f804b3116100ad578063bd85b03911610071578063bd85b03914610293578063bdf7a8e6146102b3578063c87b56dd146102c6578063e985e9c5146102d9578063f242432a146102ef57600080fd5b806355f804b3146102375780636c0360eb1461024a5780638da5cb5b1461025257806395d89b411461027d578063a22cb4651461028557600080fd5b806313af4035116100f457806313af4035146101cb578063162094c4146101de5780632eb2c2d6146101f15780633b439351146102045780634e1273f41461021757600080fd5b8062fdd58e1461013057806301ffc9a71461016b57806306fdde031461018e5780630e89341c146101a35780631078ea1c146101b6575b600080fd5b61015861013e366004610f2e565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b61017e610179366004610f71565b6102fd565b6040519015158152602001610162565b61019661034f565b6040516101629190610fc5565b6101966101b1366004610ff8565b6103dd565b6101c96101c4366004611011565b610504565b005b6101c96101d9366004611033565b61062d565b6101c96101ec366004611096565b6106b4565b6101c96101ff366004611224565b610794565b6101c9610212366004611311565b6107ad565b61022a61022536600461135c565b610884565b604051610162919061141b565b6101c961024536600461145f565b61098d565b610196610a03565b600354610265906001600160a01b031681565b6040516001600160a01b039091168152602001610162565b610196610a10565b6101c96101ff3660046114a0565b6101586102a1366004610ff8565b60066020526000908152604090205481565b6101c96102c13660046114dc565b610a1d565b6101966102d4366004610ff8565b610bb4565b61017e6102e736600461151a565b600092915050565b6101c96101ff36600461154d565b60006001600160e01b031982166301ffc9a760e01b148061032e57506001600160e01b03198216636cdb3d1360e11b145b8061034957506001600160e01b031982166303a24d0760e21b145b92915050565b6001805461035c906115b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610388906115b1565b80156103d55780601f106103aa576101008083540402835291602001916103d5565b820191906000526020600020905b8154815290600101906020018083116103b857829003601f168201915b505050505081565b6000818152600660205260408120546060910361040d576040516374fc75bf60e01b815260040160405180910390fd5b60008281526005602052604090208054610426906115b1565b905060000361046157600461043a83610bcd565b60405160200161044b9291906115eb565b6040516020818303038152906040529050919050565b6000828152600560205260409020805461047a906115b1565b80601f01602080910402602001604051908101604052809291908181526020018280546104a6906115b1565b80156104f35780601f106104c8576101008083540402835291602001916104f3565b820191906000526020600020905b8154815290600101906020018083116104d657829003601f168201915b50505050509050919050565b919050565b6003546001600160a01b0316331461052f57604051630b2db9b760e31b815260040160405180910390fd5b600854821115610552576040516374fc75bf60e01b815260040160405180910390fd5b6000828152600560205260409020805461056b906115b1565b15905061058b5760405163744d6a3360e01b815260040160405180910390fd5b600082815260076020526040902081905560085482036105f7576001600860008282546105b89190611688565b909155505060405181815282907fbfb89d0afddd5ce1c3524b6e7990e2ccd05e618537ffc5072c29575966c53c8e906020015b60405180910390a25050565b817f94d9e4b71c51ed4f5320de6710f6d41319c7bddd7768876e2d7a9abf161bce5f826040516105eb91815260200190565b5050565b6003546001600160a01b0316331461065857604051630b2db9b760e31b815260040160405180910390fd5b6003546040516001600160a01b038084169216907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c90600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031633146106df57604051630b2db9b760e31b815260040160405180910390fd5b6008548310610701576040516374fc75bf60e01b815260040160405180910390fd5b6000838152600560205260409020805461071a906115b1565b15905061073a5760405163744d6a3360e01b815260040160405180910390fd5b60008381526005602052604090206107538284836116ef565b507fda84ca2183491f179a603e877b2cb058e42195041c2b9c53d746427e519a34df838383604051610787939291906117d8565b60405180910390a1505050565b60405163fcd0178f60e01b815260040160405180910390fd5b60008181526007602090815260408083205490516bffffffffffffffffffffffff193360601b1692810192909252919060340160405160208183030381529060405280519060200120905061083782868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250610cd5915050565b61085457604051631ff3747d60e21b815260040160405180910390fd5b61085e3384610d84565b6000838152600660205260408120805491610878836117fb565b91905055505050505050565b606081518351146108a85760405163c21fe6bf60e01b815260040160405180910390fd5b82516001600160401b038111156108c1576108c16110e1565b6040519080825280602002602001820160405280156108ea578160200160208202803683370190505b50905060005b83518110156109865760008085838151811061090e5761090e611814565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600084838151811061094a5761094a611814565b602002602001015181526020019081526020016000205482828151811061097357610973611814565b60209081029190910101526001016108f0565b5092915050565b6003546001600160a01b031633146109b857604051630b2db9b760e31b815260040160405180910390fd5b60046109c58284836116ef565b507ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f682826040516109f792919061182a565b60405180910390a15050565b6004805461035c906115b1565b6002805461035c906115b1565b6003546001600160a01b03163314610a4857604051630b2db9b760e31b815260040160405180910390fd5b600854831115610a6b576040516374fc75bf60e01b815260040160405180910390fd5b60008381526005602052604090208054610a84906115b1565b159050610aa45760405163744d6a3360e01b815260040160405180910390fd5b6008548303610b0057600160086000828254610ac09190611688565b90915550506040516000815283907fbfb89d0afddd5ce1c3524b6e7990e2ccd05e618537ffc5072c29575966c53c8e9060200160405180910390a2610b3c565b827f94d9e4b71c51ed4f5320de6710f6d41319c7bddd7768876e2d7a9abf161bce5f604051610b33906000815260200190565b60405180910390a25b8060005b81811015610b8a57610b78848483818110610b5d57610b5d611814565b9050602002016020810190610b729190611033565b86610d84565b80610b82816117fb565b915050610b40565b5060008481526006602052604081208054839290610ba9908490611688565b909155505050505050565b6005602052600090815260409020805461035c906115b1565b606081600003610bf45750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610c1e5780610c08816117fb565b9150610c179050600a83611854565b9150610bf8565b6000816001600160401b03811115610c3857610c386110e1565b6040519080825280601f01601f191660200182016040528015610c62576020820181803683370190505b5090505b8415610ccd57610c77600183611868565b9150610c84600a8661187f565b610c8f906030611688565b60f81b818381518110610ca457610ca4611814565b60200101906001600160f81b031916908160001a905350610cc6600a86611854565b9450610c66565b949350505050565b600081815b8451811015610d79576000858281518110610cf757610cf7611814565b60200260200101519050808311610d39576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610d66565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080610d71816117fb565b915050610cda565b509093149392505050565b6001600160a01b038216600090815260208181526040808320848452909152902054600103610dc55760405162a5a1f560e01b815260040160405180910390fd5b6001600160a01b038216600081815260208181526040808320858452825280832060019081905581518681529283015233917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0382163b15801590610ed2575060405163f23a6e6160e01b808252336004830152600060248301819052604483018490526001606484015260a0608484015260a4830152906001600160a01b0384169063f23a6e619060c4016020604051808303816000875af1158015610ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec59190611893565b6001600160e01b03191614155b15610ef0576040516307dcd0fb60e51b815260040160405180910390fd5b6001600160a01b038216610629576040516308cdf45760e41b815260040160405180910390fd5b80356001600160a01b03811681146104ff57600080fd5b60008060408385031215610f4157600080fd5b610f4a83610f17565b946020939093013593505050565b6001600160e01b031981168114610f6e57600080fd5b50565b600060208284031215610f8357600080fd5b8135610f8e81610f58565b9392505050565b60005b83811015610fb0578181015183820152602001610f98565b83811115610fbf576000848401525b50505050565b6020815260008251806020840152610fe4816040850160208701610f95565b601f01601f19169190910160400192915050565b60006020828403121561100a57600080fd5b5035919050565b6000806040838503121561102457600080fd5b50508035926020909101359150565b60006020828403121561104557600080fd5b610f8e82610f17565b60008083601f84011261106057600080fd5b5081356001600160401b0381111561107757600080fd5b60208301915083602082850101111561108f57600080fd5b9250929050565b6000806000604084860312156110ab57600080fd5b8335925060208401356001600160401b038111156110c857600080fd5b6110d48682870161104e565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561111f5761111f6110e1565b604052919050565b60006001600160401b03821115611140576111406110e1565b5060051b60200190565b600082601f83011261115b57600080fd5b8135602061117061116b83611127565b6110f7565b82815260059290921b8401810191818101908684111561118f57600080fd5b8286015b848110156111aa5780358352918301918301611193565b509695505050505050565b600082601f8301126111c657600080fd5b81356001600160401b038111156111df576111df6110e1565b6111f2601f8201601f19166020016110f7565b81815284602083860101111561120757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561123c57600080fd5b61124586610f17565b945061125360208701610f17565b935060408601356001600160401b038082111561126f57600080fd5b61127b89838a0161114a565b9450606088013591508082111561129157600080fd5b61129d89838a0161114a565b935060808801359150808211156112b357600080fd5b506112c0888289016111b5565b9150509295509295909350565b60008083601f8401126112df57600080fd5b5081356001600160401b038111156112f657600080fd5b6020830191508360208260051b850101111561108f57600080fd5b60008060006040848603121561132657600080fd5b83356001600160401b0381111561133c57600080fd5b611348868287016112cd565b909790965060209590950135949350505050565b6000806040838503121561136f57600080fd5b82356001600160401b038082111561138657600080fd5b818501915085601f83011261139a57600080fd5b813560206113aa61116b83611127565b82815260059290921b840181019181810190898411156113c957600080fd5b948201945b838610156113ee576113df86610f17565b825294820194908201906113ce565b9650508601359250508082111561140457600080fd5b506114118582860161114a565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561145357835183529284019291840191600101611437565b50909695505050505050565b6000806020838503121561147257600080fd5b82356001600160401b0381111561148857600080fd5b6114948582860161104e565b90969095509350505050565b600080604083850312156114b357600080fd5b6114bc83610f17565b9150602083013580151581146114d157600080fd5b809150509250929050565b6000806000604084860312156114f157600080fd5b8335925060208401356001600160401b0381111561150e57600080fd5b6110d4868287016112cd565b6000806040838503121561152d57600080fd5b61153683610f17565b915061154460208401610f17565b90509250929050565b600080600080600060a0868803121561156557600080fd5b61156e86610f17565b945061157c60208701610f17565b9350604086013592506060860135915060808601356001600160401b038111156115a557600080fd5b6112c0888289016111b5565b600181811c908216806115c557607f821691505b6020821081036115e557634e487b7160e01b600052602260045260246000fd5b50919050565b60008084546115f9816115b1565b60018281168015611611576001811461162657611655565b60ff1984168752821515830287019450611655565b8860005260208060002060005b8581101561164c5781548a820152908401908201611633565b50505082870194505b505050508351611669818360208801610f95565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561169b5761169b611672565b500190565b601f8211156116ea57600081815260208120601f850160051c810160208610156116c75750805b601f850160051c820191505b818110156116e6578281556001016116d3565b5050505b505050565b6001600160401b03831115611706576117066110e1565b61171a8361171483546115b1565b836116a0565b6000601f84116001811461174e57600085156117365750838201355b600019600387901b1c1916600186901b1783556117a8565b600083815260209020601f19861690835b8281101561177f578685013582556020948501946001909201910161175f565b508682101561179c5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006117f26040830184866117af565b95945050505050565b60006001820161180d5761180d611672565b5060010190565b634e487b7160e01b600052603260045260246000fd5b602081526000610ccd6020830184866117af565b634e487b7160e01b600052601260045260246000fd5b6000826118635761186361183e565b500490565b60008282101561187a5761187a611672565b500390565b60008261188e5761188e61183e565b500690565b6000602082840312156118a557600080fd5b8151610f8e81610f5856fea2646970667358221220e530659b06d015f53fa3b434b1b20e5324c5477ec18e75843eca0bb4a0ddfe2f64736f6c634300080f00330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f6170692e646f70616d696e652e78797a2f70617274792d6e6674732f6d657461646174612f00000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061012b5760003560e01c806355f804b3116100ad578063bd85b03911610071578063bd85b03914610293578063bdf7a8e6146102b3578063c87b56dd146102c6578063e985e9c5146102d9578063f242432a146102ef57600080fd5b806355f804b3146102375780636c0360eb1461024a5780638da5cb5b1461025257806395d89b411461027d578063a22cb4651461028557600080fd5b806313af4035116100f457806313af4035146101cb578063162094c4146101de5780632eb2c2d6146101f15780633b439351146102045780634e1273f41461021757600080fd5b8062fdd58e1461013057806301ffc9a71461016b57806306fdde031461018e5780630e89341c146101a35780631078ea1c146101b6575b600080fd5b61015861013e366004610f2e565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b61017e610179366004610f71565b6102fd565b6040519015158152602001610162565b61019661034f565b6040516101629190610fc5565b6101966101b1366004610ff8565b6103dd565b6101c96101c4366004611011565b610504565b005b6101c96101d9366004611033565b61062d565b6101c96101ec366004611096565b6106b4565b6101c96101ff366004611224565b610794565b6101c9610212366004611311565b6107ad565b61022a61022536600461135c565b610884565b604051610162919061141b565b6101c961024536600461145f565b61098d565b610196610a03565b600354610265906001600160a01b031681565b6040516001600160a01b039091168152602001610162565b610196610a10565b6101c96101ff3660046114a0565b6101586102a1366004610ff8565b60066020526000908152604090205481565b6101c96102c13660046114dc565b610a1d565b6101966102d4366004610ff8565b610bb4565b61017e6102e736600461151a565b600092915050565b6101c96101ff36600461154d565b60006001600160e01b031982166301ffc9a760e01b148061032e57506001600160e01b03198216636cdb3d1360e11b145b8061034957506001600160e01b031982166303a24d0760e21b145b92915050565b6001805461035c906115b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610388906115b1565b80156103d55780601f106103aa576101008083540402835291602001916103d5565b820191906000526020600020905b8154815290600101906020018083116103b857829003601f168201915b505050505081565b6000818152600660205260408120546060910361040d576040516374fc75bf60e01b815260040160405180910390fd5b60008281526005602052604090208054610426906115b1565b905060000361046157600461043a83610bcd565b60405160200161044b9291906115eb565b6040516020818303038152906040529050919050565b6000828152600560205260409020805461047a906115b1565b80601f01602080910402602001604051908101604052809291908181526020018280546104a6906115b1565b80156104f35780601f106104c8576101008083540402835291602001916104f3565b820191906000526020600020905b8154815290600101906020018083116104d657829003601f168201915b50505050509050919050565b919050565b6003546001600160a01b0316331461052f57604051630b2db9b760e31b815260040160405180910390fd5b600854821115610552576040516374fc75bf60e01b815260040160405180910390fd5b6000828152600560205260409020805461056b906115b1565b15905061058b5760405163744d6a3360e01b815260040160405180910390fd5b600082815260076020526040902081905560085482036105f7576001600860008282546105b89190611688565b909155505060405181815282907fbfb89d0afddd5ce1c3524b6e7990e2ccd05e618537ffc5072c29575966c53c8e906020015b60405180910390a25050565b817f94d9e4b71c51ed4f5320de6710f6d41319c7bddd7768876e2d7a9abf161bce5f826040516105eb91815260200190565b5050565b6003546001600160a01b0316331461065857604051630b2db9b760e31b815260040160405180910390fd5b6003546040516001600160a01b038084169216907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c90600090a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b6003546001600160a01b031633146106df57604051630b2db9b760e31b815260040160405180910390fd5b6008548310610701576040516374fc75bf60e01b815260040160405180910390fd5b6000838152600560205260409020805461071a906115b1565b15905061073a5760405163744d6a3360e01b815260040160405180910390fd5b60008381526005602052604090206107538284836116ef565b507fda84ca2183491f179a603e877b2cb058e42195041c2b9c53d746427e519a34df838383604051610787939291906117d8565b60405180910390a1505050565b60405163fcd0178f60e01b815260040160405180910390fd5b60008181526007602090815260408083205490516bffffffffffffffffffffffff193360601b1692810192909252919060340160405160208183030381529060405280519060200120905061083782868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250610cd5915050565b61085457604051631ff3747d60e21b815260040160405180910390fd5b61085e3384610d84565b6000838152600660205260408120805491610878836117fb565b91905055505050505050565b606081518351146108a85760405163c21fe6bf60e01b815260040160405180910390fd5b82516001600160401b038111156108c1576108c16110e1565b6040519080825280602002602001820160405280156108ea578160200160208202803683370190505b50905060005b83518110156109865760008085838151811061090e5761090e611814565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600084838151811061094a5761094a611814565b602002602001015181526020019081526020016000205482828151811061097357610973611814565b60209081029190910101526001016108f0565b5092915050565b6003546001600160a01b031633146109b857604051630b2db9b760e31b815260040160405180910390fd5b60046109c58284836116ef565b507ff9c7803e94e0d3c02900d8a90893a6d5e90dd04d32a4cfe825520f82bf9f32f682826040516109f792919061182a565b60405180910390a15050565b6004805461035c906115b1565b6002805461035c906115b1565b6003546001600160a01b03163314610a4857604051630b2db9b760e31b815260040160405180910390fd5b600854831115610a6b576040516374fc75bf60e01b815260040160405180910390fd5b60008381526005602052604090208054610a84906115b1565b159050610aa45760405163744d6a3360e01b815260040160405180910390fd5b6008548303610b0057600160086000828254610ac09190611688565b90915550506040516000815283907fbfb89d0afddd5ce1c3524b6e7990e2ccd05e618537ffc5072c29575966c53c8e9060200160405180910390a2610b3c565b827f94d9e4b71c51ed4f5320de6710f6d41319c7bddd7768876e2d7a9abf161bce5f604051610b33906000815260200190565b60405180910390a25b8060005b81811015610b8a57610b78848483818110610b5d57610b5d611814565b9050602002016020810190610b729190611033565b86610d84565b80610b82816117fb565b915050610b40565b5060008481526006602052604081208054839290610ba9908490611688565b909155505050505050565b6005602052600090815260409020805461035c906115b1565b606081600003610bf45750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610c1e5780610c08816117fb565b9150610c179050600a83611854565b9150610bf8565b6000816001600160401b03811115610c3857610c386110e1565b6040519080825280601f01601f191660200182016040528015610c62576020820181803683370190505b5090505b8415610ccd57610c77600183611868565b9150610c84600a8661187f565b610c8f906030611688565b60f81b818381518110610ca457610ca4611814565b60200101906001600160f81b031916908160001a905350610cc6600a86611854565b9450610c66565b949350505050565b600081815b8451811015610d79576000858281518110610cf757610cf7611814565b60200260200101519050808311610d39576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250610d66565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080610d71816117fb565b915050610cda565b509093149392505050565b6001600160a01b038216600090815260208181526040808320848452909152902054600103610dc55760405162a5a1f560e01b815260040160405180910390fd5b6001600160a01b038216600081815260208181526040808320858452825280832060019081905581518681529283015233917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0382163b15801590610ed2575060405163f23a6e6160e01b808252336004830152600060248301819052604483018490526001606484015260a0608484015260a4830152906001600160a01b0384169063f23a6e619060c4016020604051808303816000875af1158015610ea1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec59190611893565b6001600160e01b03191614155b15610ef0576040516307dcd0fb60e51b815260040160405180910390fd5b6001600160a01b038216610629576040516308cdf45760e41b815260040160405180910390fd5b80356001600160a01b03811681146104ff57600080fd5b60008060408385031215610f4157600080fd5b610f4a83610f17565b946020939093013593505050565b6001600160e01b031981168114610f6e57600080fd5b50565b600060208284031215610f8357600080fd5b8135610f8e81610f58565b9392505050565b60005b83811015610fb0578181015183820152602001610f98565b83811115610fbf576000848401525b50505050565b6020815260008251806020840152610fe4816040850160208701610f95565b601f01601f19169190910160400192915050565b60006020828403121561100a57600080fd5b5035919050565b6000806040838503121561102457600080fd5b50508035926020909101359150565b60006020828403121561104557600080fd5b610f8e82610f17565b60008083601f84011261106057600080fd5b5081356001600160401b0381111561107757600080fd5b60208301915083602082850101111561108f57600080fd5b9250929050565b6000806000604084860312156110ab57600080fd5b8335925060208401356001600160401b038111156110c857600080fd5b6110d48682870161104e565b9497909650939450505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171561111f5761111f6110e1565b604052919050565b60006001600160401b03821115611140576111406110e1565b5060051b60200190565b600082601f83011261115b57600080fd5b8135602061117061116b83611127565b6110f7565b82815260059290921b8401810191818101908684111561118f57600080fd5b8286015b848110156111aa5780358352918301918301611193565b509695505050505050565b600082601f8301126111c657600080fd5b81356001600160401b038111156111df576111df6110e1565b6111f2601f8201601f19166020016110f7565b81815284602083860101111561120757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561123c57600080fd5b61124586610f17565b945061125360208701610f17565b935060408601356001600160401b038082111561126f57600080fd5b61127b89838a0161114a565b9450606088013591508082111561129157600080fd5b61129d89838a0161114a565b935060808801359150808211156112b357600080fd5b506112c0888289016111b5565b9150509295509295909350565b60008083601f8401126112df57600080fd5b5081356001600160401b038111156112f657600080fd5b6020830191508360208260051b850101111561108f57600080fd5b60008060006040848603121561132657600080fd5b83356001600160401b0381111561133c57600080fd5b611348868287016112cd565b909790965060209590950135949350505050565b6000806040838503121561136f57600080fd5b82356001600160401b038082111561138657600080fd5b818501915085601f83011261139a57600080fd5b813560206113aa61116b83611127565b82815260059290921b840181019181810190898411156113c957600080fd5b948201945b838610156113ee576113df86610f17565b825294820194908201906113ce565b9650508601359250508082111561140457600080fd5b506114118582860161114a565b9150509250929050565b6020808252825182820181905260009190848201906040850190845b8181101561145357835183529284019291840191600101611437565b50909695505050505050565b6000806020838503121561147257600080fd5b82356001600160401b0381111561148857600080fd5b6114948582860161104e565b90969095509350505050565b600080604083850312156114b357600080fd5b6114bc83610f17565b9150602083013580151581146114d157600080fd5b809150509250929050565b6000806000604084860312156114f157600080fd5b8335925060208401356001600160401b0381111561150e57600080fd5b6110d4868287016112cd565b6000806040838503121561152d57600080fd5b61153683610f17565b915061154460208401610f17565b90509250929050565b600080600080600060a0868803121561156557600080fd5b61156e86610f17565b945061157c60208701610f17565b9350604086013592506060860135915060808601356001600160401b038111156115a557600080fd5b6112c0888289016111b5565b600181811c908216806115c557607f821691505b6020821081036115e557634e487b7160e01b600052602260045260246000fd5b50919050565b60008084546115f9816115b1565b60018281168015611611576001811461162657611655565b60ff1984168752821515830287019450611655565b8860005260208060002060005b8581101561164c5781548a820152908401908201611633565b50505082870194505b505050508351611669818360208801610f95565b01949350505050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561169b5761169b611672565b500190565b601f8211156116ea57600081815260208120601f850160051c810160208610156116c75750805b601f850160051c820191505b818110156116e6578281556001016116d3565b5050505b505050565b6001600160401b03831115611706576117066110e1565b61171a8361171483546115b1565b836116a0565b6000601f84116001811461174e57600085156117365750838201355b600019600387901b1c1916600186901b1783556117a8565b600083815260209020601f19861690835b8281101561177f578685013582556020948501946001909201910161175f565b508682101561179c5760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b8381526040602082015260006117f26040830184866117af565b95945050505050565b60006001820161180d5761180d611672565b5060010190565b634e487b7160e01b600052603260045260246000fd5b602081526000610ccd6020830184866117af565b634e487b7160e01b600052601260045260246000fd5b6000826118635761186361183e565b500490565b60008282101561187a5761187a611672565b500390565b60008261188e5761188e61183e565b500690565b6000602082840312156118a557600080fd5b8151610f8e81610f5856fea2646970667358221220e530659b06d015f53fa3b434b1b20e5324c5477ec18e75843eca0bb4a0ddfe2f64736f6c634300080f0033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002d68747470733a2f2f6170692e646f70616d696e652e78797a2f70617274792d6e6674732f6d657461646174612f00000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI_ (string): https://api.dopamine.xyz/party-nfts/metadata/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 000000000000000000000000000000000000000000000000000000000000002d
Arg [2] : 68747470733a2f2f6170692e646f70616d696e652e78797a2f70617274792d6e
Arg [3] : 6674732f6d657461646174612f00000000000000000000000000000000000000


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.