diff --git a/.changeset/blue-geese-refuse.md b/.changeset/blue-geese-refuse.md new file mode 100644 index 00000000000..fce974a27ea --- /dev/null +++ b/.changeset/blue-geese-refuse.md @@ -0,0 +1,5 @@ +--- +"thirdweb": patch +--- + +Single phase functionality for erc1155 diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions-form/hooks.ts b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions-form/hooks.ts index 62e9e08c431..0b65d512fe0 100644 --- a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions-form/hooks.ts +++ b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions-form/hooks.ts @@ -126,7 +126,7 @@ export async function getClaimPhasesInLegacyFormat( type PhaseInput = z.input; export function setClaimPhasesTx( - baseOptions: BaseTransactionOptions, + baseOptions: BaseTransactionOptions & { isSinglePhase?: boolean }, rawPhases: PhaseInput[], ) { const phases = rawPhases.map((phase) => { @@ -172,6 +172,7 @@ export function setClaimPhasesTx( contract: baseOptions.contract, phases, tokenId: baseOptions.tokenId, + singlePhaseDrop: baseOptions.isSinglePhase, }); } } diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions-form/index.tsx b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions-form/index.tsx index 2e92ba78d9c..0f1236353ca 100644 --- a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions-form/index.tsx +++ b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions-form/index.tsx @@ -226,7 +226,10 @@ export const ClaimConditionsForm: React.FC = ({ ? { type: "erc20", decimals: tokenDecimals.data } : isErc721 ? { type: "erc721" } - : { type: "erc1155", tokenId: BigInt(tokenId || 0) }), + : { + type: "erc1155", + tokenId: BigInt(tokenId || 0), + }), }); const transformedQueryData = useMemo(() => { @@ -370,6 +373,7 @@ export const ClaimConditionsForm: React.FC = ({ const tx = setClaimPhasesTx( { contract, + isSinglePhase: !isMultiPhase, ...(isErc20 ? { type: "erc20", decimals: tokenDecimals.data } : isErc721 @@ -635,6 +639,7 @@ export const ClaimConditionsForm: React.FC = ({ isErc20={isErc20} contract={contract} tokenId={tokenId} + isMultiphase={isMultiPhase} /> )} diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions.tsx b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions.tsx index c56d21b4598..4c342137415 100644 --- a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions.tsx +++ b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/claim-conditions.tsx @@ -10,6 +10,7 @@ interface ClaimConditionsProps { isColumn?: true; isERC20: boolean; twAccount: Account | undefined; + isMultiphase: boolean; } export const ClaimConditions: React.FC = ({ contract, @@ -17,6 +18,7 @@ export const ClaimConditions: React.FC = ({ isColumn, isERC20, twAccount, + isMultiphase, }) => { return (
@@ -37,8 +39,7 @@ export const ClaimConditions: React.FC = ({ contract={contract} tokenId={tokenId} isColumn={isColumn} - // always multi phase! - isMultiPhase={true} + isMultiPhase={isMultiphase} />
); diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/reset-claim-eligibility.tsx b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/reset-claim-eligibility.tsx index 8d40ee1fbdd..a2036ee46d8 100644 --- a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/reset-claim-eligibility.tsx +++ b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/_components/claim-conditions/reset-claim-eligibility.tsx @@ -18,6 +18,7 @@ interface ResetClaimEligibilityProps { contract: ThirdwebContract; tokenId?: string; twAccount: Account | undefined; + isMultiphase: boolean; } export const ResetClaimEligibility: React.FC = ({ @@ -25,6 +26,7 @@ export const ResetClaimEligibility: React.FC = ({ tokenId, isErc20, twAccount, + isMultiphase, }) => { const trackEvent = useTrack(); @@ -55,6 +57,7 @@ export const ResetClaimEligibility: React.FC = ({ return ERC1155Ext.resetClaimEligibility({ contract, tokenId: BigInt(tokenId), + singlePhaseDrop: !isMultiphase, }); } // assume erc 721 diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/ClaimConditions.client.tsx b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/ClaimConditions.client.tsx index 4cb9114f7b0..e42fe28465c 100644 --- a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/ClaimConditions.client.tsx +++ b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/ClaimConditions.client.tsx @@ -36,6 +36,7 @@ export function ClaimConditionsClient(props: { contract={props.contract} isERC20={supportedERCs.isERC20} twAccount={props.twAccount} + isMultiphase={true} /> ); } diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/page.tsx b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/page.tsx index 858ea0d999c..8325cfa20ca 100644 --- a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/page.tsx +++ b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/claim-conditions/page.tsx @@ -41,6 +41,7 @@ export default async function Page(props: { contract={contract} isERC20={supportedERCs.isERC20} twAccount={account} + isMultiphase={true} /> ); } diff --git a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/useNftDrawerTabs.tsx b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/useNftDrawerTabs.tsx index cf3cd32d703..96c4c024940 100644 --- a/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/useNftDrawerTabs.tsx +++ b/apps/dashboard/src/app/(dashboard)/(chain)/[chain_id]/[contractAddress]/nfts/[tokenId]/useNftDrawerTabs.tsx @@ -68,7 +68,6 @@ export function useNFTDrawerTabs({ const hasERC1155ClaimConditions = (() => { return [ // reads - ERC1155Ext.isGetClaimConditionByIdSupported(functionSelectors), ERC1155Ext.isGetClaimConditionsSupported(functionSelectors), ERC1155Ext.isGetActiveClaimConditionSupported(functionSelectors), // writes @@ -77,6 +76,10 @@ export function useNFTDrawerTabs({ ].every(Boolean); })(); + const isERC1155Multiphase = (() => { + return ERC1155Ext.isGetClaimConditionByIdSupported(functionSelectors); + })(); + const isBurnable = (() => { if (isERC721) { return ERC721Ext.isBurnSupported(functionSelectors); @@ -130,6 +133,7 @@ export function useNFTDrawerTabs({ tokenId={tokenId} isColumn twAccount={twAccount} + isMultiphase={isERC1155Multiphase} /> ), }, diff --git a/packages/thirdweb/scripts/generate/abis/erc1155/IDropSinglePhase1155.json b/packages/thirdweb/scripts/generate/abis/erc1155/IDropSinglePhase1155.json index e270d08a278..f94b8d81fe0 100644 --- a/packages/thirdweb/scripts/generate/abis/erc1155/IDropSinglePhase1155.json +++ b/packages/thirdweb/scripts/generate/abis/erc1155/IDropSinglePhase1155.json @@ -1,7 +1,7 @@ [ "function claim(address receiver, uint256 tokenId, uint256 quantity, address currency, uint256 pricePerToken, (bytes32[] proof, uint256 quantityLimitPerWallet, uint256 pricePerToken, address currency) allowlistProof, bytes data) payable", "function setClaimConditions(uint256 tokenId, (uint256 startTimestamp, uint256 maxClaimableSupply, uint256 supplyClaimed, uint256 quantityLimitPerWallet, bytes32 merkleRoot, uint256 pricePerToken, address currency, string metadata) phase, bool resetClaimEligibility)", - "function claimCondition(uint256 tokenId) view returns ((uint256 startTimestamp, uint256 maxClaimableSupply, uint256 supplyClaimed, uint256 quantityLimitPerWallet, bytes32 merkleRoot, uint256 pricePerToken, address currency, string metadata) condition)", + "function claimCondition(uint256 tokenId) view returns (uint256 startTimestamp, uint256 maxClaimableSupply, uint256 supplyClaimed, uint256 quantityLimitPerWallet, bytes32 merkleRoot, uint256 pricePerToken, address currency, string metadata)", "event ClaimConditionUpdated(uint256 indexed tokenId, (uint256 startTimestamp, uint256 maxClaimableSupply, uint256 supplyClaimed, uint256 quantityLimitPerWallet, bytes32 merkleRoot, uint256 pricePerToken, address currency, string metadata) condition, bool resetEligibility)", "event TokensClaimed(address indexed claimer, address indexed receiver, uint256 indexed tokenId, uint256 quantityClaimed)" ] \ No newline at end of file diff --git a/packages/thirdweb/src/exports/extensions/erc1155.ts b/packages/thirdweb/src/exports/extensions/erc1155.ts index 865d502ae4e..7ba268de3c9 100644 --- a/packages/thirdweb/src/exports/extensions/erc1155.ts +++ b/packages/thirdweb/src/exports/extensions/erc1155.ts @@ -112,6 +112,7 @@ export { type CanClaimParams, type CanClaimResult, } from "../../extensions/erc1155/drops/read/canClaim.js"; +export { claimCondition } from "../../extensions/erc1155/__generated__/IDropSinglePhase1155/read/claimCondition.js"; // WRITE export { diff --git a/packages/thirdweb/src/extensions/erc1155/__generated__/IDropSinglePhase1155/read/claimCondition.ts b/packages/thirdweb/src/extensions/erc1155/__generated__/IDropSinglePhase1155/read/claimCondition.ts index 13826906051..04b44c4486c 100644 --- a/packages/thirdweb/src/extensions/erc1155/__generated__/IDropSinglePhase1155/read/claimCondition.ts +++ b/packages/thirdweb/src/extensions/erc1155/__generated__/IDropSinglePhase1155/read/claimCondition.ts @@ -22,42 +22,36 @@ const FN_INPUTS = [ ] as const; const FN_OUTPUTS = [ { - type: "tuple", - name: "condition", - components: [ - { - type: "uint256", - name: "startTimestamp", - }, - { - type: "uint256", - name: "maxClaimableSupply", - }, - { - type: "uint256", - name: "supplyClaimed", - }, - { - type: "uint256", - name: "quantityLimitPerWallet", - }, - { - type: "bytes32", - name: "merkleRoot", - }, - { - type: "uint256", - name: "pricePerToken", - }, - { - type: "address", - name: "currency", - }, - { - type: "string", - name: "metadata", - }, - ], + type: "uint256", + name: "startTimestamp", + }, + { + type: "uint256", + name: "maxClaimableSupply", + }, + { + type: "uint256", + name: "supplyClaimed", + }, + { + type: "uint256", + name: "quantityLimitPerWallet", + }, + { + type: "bytes32", + name: "merkleRoot", + }, + { + type: "uint256", + name: "pricePerToken", + }, + { + type: "address", + name: "currency", + }, + { + type: "string", + name: "metadata", }, ] as const; @@ -130,7 +124,7 @@ export function encodeClaimCondition(options: ClaimConditionParams) { * ``` */ export function decodeClaimConditionResult(result: Hex) { - return decodeAbiParameters(FN_OUTPUTS, result)[0]; + return decodeAbiParameters(FN_OUTPUTS, result); } /** diff --git a/packages/thirdweb/src/extensions/erc1155/customDrop1155.test.ts b/packages/thirdweb/src/extensions/erc1155/customDrop1155.test.ts index 4b7ce9c87bf..098ea7bfe8f 100644 --- a/packages/thirdweb/src/extensions/erc1155/customDrop1155.test.ts +++ b/packages/thirdweb/src/extensions/erc1155/customDrop1155.test.ts @@ -7,13 +7,16 @@ import { TEST_CLIENT } from "../../../test/src/test-clients.js"; import { TEST_ACCOUNT_B, TEST_ACCOUNT_C, + TEST_ACCOUNT_D, } from "../../../test/src/test-wallets.js"; import { type ThirdwebContract, getContract } from "../../contract/contract.js"; import { sendAndConfirmTransaction } from "../../transaction/actions/send-and-confirm-transaction.js"; import { deployContractfromDeployMetadata } from "../prebuilts/deploy-published.js"; import { balanceOf } from "./__generated__/IERC1155/read/balanceOf.js"; import { nextTokenIdToMint } from "./__generated__/IERC1155Enumerable/read/nextTokenIdToMint.js"; +import { getClaimConditions } from "./drops/read/getClaimConditions.js"; import { claimTo } from "./drops/write/claimTo.js"; +import { resetClaimEligibility } from "./drops/write/resetClaimEligibility.js"; import { setClaimConditions } from "./drops/write/setClaimConditions.js"; import { getNFT } from "./read/getNFT.js"; import { lazyMint } from "./write/lazyMint.js"; @@ -92,6 +95,14 @@ describe.runIf(process.env.TW_SECRET_KEY)( }), account: TEST_ACCOUNT_C, }); + + const condition = await getClaimConditions({ + contract, + tokenId: 0n, + }); + expect(condition.length).to.eq(1); + expect(condition[0]?.maxClaimableSupply).to.eq(10n); + const claimTx = claimTo({ contract, to: TEST_ACCOUNT_C.address, @@ -166,5 +177,80 @@ describe.runIf(process.env.TW_SECRET_KEY)( chainId: ${contract.chain.id}] `); }); + + it("should reset claim eligibility", async () => { + await sendAndConfirmTransaction({ + transaction: setClaimConditions({ + contract, + phases: [ + { + startTime: new Date(0), + maxClaimableSupply: 10n, + maxClaimablePerWallet: 1n, + }, + ], + tokenId: 0n, + singlePhaseDrop: true, + }), + account: TEST_ACCOUNT_C, + }); + // claim one token + const claimTx = claimTo({ + contract, + to: TEST_ACCOUNT_D.address, + tokenId: 0n, + quantity: 1n, + singlePhaseDrop: true, + }); + await sendAndConfirmTransaction({ + transaction: claimTx, + account: TEST_ACCOUNT_D, + }); + await expect( + balanceOf({ contract, owner: TEST_ACCOUNT_D.address, tokenId: 0n }), + ).resolves.toBe(1n); + + // attempt to claim another token (this should fail) + await expect( + sendAndConfirmTransaction({ + transaction: claimTo({ + tokenId: 0n, + contract, + to: TEST_ACCOUNT_D.address, + quantity: 1n, + }), + account: TEST_ACCOUNT_D, + }), + ).rejects.toThrowErrorMatchingInlineSnapshot(` + [TransactionError: Error - !Qty + + contract: ${contract.address} + chainId: ${contract.chain.id}] + `); + + // reset claim eligibility + await sendAndConfirmTransaction({ + transaction: resetClaimEligibility({ + tokenId: 0n, + contract, + singlePhaseDrop: true, + }), + account: TEST_ACCOUNT_C, + }); + // attempt to claim another token (this should succeed) + await sendAndConfirmTransaction({ + transaction: claimTo({ + tokenId: 0n, + contract, + to: TEST_ACCOUNT_D.address, + quantity: 1n, + }), + account: TEST_ACCOUNT_D, + }); + // check that the account has claimed two tokens + await expect( + balanceOf({ tokenId: 0n, contract, owner: TEST_ACCOUNT_D.address }), + ).resolves.toBe(2n); + }); }, ); diff --git a/packages/thirdweb/src/extensions/erc1155/drops/read/getActiveClaimCondition.ts b/packages/thirdweb/src/extensions/erc1155/drops/read/getActiveClaimCondition.ts index 0becaef0032..cf27bc0addf 100644 --- a/packages/thirdweb/src/extensions/erc1155/drops/read/getActiveClaimCondition.ts +++ b/packages/thirdweb/src/extensions/erc1155/drops/read/getActiveClaimCondition.ts @@ -9,6 +9,10 @@ import { getClaimConditionById, isGetClaimConditionByIdSupported, } from "../../__generated__/IDrop1155/read/getClaimConditionById.js"; +import { + claimCondition, + isClaimConditionSupported, +} from "../../__generated__/IDropSinglePhase1155/read/claimCondition.js"; export type GetActiveClaimConditionParams = GetActiveClaimConditionIdParams; /** @@ -26,12 +30,43 @@ export type GetActiveClaimConditionParams = GetActiveClaimConditionIdParams; export async function getActiveClaimCondition( options: BaseTransactionOptions, ): Promise { - try { + const getActiveClaimConditionMultiPhase = async () => { const conditionId = await getActiveClaimConditionId(options); return getClaimConditionById({ ...options, conditionId }); - } catch { - throw new Error("Claim condition not found"); + }; + + const getActiveClaimConditionSinglePhase = async () => { + const [ + startTimestamp, + maxClaimableSupply, + supplyClaimed, + quantityLimitPerWallet, + merkleRoot, + pricePerToken, + currency, + metadata, + ] = await claimCondition({ ...options, tokenId: options.tokenId }); + return { + startTimestamp, + maxClaimableSupply, + supplyClaimed, + quantityLimitPerWallet, + merkleRoot, + pricePerToken, + currency, + metadata, + }; + }; + const results = await Promise.allSettled([ + getActiveClaimConditionMultiPhase(), + getActiveClaimConditionSinglePhase(), + ]); + + const condition = results.find((result) => result.status === "fulfilled"); + if (condition?.status === "fulfilled") { + return condition.value; } + throw new Error("Claim condition not found"); } /** @@ -49,9 +84,10 @@ export async function getActiveClaimCondition( export function isGetActiveClaimConditionSupported( availableSelectors: string[], ) { - // if multi phase is supported, return true return ( - isGetActiveClaimConditionIdSupported(availableSelectors) && - isGetClaimConditionByIdSupported(availableSelectors) + // check multi-phase + (isGetActiveClaimConditionIdSupported(availableSelectors) && + isGetClaimConditionByIdSupported(availableSelectors)) || + isClaimConditionSupported(availableSelectors) // check single phase ); } diff --git a/packages/thirdweb/src/extensions/erc1155/drops/read/getClaimConditions.ts b/packages/thirdweb/src/extensions/erc1155/drops/read/getClaimConditions.ts index 304781121a3..5dd54645ff4 100644 --- a/packages/thirdweb/src/extensions/erc1155/drops/read/getClaimConditions.ts +++ b/packages/thirdweb/src/extensions/erc1155/drops/read/getClaimConditions.ts @@ -2,6 +2,7 @@ import type { BaseTransactionOptions } from "../../../../transaction/types.js"; import type { ClaimCondition } from "../../../../utils/extensions/drops/types.js"; import * as MultiPhase from "../../__generated__/IDrop1155/read/claimCondition.js"; import * as MultiById from "../../__generated__/IDrop1155/read/getClaimConditionById.js"; +import * as SinglePhase from "../../__generated__/IDropSinglePhase1155/read/claimCondition.js"; export type GetClaimConditionsParams = { tokenId: bigint; @@ -21,24 +22,53 @@ export type GetClaimConditionsParams = { export async function getClaimConditions( options: BaseTransactionOptions, ): Promise { - try { - const [startId, count] = await MultiPhase.claimCondition(options); + const [multi, single] = await Promise.allSettled([ + (async () => { + const [startId, count] = await MultiPhase.claimCondition(options); - const conditionPromises: Array< - ReturnType - > = []; - for (let i = startId; i < startId + count; i++) { - conditionPromises.push( - MultiById.getClaimConditionById({ - ...options, - conditionId: i, - }), - ); - } - return Promise.all(conditionPromises); - } catch { - throw new Error("Claim condition not found"); + const conditionPromises: Array< + ReturnType + > = []; + for (let i = startId; i < startId + count; i++) { + conditionPromises.push( + MultiById.getClaimConditionById({ + ...options, + conditionId: i, + }), + ); + } + return Promise.all(conditionPromises); + })(), + SinglePhase.claimCondition(options).then( + ([ + startTimestamp, + maxClaimableSupply, + supplyClaimed, + quantityLimitPerWallet, + merkleRoot, + pricePerToken, + currency, + metadata, + ]) => ({ + startTimestamp, + maxClaimableSupply, + supplyClaimed, + quantityLimitPerWallet, + merkleRoot, + pricePerToken, + currency, + metadata, + }), + ), + ]); + if (multi.status === "fulfilled") { + return multi.value; } + if (single.status === "fulfilled") { + return [single.value]; + } + + throw new Error("Claim condition not found"); } /** @@ -56,7 +86,8 @@ export async function getClaimConditions( export function isGetClaimConditionsSupported(availableSelectors: string[]) { // if multi phase is supported, return true return ( - MultiPhase.isClaimConditionSupported(availableSelectors) && - MultiById.isGetClaimConditionByIdSupported(availableSelectors) + (MultiPhase.isClaimConditionSupported(availableSelectors) && + MultiById.isGetClaimConditionByIdSupported(availableSelectors)) || + SinglePhase.isClaimConditionSupported(availableSelectors) ); } diff --git a/packages/thirdweb/src/extensions/erc1155/drops/write/resetClaimEligibility.ts b/packages/thirdweb/src/extensions/erc1155/drops/write/resetClaimEligibility.ts index 7e90efa161a..dc20a32dc85 100644 --- a/packages/thirdweb/src/extensions/erc1155/drops/write/resetClaimEligibility.ts +++ b/packages/thirdweb/src/extensions/erc1155/drops/write/resetClaimEligibility.ts @@ -3,8 +3,16 @@ import type { BaseTransactionOptions } from "../../../../transaction/types.js"; import type { ClaimCondition } from "../../../../utils/extensions/drops/types.js"; import { isSetClaimConditionsSupported, - setClaimConditions, + setClaimConditions as setClaimConditionsMultiPhase, } from "../../__generated__/IDrop1155/write/setClaimConditions.js"; +import { + claimCondition as claimConditionSinglePhase, + isClaimConditionSupported, +} from "../../__generated__/IDropSinglePhase1155/read/claimCondition.js"; +import { + isSetClaimConditionsSupported as isSetClaimConditionsSupportedGeneratedSinglePhase, + setClaimConditions as setClaimConditionsSinglePhase, +} from "../../__generated__/IDropSinglePhase1155/write/setClaimConditions.js"; import { type GetClaimConditionsParams, getClaimConditions, @@ -31,10 +39,49 @@ export type ResetClaimEligibilityParams = GetClaimConditionsParams; * ``` */ export function resetClaimEligibility( - options: BaseTransactionOptions, + options: BaseTransactionOptions & { + singlePhaseDrop?: boolean; + }, ) { + if (options.singlePhaseDrop) { + return setClaimConditionsSinglePhase({ + contract: options.contract, + asyncParams: async () => { + // get existing condition + const existingCondition = await claimConditionSinglePhase(options).then( + ([ + startTimestamp, + maxClaimableSupply, + supplyClaimed, + quantityLimitPerWallet, + merkleRoot, + pricePerToken, + currency, + metadata, + ]) => ({ + startTimestamp, + maxClaimableSupply, + supplyClaimed, + quantityLimitPerWallet, + merkleRoot, + pricePerToken, + currency, + metadata, + }), + ); + + // then simply return the exact same ones, but with the resetClaimEligibility flag set to true + return { + tokenId: options.tokenId, + // type is necessary because of viem hex shenanigans (strict vs non-strict `0x` prefix string) + phase: existingCondition, + resetClaimEligibility: true, + }; + }, + }); + } // download existing conditions - return setClaimConditions({ + return setClaimConditionsMultiPhase({ contract: options.contract, asyncParams: async () => { // get existing conditions @@ -70,7 +117,9 @@ export function resetClaimEligibility( */ export function isResetClaimEligibilitySupported(availableSelectors: string[]) { return ( - isGetClaimConditionsSupported(availableSelectors) && - isSetClaimConditionsSupported(availableSelectors) + (isGetClaimConditionsSupported(availableSelectors) && + isSetClaimConditionsSupported(availableSelectors)) || + isClaimConditionSupported(availableSelectors) || + isSetClaimConditionsSupportedGeneratedSinglePhase(availableSelectors) ); } diff --git a/packages/thirdweb/src/utils/extensions/drops/get-claim-params.ts b/packages/thirdweb/src/utils/extensions/drops/get-claim-params.ts index a3b24a03278..9b818b74ef7 100644 --- a/packages/thirdweb/src/utils/extensions/drops/get-claim-params.ts +++ b/packages/thirdweb/src/utils/extensions/drops/get-claim-params.ts @@ -50,15 +50,6 @@ export async function getClaimParams(options: GetClaimParamsOptions) { const cc: ClaimCondition = await (async () => { if (options.type === "erc1155") { // lazy-load the getActiveClaimCondition function - if (options.singlePhaseDrop) { - const { claimCondition } = await import( - "../../../extensions/erc1155/__generated__/IDropSinglePhase1155/read/claimCondition.js" - ); - return await claimCondition({ - contract: options.contract, - tokenId: options.tokenId, - }); - } const { getActiveClaimCondition } = await import( "../../../extensions/erc1155/drops/read/getActiveClaimCondition.js" );