diff --git a/.changeset/cyan-trainers-lie.md b/.changeset/cyan-trainers-lie.md new file mode 100644 index 00000000000..9089544e991 --- /dev/null +++ b/.changeset/cyan-trainers-lie.md @@ -0,0 +1,5 @@ +--- +"@thirdweb-dev/sdk": patch +--- + +Remove request waterfall from various methods diff --git a/packages/sdk/src/evm/contracts/prebuilt-implementations/multiwrap.ts b/packages/sdk/src/evm/contracts/prebuilt-implementations/multiwrap.ts index 5a3188332dd..0b2205c0401 100644 --- a/packages/sdk/src/evm/contracts/prebuilt-implementations/multiwrap.ts +++ b/packages/sdk/src/evm/contracts/prebuilt-implementations/multiwrap.ts @@ -238,14 +238,11 @@ export class Multiwrap extends StandardErc721 { wrappedTokenMetadata: NFTMetadataOrUri, recipientAddress?: AddressOrEns, ): Promise>> => { + const signerAddress = await this.contractWrapper.getSignerAddress(); const [uri, tokens, recipient] = await Promise.all([ uploadOrExtractURI(wrappedTokenMetadata, this.storage), this.toTokenStructList(contents), - resolveAddress( - recipientAddress - ? recipientAddress - : await this.contractWrapper.getSignerAddress(), - ), + resolveAddress(recipientAddress ? recipientAddress : signerAddress), ]); return Transaction.fromContractWrapper({ diff --git a/packages/sdk/src/evm/contracts/prebuilt-implementations/signature-drop.ts b/packages/sdk/src/evm/contracts/prebuilt-implementations/signature-drop.ts index db64841df41..49719eab377 100644 --- a/packages/sdk/src/evm/contracts/prebuilt-implementations/signature-drop.ts +++ b/packages/sdk/src/evm/contracts/prebuilt-implementations/signature-drop.ts @@ -268,7 +268,7 @@ export class SignatureDrop extends StandardErc721 { * ``` * * @param queryParams - optional filtering to only fetch a subset of results. - * @returns The NFT metadata and their ownersfor all NFTs queried. + * @returns The NFT metadata and their owners for all NFTs queried. */ public async getAllClaimed(queryParams?: QueryAllParams): Promise { const start = BigNumber.from(queryParams?.start || 0).toNumber(); diff --git a/packages/sdk/src/evm/core/classes/account-permissions.ts b/packages/sdk/src/evm/core/classes/account-permissions.ts index 819d621e42e..59b449f0f09 100644 --- a/packages/sdk/src/evm/core/classes/account-permissions.ts +++ b/packages/sdk/src/evm/core/classes/account-permissions.ts @@ -744,21 +744,27 @@ export class AccountPermissions implements DetectableFeature { return !item.makeAdmin; }) .map((item) => item.signer); - await Promise.all( - allSigners.map(async (item) => { - if (!allToMakeSigners.includes(item.signer)) { - const data = ( - await this.sendSignerPermissionRequest( + + const requests = await Promise.all( + allSigners.map((item) => + !allToMakeSigners.includes(item.signer) + ? this.sendSignerPermissionRequest( item.signer, DEFAULT_PERMISSIONS, AdminFlag.None, ) - ).encode(); - removeSignerData.push(data); - } - }), + : null, + ), ); + allSigners.map((item, index) => { + const request = requests[index]; + if (!allToMakeSigners.includes(item.signer) && request) { + const data = request.encode(); + removeSignerData.push(data); + } + }); + for (const member of resolvedSnapshot) { // Add new admin if (member.makeAdmin) { diff --git a/packages/sdk/src/evm/core/classes/contract-roles.ts b/packages/sdk/src/evm/core/classes/contract-roles.ts index 9a9880001de..8b6f88be486 100644 --- a/packages/sdk/src/evm/core/classes/contract-roles.ts +++ b/packages/sdk/src/evm/core/classes/contract-roles.ts @@ -210,21 +210,21 @@ export class ContractRoles * @internal */ public async verify(roles: TRole[], address: AddressOrEns): Promise { - await Promise.all( - roles.map(async (role) => { - const [members, resolvedAddress] = await Promise.all([ - this.get(role), - resolveAddress(address), - ]); - if ( - !members - .map((a) => a.toLowerCase()) - .includes(resolvedAddress.toLowerCase()) - ) { - throw new MissingRoleError(resolvedAddress, role); - } - }), - ); + const [resolvedAddress, fetchedRoles]: [string, string[][]] = + await Promise.all([ + resolveAddress(address), + Promise.all(roles.map((role) => this.get(role))), + ]); + roles.map(async (role, index) => { + const members = fetchedRoles[index]; + if ( + !members + .map((a) => a.toLowerCase()) + .includes(resolvedAddress.toLowerCase()) + ) { + throw new MissingRoleError(resolvedAddress, role); + } + }); } /** ************************** diff --git a/packages/sdk/src/evm/core/classes/erc-721-tiered-drop.ts b/packages/sdk/src/evm/core/classes/erc-721-tiered-drop.ts index 62822e22869..39f57020ed1 100644 --- a/packages/sdk/src/evm/core/classes/erc-721-tiered-drop.ts +++ b/packages/sdk/src/evm/core/classes/erc-721-tiered-drop.ts @@ -291,18 +291,20 @@ export class Erc721TieredDrop implements DetectableFeature { public async generateBatch( payloadsToSign: TieredDropPayloadInput[], ): Promise { + const signer = this.contractWrapper.getSigner(); + invariant(signer, "No signer available"); const parsedPayloads = await Promise.all( payloadsToSign.map((payload) => TieredDropPayloadSchema.parseAsync(payload), ), ); const chainId = await this.contractWrapper.getChainID(); - const signer = this.contractWrapper.getSigner(); - invariant(signer, "No signer available"); - - return await Promise.all( - parsedPayloads.map(async (payload) => { - const signature = await this.contractWrapper.signTypedData( + const contractStructs = await Promise.all( + parsedPayloads.map((payload) => this.mapPayloadToContractStruct(payload)), + ); + const signatures = await Promise.all( + contractStructs.map((message) => + this.contractWrapper.signTypedData( signer, { name: "SignatureAction", @@ -311,12 +313,14 @@ export class Erc721TieredDrop implements DetectableFeature { verifyingContract: this.contractWrapper.address, }, { GenericRequest: GenericRequest }, - await this.mapPayloadToContractStruct(payload), - ); - - return { payload, signature: signature.toString() }; - }), + message, + ), + ), ); + return parsedPayloads.map((payload, index) => { + const signature = signatures[index]; + return { payload, signature: signature.toString() }; + }); } public async verify( diff --git a/packages/sdk/src/evm/core/classes/erc-721-with-quantity-signature-mintable.ts b/packages/sdk/src/evm/core/classes/erc-721-with-quantity-signature-mintable.ts index b9158d6b3ca..fa1e27aa597 100644 --- a/packages/sdk/src/evm/core/classes/erc-721-with-quantity-signature-mintable.ts +++ b/packages/sdk/src/evm/core/classes/erc-721-with-quantity-signature-mintable.ts @@ -313,7 +313,7 @@ export class Erc721WithQuantitySignatureMintable implements DetectableFeature { } /** - * Genrate a batch of signatures that can be used to mint many dynamic NFTs. + * Generate a batch of signatures that can be used to mint many dynamic NFTs. * * @remarks See {@link Erc721WithQuantitySignatureMintable.generate} * @@ -324,59 +324,58 @@ export class Erc721WithQuantitySignatureMintable implements DetectableFeature { public async generateBatch( payloadsToSign: PayloadToSign721withQuantity[], ): Promise { - const isLegacyNFTContract = await this.isLegacyNFTContract(); - - const parsedRequests = await Promise.all( - payloadsToSign.map((m) => Signature721WithQuantityInput.parseAsync(m)), - ); + const [isLegacyNFTContract, parsedRequests, chainId] = await Promise.all([ + this.isLegacyNFTContract(), + Promise.all( + payloadsToSign.map((m) => Signature721WithQuantityInput.parseAsync(m)), + ), + this.contractWrapper.getChainID(), + ]); const metadatas = parsedRequests.map((r) => r.metadata); const uris = await uploadOrExtractURIs(metadatas, this.storage); - const chainId = await this.contractWrapper.getChainID(); const signer = this.contractWrapper.getSigner(); invariant(signer, "No signer available"); - return await Promise.all( - parsedRequests.map(async (m, i) => { - const uri = uris[i]; - const finalPayload = await Signature721WithQuantityOutput.parseAsync({ + const finalPayloads = await Promise.all( + parsedRequests.map((m, index) => + Signature721WithQuantityOutput.parseAsync({ ...m, - uri, - }); - let signature; - - if (isLegacyNFTContract) { - signature = await this.contractWrapper.signTypedData( - signer, - { - name: "TokenERC721", - version: "1", - chainId, - verifyingContract: this.contractWrapper.address, - }, - { MintRequest: MintRequest721 }, - await this.mapLegacyPayloadToContractStruct(finalPayload), - ); - } else { - signature = await this.contractWrapper.signTypedData( - signer, - { - name: "SignatureMintERC721", - version: "1", - chainId, - verifyingContract: await this.contractWrapper.address, - }, - { MintRequest: MintRequest721withQuantity }, // TYPEHASH - await this.mapPayloadToContractStruct(finalPayload), - ); - } - return { - payload: finalPayload, - signature: signature.toString(), - }; - }), + uri: uris[index], + }), + ), + ); + const contractStructs = await Promise.all( + finalPayloads.map((finalPayload) => + isLegacyNFTContract + ? this.mapLegacyPayloadToContractStruct(finalPayload) + : this.mapPayloadToContractStruct(finalPayload), + ), + ); + const signatures = await Promise.all( + contractStructs.map((struct) => + this.contractWrapper.signTypedData( + signer, + { + name: isLegacyNFTContract ? "TokenERC721" : "SignatureMintERC721", + version: "1", + chainId, + verifyingContract: this.contractWrapper.address, + }, + { + MintRequest: isLegacyNFTContract + ? MintRequest721 + : MintRequest721withQuantity, + }, + struct, + ), + ), ); + return signatures.map((signature, index) => ({ + payload: finalPayloads[index], + signature: signature.toString(), + })); } /** ****************************** diff --git a/packages/sdk/src/evm/core/classes/multichain-registry.ts b/packages/sdk/src/evm/core/classes/multichain-registry.ts index 152252cb4f8..5de6f08e248 100644 --- a/packages/sdk/src/evm/core/classes/multichain-registry.ts +++ b/packages/sdk/src/evm/core/classes/multichain-registry.ts @@ -149,12 +149,14 @@ export class MultichainRegistry { ): Promise> => { const deployerAddress = await this.registryRouter.getSignerAddress(); const contractEncoder = new ContractEncoder(this.registryLogic); - + const contractAddresses = await Promise.all( + contracts.map((item) => resolveAddress(item.address)), + ); const encoded: string[] = await Promise.all( - contracts.map(async (contract) => + contracts.map(async (contract, index) => contractEncoder.encode("remove", [ deployerAddress, - await resolveAddress(contract.address), + contractAddresses[index], contract.chainId, ]), ), diff --git a/packages/sdk/src/evm/core/sdk.ts b/packages/sdk/src/evm/core/sdk.ts index 24ab93a978b..e7bfb3f3822 100644 --- a/packages/sdk/src/evm/core/sdk.ts +++ b/packages/sdk/src/evm/core/sdk.ts @@ -2338,25 +2338,26 @@ export class ContractDeployer extends RPCConnectionHandler { }); }); } - - transactions = ( - await Promise.all( - transactions.map(async (tx) => { - const addresses = ( - await Promise.all( - tx.addresses.map(async (address) => { - const isDeployed = await isContractDeployed( - address, - provider, - ); - return isDeployed ? null : address; - }), - ) - ).filter(Boolean); - return addresses.length > 0 ? tx : null; - }), - ) - ).filter(Boolean) as DeploymentTransaction[]; + const isDeployedArr = await Promise.all( + transactions.map((tx) => + Promise.all( + tx.addresses.map((address) => + isContractDeployed(address, provider), + ), + ), + ), + ); + transactions = transactions + .map((tx, index) => { + const addresses = tx.addresses + .map((address, txIndex) => { + const isDeployed = isDeployedArr[index][txIndex]; + return isDeployed ? null : address; + }) + .filter(Boolean); + return addresses.length > 0 ? tx : null; + }) + .filter(Boolean) as DeploymentTransaction[]; transactions.push({ contractType: "proxy",