ETH Price: $3,649.05 (+0.99%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Airdrop152808762022-08-05 7:06:59885 days ago1659683219IN
0xe9d28bAb...4dB199965
0 ETH0.1959501412.68111234

Advanced mode:
Parent Transaction Hash Block
From
To
View All Internal Transactions
Loading...
Loading

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


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.