creation_sourcecode: {{
    "language": "Solidity",
    "sources": {
      "contracts/single/ManifoldERC721Single.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/// @author: manifold.xyz\n\nimport \"@manifoldxyz/libraries-solidity/contracts/access/IAdminControl.sol\";\nimport \"@manifoldxyz/creator-core-solidity/contracts/core/IERC721CreatorCore.sol\";\nimport \"./IManifoldERC721Single.sol\";\n\n/**\n * Manifold ERC721 Single Mint Implementation\n */\ncontract ManifoldERC721Single is IManifoldERC721Single {\n\n    /**\n     * @dev Only allows approved admins to call the specified function\n     */\n    modifier creatorAdminRequired(address creator) {\n        if (!IAdminControl(creator).isAdmin(msg.sender)) revert(\"Must be owner or admin of creator contract\");\n        _;\n    }\n\n    /**\n     * @dev See {IManifoldERC721Single-mint}.\n     */\n    function mint(address creatorCore, uint256 expectedTokenId, string calldata uri, address recipient) external override creatorAdminRequired(creatorCore) {\n        uint256 tokenId = IERC721CreatorCore(creatorCore).mintBase(recipient, uri);\n        if (tokenId != expectedTokenId) {\n            revert InvalidInput();\n        }\n    }\n}\n"
      },
      "node_modules/@manifoldxyz/libraries-solidity/contracts/access/IAdminControl.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/// @author: manifold.xyz\n\nimport \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\n/**\n * @dev Interface for admin control\n */\ninterface IAdminControl is IERC165 {\n\n    event AdminApproved(address indexed account, address indexed sender);\n    event AdminRevoked(address indexed account, address indexed sender);\n\n    /**\n     * @dev gets address of all admins\n     */\n    function getAdmins() external view returns (address[] memory);\n\n    /**\n     * @dev add an admin.  Can only be called by contract owner.\n     */\n    function approveAdmin(address admin) external;\n\n    /**\n     * @dev remove an admin.  Can only be called by contract owner.\n     */\n    function revokeAdmin(address admin) external;\n\n    /**\n     * @dev checks whether or not given address is an admin\n     * Returns True if they are\n     */\n    function isAdmin(address admin) external view returns (bool);\n\n}"
      },
      "node_modules/@manifoldxyz/creator-core-solidity/contracts/core/IERC721CreatorCore.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/// @author: manifold.xyz\n\nimport \"./ICreatorCore.sol\";\n\n/**\n * @dev Core ERC721 creator interface\n */\ninterface IERC721CreatorCore is ICreatorCore {\n\n    /**\n     * @dev mint a token with no extension. Can only be called by an admin.\n     * Returns tokenId minted\n     */\n    function mintBase(address to) external returns (uint256);\n\n    /**\n     * @dev mint a token with no extension. Can only be called by an admin.\n     * Returns tokenId minted\n     */\n    function mintBase(address to, string calldata uri) external returns (uint256);\n\n    /**\n     * @dev batch mint a token with no extension. Can only be called by an admin.\n     * Returns tokenId minted\n     */\n    function mintBaseBatch(address to, uint16 count) external returns (uint256[] memory);\n\n    /**\n     * @dev batch mint a token with no extension. Can only be called by an admin.\n     * Returns tokenId minted\n     */\n    function mintBaseBatch(address to, string[] calldata uris) external returns (uint256[] memory);\n\n    /**\n     * @dev mint a token. Can only be called by a registered extension.\n     * Returns tokenId minted\n     */\n    function mintExtension(address to) external returns (uint256);\n\n    /**\n     * @dev mint a token. Can only be called by a registered extension.\n     * Returns tokenId minted\n     */\n    function mintExtension(address to, string calldata uri) external returns (uint256);\n\n    /**\n     * @dev mint a token. Can only be called by a registered extension.\n     * Returns tokenId minted\n     */\n    function mintExtension(address to, uint80 data) external returns (uint256);\n\n    /**\n     * @dev batch mint a token. Can only be called by a registered extension.\n     * Returns tokenIds minted\n     */\n    function mintExtensionBatch(address to, uint16 count) external returns (uint256[] memory);\n\n    /**\n     * @dev batch mint a token. Can only be called by a registered extension.\n     * Returns tokenId minted\n     */\n    function mintExtensionBatch(address to, string[] calldata uris) external returns (uint256[] memory);\n\n    /**\n     * @dev batch mint a token. Can only be called by a registered extension.\n     * Returns tokenId minted\n     */\n    function mintExtensionBatch(address to, uint80[] calldata data) external returns (uint256[] memory);\n\n    /**\n     * @dev burn a token. Can only be called by token owner or approved address.\n     * On burn, calls back to the registered extension's onBurn method\n     */\n    function burn(uint256 tokenId) external;\n\n    /**\n     * @dev get token data\n     */\n    function tokenData(uint256 tokenId) external view returns (uint80);\n\n}"
      },
      "contracts/single/IManifoldERC721Single.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/// @author: manifold.xyz\n\n/**\n * Manifold ERC721 Single Mint interface\n */\ninterface IManifoldERC721Single {\n\n    error InvalidInput();\n\n    /**\n     * @dev Mint a token\n     */\n    function mint(address creatorCore, uint256 expectedTokenId, string calldata uri, address recipient) external;\n}\n"
      },
      "node_modules/@openzeppelin/contracts/utils/introspection/IERC165.sol": {
        "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n    /**\n     * @dev Returns true if this contract implements the interface defined by\n     * `interfaceId`. See the corresponding\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n     * to learn more about how these ids are created.\n     *\n     * This function call must use less than 30 000 gas.\n     */\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n"
      },
      "node_modules/@manifoldxyz/creator-core-solidity/contracts/core/ICreatorCore.sol": {
        "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/// @author: manifold.xyz\n\nimport \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\n\n/**\n * @dev Core creator interface\n */\ninterface ICreatorCore is IERC165 {\n\n    event ExtensionRegistered(address indexed extension, address indexed sender);\n    event ExtensionUnregistered(address indexed extension, address indexed sender);\n    event ExtensionBlacklisted(address indexed extension, address indexed sender);\n    event MintPermissionsUpdated(address indexed extension, address indexed permissions, address indexed sender);\n    event RoyaltiesUpdated(uint256 indexed tokenId, address payable[] receivers, uint256[] basisPoints);\n    event DefaultRoyaltiesUpdated(address payable[] receivers, uint256[] basisPoints);\n    event ApproveTransferUpdated(address extension);\n    event ExtensionRoyaltiesUpdated(address indexed extension, address payable[] receivers, uint256[] basisPoints);\n    event ExtensionApproveTransferUpdated(address indexed extension, bool enabled);\n\n    /**\n     * @dev gets address of all extensions\n     */\n    function getExtensions() external view returns (address[] memory);\n\n    /**\n     * @dev add an extension.  Can only be called by contract owner or admin.\n     * extension address must point to a contract implementing ICreatorExtension.\n     * Returns True if newly added, False if already added.\n     */\n    function registerExtension(address extension, string calldata baseURI) external;\n\n    /**\n     * @dev add an extension.  Can only be called by contract owner or admin.\n     * extension address must point to a contract implementing ICreatorExtension.\n     * Returns True if newly added, False if already added.\n     */\n    function registerExtension(address extension, string calldata baseURI, bool baseURIIdentical) external;\n\n    /**\n     * @dev add an extension.  Can only be called by contract owner or admin.\n     * Returns True if removed, False if already removed.\n     */\n    function unregisterExtension(address extension) external;\n\n    /**\n     * @dev blacklist an extension.  Can only be called by contract owner or admin.\n     * This function will destroy all ability to reference the metadata of any tokens created\n     * by the specified extension. It will also unregister the extension if needed.\n     * Returns True if removed, False if already removed.\n     */\n    function blacklistExtension(address extension) external;\n\n    /**\n     * @dev set the baseTokenURI of an extension.  Can only be called by extension.\n     */\n    function setBaseTokenURIExtension(string calldata uri) external;\n\n    /**\n     * @dev set the baseTokenURI of an extension.  Can only be called by extension.\n     * For tokens with no uri configured, tokenURI will return \"uri+tokenId\"\n     */\n    function setBaseTokenURIExtension(string calldata uri, bool identical) external;\n\n    /**\n     * @dev set the common prefix of an extension.  Can only be called by extension.\n     * If configured, and a token has a uri set, tokenURI will return \"prefixURI+tokenURI\"\n     * Useful if you want to use ipfs/arweave\n     */\n    function setTokenURIPrefixExtension(string calldata prefix) external;\n\n    /**\n     * @dev set the tokenURI of a token extension.  Can only be called by extension that minted token.\n     */\n    function setTokenURIExtension(uint256 tokenId, string calldata uri) external;\n\n    /**\n     * @dev set the tokenURI of a token extension for multiple tokens.  Can only be called by extension that minted token.\n     */\n    function setTokenURIExtension(uint256[] memory tokenId, string[] calldata uri) external;\n\n    /**\n     * @dev set the baseTokenURI for tokens with no extension.  Can only be called by owner/admin.\n     * For tokens with no uri configured, tokenURI will return \"uri+tokenId\"\n     */\n    function setBaseTokenURI(string calldata uri) external;\n\n    /**\n     * @dev set the common prefix for tokens with no extension.  Can only be called by owner/admin.\n     * If configured, and a token has a uri set, tokenURI will return \"prefixURI+tokenURI\"\n     * Useful if you want to use ipfs/arweave\n     */\n    function setTokenURIPrefix(string calldata prefix) external;\n\n    /**\n     * @dev set the tokenURI of a token with no extension.  Can only be called by owner/admin.\n     */\n    function setTokenURI(uint256 tokenId, string calldata uri) external;\n\n    /**\n     * @dev set the tokenURI of multiple tokens with no extension.  Can only be called by owner/admin.\n     */\n    function setTokenURI(uint256[] memory tokenIds, string[] calldata uris) external;\n\n    /**\n     * @dev set a permissions contract for an extension.  Used to control minting.\n     */\n    function setMintPermissions(address extension, address permissions) external;\n\n    /**\n     * @dev Configure so transfers of tokens created by the caller (must be extension) gets approval\n     * from the extension before transferring\n     */\n    function setApproveTransferExtension(bool enabled) external;\n\n    /**\n     * @dev get the extension of a given token\n     */\n    function tokenExtension(uint256 tokenId) external view returns (address);\n\n    /**\n     * @dev Set default royalties\n     */\n    function setRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints) external;\n\n    /**\n     * @dev Set royalties of a token\n     */\n    function setRoyalties(uint256 tokenId, address payable[] calldata receivers, uint256[] calldata basisPoints) external;\n\n    /**\n     * @dev Set royalties of an extension\n     */\n    function setRoyaltiesExtension(address extension, address payable[] calldata receivers, uint256[] calldata basisPoints) external;\n\n    /**\n     * @dev Get royalites of a token.  Returns list of receivers and basisPoints\n     */\n    function getRoyalties(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory);\n    \n    // Royalty support for various other standards\n    function getFeeRecipients(uint256 tokenId) external view returns (address payable[] memory);\n    function getFeeBps(uint256 tokenId) external view returns (uint[] memory);\n    function getFees(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory);\n    function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address, uint256);\n\n    /**\n     * @dev Set the default approve transfer contract location.\n     */\n    function setApproveTransfer(address extension) external; \n\n    /**\n     * @dev Get the default approve transfer contract location.\n     */\n    function getApproveTransfer() external view returns (address);\n}\n"
      }
    },
    "settings": {
      "remappings": [
        "create2-scripts/=lib/create2-helpers/script/",
        "create2-helpers/=lib/create2-helpers/src/",
        "forge-std/=lib/forge-std/src/",
        "@ensdomains/=node_modules/@ensdomains/",
        "@manifoldxyz/=node_modules/@manifoldxyz/",
        "@openzeppelin/=node_modules/@openzeppelin/",
        "ds-test/=lib/forge-std/lib/ds-test/src/",
        "erc4626-tests/=lib/operator-filter-registry/lib/openzeppelin-contracts/lib/erc4626-tests/",
        "eth-gas-reporter/=node_modules/eth-gas-reporter/",
        "hardhat/=node_modules/hardhat/",
        "murky/=lib/murky/src/",
        "openzeppelin-contracts-upgradeable/=lib/operator-filter-registry/lib/openzeppelin-contracts-upgradeable/",
        "openzeppelin-contracts/=lib/murky/lib/openzeppelin-contracts/",
        "operator-filter-registry/=node_modules/operator-filter-registry/",
        "truffle/=node_modules/truffle/"
      ],
      "optimizer": {
        "enabled": true,
        "runs": 1000000
      },
      "metadata": {
        "useLiteralContent": false,
        "bytecodeHash": "ipfs"
      },
      "outputSelection": {
        "*": {
          "*": [
            "evm.bytecode",
            "evm.deployedBytecode",
            "devdoc",
            "userdoc",
            "metadata",
            "abi"
          ]
        }
      },
      "evmVersion": "london",
      "libraries": {}
    }
  }}