From cb6fec825a2d967c0da8dfac4796d8f22180507c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20S=C3=A1ez?= Date: Mon, 15 May 2023 13:52:16 -0400 Subject: [PATCH] Use provider for expected edition address (#224) * Use provider for expected edition address * retry logic * 5 attempts --- .changeset/shiny-bears-brush.md | 5 +++++ packages/sdk/src/client/edition/create.ts | 21 ++++++++++++------- packages/sdk/src/client/instance.ts | 17 +++++++++++++++ packages/sdk/src/utils/helpers.ts | 25 +++++++++++++++++++++++ 4 files changed, 61 insertions(+), 7 deletions(-) create mode 100644 .changeset/shiny-bears-brush.md diff --git a/.changeset/shiny-bears-brush.md b/.changeset/shiny-bears-brush.md new file mode 100644 index 00000000..f87f2f83 --- /dev/null +++ b/.changeset/shiny-bears-brush.md @@ -0,0 +1,5 @@ +--- +'@soundxyz/sdk': patch +--- + +Use provider for expected edition address diff --git a/packages/sdk/src/client/edition/create.ts b/packages/sdk/src/client/edition/create.ts index 518c0f83..e504767d 100644 --- a/packages/sdk/src/client/edition/create.ts +++ b/packages/sdk/src/client/edition/create.ts @@ -17,7 +17,7 @@ import { } from '../../errors' import { ContractCall, EditionConfig, MintConfig } from '../../types' import { editionInitFlags, MINTER_ROLE, NULL_ADDRESS, NULL_BYTES32, UINT32_MAX } from '../../utils/constants' -import { getSaltAsBytes32, validateAddress } from '../../utils/helpers' +import { getSaltAsBytes32, retry, validateAddress } from '../../utils/helpers' import { SoundClientInstance } from '../instance' export async function createEdition( @@ -51,7 +51,10 @@ export async function createEdition( validateMintConfigs(mintConfigs) - const { signer, userAddress } = await this.expectSigner() + const [{ signer, userAddress }, { providerOrSigner }] = await Promise.all([ + this.expectSigner(), + this.expectProviderOrSigner(), + ]) const txnOverrides: Overrides = { gasLimit, @@ -62,9 +65,13 @@ export async function createEdition( const formattedSalt = getSaltAsBytes32(customSalt || Math.random() * 1_000_000_000_000_000) // Precompute the edition address. - const [editionAddress, _] = await SoundCreatorV1__factory.connect(creatorAddress, signer).soundEditionAddress( - userAddress, - formattedSalt, + const [editionAddress, _] = await retry( + () => + SoundCreatorV1__factory.connect(creatorAddress, providerOrSigner).soundEditionAddress(userAddress, formattedSalt), + { + attempts: 5, + delay: 500, + }, ) const editionInterface = SoundEditionV1_2__factory.createInterface() @@ -267,11 +274,11 @@ export async function expectedEditionAddress( type: 'CREATOR_ADDRESS', address: creatorAddress, }) - const { signerOrProvider } = await this.expectSignerOrProvider() + const { providerOrSigner } = await this.expectProviderOrSigner() const { addr: editionAddress, exists } = await SoundCreatorV1__factory.connect( creatorAddress, - signerOrProvider, + providerOrSigner, ).soundEditionAddress(deployer, getSaltAsBytes32(salt)) return { diff --git a/packages/sdk/src/client/instance.ts b/packages/sdk/src/client/instance.ts index e07d05ac..050375ca 100644 --- a/packages/sdk/src/client/instance.ts +++ b/packages/sdk/src/client/instance.ts @@ -110,6 +110,22 @@ export function SoundClientInstance({ throw new MissingSignerOrProviderError() } + async function expectProviderOrSigner(): Promise<{ providerOrSigner: SignerOrProvider }> { + if (instance.provider) { + const provider = await getLazyOption(instance.provider) + return { providerOrSigner: provider } + } + if (instance.signer) { + const signer = await getLazyOption(instance.signer) + + if (signer.provider) return { providerOrSigner: signer.provider } + + return { providerOrSigner: signer } + } + + throw new MissingSignerOrProviderError() + } + function expectSoundAPI() { const soundAPI = instance.soundAPI if (!soundAPI) throw new MissingSoundAPI() @@ -123,6 +139,7 @@ export function SoundClientInstance({ expectSigner, expectProvider, expectSignerOrProvider, + expectProviderOrSigner, expectSoundAPI, getNetworkChainId, } diff --git a/packages/sdk/src/utils/helpers.ts b/packages/sdk/src/utils/helpers.ts index 22b1978e..5fdefce4 100644 --- a/packages/sdk/src/utils/helpers.ts +++ b/packages/sdk/src/utils/helpers.ts @@ -63,3 +63,28 @@ export function curry any>(fn: T): Curry { export function exhaustiveGuard(_value: never): never { throw new Error(`Exhaustive guard reached with value ${_value}`) } + +export async function retry( + fn: () => Promise, + { + attempts, + delay, + }: { + attempts: number + delay: number + }, +): Promise { + for (let i = 0; i < attempts; i++) { + try { + return await fn() + } catch (error) { + if (i < attempts - 1) { + await new Promise((resolve) => setTimeout(resolve, delay)) + } else { + throw error + } + } + } + + return fn() +}