EthereumEthereum
0x68...Ec2E
Impossible Distance by ippsketch

Impossible Distance by ippsketch

DIAMOND

收藏品
底价
0.02699 ETH
$2,345.34
大小
601
收藏品
所有者
509
85% 独特的所有者
此合同的源代码已经过验证!
合同元数据
编译器
0.8.17+commit.8df45f5f
语言
Solidity
合同源代码
文件 1 的 49:AccessControl.sol
合同源代码
文件 2 的 49:AccessControlEnumerable.sol
合同源代码
文件 3 的 49:AccessControlPausable.sol
合同源代码
文件 4 的 49:Address.sol
合同源代码
文件 5 的 49:BaseSellable.sol
合同源代码
文件 6 的 49:BaseTokenURI.sol
合同源代码
文件 7 的 49:BytecodeStorage.sol
合同源代码
文件 8 的 49:Bytes32Strings.sol
合同源代码
文件 9 的 49:Constants.sol
合同源代码
文件 10 的 49:Context.sol
合同源代码
文件 11 的 49:DefaultOperatorFilterer.sol
合同源代码
文件 12 的 49:DiamondExhibition.sol
// SPDX-License-Identifier: MIT
// Copyright 2023 PROOF Holdings Inc
pragma solidity ^0.8.15;

import {Strings} from "openzeppelin-contracts/utils/Strings.sol";
import {GenArt721CoreV3_Engine_Flex_PROOF} from "artblocks-contracts/GenArt721CoreV3_Engine_Flex_PROOF.sol";

import {ERC721A, ERC721ACommon, BaseTokenURI, ERC721ACommonBaseTokenURI} from "ethier/erc721/BaseTokenURI.sol";
import {OperatorFilterOS} from "ethier/erc721/OperatorFilterOS.sol";

import {artblocksTokenID} from "proof/artblocks/TokenIDMapping.sol";
import {IGenArt721CoreContractV3_Mintable} from "proof/artblocks/IGenArt721CoreContractV3_Mintable.sol";
import {SellableERC721ACommon} from "proof/sellers/sellable/SellableERC721ACommon.sol";

import {ProjectsConfig} from "./ProjectsConfig.sol";
import {TokenInfoManager} from "./TokenInfoManager.sol";

/**
 * @notice Library for encoding and decoding purchase data for the Diamond Exhibition sellers.
 */
library DiamondExhibitionLib {
    function encodePurchaseData(uint8[] memory projectIds) internal pure returns (bytes memory) {
        return abi.encode(projectIds);
    }

    function dencodePurchaseData(bytes memory data) internal pure returns (uint8[] memory) {
        return abi.decode(data, (uint8[]));
    }
}

/**
 * @notice Diamond Exhibition
 * @author David Huber (@cxkoda)
 * @custom:reviewer Arran Schlosberg (@divergencearran)
 */
