{"language":"Solidity","sources":{"src/MintpadERC1155Drop.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"@thirdweb-dev/contracts/base/ERC1155Base.sol\";\n\n//  ==========  External imports    ==========\n\n//  ==========  Internal imports    ==========\nimport \"@thirdweb-dev/contracts/lib/CurrencyTransferLib.sol\";\nimport \"@thirdweb-dev/contracts/lib/TWStrings.sol\";\n\n//  ==========  Features    ==========\nimport \"@thirdweb-dev/contracts/extension/PrimarySale.sol\";\nimport \"@thirdweb-dev/contracts/extension/LazyMint.sol\";\nimport \"@thirdweb-dev/contracts/extension/PermissionsEnumerable.sol\";\nimport \"@thirdweb-dev/contracts/extension/Drop1155.sol\";\nimport \"../extension/TransactionFee.sol\";\n\ncontract MintpadERC1155Drop is \n    ERC1155Base,\n    PrimarySale,\n    LazyMint,\n    TransactionFee,\n    PermissionsEnumerable,\n    Drop1155\n{\n    using TWStrings for uint256;\n\n    /*///////////////////////////////////////////////////////////////\n                            State variables\n    //////////////////////////////////////////////////////////////*/\n\n    /// @dev Only transfers to or from TRANSFER_ROLE holders are valid, when transfers are restricted.\n    bytes32 private transferRole;\n    /// @dev Only MINTER_ROLE holders can sign off on `MintRequest`s and lazy mint tokens.\n    bytes32 private minterRole;\n\n    /*///////////////////////////////////////////////////////////////\n                                Mappings\n    //////////////////////////////////////////////////////////////*/\n\n    /// @dev Mapping from token ID => maximum possible total circulating supply of tokens with that ID.\n    mapping(uint256 => uint256) public maxTotalSupply;\n\n    /// @dev Mapping from token ID => the address of the recipient of primary sales.\n    mapping(uint256 => address) public saleRecipient;\n    \n    constructor (\n        address _defaultAdmin,\n        string memory _name,\n        string memory _symbol,\n        address _saleRecipient,\n        uint256 _transactionFee,\n        address _royaltyRecipient,\n        uint128 _royaltyBps\n    ) \n        ERC1155Base(\n            _defaultAdmin,\n            _name,\n            _symbol,\n            _royaltyRecipient,\n            _royaltyBps\n        ) \n    {\n        require(_transactionFee > 0, \"!TransactionFee\");\n\n        bytes32 _transferRole = keccak256(\"TRANSFER_ROLE\");\n        bytes32 _minterRole = keccak256(\"MINTER_ROLE\");\n\n        _setupRole(DEFAULT_ADMIN_ROLE, _defaultAdmin);\n        _setupRole(_minterRole, _defaultAdmin);\n        _setupRole(_transferRole, _defaultAdmin);\n        _setupRole(_transferRole, address(0));\n\n        _setupPrimarySaleRecipient(_saleRecipient);\n\n        transferRole = _transferRole;\n        minterRole = _minterRole;\n\n        transactionFee = _transactionFee;\n    }\n\n    /*///////////////////////////////////////////////////////////////\n                        Contract identifiers\n    //////////////////////////////////////////////////////////////*/\n\n    function contractType() external pure returns (bytes32) {\n        return bytes32(\"ERC1155\");\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                        Overriden ERC1155 logic\n    //////////////////////////////////////////////////////////////*/\n\n    /// @dev Returns the uri for a given tokenId.\n    function uri(uint256 _tokenId) public view override returns (string memory) {\n        string memory batchUri = _getBaseURI(_tokenId);\n        return string(abi.encodePacked(batchUri, _tokenId.toString()));\n    }\n\n    /*///////////////////////////////////////////////////////////////\n                        Setter functions\n    //////////////////////////////////////////////////////////////*/\n\n    /// @dev Lets a module admin set a max total supply for token.\n    function setMaxTotalSupply(uint256 _tokenId, uint256 _maxTotalSupply) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        maxTotalSupply[_tokenId] = _maxTotalSupply;\n    }\n\n    /// @dev Lets a contract admin set the recipient for all primary sales.\n    function setSaleRecipientForToken(uint256 _tokenId, address _saleRecipient) external onlyRole(DEFAULT_ADMIN_ROLE) {\n        saleRecipient[_tokenId] = _saleRecipient;\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                        Internal (overrideable) functions\n    //////////////////////////////////////////////////////////////*/\n\n    /// @dev Runs before every `claim` function call.\n    function _beforeClaim(\n        uint256 _tokenId,\n        address,\n        uint256 _quantity,\n        address,\n        uint256,\n        AllowlistProof calldata,\n        bytes memory\n    ) internal view override {\n        require(maxTotalSupply[_tokenId] == 0 || totalSupply[_tokenId] + _quantity <= maxTotalSupply[_tokenId], \"!Supply\");\n    }\n\n    /// @dev Collects and distributes the primary sale value of NFTs being claimed.\n    function collectPriceOnClaim(\n        uint256 _tokenId,\n        address _primarySaleRecipient,\n        uint256 _quantityToClaim,\n        address _currency,\n        uint256 _pricePerToken\n    ) internal override {\n        address _saleRecipient = _primarySaleRecipient == address(0)\n            ? (saleRecipient[_tokenId] == address(0) ? primarySaleRecipient() : saleRecipient[_tokenId])\n            : _primarySaleRecipient;\n        uint256 totalPrice = _pricePerToken > 0 ? _quantityToClaim * _pricePerToken : 0;\n\n        if (_currency == CurrencyTransferLib.NATIVE_TOKEN) {\n            require (msg.value == (totalPrice + transactionFee), \"!ClaimPrice\");\n        }\n\n        if (_pricePerToken > 0) {\n            CurrencyTransferLib.transferCurrency(_currency, _msgSender(), _saleRecipient, totalPrice);\n        }\n        CurrencyTransferLib.transferCurrency(_currency, _msgSender(), platformAddress, transactionFee);\n    }\n\n    /// @dev Transfers the NFTs being claimed.\n    function transferTokensOnClaim(\n        address _to,\n        uint256 _tokenId,\n        uint256 _quantityBeingClaimed\n    ) internal override {\n        _mint(_to, _tokenId, _quantityBeingClaimed, \"\");\n    }\n\n    /// @dev Checks whether primary sale recipient can be set in the given execution context.\n    function _canSetPrimarySaleRecipient() internal view override returns (bool) {\n        return hasRole(DEFAULT_ADMIN_ROLE, _msgSender());\n    }\n\n    /// @dev Checks whether owner can be set in the given execution context.\n    function _canSetOwner() internal view override returns (bool) {\n        return hasRole(DEFAULT_ADMIN_ROLE, _msgSender());\n    }\n\n    /// @dev Checks whether royalty info can be set in the given execution context.\n    function _canSetRoyaltyInfo() internal view override returns (bool) {\n        return hasRole(DEFAULT_ADMIN_ROLE, _msgSender());\n    }\n\n    /// @dev Checks whether contract metadata can be set in the given execution context.\n    function _canSetContractURI() internal view override returns (bool) {\n        return hasRole(DEFAULT_ADMIN_ROLE, _msgSender());\n    }\n\n    /// @dev Checks whether platform fee info can be set in the given execution context.\n    function _canSetClaimConditions() internal view override returns (bool) {\n        return hasRole(DEFAULT_ADMIN_ROLE, _msgSender());\n    }\n\n    /// @dev Returns whether lazy minting can be done in the given execution context.\n    function _canLazyMint() internal view virtual override returns (bool) {\n        return hasRole(minterRole, _msgSender());\n    }\n\n    /*///////////////////////////////////////////////////////////////\n                        Miscellaneous\n    //////////////////////////////////////////////////////////////*/\n\n    /// @dev The tokenId of the next NFT that will be minted / lazy minted.\n    function nextTokenIdToMint() public view virtual override returns (uint256) {\n        return nextTokenIdToLazyMint;\n    }\n\n    function _dropMsgSender() internal view virtual override returns (address) {\n        return _msgSender();\n    }\n\n    function _msgSender() internal view virtual returns (address) {\n        return msg.sender;\n    }\n\n    function _msgData() internal view virtual returns (bytes calldata) {\n        return msg.data;\n    }\n}"},"extension/TransactionFee.sol":{"content":"// SPDX-License-Identifier: Apache 2.0\npragma solidity ^0.8.0;\n\nerror TrxErrorAuth();\nerror TrxErrorFee1();\nerror TrxErrorFee2();\n\n/// @author Mintpad\nabstract contract TransactionFee {\n    \n    /// @dev Platform wallet address\n    address public platformAddress = 0x4ec431790805909b0D3Dcf5C8dA25FCBF46E93F8;\n\n    /// @dev Transaction cost\n    uint256 public transactionFee;\n\n    /// @dev At any given moment, returns the transaction fee.\n    function getTransactionFee() public view returns (uint256) {\n        return transactionFee;\n    }\n\n    /**\n     *  @notice         Sets a new transaction fee in case of need.\n     *  @dev            This function is only used in rare situations where\n     *                  the transaction fee is not set correctly. This value can\n     *                  only be lower than the current transaction fee to prevent\n     *                  fraud. Only Mintpad can set this transaction fee.\n     *\n     *  @param _transactionFee The transaction fee to be set.\n     */\n    function setTransactionFee(uint256 _transactionFee) external {\n        if (msg.sender != platformAddress) {\n            revert TrxErrorAuth();\n        }\n        if (_transactionFee > transactionFee) {\n            revert TrxErrorFee1();\n        }\n        if (_transactionFee <= 0) {\n            revert TrxErrorFee2();\n        }\n\n        transactionFee = _transactionFee;\n    }\n}"},"node_modules/@thirdweb-dev/contracts/eip/ERC1155.sol":{"content":"// SPDX-License-Identifier: Apache 2.0\npragma solidity ^0.8.0;\n\nimport \"./interface/IERC1155.sol\";\nimport \"./interface/IERC1155Metadata.sol\";\nimport \"./interface/IERC1155Receiver.sol\";\n\ncontract ERC1155 is IERC1155, IERC1155Metadata {\n    /*//////////////////////////////////////////////////////////////\n                        State variables\n    //////////////////////////////////////////////////////////////*/\n\n    string public name;\n    string public symbol;\n\n    /*//////////////////////////////////////////////////////////////\n                            Mappings\n    //////////////////////////////////////////////////////////////*/\n\n    mapping(address => mapping(uint256 => uint256)) public balanceOf;\n\n    mapping(address => mapping(address => bool)) public isApprovedForAll;\n\n    mapping(uint256 => string) internal _uri;\n\n    /*//////////////////////////////////////////////////////////////\n                            Constructor\n    //////////////////////////////////////////////////////////////*/\n\n    constructor(string memory _name, string memory _symbol) {\n        name = _name;\n        symbol = _symbol;\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                            View functions\n    //////////////////////////////////////////////////////////////*/\n\n    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {\n        return\n            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165\n            interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155\n            interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI\n    }\n\n    function uri(uint256 tokenId) public view virtual override returns (string memory) {\n        return _uri[tokenId];\n    }\n\n    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)\n        public\n        view\n        virtual\n        override\n        returns (uint256[] memory)\n    {\n        require(accounts.length == ids.length, \"LENGTH_MISMATCH\");\n\n        uint256[] memory batchBalances = new uint256[](accounts.length);\n\n        for (uint256 i = 0; i < accounts.length; ++i) {\n            batchBalances[i] = balanceOf[accounts[i]][ids[i]];\n        }\n\n        return batchBalances;\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                            ERC1155 logic\n    //////////////////////////////////////////////////////////////*/\n\n    function setApprovalForAll(address operator, bool approved) public virtual override {\n        address owner = msg.sender;\n        require(owner != operator, \"APPROVING_SELF\");\n        isApprovedForAll[owner][operator] = approved;\n        emit ApprovalForAll(owner, operator, approved);\n    }\n\n    function safeTransferFrom(\n        address from,\n        address to,\n        uint256 id,\n        uint256 amount,\n        bytes memory data\n    ) public virtual override {\n        require(from == msg.sender || isApprovedForAll[from][msg.sender], \"!OWNER_OR_APPROVED\");\n        _safeTransferFrom(from, to, id, amount, data);\n    }\n\n    function safeBatchTransferFrom(\n        address from,\n        address to,\n        uint256[] memory ids,\n        uint256[] memory amounts,\n        bytes memory data\n    ) public virtual override {\n        require(from == msg.sender || isApprovedForAll[from][msg.sender], \"!OWNER_OR_APPROVED\");\n        _safeBatchTransferFrom(from, to, ids, amounts, data);\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                            Internal logic\n    //////////////////////////////////////////////////////////////*/\n\n    function _safeTransferFrom(\n        address from,\n        address to,\n        uint256 id,\n        uint256 amount,\n        bytes memory data\n    ) internal virtual {\n        require(to != address(0), \"TO_ZERO_ADDR\");\n\n        address operator = msg.sender;\n\n        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);\n\n        uint256 fromBalance = balanceOf[from][id];\n        require(fromBalance >= amount, \"INSUFFICIENT_BAL\");\n        unchecked {\n            balanceOf[from][id] = fromBalance - amount;\n        }\n        balanceOf[to][id] += amount;\n\n        emit TransferSingle(operator, from, to, id, amount);\n\n        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);\n    }\n\n    function _safeBatchTransferFrom(\n        address from,\n        address to,\n        uint256[] memory ids,\n        uint256[] memory amounts,\n        bytes memory data\n    ) internal virtual {\n        require(ids.length == amounts.length, \"LENGTH_MISMATCH\");\n        require(to != address(0), \"TO_ZERO_ADDR\");\n\n        address operator = msg.sender;\n\n        _beforeTokenTransfer(operator, from, to, ids, amounts, data);\n\n        for (uint256 i = 0; i < ids.length; ++i) {\n            uint256 id = ids[i];\n            uint256 amount = amounts[i];\n\n            uint256 fromBalance = balanceOf[from][id];\n            require(fromBalance >= amount, \"INSUFFICIENT_BAL\");\n            unchecked {\n                balanceOf[from][id] = fromBalance - amount;\n            }\n            balanceOf[to][id] += amount;\n        }\n\n        emit TransferBatch(operator, from, to, ids, amounts);\n\n        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);\n    }\n\n    function _setTokenURI(uint256 tokenId, string memory newuri) internal virtual {\n        _uri[tokenId] = newuri;\n    }\n\n    function _mint(\n        address to,\n        uint256 id,\n        uint256 amount,\n        bytes memory data\n    ) internal virtual {\n        require(to != address(0), \"TO_ZERO_ADDR\");\n\n        address operator = msg.sender;\n\n        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);\n\n        balanceOf[to][id] += amount;\n        emit TransferSingle(operator, address(0), to, id, amount);\n\n        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);\n    }\n\n    function _mintBatch(\n        address to,\n        uint256[] memory ids,\n        uint256[] memory amounts,\n        bytes memory data\n    ) internal virtual {\n        require(to != address(0), \"TO_ZERO_ADDR\");\n        require(ids.length == amounts.length, \"LENGTH_MISMATCH\");\n\n        address operator = msg.sender;\n\n        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);\n\n        for (uint256 i = 0; i < ids.length; i++) {\n            balanceOf[to][ids[i]] += amounts[i];\n        }\n\n        emit TransferBatch(operator, address(0), to, ids, amounts);\n\n        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);\n    }\n\n    function _burn(\n        address from,\n        uint256 id,\n        uint256 amount\n    ) internal virtual {\n        require(from != address(0), \"FROM_ZERO_ADDR\");\n\n        address operator = msg.sender;\n\n        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), \"\");\n\n        uint256 fromBalance = balanceOf[from][id];\n        require(fromBalance >= amount, \"INSUFFICIENT_BAL\");\n        unchecked {\n            balanceOf[from][id] = fromBalance - amount;\n        }\n\n        emit TransferSingle(operator, from, address(0), id, amount);\n    }\n\n    function _burnBatch(\n        address from,\n        uint256[] memory ids,\n        uint256[] memory amounts\n    ) internal virtual {\n        require(from != address(0), \"FROM_ZERO_ADDR\");\n        require(ids.length == amounts.length, \"LENGTH_MISMATCH\");\n\n        address operator = msg.sender;\n\n        _beforeTokenTransfer(operator, from, address(0), ids, amounts, \"\");\n\n        for (uint256 i = 0; i < ids.length; i++) {\n            uint256 id = ids[i];\n            uint256 amount = amounts[i];\n\n            uint256 fromBalance = balanceOf[from][id];\n            require(fromBalance >= amount, \"INSUFFICIENT_BAL\");\n            unchecked {\n                balanceOf[from][id] = fromBalance - amount;\n            }\n        }\n\n        emit TransferBatch(operator, from, address(0), ids, amounts);\n    }\n\n    function _beforeTokenTransfer(\n        address operator,\n        address from,\n        address to,\n        uint256[] memory ids,\n        uint256[] memory amounts,\n        bytes memory data\n    ) internal virtual {}\n\n    function _doSafeTransferAcceptanceCheck(\n        address operator,\n        address from,\n        address to,\n        uint256 id,\n        uint256 amount,\n        bytes memory data\n    ) private {\n        if (to.code.length > 0) {\n            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {\n                if (response != IERC1155Receiver.onERC1155Received.selector) {\n                    revert(\"TOKENS_REJECTED\");\n                }\n            } catch Error(string memory reason) {\n                revert(reason);\n            } catch {\n                revert(\"!ERC1155RECEIVER\");\n            }\n        }\n    }\n\n    function _doSafeBatchTransferAcceptanceCheck(\n        address operator,\n        address from,\n        address to,\n        uint256[] memory ids,\n        uint256[] memory amounts,\n        bytes memory data\n    ) private {\n        if (to.code.length > 0) {\n            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (\n                bytes4 response\n            ) {\n                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {\n                    revert(\"TOKENS_REJECTED\");\n                }\n            } catch Error(string memory reason) {\n                revert(reason);\n            } catch {\n                revert(\"!ERC1155RECEIVER\");\n            }\n        }\n    }\n\n    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {\n        uint256[] memory array = new uint256[](1);\n        array[0] = element;\n\n        return array;\n    }\n}\n"},"node_modules/@thirdweb-dev/contracts/lib/TWAddress.sol":{"content":"// SPDX-License-Identifier: Apache 2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary TWAddress {\n    /**\n     * @dev Returns true if `account` is a contract.\n     *\n     * [IMPORTANT]\n     * ====\n     * It is unsafe to assume that an address for which this function returns\n     * false is an externally-owned account (EOA) and not a contract.\n     *\n     * Among others, `isContract` will return false for the following\n     * types of addresses:\n     *\n     *  - an externally-owned account\n     *  - a contract in construction\n     *  - an address where a contract will be created\n     *  - an address where a contract lived, but was destroyed\n     * ====\n     *\n     * [IMPORTANT]\n     * ====\n     * You shouldn't rely on `isContract` to protect against flash loan attacks!\n     *\n     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n     * constructor.\n     * ====\n     */\n    function isContract(address account) internal view returns (bool) {\n        // This method relies on extcodesize/address.code.length, which returns 0\n        // for contracts in construction, since the code is only stored at the end\n        // of the constructor execution.\n\n        return account.code.length > 0;\n    }\n\n    /**\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n     * `recipient`, forwarding all available gas and reverting on errors.\n     *\n     * [EIP1884](https://eips.ethereum.org/EIPS/eip-1884) increases the gas cost\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\n     * imposed by `transfer`, making them unable to receive funds via\n     * `transfer`. {sendValue} removes this limitation.\n     *\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n     *\n     * IMPORTANT: because control is transferred to `recipient`, care must be\n     * taken to not create reentrancy vulnerabilities. Consider using\n     * {ReentrancyGuard} or the\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n     */\n    function sendValue(address payable recipient, uint256 amount) internal {\n        require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n        (bool success, ) = recipient.call{ value: amount }(\"\");\n        require(success, \"Address: unable to send value, recipient may have reverted\");\n    }\n\n    /**\n     * @dev Performs a Solidity function call using a low level `call`. A\n     * plain `call` is an unsafe replacement for a function call: use this\n     * function instead.\n     *\n     * If `target` reverts with a revert reason, it is bubbled up by this\n     * function (like regular Solidity function calls).\n     *\n     * Returns the raw returned data. To convert to the expected return value,\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n     *\n     * Requirements:\n     *\n     * - `target` must be a contract.\n     * - calling `target` with `data` must not revert.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionCall(target, data, \"Address: low-level call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n     * `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, 0, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but also transferring `value` wei to `target`.\n     *\n     * Requirements:\n     *\n     * - the calling contract must have an ETH balance of at least `value`.\n     * - the called Solidity function must be `payable`.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value\n    ) internal returns (bytes memory) {\n        return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\n     *\n     * _Available since v3.1._\n     */\n    function functionCallWithValue(\n        address target,\n        bytes memory data,\n        uint256 value,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(address(this).balance >= value, \"Address: insufficient balance for call\");\n        require(isContract(target), \"Address: call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.call{ value: value }(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n        return functionStaticCall(target, data, \"Address: low-level static call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a static call.\n     *\n     * _Available since v3.3._\n     */\n    function functionStaticCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal view returns (bytes memory) {\n        require(isContract(target), \"Address: static call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.staticcall(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n        return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n    }\n\n    /**\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n     * but performing a delegate call.\n     *\n     * _Available since v3.4._\n     */\n    function functionDelegateCall(\n        address target,\n        bytes memory data,\n        string memory errorMessage\n    ) internal returns (bytes memory) {\n        require(isContract(target), \"Address: delegate call to non-contract\");\n\n        (bool success, bytes memory returndata) = target.delegatecall(data);\n        return verifyCallResult(success, returndata, errorMessage);\n    }\n\n    /**\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\n     * revert reason using the provided one.\n     *\n     * _Available since v4.3._\n     */\n    function verifyCallResult(\n        bool success,\n        bytes memory returndata,\n        string memory errorMessage\n    ) internal pure returns (bytes memory) {\n        if (success) {\n            return returndata;\n        } else {\n            // Look for revert reason and bubble it up if present\n            if (returndata.length > 0) {\n                // The easiest way to bubble the revert reason is using memory via assembly\n\n                assembly {\n                    let returndata_size := mload(returndata)\n                    revert(add(32, returndata), returndata_size)\n                }\n            } else {\n                revert(errorMessage);\n            }\n        }\n    }\n}\n"},"node_modules/@thirdweb-dev/contracts/lib/TWStrings.sol":{"content":"// SPDX-License-Identifier: Apache 2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\n/**\n * @dev String operations.\n */\nlibrary TWStrings {\n    bytes16 private constant _HEX_SYMBOLS = \"0123456789abcdef\";\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` decimal representation.\n     */\n    function toString(uint256 value) internal pure returns (string memory) {\n        // Inspired by OraclizeAPI's implementation - MIT licence\n        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\n\n        if (value == 0) {\n            return \"0\";\n        }\n        uint256 temp = value;\n        uint256 digits;\n        while (temp != 0) {\n            digits++;\n            temp /= 10;\n        }\n        bytes memory buffer = new bytes(digits);\n        while (value != 0) {\n            digits -= 1;\n            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\n            value /= 10;\n        }\n        return string(buffer);\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\n     */\n    function toHexString(uint256 value) internal pure returns (string memory) {\n        if (value == 0) {\n            return \"0x00\";\n        }\n        uint256 temp = value;\n        uint256 length = 0;\n        while (temp != 0) {\n            length++;\n            temp >>= 8;\n        }\n        return toHexString(value, length);\n    }\n\n    /**\n     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\n     */\n    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\n        bytes memory buffer = new bytes(2 * length + 2);\n        buffer[0] = \"0\";\n        buffer[1] = \"x\";\n        for (uint256 i = 2 * length + 1; i > 1; --i) {\n            buffer[i] = _HEX_SYMBOLS[value & 0xf];\n            value >>= 4;\n        }\n        require(value == 0, \"Strings: hex length insufficient\");\n        return string(buffer);\n    }\n}\n"},"node_modules/@thirdweb-dev/contracts/lib/MerkleProof.sol":{"content":"// SPDX-License-Identifier: Apache 2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\n/**\n * @dev These functions deal with verification of Merkle Trees proofs.\n *\n * The proofs can be generated using the JavaScript library\n * https://github.com/miguelmota/merkletreejs[merkletreejs].\n * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.\n *\n * See `test/utils/cryptography/MerkleProof.test.js` for some examples.\n *\n * Source: https://github.com/ensdomains/governance/blob/master/contracts/MerkleProof.sol\n */\nlibrary MerkleProof {\n    /**\n     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\n     * defined by `root`. For this, a `proof` must be provided, containing\n     * sibling hashes on the branch from the leaf to the root of the tree. Each\n     * pair of leaves and each pair of pre-images are assumed to be sorted.\n     */\n    function verify(\n        bytes32[] memory proof,\n        bytes32 root,\n        bytes32 leaf\n    ) internal pure returns (bool, uint256) {\n        bytes32 computedHash = leaf;\n        uint256 index = 0;\n\n        for (uint256 i = 0; i < proof.length; i++) {\n            index *= 2;\n            bytes32 proofElement = proof[i];\n\n            if (computedHash <= proofElement) {\n                // Hash(current computed hash + current element of the proof)\n                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));\n            } else {\n                // Hash(current element of the proof + current computed hash)\n                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));\n                index += 1;\n            }\n        }\n\n        // Check if the computed hash (root) is equal to the provided root\n        return (computedHash == root, index);\n    }\n}\n"},"node_modules/@thirdweb-dev/contracts/base/ERC1155Base.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\nimport { ERC1155 } from \"../eip/ERC1155.sol\";\n\nimport \"../extension/ContractMetadata.sol\";\nimport \"../extension/Multicall.sol\";\nimport \"../extension/Ownable.sol\";\nimport \"../extension/Royalty.sol\";\nimport \"../extension/BatchMintMetadata.sol\";\n\nimport \"../lib/TWStrings.sol\";\n\n/**\n *  The `ERC1155Base` smart contract implements the ERC1155 NFT standard.\n *  It includes the following additions to standard ERC1155 logic:\n *\n *      - Ability to mint NFTs via the provided `mintTo` and `batchMintTo` functions.\n *\n *      - Contract metadata for royalty support on platforms such as OpenSea that use\n *        off-chain information to distribute roaylties.\n *\n *      - Ownership of the contract, with the ability to restrict certain functions to\n *        only be called by the contract's owner.\n *\n *      - Multicall capability to perform multiple actions atomically\n *\n *      - EIP 2981 compliance for royalty support on NFT marketplaces.\n */\n\ncontract ERC1155Base is ERC1155, ContractMetadata, Ownable, Royalty, Multicall, BatchMintMetadata {\n    using TWStrings for uint256;\n\n    /*//////////////////////////////////////////////////////////////\n                        State variables\n    //////////////////////////////////////////////////////////////*/\n\n    /// @dev The tokenId of the next NFT to mint.\n    uint256 internal nextTokenIdToMint_;\n\n    /*//////////////////////////////////////////////////////////////\n                        Mappings\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     *  @notice Returns the total supply of NFTs of a given tokenId\n     *  @dev Mapping from tokenId => total circulating supply of NFTs of that tokenId.\n     */\n    mapping(uint256 => uint256) public totalSupply;\n\n    /*//////////////////////////////////////////////////////////////\n                            Constructor\n    //////////////////////////////////////////////////////////////*/\n\n    constructor(\n        address _defaultAdmin,\n        string memory _name,\n        string memory _symbol,\n        address _royaltyRecipient,\n        uint128 _royaltyBps\n    ) ERC1155(_name, _symbol) {\n        _setupOwner(_defaultAdmin);\n        _setupDefaultRoyaltyInfo(_royaltyRecipient, _royaltyBps);\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                    Overriden metadata logic\n    //////////////////////////////////////////////////////////////*/\n\n    /// @notice Returns the metadata URI for the given tokenId.\n    /// @param _tokenId The tokenId of the token for which a URI should be returned.\n    /// @return The metadata URI for the given tokenId.\n    function uri(uint256 _tokenId) public view virtual override returns (string memory) {\n        string memory uriForToken = _uri[_tokenId];\n        if (bytes(uriForToken).length > 0) {\n            return uriForToken;\n        }\n\n        string memory batchUri = _getBaseURI(_tokenId);\n        return string(abi.encodePacked(batchUri, _tokenId.toString()));\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                        Mint / burn logic\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     *  @notice          Lets an authorized address mint NFTs to a recipient.\n     *  @dev             - The logic in the `_canMint` function determines whether the caller is authorized to mint NFTs.\n     *                   - If `_tokenId == type(uint256).max` a new NFT at tokenId `nextTokenIdToMint` is minted. If the given\n     *                     `tokenId < nextTokenIdToMint`, then additional supply of an existing NFT is being minted.\n     *\n     *  @param _to       The recipient of the NFTs to mint.\n     *  @param _tokenId  The tokenId of the NFT to mint.\n     *  @param _tokenURI The full metadata URI for the NFTs minted (if a new NFT is being minted).\n     *  @param _amount   The amount of the same NFT to mint.\n     */\n    function mintTo(\n        address _to,\n        uint256 _tokenId,\n        string memory _tokenURI,\n        uint256 _amount\n    ) public virtual {\n        require(_canMint(), \"Not authorized to mint.\");\n\n        uint256 tokenIdToMint;\n        uint256 nextIdToMint = nextTokenIdToMint();\n\n        if (_tokenId == type(uint256).max) {\n            tokenIdToMint = nextIdToMint;\n            nextTokenIdToMint_ += 1;\n            _setTokenURI(nextIdToMint, _tokenURI);\n        } else {\n            require(_tokenId < nextIdToMint, \"invalid id\");\n            tokenIdToMint = _tokenId;\n        }\n\n        _mint(_to, tokenIdToMint, _amount, \"\");\n    }\n\n    /**\n     *  @notice          Lets an authorized address mint multiple NEW NFTs at once to a recipient.\n     *  @dev             The logic in the `_canMint` function determines whether the caller is authorized to mint NFTs.\n     *                   If `_tokenIds[i] == type(uint256).max` a new NFT at tokenId `nextTokenIdToMint` is minted. If the given\n     *                   `tokenIds[i] < nextTokenIdToMint`, then additional supply of an existing NFT is minted.\n     *                   The metadata for each new NFT is stored at `baseURI/{tokenID of NFT}`\n     *\n     *  @param _to       The recipient of the NFT to mint.\n     *  @param _tokenIds The tokenIds of the NFTs to mint.\n     *  @param _amounts  The amounts of each NFT to mint.\n     *  @param _baseURI  The baseURI for the `n` number of NFTs minted. The metadata for each NFT is `baseURI/tokenId`\n     */\n    function batchMintTo(\n        address _to,\n        uint256[] memory _tokenIds,\n        uint256[] memory _amounts,\n        string memory _baseURI\n    ) public virtual {\n        require(_canMint(), \"Not authorized to mint.\");\n        require(_amounts.length > 0, \"Minting zero tokens.\");\n        require(_tokenIds.length == _amounts.length, \"Length mismatch.\");\n\n        uint256 nextIdToMint = nextTokenIdToMint();\n        uint256 startNextIdToMint = nextIdToMint;\n\n        uint256 numOfNewNFTs;\n\n        for (uint256 i = 0; i < _tokenIds.length; i += 1) {\n            if (_tokenIds[i] == type(uint256).max) {\n                _tokenIds[i] = nextIdToMint;\n\n                nextIdToMint += 1;\n                numOfNewNFTs += 1;\n            } else {\n                require(_tokenIds[i] < nextIdToMint, \"invalid id\");\n            }\n        }\n\n        if (numOfNewNFTs > 0) {\n            _batchMintMetadata(startNextIdToMint, numOfNewNFTs, _baseURI);\n        }\n\n        nextTokenIdToMint_ = nextIdToMint;\n        _mintBatch(_to, _tokenIds, _amounts, \"\");\n    }\n\n    /**\n     *  @notice         Lets an owner or approved operator burn NFTs of the given tokenId.\n     *\n     *  @param _owner   The owner of the NFT to burn.\n     *  @param _tokenId The tokenId of the NFT to burn.\n     *  @param _amount  The amount of the NFT to burn.\n     */\n    function burn(\n        address _owner,\n        uint256 _tokenId,\n        uint256 _amount\n    ) external virtual {\n        address caller = msg.sender;\n\n        require(caller == _owner || isApprovedForAll[_owner][caller], \"Unapproved caller\");\n        require(balanceOf[_owner][_tokenId] >= _amount, \"Not enough tokens owned\");\n\n        _burn(_owner, _tokenId, _amount);\n    }\n\n    /**\n     *  @notice         Lets an owner or approved operator burn NFTs of the given tokenIds.\n     *\n     *  @param _owner    The owner of the NFTs to burn.\n     *  @param _tokenIds The tokenIds of the NFTs to burn.\n     *  @param _amounts  The amounts of the NFTs to burn.\n     */\n    function burnBatch(\n        address _owner,\n        uint256[] memory _tokenIds,\n        uint256[] memory _amounts\n    ) external virtual {\n        address caller = msg.sender;\n\n        require(caller == _owner || isApprovedForAll[_owner][caller], \"Unapproved caller\");\n        require(_tokenIds.length == _amounts.length, \"Length mismatch\");\n\n        for (uint256 i = 0; i < _tokenIds.length; i += 1) {\n            require(balanceOf[_owner][_tokenIds[i]] >= _amounts[i], \"Not enough tokens owned\");\n        }\n\n        _burnBatch(_owner, _tokenIds, _amounts);\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                            ERC165 Logic\n    //////////////////////////////////////////////////////////////*/\n\n    /**\n     * @dev See ERC165: https://eips.ethereum.org/EIPS/eip-165\n     * @inheritdoc IERC165\n     */\n    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, IERC165) returns (bool) {\n        return\n            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165\n            interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155\n            interfaceId == 0x0e89341c || // ERC165 Interface ID for ERC1155MetadataURI\n            interfaceId == type(IERC2981).interfaceId; // ERC165 ID for ERC2981\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                            View functions\n    //////////////////////////////////////////////////////////////*/\n\n    /// @notice The tokenId assigned to the next new NFT to be minted.\n    function nextTokenIdToMint() public view virtual returns (uint256) {\n        return nextTokenIdToMint_;\n    }\n\n    /*//////////////////////////////////////////////////////////////\n                    Internal (overrideable) functions\n    //////////////////////////////////////////////////////////////*/\n\n    /// @dev Returns whether contract metadata can be set in the given execution context.\n    /// @return Whether contract metadata can be set in the given execution context.\n    function _canSetContractURI() internal view virtual override returns (bool) {\n        return msg.sender == owner();\n    }\n\n    /// @dev Returns whether a token can be minted in the given execution context.\n    /// @return Whether a token can be minted in the given execution context.\n    function _canMint() internal view virtual returns (bool) {\n        return msg.sender == owner();\n    }\n\n    /// @dev Returns whether owner can be set in the given execution context.\n    /// @return Whether owner can be set in the given execution context.\n    function _canSetOwner() internal view virtual override returns (bool) {\n        return msg.sender == owner();\n    }\n\n    /// @dev Returns whether royalty info can be set in the given execution context.\n    /// @return Whether royalty info can be set in the given execution context.\n    function _canSetRoyaltyInfo() internal view virtual override returns (bool) {\n        return msg.sender == owner();\n    }\n\n    /// @dev Runs before every token transfer / mint / burn.\n    /// @param operator The address of the caller.\n    /// @param from The address of the sender.\n    /// @param to The address of the recipient.\n    /// @param ids The tokenIds of the tokens being transferred.\n    /// @param amounts The amounts of the tokens being transferred.\n    /// @param data Additional data with no specified format.\n    function _beforeTokenTransfer(\n        address operator,\n        address from,\n        address to,\n        uint256[] memory ids,\n        uint256[] memory amounts,\n        bytes memory data\n    ) internal virtual override {\n        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);\n\n        if (from == address(0)) {\n            for (uint256 i = 0; i < ids.length; ++i) {\n                totalSupply[ids[i]] += amounts[i];\n            }\n        }\n\n        if (to == address(0)) {\n            for (uint256 i = 0; i < ids.length; ++i) {\n                totalSupply[ids[i]] -= amounts[i];\n            }\n        }\n    }\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/Ownable.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\nimport \"./interface/IOwnable.sol\";\n\n/**\n *  @title   Ownable\n *  @notice  Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading\n *           who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses\n *           information about who the contract's owner is.\n */\n\nabstract contract Ownable is IOwnable {\n    /// @dev Owner of the contract (purpose: OpenSea compatibility)\n    address private _owner;\n\n    /// @dev Reverts if caller is not the owner.\n    modifier onlyOwner() {\n        if (msg.sender != _owner) {\n            revert(\"Not authorized\");\n        }\n        _;\n    }\n\n    /**\n     *  @notice Returns the owner of the contract.\n     */\n    function owner() public view override returns (address) {\n        return _owner;\n    }\n\n    /**\n     *  @notice Lets an authorized wallet set a new owner for the contract.\n     *  @param _newOwner The address to set as the new owner of the contract.\n     */\n    function setOwner(address _newOwner) external override {\n        if (!_canSetOwner()) {\n            revert(\"Not authorized\");\n        }\n        _setupOwner(_newOwner);\n    }\n\n    /// @dev Lets a contract admin set a new owner for the contract. The new owner must be a contract admin.\n    function _setupOwner(address _newOwner) internal {\n        address _prevOwner = _owner;\n        _owner = _newOwner;\n\n        emit OwnerUpdated(_prevOwner, _newOwner);\n    }\n\n    /// @dev Returns whether owner can be set in the given execution context.\n    function _canSetOwner() internal view virtual returns (bool);\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/Royalty.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\nimport \"./interface/IRoyalty.sol\";\n\n/**\n *  @title   Royalty\n *  @notice  Thirdweb's `Royalty` is a contract extension to be used with any base contract. It exposes functions for setting and reading\n *           the recipient of royalty fee and the royalty fee basis points, and lets the inheriting contract perform conditional logic\n *           that uses information about royalty fees, if desired.\n *\n *  @dev     The `Royalty` contract is ERC2981 compliant.\n */\n\nabstract contract Royalty is IRoyalty {\n    /// @dev The (default) address that receives all royalty value.\n    address private royaltyRecipient;\n\n    /// @dev The (default) % of a sale to take as royalty (in basis points).\n    uint16 private royaltyBps;\n\n    /// @dev Token ID => royalty recipient and bps for token\n    mapping(uint256 => RoyaltyInfo) private royaltyInfoForToken;\n\n    /**\n     *  @notice   View royalty info for a given token and sale price.\n     *  @dev      Returns royalty amount and recipient for `tokenId` and `salePrice`.\n     *  @param tokenId          The tokenID of the NFT for which to query royalty info.\n     *  @param salePrice        Sale price of the token.\n     *\n     *  @return receiver        Address of royalty recipient account.\n     *  @return royaltyAmount   Royalty amount calculated at current royaltyBps value.\n     */\n    function royaltyInfo(uint256 tokenId, uint256 salePrice)\n        external\n        view\n        virtual\n        override\n        returns (address receiver, uint256 royaltyAmount)\n    {\n        (address recipient, uint256 bps) = getRoyaltyInfoForToken(tokenId);\n        receiver = recipient;\n        royaltyAmount = (salePrice * bps) / 10_000;\n    }\n\n    /**\n     *  @notice          View royalty info for a given token.\n     *  @dev             Returns royalty recipient and bps for `_tokenId`.\n     *  @param _tokenId  The tokenID of the NFT for which to query royalty info.\n     */\n    function getRoyaltyInfoForToken(uint256 _tokenId) public view override returns (address, uint16) {\n        RoyaltyInfo memory royaltyForToken = royaltyInfoForToken[_tokenId];\n\n        return\n            royaltyForToken.recipient == address(0)\n                ? (royaltyRecipient, uint16(royaltyBps))\n                : (royaltyForToken.recipient, uint16(royaltyForToken.bps));\n    }\n\n    /**\n     *  @notice Returns the defualt royalty recipient and BPS for this contract's NFTs.\n     */\n    function getDefaultRoyaltyInfo() external view override returns (address, uint16) {\n        return (royaltyRecipient, uint16(royaltyBps));\n    }\n\n    /**\n     *  @notice         Updates default royalty recipient and bps.\n     *  @dev            Caller should be authorized to set royalty info.\n     *                  See {_canSetRoyaltyInfo}.\n     *                  Emits {DefaultRoyalty Event}; See {_setupDefaultRoyaltyInfo}.\n     *\n     *  @param _royaltyRecipient   Address to be set as default royalty recipient.\n     *  @param _royaltyBps         Updated royalty bps.\n     */\n    function setDefaultRoyaltyInfo(address _royaltyRecipient, uint256 _royaltyBps) external override {\n        if (!_canSetRoyaltyInfo()) {\n            revert(\"Not authorized\");\n        }\n\n        _setupDefaultRoyaltyInfo(_royaltyRecipient, _royaltyBps);\n    }\n\n    /// @dev Lets a contract admin update the default royalty recipient and bps.\n    function _setupDefaultRoyaltyInfo(address _royaltyRecipient, uint256 _royaltyBps) internal {\n        if (_royaltyBps > 10_000) {\n            revert(\"Exceeds max bps\");\n        }\n\n        royaltyRecipient = _royaltyRecipient;\n        royaltyBps = uint16(_royaltyBps);\n\n        emit DefaultRoyalty(_royaltyRecipient, _royaltyBps);\n    }\n\n    /**\n     *  @notice         Updates default royalty recipient and bps for a particular token.\n     *  @dev            Sets royalty info for `_tokenId`. Caller should be authorized to set royalty info.\n     *                  See {_canSetRoyaltyInfo}.\n     *                  Emits {RoyaltyForToken Event}; See {_setupRoyaltyInfoForToken}.\n     *\n     *  @param _recipient   Address to be set as royalty recipient for given token Id.\n     *  @param _bps         Updated royalty bps for the token Id.\n     */\n    function setRoyaltyInfoForToken(\n        uint256 _tokenId,\n        address _recipient,\n        uint256 _bps\n    ) external override {\n        if (!_canSetRoyaltyInfo()) {\n            revert(\"Not authorized\");\n        }\n\n        _setupRoyaltyInfoForToken(_tokenId, _recipient, _bps);\n    }\n\n    /// @dev Lets a contract admin set the royalty recipient and bps for a particular token Id.\n    function _setupRoyaltyInfoForToken(\n        uint256 _tokenId,\n        address _recipient,\n        uint256 _bps\n    ) internal {\n        if (_bps > 10_000) {\n            revert(\"Exceeds max bps\");\n        }\n\n        royaltyInfoForToken[_tokenId] = RoyaltyInfo({ recipient: _recipient, bps: _bps });\n\n        emit RoyaltyForToken(_tokenId, _recipient, _bps);\n    }\n\n    /// @dev Returns whether royalty info can be set in the given execution context.\n    function _canSetRoyaltyInfo() internal view virtual returns (bool);\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/Drop1155.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\nimport \"./interface/IDrop1155.sol\";\nimport \"../lib/MerkleProof.sol\";\n\nabstract contract Drop1155 is IDrop1155 {\n    /*///////////////////////////////////////////////////////////////\n                            State variables\n    //////////////////////////////////////////////////////////////*/\n\n    /// @dev Mapping from token ID => the set of all claim conditions, at any given moment, for tokens of the token ID.\n    mapping(uint256 => ClaimConditionList) public claimCondition;\n\n    /*///////////////////////////////////////////////////////////////\n                            Drop logic\n    //////////////////////////////////////////////////////////////*/\n\n    /// @dev Lets an account claim tokens.\n    function claim(\n        address _receiver,\n        uint256 _tokenId,\n        uint256 _quantity,\n        address _currency,\n        uint256 _pricePerToken,\n        AllowlistProof calldata _allowlistProof,\n        bytes memory _data\n    ) public payable virtual override {\n        _beforeClaim(_tokenId, _receiver, _quantity, _currency, _pricePerToken, _allowlistProof, _data);\n\n        uint256 activeConditionId = getActiveClaimConditionId(_tokenId);\n\n        verifyClaim(\n            activeConditionId,\n            _dropMsgSender(),\n            _tokenId,\n            _quantity,\n            _currency,\n            _pricePerToken,\n            _allowlistProof\n        );\n\n        // Update contract state.\n        claimCondition[_tokenId].conditions[activeConditionId].supplyClaimed += _quantity;\n        claimCondition[_tokenId].supplyClaimedByWallet[activeConditionId][_dropMsgSender()] += _quantity;\n\n        // If there's a price, collect price.\n        collectPriceOnClaim(_tokenId, address(0), _quantity, _currency, _pricePerToken);\n\n        // Mint the relevant NFTs to claimer.\n        transferTokensOnClaim(_receiver, _tokenId, _quantity);\n\n        emit TokensClaimed(activeConditionId, _dropMsgSender(), _receiver, _tokenId, _quantity);\n\n        _afterClaim(_tokenId, _receiver, _quantity, _currency, _pricePerToken, _allowlistProof, _data);\n    }\n\n    /// @dev Lets a contract admin set claim conditions.\n    function setClaimConditions(\n        uint256 _tokenId,\n        ClaimCondition[] calldata _conditions,\n        bool _resetClaimEligibility\n    ) external virtual override {\n        if (!_canSetClaimConditions()) {\n            revert(\"Not authorized\");\n        }\n        ClaimConditionList storage conditionList = claimCondition[_tokenId];\n        uint256 existingStartIndex = conditionList.currentStartId;\n        uint256 existingPhaseCount = conditionList.count;\n\n        /**\n         *  The mapping `supplyClaimedByWallet` uses a claim condition's UID as a key.\n         *\n         *  If `_resetClaimEligibility == true`, we assign completely new UIDs to the claim\n         *  conditions in `_conditions`, effectively resetting the restrictions on claims expressed\n         *  by `supplyClaimedByWallet`.\n         */\n        uint256 newStartIndex = existingStartIndex;\n        if (_resetClaimEligibility) {\n            newStartIndex = existingStartIndex + existingPhaseCount;\n        }\n\n        conditionList.count = _conditions.length;\n        conditionList.currentStartId = newStartIndex;\n\n        uint256 lastConditionStartTimestamp;\n        for (uint256 i = 0; i < _conditions.length; i++) {\n            require(i == 0 || lastConditionStartTimestamp < _conditions[i].startTimestamp, \"ST\");\n\n            uint256 supplyClaimedAlready = conditionList.conditions[newStartIndex + i].supplyClaimed;\n            if (supplyClaimedAlready > _conditions[i].maxClaimableSupply) {\n                revert(\"max supply claimed\");\n            }\n\n            conditionList.conditions[newStartIndex + i] = _conditions[i];\n            conditionList.conditions[newStartIndex + i].supplyClaimed = supplyClaimedAlready;\n\n            lastConditionStartTimestamp = _conditions[i].startTimestamp;\n        }\n\n        /**\n         *  Gas refunds (as much as possible)\n         *\n         *  If `_resetClaimEligibility == true`, we assign completely new UIDs to the claim\n         *  conditions in `_conditions`. So, we delete claim conditions with UID < `newStartIndex`.\n         *\n         *  If `_resetClaimEligibility == false`, and there are more existing claim conditions\n         *  than in `_conditions`, we delete the existing claim conditions that don't get replaced\n         *  by the conditions in `_conditions`.\n         */\n        if (_resetClaimEligibility) {\n            for (uint256 i = existingStartIndex; i < newStartIndex; i++) {\n                delete conditionList.conditions[i];\n            }\n        } else {\n            if (existingPhaseCount > _conditions.length) {\n                for (uint256 i = _conditions.length; i < existingPhaseCount; i++) {\n                    delete conditionList.conditions[newStartIndex + i];\n                }\n            }\n        }\n\n        emit ClaimConditionsUpdated(_tokenId, _conditions, _resetClaimEligibility);\n    }\n\n    /// @dev Checks a request to claim NFTs against the active claim condition's criteria.\n    function verifyClaim(\n        uint256 _conditionId,\n        address _claimer,\n        uint256 _tokenId,\n        uint256 _quantity,\n        address _currency,\n        uint256 _pricePerToken,\n        AllowlistProof calldata _allowlistProof\n    ) public view returns (bool isOverride) {\n        ClaimCondition memory currentClaimPhase = claimCondition[_tokenId].conditions[_conditionId];\n        uint256 claimLimit = currentClaimPhase.quantityLimitPerWallet;\n        uint256 claimPrice = currentClaimPhase.pricePerToken;\n        address claimCurrency = currentClaimPhase.currency;\n\n        if (currentClaimPhase.merkleRoot != bytes32(0)) {\n            (isOverride, ) = MerkleProof.verify(\n                _allowlistProof.proof,\n                currentClaimPhase.merkleRoot,\n                keccak256(\n                    abi.encodePacked(\n                        _claimer,\n                        _allowlistProof.quantityLimitPerWallet,\n                        _allowlistProof.pricePerToken,\n                        _allowlistProof.currency\n                    )\n                )\n            );\n        }\n\n        if (isOverride) {\n            claimLimit = _allowlistProof.quantityLimitPerWallet != 0\n                ? _allowlistProof.quantityLimitPerWallet\n                : claimLimit;\n            claimPrice = _allowlistProof.pricePerToken != type(uint256).max\n                ? _allowlistProof.pricePerToken\n                : claimPrice;\n            claimCurrency = _allowlistProof.pricePerToken != type(uint256).max && _allowlistProof.currency != address(0)\n                ? _allowlistProof.currency\n                : claimCurrency;\n        }\n\n        uint256 supplyClaimedByWallet = claimCondition[_tokenId].supplyClaimedByWallet[_conditionId][_claimer];\n\n        if (_currency != claimCurrency || _pricePerToken != claimPrice) {\n            revert(\"!PriceOrCurrency\");\n        }\n\n        if (_quantity == 0 || (_quantity + supplyClaimedByWallet > claimLimit)) {\n            revert(\"!Qty\");\n        }\n\n        if (currentClaimPhase.supplyClaimed + _quantity > currentClaimPhase.maxClaimableSupply) {\n            revert(\"!MaxSupply\");\n        }\n\n        if (currentClaimPhase.startTimestamp > block.timestamp) {\n            revert(\"cant claim yet\");\n        }\n    }\n\n    /// @dev At any given moment, returns the uid for the active claim condition.\n    function getActiveClaimConditionId(uint256 _tokenId) public view returns (uint256) {\n        ClaimConditionList storage conditionList = claimCondition[_tokenId];\n        for (uint256 i = conditionList.currentStartId + conditionList.count; i > conditionList.currentStartId; i--) {\n            if (block.timestamp >= conditionList.conditions[i - 1].startTimestamp) {\n                return i - 1;\n            }\n        }\n\n        revert(\"!CONDITION.\");\n    }\n\n    /// @dev Returns the claim condition at the given uid.\n    function getClaimConditionById(uint256 _tokenId, uint256 _conditionId)\n        external\n        view\n        returns (ClaimCondition memory condition)\n    {\n        condition = claimCondition[_tokenId].conditions[_conditionId];\n    }\n\n    /// @dev Returns the supply claimed by claimer for a given conditionId.\n    function getSupplyClaimedByWallet(\n        uint256 _tokenId,\n        uint256 _conditionId,\n        address _claimer\n    ) public view returns (uint256 supplyClaimedByWallet) {\n        supplyClaimedByWallet = claimCondition[_tokenId].supplyClaimedByWallet[_conditionId][_claimer];\n    }\n\n    /*////////////////////////////////////////////////////////////////////\n        Optional hooks that can be implemented in the derived contract\n    ///////////////////////////////////////////////////////////////////*/\n\n    /// @dev Exposes the ability to override the msg sender.\n    function _dropMsgSender() internal virtual returns (address) {\n        return msg.sender;\n    }\n\n    /// @dev Runs before every `claim` function call.\n    function _beforeClaim(\n        uint256 _tokenId,\n        address _receiver,\n        uint256 _quantity,\n        address _currency,\n        uint256 _pricePerToken,\n        AllowlistProof calldata _allowlistProof,\n        bytes memory _data\n    ) internal virtual {}\n\n    /// @dev Runs after every `claim` function call.\n    function _afterClaim(\n        uint256 _tokenId,\n        address _receiver,\n        uint256 _quantity,\n        address _currency,\n        uint256 _pricePerToken,\n        AllowlistProof calldata _allowlistProof,\n        bytes memory _data\n    ) internal virtual {}\n\n    /*///////////////////////////////////////////////////////////////\n        Virtual functions: to be implemented in derived contract\n    //////////////////////////////////////////////////////////////*/\n\n    /// @dev Collects and distributes the primary sale value of NFTs being claimed.\n    function collectPriceOnClaim(\n        uint256 _tokenId,\n        address _primarySaleRecipient,\n        uint256 _quantityToClaim,\n        address _currency,\n        uint256 _pricePerToken\n    ) internal virtual;\n\n    /// @dev Transfers the NFTs being claimed.\n    function transferTokensOnClaim(\n        address _to,\n        uint256 _tokenId,\n        uint256 _quantityBeingClaimed\n    ) internal virtual;\n\n    /// @dev Determine what wallet can update claim conditions\n    function _canSetClaimConditions() internal view virtual returns (bool);\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/LazyMint.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\nimport \"./interface/ILazyMint.sol\";\nimport \"./BatchMintMetadata.sol\";\n\n/**\n *  The `LazyMint` is a contract extension for any base NFT contract. It lets you 'lazy mint' any number of NFTs\n *  at once. Here, 'lazy mint' means defining the metadata for particular tokenIds of your NFT contract, without actually\n *  minting a non-zero balance of NFTs of those tokenIds.\n */\n\nabstract contract LazyMint is ILazyMint, BatchMintMetadata {\n    /// @notice The tokenId assigned to the next new NFT to be lazy minted.\n    uint256 internal nextTokenIdToLazyMint;\n\n    /**\n     *  @notice                  Lets an authorized address lazy mint a given amount of NFTs.\n     *\n     *  @param _amount           The number of NFTs to lazy mint.\n     *  @param _baseURIForTokens The base URI for the 'n' number of NFTs being lazy minted, where the metadata for each\n     *                           of those NFTs is `${baseURIForTokens}/${tokenId}`.\n     *  @param _data             Additional bytes data to be used at the discretion of the consumer of the contract.\n     *  @return batchId          A unique integer identifier for the batch of NFTs lazy minted together.\n     */\n    function lazyMint(\n        uint256 _amount,\n        string calldata _baseURIForTokens,\n        bytes calldata _data\n    ) public virtual override returns (uint256 batchId) {\n        if (!_canLazyMint()) {\n            revert(\"Not authorized\");\n        }\n\n        if (_amount == 0) {\n            revert(\"0 amt\");\n        }\n\n        uint256 startId = nextTokenIdToLazyMint;\n\n        (nextTokenIdToLazyMint, batchId) = _batchMintMetadata(startId, _amount, _baseURIForTokens);\n\n        emit TokensLazyMinted(startId, startId + _amount - 1, _baseURIForTokens, _data);\n\n        return batchId;\n    }\n\n    /// @dev Returns whether lazy minting can be performed in the given execution context.\n    function _canLazyMint() internal view virtual returns (bool);\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/Multicall.sol":{"content":"// SPDX-License-Identifier: Apache 2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\nimport \"../lib/TWAddress.sol\";\nimport \"./interface/IMulticall.sol\";\n\n/**\n * @dev Provides a function to batch together multiple calls in a single external call.\n *\n * _Available since v4.1._\n */\ncontract Multicall is IMulticall {\n    /**\n     *  @notice Receives and executes a batch of function calls on this contract.\n     *  @dev Receives and executes a batch of function calls on this contract.\n     *\n     *  @param data The bytes data that makes up the batch of function calls to execute.\n     *  @return results The bytes data that makes up the result of the batch of function calls executed.\n     */\n    function multicall(bytes[] calldata data) external virtual override returns (bytes[] memory results) {\n        results = new bytes[](data.length);\n        for (uint256 i = 0; i < data.length; i++) {\n            results[i] = TWAddress.functionDelegateCall(address(this), data[i]);\n        }\n        return results;\n    }\n}\n"},"node_modules/@thirdweb-dev/contracts/eip/interface/IERC20.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/**\n * @title ERC20 interface\n * @dev see https://github.com/ethereum/EIPs/issues/20\n */\ninterface IERC20 {\n    function totalSupply() external view returns (uint256);\n\n    function balanceOf(address who) external view returns (uint256);\n\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    function transfer(address to, uint256 value) external returns (bool);\n\n    function approve(address spender, uint256 value) external returns (bool);\n\n    function transferFrom(\n        address from,\n        address to,\n        uint256 value\n    ) external returns (bool);\n\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n}\n"},"node_modules/@thirdweb-dev/contracts/eip/interface/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 * [EIP](https://eips.ethereum.org/EIPS/eip-165).\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     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)\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/@thirdweb-dev/contracts/extension/Permissions.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\nimport \"./interface/IPermissions.sol\";\nimport \"../lib/TWStrings.sol\";\n\n/**\n *  @title   Permissions\n *  @dev     This contracts provides extending-contracts with role-based access control mechanisms\n */\ncontract Permissions is IPermissions {\n    /// @dev Map from keccak256 hash of a role => a map from address => whether address has role.\n    mapping(bytes32 => mapping(address => bool)) private _hasRole;\n\n    /// @dev Map from keccak256 hash of a role to role admin. See {getRoleAdmin}.\n    mapping(bytes32 => bytes32) private _getRoleAdmin;\n\n    /// @dev Default admin role for all roles. Only accounts with this role can grant/revoke other roles.\n    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\n\n    /// @dev Modifier that checks if an account has the specified role; reverts otherwise.\n    modifier onlyRole(bytes32 role) {\n        _checkRole(role, msg.sender);\n        _;\n    }\n\n    /**\n     *  @notice         Checks whether an account has a particular role.\n     *  @dev            Returns `true` if `account` has been granted `role`.\n     *\n     *  @param role     keccak256 hash of the role. e.g. keccak256(\"TRANSFER_ROLE\")\n     *  @param account  Address of the account for which the role is being checked.\n     */\n    function hasRole(bytes32 role, address account) public view override returns (bool) {\n        return _hasRole[role][account];\n    }\n\n    /**\n     *  @notice         Checks whether an account has a particular role;\n     *                  role restrictions can be swtiched on and off.\n     *\n     *  @dev            Returns `true` if `account` has been granted `role`.\n     *                  Role restrictions can be swtiched on and off:\n     *                      - If address(0) has ROLE, then the ROLE restrictions\n     *                        don't apply.\n     *                      - If address(0) does not have ROLE, then the ROLE\n     *                        restrictions will apply.\n     *\n     *  @param role     keccak256 hash of the role. e.g. keccak256(\"TRANSFER_ROLE\")\n     *  @param account  Address of the account for which the role is being checked.\n     */\n    function hasRoleWithSwitch(bytes32 role, address account) public view returns (bool) {\n        if (!_hasRole[role][address(0)]) {\n            return _hasRole[role][account];\n        }\n\n        return true;\n    }\n\n    /**\n     *  @notice         Returns the admin role that controls the specified role.\n     *  @dev            See {grantRole} and {revokeRole}.\n     *                  To change a role's admin, use {_setRoleAdmin}.\n     *\n     *  @param role     keccak256 hash of the role. e.g. keccak256(\"TRANSFER_ROLE\")\n     */\n    function getRoleAdmin(bytes32 role) external view override returns (bytes32) {\n        return _getRoleAdmin[role];\n    }\n\n    /**\n     *  @notice         Grants a role to an account, if not previously granted.\n     *  @dev            Caller must have admin role for the `role`.\n     *                  Emits {RoleGranted Event}.\n     *\n     *  @param role     keccak256 hash of the role. e.g. keccak256(\"TRANSFER_ROLE\")\n     *  @param account  Address of the account to which the role is being granted.\n     */\n    function grantRole(bytes32 role, address account) public virtual override {\n        _checkRole(_getRoleAdmin[role], msg.sender);\n        if (_hasRole[role][account]) {\n            revert(\"Can only grant to non holders\");\n        }\n        _setupRole(role, account);\n    }\n\n    /**\n     *  @notice         Revokes role from an account.\n     *  @dev            Caller must have admin role for the `role`.\n     *                  Emits {RoleRevoked Event}.\n     *\n     *  @param role     keccak256 hash of the role. e.g. keccak256(\"TRANSFER_ROLE\")\n     *  @param account  Address of the account from which the role is being revoked.\n     */\n    function revokeRole(bytes32 role, address account) public virtual override {\n        _checkRole(_getRoleAdmin[role], msg.sender);\n        _revokeRole(role, account);\n    }\n\n    /**\n     *  @notice         Revokes role from the account.\n     *  @dev            Caller must have the `role`, with caller being the same as `account`.\n     *                  Emits {RoleRevoked Event}.\n     *\n     *  @param role     keccak256 hash of the role. e.g. keccak256(\"TRANSFER_ROLE\")\n     *  @param account  Address of the account from which the role is being revoked.\n     */\n    function renounceRole(bytes32 role, address account) public virtual override {\n        if (msg.sender != account) {\n            revert(\"Can only renounce for self\");\n        }\n        _revokeRole(role, account);\n    }\n\n    /// @dev Sets `adminRole` as `role`'s admin role.\n    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\n        bytes32 previousAdminRole = _getRoleAdmin[role];\n        _getRoleAdmin[role] = adminRole;\n        emit RoleAdminChanged(role, previousAdminRole, adminRole);\n    }\n\n    /// @dev Sets up `role` for `account`\n    function _setupRole(bytes32 role, address account) internal virtual {\n        _hasRole[role][account] = true;\n        emit RoleGranted(role, account, msg.sender);\n    }\n\n    /// @dev Revokes `role` from `account`\n    function _revokeRole(bytes32 role, address account) internal virtual {\n        _checkRole(role, account);\n        delete _hasRole[role][account];\n        emit RoleRevoked(role, account, msg.sender);\n    }\n\n    /// @dev Checks `role` for `account`. Reverts with a message including the required role.\n    function _checkRole(bytes32 role, address account) internal view virtual {\n        if (!_hasRole[role][account]) {\n            revert(\n                string(\n                    abi.encodePacked(\n                        \"Permissions: account \",\n                        TWStrings.toHexString(uint160(account), 20),\n                        \" is missing role \",\n                        TWStrings.toHexString(uint256(role), 32)\n                    )\n                )\n            );\n        }\n    }\n\n    /// @dev Checks `role` for `account`. Reverts with a message including the required role.\n    function _checkRoleWithSwitch(bytes32 role, address account) internal view virtual {\n        if (!hasRoleWithSwitch(role, account)) {\n            revert(\n                string(\n                    abi.encodePacked(\n                        \"Permissions: account \",\n                        TWStrings.toHexString(uint160(account), 20),\n                        \" is missing role \",\n                        TWStrings.toHexString(uint256(role), 32)\n                    )\n                )\n            );\n        }\n    }\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/PrimarySale.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\nimport \"./interface/IPrimarySale.sol\";\n\n/**\n *  @title   Primary Sale\n *  @notice  Thirdweb's `PrimarySale` is a contract extension to be used with any base contract. It exposes functions for setting and reading\n *           the recipient of primary sales, and lets the inheriting contract perform conditional logic that uses information about\n *           primary sales, if desired.\n */\n\nabstract contract PrimarySale is IPrimarySale {\n    /// @dev The address that receives all primary sales value.\n    address private recipient;\n\n    /// @dev Returns primary sale recipient address.\n    function primarySaleRecipient() public view override returns (address) {\n        return recipient;\n    }\n\n    /**\n     *  @notice         Updates primary sale recipient.\n     *  @dev            Caller should be authorized to set primary sales info.\n     *                  See {_canSetPrimarySaleRecipient}.\n     *                  Emits {PrimarySaleRecipientUpdated Event}; See {_setupPrimarySaleRecipient}.\n     *\n     *  @param _saleRecipient   Address to be set as new recipient of primary sales.\n     */\n    function setPrimarySaleRecipient(address _saleRecipient) external override {\n        if (!_canSetPrimarySaleRecipient()) {\n            revert(\"Not authorized\");\n        }\n        _setupPrimarySaleRecipient(_saleRecipient);\n    }\n\n    /// @dev Lets a contract admin set the recipient for all primary sales.\n    function _setupPrimarySaleRecipient(address _saleRecipient) internal {\n        recipient = _saleRecipient;\n        emit PrimarySaleRecipientUpdated(_saleRecipient);\n    }\n\n    /// @dev Returns whether primary sale recipient can be set in the given execution context.\n    function _canSetPrimarySaleRecipient() internal view virtual returns (bool);\n}\n"},"node_modules/@thirdweb-dev/contracts/infra/interface/IWETH.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\ninterface IWETH {\n    function deposit() external payable;\n\n    function withdraw(uint256 amount) external;\n\n    function transfer(address to, uint256 value) external returns (bool);\n}\n"},"node_modules/@thirdweb-dev/contracts/eip/interface/IERC1155.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/**\n    @title ERC-1155 Multi Token Standard\n    @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1155.md\n    Note: The ERC-165 identifier for this interface is 0xd9b67a26.\n */\ninterface IERC1155 {\n    /**\n        @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see \"Safe Transfer Rules\" section of the standard).\n        The `_operator` argument MUST be msg.sender.\n        The `_from` argument MUST be the address of the holder whose balance is decreased.\n        The `_to` argument MUST be the address of the recipient whose balance is increased.\n        The `_id` argument MUST be the token type being transferred.\n        The `_value` argument MUST be the number of tokens the holder balance is decreased by and match what the recipient balance is increased by.\n        When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).\n        When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).\n    */\n    event TransferSingle(\n        address indexed _operator,\n        address indexed _from,\n        address indexed _to,\n        uint256 _id,\n        uint256 _value\n    );\n\n    /**\n        @dev Either `TransferSingle` or `TransferBatch` MUST emit when tokens are transferred, including zero value transfers as well as minting or burning (see \"Safe Transfer Rules\" section of the standard).\n        The `_operator` argument MUST be msg.sender.\n        The `_from` argument MUST be the address of the holder whose balance is decreased.\n        The `_to` argument MUST be the address of the recipient whose balance is increased.\n        The `_ids` argument MUST be the list of tokens being transferred.\n        The `_values` argument MUST be the list of number of tokens (matching the list and order of tokens specified in _ids) the holder balance is decreased by and match what the recipient balance is increased by.\n        When minting/creating tokens, the `_from` argument MUST be set to `0x0` (i.e. zero address).\n        When burning/destroying tokens, the `_to` argument MUST be set to `0x0` (i.e. zero address).\n    */\n    event TransferBatch(\n        address indexed _operator,\n        address indexed _from,\n        address indexed _to,\n        uint256[] _ids,\n        uint256[] _values\n    );\n\n    /**\n        @dev MUST emit when approval for a second party/operator address to manage all tokens for an owner address is enabled or disabled (absense of an event assumes disabled).\n    */\n    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);\n\n    /**\n        @dev MUST emit when the URI is updated for a token ID.\n        URIs are defined in RFC 3986.\n        The URI MUST point a JSON file that conforms to the \"ERC-1155 Metadata URI JSON Schema\".\n    */\n    event URI(string _value, uint256 indexed _id);\n\n    /**\n        @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call).\n        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see \"Approval\" section of the standard).\n        MUST revert if `_to` is the zero address.\n        MUST revert if balance of holder for token `_id` is lower than the `_value` sent.\n        MUST revert on any other error.\n        MUST emit the `TransferSingle` event to reflect the balance change (see \"Safe Transfer Rules\" section of the standard).\n        After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see \"Safe Transfer Rules\" section of the standard).\n        @param _from    Source address\n        @param _to      Target address\n        @param _id      ID of the token type\n        @param _value   Transfer amount\n        @param _data    Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to`\n    */\n    function safeTransferFrom(\n        address _from,\n        address _to,\n        uint256 _id,\n        uint256 _value,\n        bytes calldata _data\n    ) external;\n\n    /**\n        @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call).\n        @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see \"Approval\" section of the standard).\n        MUST revert if `_to` is the zero address.\n        MUST revert if length of `_ids` is not the same as length of `_values`.\n        MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient.\n        MUST revert on any other error.\n        MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see \"Safe Transfer Rules\" section of the standard).\n        Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc).\n        After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see \"Safe Transfer Rules\" section of the standard).\n        @param _from    Source address\n        @param _to      Target address\n        @param _ids     IDs of each token type (order and length must match _values array)\n        @param _values  Transfer amounts per token type (order and length must match _ids array)\n        @param _data    Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to`\n    */\n    function safeBatchTransferFrom(\n        address _from,\n        address _to,\n        uint256[] calldata _ids,\n        uint256[] calldata _values,\n        bytes calldata _data\n    ) external;\n\n    /**\n        @notice Get the balance of an account's Tokens.\n        @param _owner  The address of the token holder\n        @param _id     ID of the Token\n        @return        The _owner's balance of the Token type requested\n     */\n    function balanceOf(address _owner, uint256 _id) external view returns (uint256);\n\n    /**\n        @notice Get the balance of multiple account/token pairs\n        @param _owners The addresses of the token holders\n        @param _ids    ID of the Tokens\n        @return        The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair)\n     */\n    function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids)\n        external\n        view\n        returns (uint256[] memory);\n\n    /**\n        @notice Enable or disable approval for a third party (\"operator\") to manage all of the caller's tokens.\n        @dev MUST emit the ApprovalForAll event on success.\n        @param _operator  Address to add to the set of authorized operators\n        @param _approved  True if the operator is approved, false to revoke approval\n    */\n    function setApprovalForAll(address _operator, bool _approved) external;\n\n    /**\n        @notice Queries the approval status of an operator for a given owner.\n        @param _owner     The owner of the Tokens\n        @param _operator  Address of authorized operator\n        @return           True if the operator is approved, false if not\n    */\n    function isApprovedForAll(address _owner, address _operator) external view returns (bool);\n}\n"},"node_modules/@thirdweb-dev/contracts/eip/interface/IERC2981.sol":{"content":"// SPDX-License-Identifier: Apache 2.0\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Interface for the NFT Royalty Standard.\n *\n * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal\n * support for royalty payments across all NFT marketplaces and ecosystem participants.\n *\n * _Available since v4.5._\n */\ninterface IERC2981 is IERC165 {\n    /**\n     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of\n     * exchange. The royalty amount is denominated and should be payed in that same unit of exchange.\n     */\n    function royaltyInfo(uint256 tokenId, uint256 salePrice)\n        external\n        view\n        returns (address receiver, uint256 royaltyAmount);\n}\n"},"node_modules/@thirdweb-dev/contracts/lib/CurrencyTransferLib.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\n// Helper interfaces\nimport { IWETH } from \"../infra/interface/IWETH.sol\";\n\nimport \"../external-deps/openzeppelin/token/ERC20/utils/SafeERC20.sol\";\n\nlibrary CurrencyTransferLib {\n    using SafeERC20 for IERC20;\n\n    /// @dev The address interpreted as native token of the chain.\n    address public constant NATIVE_TOKEN = 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE;\n\n    /// @dev Transfers a given amount of currency.\n    function transferCurrency(\n        address _currency,\n        address _from,\n        address _to,\n        uint256 _amount\n    ) internal {\n        if (_amount == 0) {\n            return;\n        }\n\n        if (_currency == NATIVE_TOKEN) {\n            safeTransferNativeToken(_to, _amount);\n        } else {\n            safeTransferERC20(_currency, _from, _to, _amount);\n        }\n    }\n\n    /// @dev Transfers a given amount of currency. (With native token wrapping)\n    function transferCurrencyWithWrapper(\n        address _currency,\n        address _from,\n        address _to,\n        uint256 _amount,\n        address _nativeTokenWrapper\n    ) internal {\n        if (_amount == 0) {\n            return;\n        }\n\n        if (_currency == NATIVE_TOKEN) {\n            if (_from == address(this)) {\n                // withdraw from weth then transfer withdrawn native token to recipient\n                IWETH(_nativeTokenWrapper).withdraw(_amount);\n                safeTransferNativeTokenWithWrapper(_to, _amount, _nativeTokenWrapper);\n            } else if (_to == address(this)) {\n                // store native currency in weth\n                require(_amount == msg.value, \"msg.value != amount\");\n                IWETH(_nativeTokenWrapper).deposit{ value: _amount }();\n            } else {\n                safeTransferNativeTokenWithWrapper(_to, _amount, _nativeTokenWrapper);\n            }\n        } else {\n            safeTransferERC20(_currency, _from, _to, _amount);\n        }\n    }\n\n    /// @dev Transfer `amount` of ERC20 token from `from` to `to`.\n    function safeTransferERC20(\n        address _currency,\n        address _from,\n        address _to,\n        uint256 _amount\n    ) internal {\n        if (_from == _to) {\n            return;\n        }\n\n        if (_from == address(this)) {\n            IERC20(_currency).safeTransfer(_to, _amount);\n        } else {\n            IERC20(_currency).safeTransferFrom(_from, _to, _amount);\n        }\n    }\n\n    /// @dev Transfers `amount` of native token to `to`.\n    function safeTransferNativeToken(address to, uint256 value) internal {\n        // solhint-disable avoid-low-level-calls\n        // slither-disable-next-line low-level-calls\n        (bool success, ) = to.call{ value: value }(\"\");\n        require(success, \"native token transfer failed\");\n    }\n\n    /// @dev Transfers `amount` of native token to `to`. (With native token wrapping)\n    function safeTransferNativeTokenWithWrapper(\n        address to,\n        uint256 value,\n        address _nativeTokenWrapper\n    ) internal {\n        // solhint-disable avoid-low-level-calls\n        // slither-disable-next-line low-level-calls\n        (bool success, ) = to.call{ value: value }(\"\");\n        if (!success) {\n            IWETH(_nativeTokenWrapper).deposit{ value: value }();\n            IERC20(_nativeTokenWrapper).safeTransfer(to, value);\n        }\n    }\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/ContractMetadata.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\nimport \"./interface/IContractMetadata.sol\";\n\n/**\n *  @title   Contract Metadata\n *  @notice  Thirdweb's `ContractMetadata` is a contract extension for any base contracts. It lets you set a metadata URI\n *           for you contract.\n *           Additionally, `ContractMetadata` is necessary for NFT contracts that want royalties to get distributed on OpenSea.\n */\n\nabstract contract ContractMetadata is IContractMetadata {\n    /// @notice Returns the contract metadata URI.\n    string public override contractURI;\n\n    /**\n     *  @notice         Lets a contract admin set the URI for contract-level metadata.\n     *  @dev            Caller should be authorized to setup contractURI, e.g. contract admin.\n     *                  See {_canSetContractURI}.\n     *                  Emits {ContractURIUpdated Event}.\n     *\n     *  @param _uri     keccak256 hash of the role. e.g. keccak256(\"TRANSFER_ROLE\")\n     */\n    function setContractURI(string memory _uri) external override {\n        if (!_canSetContractURI()) {\n            revert(\"Not authorized\");\n        }\n\n        _setupContractURI(_uri);\n    }\n\n    /// @dev Lets a contract admin set the URI for contract-level metadata.\n    function _setupContractURI(string memory _uri) internal {\n        string memory prevURI = contractURI;\n        contractURI = _uri;\n\n        emit ContractURIUpdated(prevURI, _uri);\n    }\n\n    /// @dev Returns whether contract metadata can be set in the given execution context.\n    function _canSetContractURI() internal view virtual returns (bool);\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/BatchMintMetadata.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\n/**\n *  @title   Batch-mint Metadata\n *  @notice  The `BatchMintMetadata` is a contract extension for any base NFT contract. It lets the smart contract\n *           using this extension set metadata for `n` number of NFTs all at once. This is enabled by storing a single\n *           base URI for a batch of `n` NFTs, where the metadata for each NFT in a relevant batch is `baseURI/tokenId`.\n */\n\ncontract BatchMintMetadata {\n    /// @dev Largest tokenId of each batch of tokens with the same baseURI.\n    uint256[] private batchIds;\n\n    /// @dev Mapping from id of a batch of tokens => to base URI for the respective batch of tokens.\n    mapping(uint256 => string) private baseURI;\n\n    /// @dev Mapping from id of a batch of tokens => to whether the base URI for the respective batch of tokens is frozen.\n    mapping(uint256 => bool) public batchFrozen;\n\n    /// @dev This event emits when the metadata of all tokens are frozen.\n    /// While not currently supported by marketplaces, this event allows\n    /// future indexing if desired.\n    event MetadataFrozen();\n\n    // @dev This event emits when the metadata of a range of tokens is updated.\n    /// So that the third-party platforms such as NFT market could\n    /// timely update the images and related attributes of the NFTs.\n    event BatchMetadataUpdate(uint256 _fromTokenId, uint256 _toTokenId);\n\n    /**\n     *  @notice         Returns the count of batches of NFTs.\n     *  @dev            Each batch of tokens has an in ID and an associated `baseURI`.\n     *                  See {batchIds}.\n     */\n    function getBaseURICount() public view returns (uint256) {\n        return batchIds.length;\n    }\n\n    /**\n     *  @notice         Returns the ID for the batch of tokens at the given index.\n     *  @dev            See {getBaseURICount}.\n     *  @param _index   Index of the desired batch in batchIds array.\n     */\n    function getBatchIdAtIndex(uint256 _index) public view returns (uint256) {\n        if (_index >= getBaseURICount()) {\n            revert(\"Invalid index\");\n        }\n        return batchIds[_index];\n    }\n\n    /// @dev Returns the id for the batch of tokens the given tokenId belongs to.\n    function _getBatchId(uint256 _tokenId) internal view returns (uint256 batchId, uint256 index) {\n        uint256 numOfTokenBatches = getBaseURICount();\n        uint256[] memory indices = batchIds;\n\n        for (uint256 i = 0; i < numOfTokenBatches; i += 1) {\n            if (_tokenId < indices[i]) {\n                index = i;\n                batchId = indices[i];\n\n                return (batchId, index);\n            }\n        }\n\n        revert(\"Invalid tokenId\");\n    }\n\n    /// @dev Returns the baseURI for a token. The intended metadata URI for the token is baseURI + tokenId.\n    function _getBaseURI(uint256 _tokenId) internal view returns (string memory) {\n        uint256 numOfTokenBatches = getBaseURICount();\n        uint256[] memory indices = batchIds;\n\n        for (uint256 i = 0; i < numOfTokenBatches; i += 1) {\n            if (_tokenId < indices[i]) {\n                return baseURI[indices[i]];\n            }\n        }\n        revert(\"Invalid tokenId\");\n    }\n\n    /// @dev returns the starting tokenId of a given batchId.\n    function _getBatchStartId(uint256 _batchID) internal view returns (uint256) {\n        uint256 numOfTokenBatches = getBaseURICount();\n        uint256[] memory indices = batchIds;\n\n        for (uint256 i = 0; i < numOfTokenBatches; i++) {\n            if (_batchID == indices[i]) {\n                if (i > 0) {\n                    return indices[i - 1];\n                }\n                return 0;\n            }\n        }\n        revert(\"Invalid batchId\");\n    }\n\n    /// @dev Sets the base URI for the batch of tokens with the given batchId.\n    function _setBaseURI(uint256 _batchId, string memory _baseURI) internal {\n        require(!batchFrozen[_batchId], \"Batch frozen\");\n        baseURI[_batchId] = _baseURI;\n        emit BatchMetadataUpdate(_getBatchStartId(_batchId), _batchId);\n    }\n\n    /// @dev Freezes the base URI for the batch of tokens with the given batchId.\n    function _freezeBaseURI(uint256 _batchId) internal {\n        string memory baseURIForBatch = baseURI[_batchId];\n        require(bytes(baseURIForBatch).length > 0, \"Invalid batch\");\n        batchFrozen[_batchId] = true;\n        emit MetadataFrozen();\n    }\n\n    /// @dev Mints a batch of tokenIds and associates a common baseURI to all those Ids.\n    function _batchMintMetadata(\n        uint256 _startId,\n        uint256 _amountToMint,\n        string memory _baseURIForTokens\n    ) internal returns (uint256 nextTokenIdToMint, uint256 batchId) {\n        batchId = _startId + _amountToMint;\n        nextTokenIdToMint = batchId;\n\n        batchIds.push(batchId);\n\n        baseURI[batchId] = _baseURIForTokens;\n    }\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/interface/IOwnable.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\n/**\n *  Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading\n *  who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses\n *  information about who the contract's owner is.\n */\n\ninterface IOwnable {\n    /// @dev Returns the owner of the contract.\n    function owner() external view returns (address);\n\n    /// @dev Lets a module admin set a new owner for the contract. The new owner must be a module admin.\n    function setOwner(address _newOwner) external;\n\n    /// @dev Emitted when a new Owner is set.\n    event OwnerUpdated(address indexed prevOwner, address indexed newOwner);\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/interface/IRoyalty.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\nimport \"../../eip/interface/IERC2981.sol\";\n\n/**\n *  Thirdweb's `Royalty` is a contract extension to be used with any base contract. It exposes functions for setting and reading\n *  the recipient of royalty fee and the royalty fee basis points, and lets the inheriting contract perform conditional logic\n *  that uses information about royalty fees, if desired.\n *\n *  The `Royalty` contract is ERC2981 compliant.\n */\n\ninterface IRoyalty is IERC2981 {\n    struct RoyaltyInfo {\n        address recipient;\n        uint256 bps;\n    }\n\n    /// @dev Returns the royalty recipient and fee bps.\n    function getDefaultRoyaltyInfo() external view returns (address, uint16);\n\n    /// @dev Lets a module admin update the royalty bps and recipient.\n    function setDefaultRoyaltyInfo(address _royaltyRecipient, uint256 _royaltyBps) external;\n\n    /// @dev Lets a module admin set the royalty recipient for a particular token Id.\n    function setRoyaltyInfoForToken(\n        uint256 tokenId,\n        address recipient,\n        uint256 bps\n    ) external;\n\n    /// @dev Returns the royalty recipient for a particular token Id.\n    function getRoyaltyInfoForToken(uint256 tokenId) external view returns (address, uint16);\n\n    /// @dev Emitted when royalty info is updated.\n    event DefaultRoyalty(address indexed newRoyaltyRecipient, uint256 newRoyaltyBps);\n\n    /// @dev Emitted when royalty recipient for tokenId is set\n    event RoyaltyForToken(uint256 indexed tokenId, address indexed royaltyRecipient, uint256 royaltyBps);\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/interface/IDrop1155.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\nimport \"./IClaimConditionMultiPhase.sol\";\n\n/**\n *  The interface `IDrop1155` is written for thirdweb's 'Drop' contracts, which are distribution mechanisms for tokens.\n *\n *  An authorized wallet can set a series of claim conditions, ordered by their respective `startTimestamp`.\n *  A claim condition defines criteria under which accounts can mint tokens. Claim conditions can be overwritten\n *  or added to by the contract admin. At any moment, there is only one active claim condition.\n */\n\ninterface IDrop1155 is IClaimConditionMultiPhase {\n    /**\n     *  @param proof Proof of concerned wallet's inclusion in an allowlist.\n     *  @param quantityLimitPerWallet The total quantity of tokens the allowlisted wallet is eligible to claim over time.\n     *  @param pricePerToken The price per token the allowlisted wallet must pay to claim tokens.\n     *  @param currency The currency in which the allowlisted wallet must pay the price for claiming tokens.\n     */\n    struct AllowlistProof {\n        bytes32[] proof;\n        uint256 quantityLimitPerWallet;\n        uint256 pricePerToken;\n        address currency;\n    }\n\n    /// @notice Emitted when tokens are claimed.\n    event TokensClaimed(\n        uint256 indexed claimConditionIndex,\n        address indexed claimer,\n        address indexed receiver,\n        uint256 tokenId,\n        uint256 quantityClaimed\n    );\n\n    /// @notice Emitted when the contract's claim conditions are updated.\n    event ClaimConditionsUpdated(uint256 indexed tokenId, ClaimCondition[] claimConditions, bool resetEligibility);\n\n    /**\n     *  @notice Lets an account claim a given quantity of NFTs.\n     *\n     *  @param receiver                       The receiver of the NFTs to claim.\n     *  @param tokenId                        The tokenId of the NFT to claim.\n     *  @param quantity                       The quantity of NFTs to claim.\n     *  @param currency                       The currency in which to pay for the claim.\n     *  @param pricePerToken                  The price per token to pay for the claim.\n     *  @param allowlistProof                 The proof of the claimer's inclusion in the merkle root allowlist\n     *                                        of the claim conditions that apply.\n     *  @param data                           Arbitrary bytes data that can be leveraged in the implementation of this interface.\n     */\n    function claim(\n        address receiver,\n        uint256 tokenId,\n        uint256 quantity,\n        address currency,\n        uint256 pricePerToken,\n        AllowlistProof calldata allowlistProof,\n        bytes memory data\n    ) external payable;\n\n    /**\n     *  @notice Lets a contract admin (account with `DEFAULT_ADMIN_ROLE`) set claim conditions.\n     *\n     *  @param tokenId                  The token ID for which to set mint conditions.\n     *  @param phases                   Claim conditions in ascending order by `startTimestamp`.\n     *\n     *  @param resetClaimEligibility    Whether to honor the restrictions applied to wallets who have claimed tokens in the current conditions,\n     *                                  in the new claim conditions being set.\n     *\n     */\n    function setClaimConditions(\n        uint256 tokenId,\n        ClaimCondition[] calldata phases,\n        bool resetClaimEligibility\n    ) external;\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/interface/ILazyMint.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\n/**\n *  Thirdweb's `LazyMint` is a contract extension for any base NFT contract. It lets you 'lazy mint' any number of NFTs\n *  at once. Here, 'lazy mint' means defining the metadata for particular tokenIds of your NFT contract, without actually\n *  minting a non-zero balance of NFTs of those tokenIds.\n */\n\ninterface ILazyMint {\n    /// @dev Emitted when tokens are lazy minted.\n    event TokensLazyMinted(uint256 indexed startTokenId, uint256 endTokenId, string baseURI, bytes encryptedBaseURI);\n\n    /**\n     *  @notice Lazy mints a given amount of NFTs.\n     *\n     *  @param amount           The number of NFTs to lazy mint.\n     *\n     *  @param baseURIForTokens The base URI for the 'n' number of NFTs being lazy minted, where the metadata for each\n     *                          of those NFTs is `${baseURIForTokens}/${tokenId}`.\n     *\n     *  @param extraData        Additional bytes data to be used at the discretion of the consumer of the contract.\n     *\n     *  @return batchId         A unique integer identifier for the batch of NFTs lazy minted together.\n     */\n    function lazyMint(\n        uint256 amount,\n        string calldata baseURIForTokens,\n        bytes calldata extraData\n    ) external returns (uint256 batchId);\n}\n"},"node_modules/@thirdweb-dev/contracts/eip/interface/IERC1155Metadata.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/**\n    Note: The ERC-165 identifier for this interface is 0x0e89341c.\n*/\ninterface IERC1155Metadata {\n    /**\n        @notice A distinct Uniform Resource Identifier (URI) for a given token.\n        @dev URIs are defined in RFC 3986.\n        The URI may point to a JSON file that conforms to the \"ERC-1155 Metadata URI JSON Schema\".\n        @return URI string\n    */\n    function uri(uint256 _id) external view returns (string memory);\n}\n"},"node_modules/@thirdweb-dev/contracts/eip/interface/IERC1155Receiver.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev _Available since v3.1._\n */\ninterface IERC1155Receiver is IERC165 {\n    /**\n     * @dev Handles the receipt of a single ERC1155 token type. This function is\n     * called at the end of a `safeTransferFrom` after the balance has been updated.\n     *\n     * NOTE: To accept the transfer, this must return\n     * `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))`\n     * (i.e. 0xf23a6e61, or its own function selector).\n     *\n     * @param operator The address which initiated the transfer (i.e. msg.sender)\n     * @param from The address which previously owned the token\n     * @param id The ID of the token being transferred\n     * @param value The amount of tokens being transferred\n     * @param data Additional data with no specified format\n     * @return `bytes4(keccak256(\"onERC1155Received(address,address,uint256,uint256,bytes)\"))` if transfer is allowed\n     */\n    function onERC1155Received(\n        address operator,\n        address from,\n        uint256 id,\n        uint256 value,\n        bytes calldata data\n    ) external returns (bytes4);\n\n    /**\n     * @dev Handles the receipt of a multiple ERC1155 token types. This function\n     * is called at the end of a `safeBatchTransferFrom` after the balances have\n     * been updated.\n     *\n     * NOTE: To accept the transfer(s), this must return\n     * `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))`\n     * (i.e. 0xbc197c81, or its own function selector).\n     *\n     * @param operator The address which initiated the batch transfer (i.e. msg.sender)\n     * @param from The address which previously owned the token\n     * @param ids An array containing ids of each token being transferred (order and length must match values array)\n     * @param values An array containing amounts of each token being transferred (order and length must match ids array)\n     * @param data Additional data with no specified format\n     * @return `bytes4(keccak256(\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\"))` if transfer is allowed\n     */\n    function onERC1155BatchReceived(\n        address operator,\n        address from,\n        uint256[] calldata ids,\n        uint256[] calldata values,\n        bytes calldata data\n    ) external returns (bytes4);\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/interface/IMulticall.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\n/**\n * @dev Provides a function to batch together multiple calls in a single external call.\n *\n * _Available since v4.1._\n */\ninterface IMulticall {\n    /**\n     * @dev Receives and executes a batch of function calls on this contract.\n     */\n    function multicall(bytes[] calldata data) external returns (bytes[] memory results);\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/PermissionsEnumerable.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\nimport \"./interface/IPermissionsEnumerable.sol\";\nimport \"./Permissions.sol\";\n\n/**\n *  @title   PermissionsEnumerable\n *  @dev     This contracts provides extending-contracts with role-based access control mechanisms.\n *           Also provides interfaces to view all members with a given role, and total count of members.\n */\ncontract PermissionsEnumerable is IPermissionsEnumerable, Permissions {\n    /**\n     *  @notice A data structure to store data of members for a given role.\n     *\n     *  @param index    Current index in the list of accounts that have a role.\n     *  @param members  map from index => address of account that has a role\n     *  @param indexOf  map from address => index which the account has.\n     */\n    struct RoleMembers {\n        uint256 index;\n        mapping(uint256 => address) members;\n        mapping(address => uint256) indexOf;\n    }\n\n    /// @dev map from keccak256 hash of a role to its members' data. See {RoleMembers}.\n    mapping(bytes32 => RoleMembers) private roleMembers;\n\n    /**\n     *  @notice         Returns the role-member from a list of members for a role,\n     *                  at a given index.\n     *  @dev            Returns `member` who has `role`, at `index` of role-members list.\n     *                  See struct {RoleMembers}, and mapping {roleMembers}\n     *\n     *  @param role     keccak256 hash of the role. e.g. keccak256(\"TRANSFER_ROLE\")\n     *  @param index    Index in list of current members for the role.\n     *\n     *  @return member  Address of account that has `role`\n     */\n    function getRoleMember(bytes32 role, uint256 index) external view override returns (address member) {\n        uint256 currentIndex = roleMembers[role].index;\n        uint256 check;\n\n        for (uint256 i = 0; i < currentIndex; i += 1) {\n            if (roleMembers[role].members[i] != address(0)) {\n                if (check == index) {\n                    member = roleMembers[role].members[i];\n                    return member;\n                }\n                check += 1;\n            } else if (hasRole(role, address(0)) && i == roleMembers[role].indexOf[address(0)]) {\n                check += 1;\n            }\n        }\n    }\n\n    /**\n     *  @notice         Returns total number of accounts that have a role.\n     *  @dev            Returns `count` of accounts that have `role`.\n     *                  See struct {RoleMembers}, and mapping {roleMembers}\n     *\n     *  @param role     keccak256 hash of the role. e.g. keccak256(\"TRANSFER_ROLE\")\n     *\n     *  @return count   Total number of accounts that have `role`\n     */\n    function getRoleMemberCount(bytes32 role) external view override returns (uint256 count) {\n        uint256 currentIndex = roleMembers[role].index;\n\n        for (uint256 i = 0; i < currentIndex; i += 1) {\n            if (roleMembers[role].members[i] != address(0)) {\n                count += 1;\n            }\n        }\n        if (hasRole(role, address(0))) {\n            count += 1;\n        }\n    }\n\n    /// @dev Revokes `role` from `account`, and removes `account` from {roleMembers}\n    ///      See {_removeMember}\n    function _revokeRole(bytes32 role, address account) internal override {\n        super._revokeRole(role, account);\n        _removeMember(role, account);\n    }\n\n    /// @dev Grants `role` to `account`, and adds `account` to {roleMembers}\n    ///      See {_addMember}\n    function _setupRole(bytes32 role, address account) internal override {\n        super._setupRole(role, account);\n        _addMember(role, account);\n    }\n\n    /// @dev adds `account` to {roleMembers}, for `role`\n    function _addMember(bytes32 role, address account) internal {\n        uint256 idx = roleMembers[role].index;\n        roleMembers[role].index += 1;\n\n        roleMembers[role].members[idx] = account;\n        roleMembers[role].indexOf[account] = idx;\n    }\n\n    /// @dev removes `account` from {roleMembers}, for `role`\n    function _removeMember(bytes32 role, address account) internal {\n        uint256 idx = roleMembers[role].indexOf[account];\n\n        delete roleMembers[role].members[idx];\n        delete roleMembers[role].indexOf[account];\n    }\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/interface/IPermissions.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\n/**\n * @dev External interface of AccessControl declared to support ERC165 detection.\n */\ninterface IPermissions {\n    /**\n     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\n     *\n     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\n     * {RoleAdminChanged} not being emitted signaling this.\n     *\n     * _Available since v3.1._\n     */\n    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\n\n    /**\n     * @dev Emitted when `account` is granted `role`.\n     *\n     * `sender` is the account that originated the contract call, an admin role\n     * bearer except when using {AccessControl-_setupRole}.\n     */\n    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Emitted when `account` is revoked `role`.\n     *\n     * `sender` is the account that originated the contract call:\n     *   - if using `revokeRole`, it is the admin role bearer\n     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)\n     */\n    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\n\n    /**\n     * @dev Returns `true` if `account` has been granted `role`.\n     */\n    function hasRole(bytes32 role, address account) external view returns (bool);\n\n    /**\n     * @dev Returns the admin role that controls `role`. See {grantRole} and\n     * {revokeRole}.\n     *\n     * To change a role's admin, use {AccessControl-_setRoleAdmin}.\n     */\n    function getRoleAdmin(bytes32 role) external view returns (bytes32);\n\n    /**\n     * @dev Grants `role` to `account`.\n     *\n     * If `account` had not been already granted `role`, emits a {RoleGranted}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function grantRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from `account`.\n     *\n     * If `account` had been granted `role`, emits a {RoleRevoked} event.\n     *\n     * Requirements:\n     *\n     * - the caller must have ``role``'s admin role.\n     */\n    function revokeRole(bytes32 role, address account) external;\n\n    /**\n     * @dev Revokes `role` from the calling account.\n     *\n     * Roles are often managed via {grantRole} and {revokeRole}: this function's\n     * purpose is to provide a mechanism for accounts to lose their privileges\n     * if they are compromised (such as when a trusted device is misplaced).\n     *\n     * If the calling account had been granted `role`, emits a {RoleRevoked}\n     * event.\n     *\n     * Requirements:\n     *\n     * - the caller must be `account`.\n     */\n    function renounceRole(bytes32 role, address account) external;\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/interface/IPrimarySale.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\n/**\n *  Thirdweb's `Primary` is a contract extension to be used with any base contract. It exposes functions for setting and reading\n *  the recipient of primary sales, and lets the inheriting contract perform conditional logic that uses information about\n *  primary sales, if desired.\n */\n\ninterface IPrimarySale {\n    /// @dev The adress that receives all primary sales value.\n    function primarySaleRecipient() external view returns (address);\n\n    /// @dev Lets a module admin set the default recipient of all primary sales.\n    function setPrimarySaleRecipient(address _saleRecipient) external;\n\n    /// @dev Emitted when a new sale recipient is set.\n    event PrimarySaleRecipientUpdated(address indexed recipient);\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/interface/IClaimCondition.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\n/**\n *  The interface `IClaimCondition` is written for thirdweb's 'Drop' contracts, which are distribution mechanisms for tokens.\n *\n *  A claim condition defines criteria under which accounts can mint tokens. Claim conditions can be overwritten\n *  or added to by the contract admin. At any moment, there is only one active claim condition.\n */\n\ninterface IClaimCondition {\n    /**\n     *  @notice The criteria that make up a claim condition.\n     *\n     *  @param startTimestamp                 The unix timestamp after which the claim condition applies.\n     *                                        The same claim condition applies until the `startTimestamp`\n     *                                        of the next claim condition.\n     *\n     *  @param maxClaimableSupply             The maximum total number of tokens that can be claimed under\n     *                                        the claim condition.\n     *\n     *  @param supplyClaimed                  At any given point, the number of tokens that have been claimed\n     *                                        under the claim condition.\n     *\n     *  @param quantityLimitPerWallet         The maximum number of tokens that can be claimed by a wallet.\n     *\n     *  @param merkleRoot                     The allowlist of addresses that can claim tokens under the claim\n     *                                        condition.\n     *\n     *  @param pricePerToken                  The price required to pay per token claimed.\n     *\n     *  @param currency                       The currency in which the `pricePerToken` must be paid.\n     *\n     *  @param metadata                       Claim condition metadata.\n     */\n    struct ClaimCondition {\n        uint256 startTimestamp;\n        uint256 maxClaimableSupply;\n        uint256 supplyClaimed;\n        uint256 quantityLimitPerWallet;\n        bytes32 merkleRoot;\n        uint256 pricePerToken;\n        address currency;\n        string metadata;\n    }\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/interface/IContractMetadata.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\n/**\n *  Thirdweb's `ContractMetadata` is a contract extension for any base contracts. It lets you set a metadata URI\n *  for you contract.\n *\n *  Additionally, `ContractMetadata` is necessary for NFT contracts that want royalties to get distributed on OpenSea.\n */\n\ninterface IContractMetadata {\n    /// @dev Returns the metadata URI of the contract.\n    function contractURI() external view returns (string memory);\n\n    /**\n     *  @dev Sets contract URI for the storefront-level metadata of the contract.\n     *       Only module admin can call this function.\n     */\n    function setContractURI(string calldata _uri) external;\n\n    /// @dev Emitted when the contract URI is updated.\n    event ContractURIUpdated(string prevURI, string newURI);\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/interface/IPermissionsEnumerable.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\nimport \"./IPermissions.sol\";\n\n/**\n * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.\n */\ninterface IPermissionsEnumerable is IPermissions {\n    /**\n     * @dev Returns one of the accounts that have `role`. `index` must be a\n     * value between 0 and {getRoleMemberCount}, non-inclusive.\n     *\n     * Role bearers are not sorted in any particular way, and their ordering may\n     * change at any point.\n     *\n     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure\n     * you perform all queries on the same block. See the following\n     * [forum post](https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296)\n     * for more information.\n     */\n    function getRoleMember(bytes32 role, uint256 index) external view returns (address);\n\n    /**\n     * @dev Returns the number of accounts that have `role`. Can be used\n     * together with {getRoleMember} to enumerate all bearers of a role.\n     */\n    function getRoleMemberCount(bytes32 role) external view returns (uint256);\n}\n"},"node_modules/@thirdweb-dev/contracts/extension/interface/IClaimConditionMultiPhase.sol":{"content":"// SPDX-License-Identifier: Apache-2.0\npragma solidity ^0.8.0;\n\n/// @author thirdweb\n\nimport \"./IClaimCondition.sol\";\n\n/**\n *  The interface `IClaimConditionMultiPhase` is written for thirdweb's 'Drop' contracts, which are distribution mechanisms for tokens.\n *\n *  An authorized wallet can set a series of claim conditions, ordered by their respective `startTimestamp`.\n *  A claim condition defines criteria under which accounts can mint tokens. Claim conditions can be overwritten\n *  or added to by the contract admin. At any moment, there is only one active claim condition.\n */\n\ninterface IClaimConditionMultiPhase is IClaimCondition {\n    /**\n     *  @notice The set of all claim conditions, at any given moment.\n     *  Claim Phase ID = [currentStartId, currentStartId + length - 1];\n     *\n     *  @param currentStartId           The uid for the first claim condition amongst the current set of\n     *                                  claim conditions. The uid for each next claim condition is one\n     *                                  more than the previous claim condition's uid.\n     *\n     *  @param count                    The total number of phases / claim conditions in the list\n     *                                  of claim conditions.\n     *\n     *  @param conditions                   The claim conditions at a given uid. Claim conditions\n     *                                  are ordered in an ascending order by their `startTimestamp`.\n     *\n     *  @param supplyClaimedByWallet    Map from a claim condition uid and account to supply claimed by account.\n     */\n    struct ClaimConditionList {\n        uint256 currentStartId;\n        uint256 count;\n        mapping(uint256 => ClaimCondition) conditions;\n        mapping(uint256 => mapping(address => uint256)) supplyClaimedByWallet;\n    }\n}\n"},"node_modules/@thirdweb-dev/contracts/external-deps/openzeppelin/token/ERC20/utils/SafeERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../../../../../eip/interface/IERC20.sol\";\nimport \"../../../../../lib/TWAddress.sol\";\n\n/**\n * @title SafeERC20\n * @dev Wrappers around ERC20 operations that throw on failure (when the token\n * contract returns false). Tokens that return no value (and instead revert or\n * throw on failure) are also supported, non-reverting calls are assumed to be\n * successful.\n * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,\n * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.\n */\nlibrary SafeERC20 {\n    using TWAddress for address;\n\n    function safeTransfer(\n        IERC20 token,\n        address to,\n        uint256 value\n    ) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));\n    }\n\n    function safeTransferFrom(\n        IERC20 token,\n        address from,\n        address to,\n        uint256 value\n    ) internal {\n        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));\n    }\n\n    /**\n     * @dev Deprecated. This function has issues similar to the ones found in\n     * {IERC20-approve}, and its usage is discouraged.\n     *\n     * Whenever possible, use {safeIncreaseAllowance} and\n     * {safeDecreaseAllowance} instead.\n     */\n    function safeApprove(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        // safeApprove should only be called when setting an initial allowance,\n        // or when resetting it to zero. To increase and decrease it, use\n        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'\n        require(\n            (value == 0) || (token.allowance(address(this), spender) == 0),\n            \"SafeERC20: approve from non-zero to non-zero allowance\"\n        );\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));\n    }\n\n    function safeIncreaseAllowance(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        uint256 newAllowance = token.allowance(address(this), spender) + value;\n        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n    }\n\n    function safeDecreaseAllowance(\n        IERC20 token,\n        address spender,\n        uint256 value\n    ) internal {\n        unchecked {\n            uint256 oldAllowance = token.allowance(address(this), spender);\n            require(oldAllowance >= value, \"SafeERC20: decreased allowance below zero\");\n            uint256 newAllowance = oldAllowance - value;\n            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));\n        }\n    }\n\n    /**\n     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement\n     * on the return value: the return value is optional (but if data is returned, it must not be false).\n     * @param token The token targeted by the call.\n     * @param data The call data (encoded using abi.encode or one of its variants).\n     */\n    function _callOptionalReturn(IERC20 token, bytes memory data) private {\n        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since\n        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that\n        // the target address contains contract code and also asserts for success in the low-level call.\n\n        bytes memory returndata = address(token).functionCall(data, \"SafeERC20: low-level call failed\");\n        if (returndata.length > 0) {\n            // Return data is optional\n            require(abi.decode(returndata, (bool)), \"SafeERC20: ERC20 operation did not succeed\");\n        }\n    }\n}\n"}},"settings":{"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"optimizer":{"runs":200,"enabled":true},"evmVersion":"paris","remappings":["@thirdweb-dev/=node_modules/@thirdweb-dev/","ds-test/=lib/forge-std/lib/ds-test/src/","forge-std/=lib/forge-std/src/"]}}