From e32dede85ce9e0eb48a5559ccb7c1599060b0e2a Mon Sep 17 00:00:00 2001 From: Joaquim Verges Date: Mon, 14 Apr 2025 10:03:28 +1200 Subject: [PATCH] [Smart Wallet] Add retry logic to predictAccountAddress --- .changeset/slow-mice-grin.md | 5 +++ .../extensions/erc1155/customDrop1155.test.ts | 1 + .../thirdweb/src/wallets/smart/lib/calls.ts | 34 ++++++++++++++++--- 3 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 .changeset/slow-mice-grin.md diff --git a/.changeset/slow-mice-grin.md b/.changeset/slow-mice-grin.md new file mode 100644 index 00000000000..29dd407b5a1 --- /dev/null +++ b/.changeset/slow-mice-grin.md @@ -0,0 +1,5 @@ +--- +"thirdweb": patch +--- + +Add retry logic to predictAccountAddress diff --git a/packages/thirdweb/src/extensions/erc1155/customDrop1155.test.ts b/packages/thirdweb/src/extensions/erc1155/customDrop1155.test.ts index 098ea7bfe8f..939e5a11581 100644 --- a/packages/thirdweb/src/extensions/erc1155/customDrop1155.test.ts +++ b/packages/thirdweb/src/extensions/erc1155/customDrop1155.test.ts @@ -99,6 +99,7 @@ describe.runIf(process.env.TW_SECRET_KEY)( const condition = await getClaimConditions({ contract, tokenId: 0n, + singlePhaseDrop: true, }); expect(condition.length).to.eq(1); expect(condition[0]?.maxClaimableSupply).to.eq(10n); diff --git a/packages/thirdweb/src/wallets/smart/lib/calls.ts b/packages/thirdweb/src/wallets/smart/lib/calls.ts index b8730bd33cd..617818cd424 100644 --- a/packages/thirdweb/src/wallets/smart/lib/calls.ts +++ b/packages/thirdweb/src/wallets/smart/lib/calls.ts @@ -97,11 +97,35 @@ export async function predictAddress(args: { accountSalt && isHex(accountSalt) ? accountSalt : stringToHex(accountSalt ?? ""); - return readContract({ - contract: factoryContract, - method: "function getAddress(address, bytes) returns (address)", - params: [adminAddress, saltHex], - }); + let result: string | undefined; + let retries = 0; + const maxRetries = 3; + + while (retries <= maxRetries) { + try { + result = await readContract({ + contract: factoryContract, + method: "function getAddress(address, bytes) returns (address)", + params: [adminAddress, saltHex], + }); + break; + } catch (error) { + if (retries === maxRetries) { + throw error; + } + + // Exponential backoff: 2^(retries + 1) * 100ms (200ms, 400ms, 800ms) + const delay = 2 ** (retries + 1) * 100; + await new Promise((resolve) => setTimeout(resolve, delay)); + retries++; + } + } + if (!result) { + throw new Error( + `No smart account address found for admin address ${adminAddress} and salt ${accountSalt}`, + ); + } + return result; }, { cacheKey: `${args.factoryContract.chain.id}-${args.factoryContract.address}-${args.adminAddress}-${args.accountSalt}`,