contract DiamondExhibition is
    ERC721ACommonBaseTokenURI,
    OperatorFilterOS,
    SellableERC721ACommon,
    ProjectsConfig,
    TokenInfoManager
{
    // =================================================================================================================
    //                          Errors
    // =================================================================================================================

    /**
     * @notice Thrown if the number of requested purchases exceeds the number of remaining tokens.
     */
    error ExceedingMaxTotalSupply(uint256 num, uint256 numLeft);

    /**
     * @notice Thrown if a user attempts to purchase tokens from an exhausted project.
     */
    error ProjectExhausted(uint8 projectId);

    /**
     * @notice Thrown if a user attempts to purchase tokens from an invalid project.
     */
    error InvalidProject(uint8 projectId);

    // =================================================================================================================
    //                          Constants
    // =================================================================================================================

    /**
     * @notice The ArtBlocks engine flex contract.
     */
    GenArt721CoreV3_Engine_Flex_PROOF public immutable flex;

    /**
     * @notice The ArtBlocks engine flex contract or a minter multiplexer.
     */
    IGenArt721CoreContractV3_Mintable public immutable flexMintGateway;

    /**
     * @notice The maximum total number of tokens that can be minted.
     * @dev This is intentionally not a compile-time constant for the sake of testing.
     */
    uint256 public immutable maxTotalSupply;

    // =========================================================================
    //                          Storage
    // =================================================================================================================

    /**
     * @notice The number of tokens minted per project.
     */
    uint16[NUM_PROJECTS] internal _numPurchasedPerProject;

    // =================================================================================================================
    //                          Storage
    // =================================================================================================================

    struct ConstructorParams {
        address admin;
        address steerer;
        address payable secondaryReceiver;
        GenArt721CoreV3_Engine_Flex_PROOF flex;
        IGenArt721CoreContractV3_Mintable flexMintGateway;
    }

    constructor(ConstructorParams memory params)
        ERC721ACommon(params.admin, params.steerer, "Diamond Exhibition", "DIAMOND", params.secondaryReceiver, 500)
        BaseTokenURI("https://metadata.proof.xyz/diamond-exhibition/")
    {
        uint256 total;
        uint256[NUM_PROJECTS] memory maxNumPerProject_ = _maxNumPerProject();
        for (uint256 i = 0; i < NUM_PROJECTS; i++) {
            total += maxNumPerProject_[i];
        }
        maxTotalSupply = total;

        flex = params.flex;
        flexMintGateway = params.flexMintGateway;
    }

    // =================================================================================================================
    //                          Selling
    // =================================================================================================================

    /**
     * @notice Assigns a project to a token.
     * @dev Mints from the associated ArtBlocks project if the project is a longform project.
     */
    function _assignProject(uint256 tokenId, uint8 projectId, uint256[NUM_PROJECTS] memory maxNumPerProject_)
        internal
    {
        if (projectId >= NUM_PROJECTS) {
            revert InvalidProject(projectId);
        }

        uint16 numPurchased = _numPurchasedPerProject[projectId];
        if (numPurchased >= maxNumPerProject_[projectId]) {
            revert ProjectExhausted(projectId);
        }
        _numPurchasedPerProject[projectId] = numPurchased + 1;

        if (_isLongformProject(projectId)) {
            flexMintGateway.mint_Ecf(address(this), _artblocksProjectId(projectId), address(this));
        }
        _setTokenInfo(tokenId, projectId, numPurchased /* edition */ );
    }

    /**
     * @inheritdoc SellableERC721ACommon
     */
    function _handleSale(address to, uint64 num, bytes calldata data) internal virtual override {
        if (num + _totalMinted() > maxTotalSupply) {
            revert ExceedingMaxTotalSupply(num, maxTotalSupply - _totalMinted());
        }

        uint8[] memory projectIds = DiamondExhibitionLib.dencodePurchaseData(data);
        assert(projectIds.length == num);

        uint256 tokenId = _nextTokenId();
        uint256[NUM_PROJECTS] memory maxNumPerProject_ = _maxNumPerProject();
        for (uint256 i = 0; i < num; ++i) {
            _assignProject(tokenId++, projectIds[i], maxNumPerProject_);
        }

        SellableERC721ACommon._handleSale(to, num, data);
    }

    /**
     * @inheritdoc ERC721A
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        TokenInfo memory info = _tokenInfo(tokenId);

        if (projectType(info.projectId) == ProjectType.Curated) {
            return string.concat(_baseURI(), Strings.toString(tokenId));
        }

        return flex.tokenURI(artblocksTokenID(_artblocksProjectId(info.projectId), info.edition));
    }

    /**
     * @notice Returns all tokenIds for a given project.
     * @dev Intended for front-end consumption and not optimised for gas.
     */
    function tokenIdsByProjectId(uint8 projectId) external view returns (uint256[] memory) {
        uint256[] memory tokenIds = new uint256[](_numPurchasedPerProject[projectId]);

        uint256 cursor;
        uint256 supply = totalSupply();
        for (uint256 tokenId = 0; tokenId < supply; ++tokenId) {
            if (_tokenInfo(tokenId).projectId == projectId) {
                tokenIds[cursor++] = tokenId;
            }
        }

        return tokenIds;
    }

    /**
     * @notice Returns the number of tokens purchased for each project.
     * @dev Intended for front-end consumption and not optimised for gas.
     */
    function numPurchasedPerProject() external view returns (uint16[NUM_PROJECTS] memory) {
        return _numPurchasedPerProject;
    }

    // =================================================================================================================
    //                          Inheritance resolution
    // =================================================================================================================

    /**
     * @notice Helper function that returns true if the token belongs to a longform project.
     */
    function _isLongformToken(uint256 tokenId) internal view virtual returns (bool) {
        return _isLongformProject(_tokenInfo(tokenId).projectId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC721ACommon, ERC721ACommonBaseTokenURI, SellableERC721ACommon)
        returns (bool)
    {
        return ERC721ACommonBaseTokenURI.supportsInterface(interfaceId);
    }

    function _baseURI() internal view virtual override(ERC721A, ERC721ACommonBaseTokenURI) returns (string memory) {
        return ERC721ACommonBaseTokenURI._baseURI();
    }

    function setApprovalForAll(address operator, bool approved) public virtual override(ERC721A, OperatorFilterOS) {
        ERC721A.setApprovalForAll(operator, approved);
    }

    function approve(address operator, uint256 tokenId) public payable virtual override(ERC721A, OperatorFilterOS) {
        if (_isLongformToken(tokenId)) {
            ERC721A.approve(operator, tokenId);
        } else {
            OperatorFilterOS.approve(operator, tokenId);
        }
    }

    function transferFrom(address from, address to, uint256 tokenId)
        public
        payable
        virtual
        override(ERC721A, OperatorFilterOS)
    {
        if (_isLongformToken(tokenId)) {
            ERC721A.transferFrom(from, to, tokenId);
        } else {
            OperatorFilterOS.transferFrom(from, to, tokenId);
        }
    }

    function safeTransferFrom(address from, address to, uint256 tokenId)
        public
        payable
        virtual
        override(ERC721A, OperatorFilterOS)
    {
        if (_isLongformToken(tokenId)) {
            ERC721A.safeTransferFrom(from, to, tokenId);
        } else {
            OperatorFilterOS.safeTransferFrom(from, to, tokenId);
        }
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        payable
        virtual
        override(ERC721A, OperatorFilterOS)
    {
        if (_isLongformToken(tokenId)) {
            ERC721A.safeTransferFrom(from, to, tokenId, data);
        } else {
            OperatorFilterOS.safeTransferFrom(from, to, tokenId, data);
        }
    }
}
合同源代码
文件 13 的 49:ERC165.sol
合同源代码
文件 14 的 49:ERC2981.sol
合同源代码
文件 15 的 49:ERC4906.sol
合同源代码
文件 16 的 49:ERC721A.sol
合同源代码
文件 17 的 49:ERC721ACommon.sol
合同源代码
文件 18 的 49:ERC721_PackedHashSeed.sol
合同源代码
文件 19 的 49:EnumerableSet.sol
合同源代码
文件 20 的 49:GenArt721CoreV3_Engine_Flex_PROOF.sol
合同源代码
文件 21 的 49:IAccessControl.sol
合同源代码
文件 22 的 49:IAccessControlEnumerable.sol
合同源代码
文件 23 的 49:IAdminACLV0.sol
合同源代码
文件 24 的 49:IDependencyRegistryCompatibleV0.sol
合同源代码
文件 25 的 49:IERC165.sol
合同源代码
文件 26 的 49:IERC2981.sol
合同源代码
文件 27 的 49:IERC721.sol
合同源代码
文件 28 的 49:IERC721A.sol
合同源代码
文件 29 的 49:IERC721Metadata.sol
合同源代码
文件 30 的 49:IERC721Receiver.sol
合同源代码
文件 31 的 49:IEngineRegistryV0.sol
合同源代码
文件 32 的 49:IGenArt721CoreContractV3_Base.sol
合同源代码
文件 33 的 49:IGenArt721CoreContractV3_Engine.sol
合同源代码
文件 34 的 49:IGenArt721CoreContractV3_Engine_Flex.sol
合同源代码
文件 35 的 49:IGenArt721CoreContractV3_Mintable.sol
合同源代码
文件 36 的 49:IManifold.sol
合同源代码
文件 37 的 49:IOperatorFilterRegistry.sol
合同源代码
文件 38 的 49:IRandomizerV2.sol
合同源代码
文件 39 的 49:ISellable.sol
合同源代码
文件 40 的 49:Math.sol
合同源代码
文件 41 的 49:OperatorFilterOS.sol
合同源代码
文件 42 的 49:OperatorFilterer.sol
合同源代码
文件 43 的 49:Ownable.sol
合同源代码
文件 44 的 49:Pausable.sol
合同源代码
文件 45 的 49:ProjectsConfig.sol
// SPDX-License-Identifier: MIT
// Copyright 2023 Proof Holdings Inc.
pragma solidity >=0.8.17;

/**
 * @notice Diamond Exhibition - Projects configuration.
 * @author David Huber (@cxkoda)
 * @custom:reviewer Arran Schlosberg (@divergencearran)
 */
contract ProjectsConfig {
    /**
     * @notice The number of longform projects.
     */
    uint8 internal constant _NUM_LONGFORM_PROJECTS = 11;

    /**
     * @notice The number of pre-curated projects.
     */
    uint8 internal constant _NUM_CURATED_PROJECTS = 10;

    /**
     * @notice The total number of projects.
     */
    uint8 public constant NUM_PROJECTS = _NUM_LONGFORM_PROJECTS + _NUM_CURATED_PROJECTS;

    /**
     * @notice Returns the number of projects than can be minted per project.
     */
    function _maxNumPerProject() internal pure virtual returns (uint256[NUM_PROJECTS] memory sizes) {
        return [
            // Longform
            uint256(600), // Impossible Distance
            600, // cathedral study
            600, // Deja Vu
            800, // WaveShapes
            1000, // Ephemeral Tides
            600, // StackSlash
            450, // Viridaria
            1000, // Windwoven
            256, // Memory Loss
            1000, // The Collector's Room
            1000, // Extrañezas
            // Pre-curated
            100, // Everydays: Group Effort
            100, // Kid Heart
            100, // BEHEADED (SELF PORTRAIT)
            1127, // End Transmissions
            77, // DES CHOSES™
            100, // A Wintry Night in Chinatown
            100, // Penthouse
            200, // Hands of Umbra
            100, // Solitaire
            100 // Remnants of a Distant Dream
        ];
    }

    /**
     * @notice Returns the number of projects than can be minted per project.
     */
    function maxNumPerProject() external pure returns (uint256[NUM_PROJECTS] memory) {
        return _maxNumPerProject();
    }

    // =========================================================================
    //                          Project Types
    // =========================================================================

    /**
     * @notice The different types of projects.
     */
    enum ProjectType {
        Longform,
        Curated
    }

    /**
     * @notice Returns the project type for a given project ID.
     */
    function projectType(uint8 projectId) public pure returns (ProjectType) {
        return projectId < _NUM_LONGFORM_PROJECTS ? ProjectType.Longform : ProjectType.Curated;
    }

    /**
     * @notice Returns true iff the project is a longform project.
     */
    function _isLongformProject(uint8 projectId) internal pure virtual returns (bool) {
        return projectType(projectId) == ProjectType.Longform;
    }

    // =========================================================================
    //                          Artblocks
    // =========================================================================

    /**
     * @notice Returns the ArtBlocks engine project IDs for the longform projects.
     */
    function _artblocksProjectIds() internal pure virtual returns (uint8[_NUM_LONGFORM_PROJECTS] memory) {
        return [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
    }

    /**
     * @notice Returns the ArtBlocks engine project IDs for the longform projects.
     */
    function artblocksProjectIds() external pure returns (uint8[_NUM_LONGFORM_PROJECTS] memory) {
        return _artblocksProjectIds();
    }

    /**
     * @notice Returns the ArtBlocks engine project ID for a given project ID.
     * @dev Reverts if the project is not long-form.
     */
    function _artblocksProjectId(uint8 projectId) internal pure returns (uint256) {
        assert(_isLongformProject(projectId));
        return _artblocksProjectIds()[projectId];
    }
}
合同源代码
文件 46 的 49:SellableERC721ACommon.sol
合同源代码
文件 47 的 49:Strings.sol
合同源代码
文件 48 的 49:TokenIDMapping.sol
合同源代码
文件 49 的 49:TokenInfoManager.sol
// SPDX-License-Identifier: MIT
// Copyright 2023 Proof Holdings Inc.
pragma solidity >=0.8.17;

/**
 * @notice Token information module for Diamond Exhibition.
 * @author David Huber (@cxkoda)
 * @custom:reviewer Arran Schlosberg (@divergencearran)
 */
contract TokenInfoManager {
    /**
     * @notice Encodes token information.
     * @param projectId the ID of the project associated with the token.
     * @param edition the edition of the token within the given project.
     */
    struct TokenInfo {
        uint8 projectId;
        uint16 edition;
    }

    /**
     * @notice Max numbers of tokens that this contract can store.
     * @dev This constant is intentionally very large so we never have to worry about it.
     */
    uint256 internal constant _NUM_MAX_TOKEN_INFO = (1 << 32);

    /**
     * @notice Stores token information.
     */
    TokenInfo[_NUM_MAX_TOKEN_INFO] private _infos;

    /**
     * @notice Returns the token information for the given token IDs.
     * @dev Intended for off-chain use only.
     */
    function tokenInfos(uint256[] calldata tokenIds) external view returns (TokenInfo[] memory) {
        TokenInfo[] memory infos = new TokenInfo[](tokenIds.length);
        for (uint256 i = 0; i < tokenIds.length; ++i) {
            infos[i] = _tokenInfo(tokenIds[i]);
        }
        return infos;
    }

    /**
     * @notice Returns the token information for the given token ID.
     */
    function _tokenInfo(uint256 tokenId) internal view returns (TokenInfo memory) {
        return _infos[tokenId];
    }

    /**
     * @notice Sets the token information for the given token ID.
     */
    function _setTokenInfo(uint256 tokenId, uint8 projectId, uint16 edition) internal {
        _infos[tokenId] = TokenInfo({projectId: projectId, edition: edition});
    }
}
设置
{
  "compilationTarget": {
    "src/exhibition/DiamondExhibition.sol": "DiamondExhibition"
  },
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "optimizer": {
    "enabled": true,
    "runs": 9999
  },
  "remappings": [
    ":@divergencetech/ethier/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ethier_0-55-0/",
    ":@openzeppelin-4-7-0/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/",
    ":@openzeppelin-4.7/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/",
    ":@openzeppelin/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/",
    ":ERC721A/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ERC721A_4-2-3/contracts/",
    ":ERC721A_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ERC721A_4-2-3/",
    ":artblocks-contracts/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/artblocks-contracts_fa1dc466/contracts/",
    ":artblocks-contracts_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/artblocks-contracts_fa1dc466/",
    ":delegation-registry/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/delegation-registry_2d1a158b/src/",
    ":delegation-registry_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/delegation-registry_2d1a158b/",
    ":ds-test/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ds-test_013e6c64/src/",
    ":ds-test_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ds-test_013e6c64/",
    ":erc721a/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ERC721A_4-2-3/",
    ":ethier/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ethier_0-55-0/contracts/",
    ":ethier_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ethier_0-55-0/",
    ":forge-std/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/forge-std_1-4-0/src/",
    ":openzeppelin-contracts-4-7-0/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/contracts/",
    ":openzeppelin-contracts/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/contracts/",
    ":openzeppelin-contracts/contracts/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/contracts/",
    ":openzeppelin-contracts_root-4-7-0/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/",
    ":openzeppelin-contracts_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/",
    ":operator-filter-registry/src/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/operator-filter-registry_1-4-1/src/",
    ":operator-filter-registry_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/operator-filter-registry_1-4-1/",
    ":proof/artblocks/=/home/dave/proof/proof-seller/contracts/artblocks/src/",
    ":proof/constants/=/home/dave/proof/proof-seller/contracts/constants/src/",
    ":proof/redemption/=/home/dave/proof/proof-seller/contracts/redemption/src/",
    ":proof/sellers/=/home/dave/proof/proof-seller/contracts/sellers/src/"
  ]
}
ABI
[{"inputs":[{"components":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"steerer","type":"address"},{"internalType":"address payable","name":"secondaryReceiver","type":"address"},{"internalType":"contract GenArt721CoreV3_Engine_Flex_PROOF","name":"flex","type":"address"},{"internalType":"contract IGenArt721CoreContractV3_Mintable","name":"flexMintGateway","type":"address"}],"internalType":"struct DiamondExhibition.ConstructorParams","name":"params","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"num","type":"uint256"},{"internalType":"uint256","name":"numLeft","type":"uint256"}],"name":"ExceedingMaxTotalSupply","type":"error"},{"inputs":[{"internalType":"uint8","name":"projectId","type":"uint8"}],"name":"InvalidProject","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[{"internalType":"uint8","name":"projectId","type":"uint8"}],"name":"ProjectExhausted","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"MetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"AUTHORISED_SELLER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_STEERING_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUM_PROJECTS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"artblocksProjectIds","outputs":[{"internalType":"uint8[11]","name":"","type":"uint8[11]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"cdata","type":"bytes"}],"name":"callOperatorFilterRegistry","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emitMetadataUpdateForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flex","outputs":[{"internalType":"contract GenArt721CoreV3_Engine_Flex_PROOF","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flexMintGateway","outputs":[{"internalType":"contract IGenArt721CoreContractV3_Mintable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint64","name":"num","type":"uint64"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"handleSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockSellers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxNumPerProject","outputs":[{"internalType":"uint256[21]","name":"","type":"uint256[21]"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numPurchasedPerProject","outputs":[{"internalType":"uint16[21]","name":"","type":"uint16[21]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"projectId","type":"uint8"}],"name":"projectType","outputs":[{"internalType":"enum ProjectsConfig.ProjectType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseTokenURI_","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"basisPoints","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"projectId","type":"uint8"}],"name":"tokenIdsByProjectId","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"tokenInfos","outputs":[{"components":[{"internalType":"uint8","name":"projectId","type":"uint8"},{"internalType":"uint16","name":"edition","type":"uint16"}],"internalType":"struct TokenInfoManager.TokenInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]