diff --git a/packages/sdk/src/evm/common/any-evm-utils/computeDeploymentInfo.ts b/packages/sdk/src/evm/common/any-evm-utils/computeDeploymentInfo.ts index 7c43ef828fd..770fa7158c9 100644 --- a/packages/sdk/src/evm/common/any-evm-utils/computeDeploymentInfo.ts +++ b/packages/sdk/src/evm/common/any-evm-utils/computeDeploymentInfo.ts @@ -141,7 +141,7 @@ export async function encodeConstructorParamsForImplementation( return p.type; } }); - + const { chainId } = await provider.getNetwork(); const constructorParamValues = await Promise.all( constructorParams.map(async (p) => { if (constructorParamMap && constructorParamMap[p.name]) { @@ -200,7 +200,6 @@ export async function encodeConstructorParamsForImplementation( return deploymentInfo.transaction.predictedAddress; } else if (p.name && p.name.includes("royaltyEngineAddress")) { - const chainId = (await provider.getNetwork()).chainId; return getRoyaltyEngineV1ByChainId(chainId); } else if (p.name && p.name.includes("marketplaceV3Params")) { const chainId = (await provider.getNetwork()).chainId; diff --git a/packages/sdk/src/evm/common/any-evm-utils/deployCreate2Factory.ts b/packages/sdk/src/evm/common/any-evm-utils/deployCreate2Factory.ts index 81536b29826..d5c4328138a 100644 --- a/packages/sdk/src/evm/common/any-evm-utils/deployCreate2Factory.ts +++ b/packages/sdk/src/evm/common/any-evm-utils/deployCreate2Factory.ts @@ -27,9 +27,10 @@ export async function deployCreate2Factory( if (commonFactoryExists) { return COMMON_FACTORY; } - - const enforceEip155 = await isEIP155Enforced(signer.provider); - const networkId = (await signer.provider.getNetwork()).chainId; + const [enforceEip155, { chainId: networkId }] = await Promise.all([ + isEIP155Enforced(signer.provider), + signer.provider.getNetwork(), + ]); const chainId = enforceEip155 ? networkId : 0; console.debug(`ChainId ${networkId} enforces EIP155: ${enforceEip155}`); const deploymentInfo = CUSTOM_GAS_FOR_CHAIN[networkId] diff --git a/packages/sdk/src/evm/common/any-evm-utils/getCreate2FactoryAddress.ts b/packages/sdk/src/evm/common/any-evm-utils/getCreate2FactoryAddress.ts index e33b057afbd..8e8e808a102 100644 --- a/packages/sdk/src/evm/common/any-evm-utils/getCreate2FactoryAddress.ts +++ b/packages/sdk/src/evm/common/any-evm-utils/getCreate2FactoryAddress.ts @@ -23,9 +23,10 @@ export async function getCreate2FactoryAddress( if (commonFactoryExists) { return COMMON_FACTORY; } - - const enforceEip155 = await isEIP155Enforced(provider); - const networkId = (await provider.getNetwork()).chainId; + const [enforceEip155, { chainId: networkId }] = await Promise.all([ + isEIP155Enforced(provider), + provider.getNetwork(), + ]); const chainId = enforceEip155 ? networkId : 0; const deploymentInfo = CUSTOM_GAS_FOR_CHAIN[networkId] ? getCreate2FactoryDeploymentInfo(chainId, { diff --git a/packages/sdk/src/evm/common/any-evm-utils/getEncodedConstructorParamsForThirdwebContract.ts b/packages/sdk/src/evm/common/any-evm-utils/getEncodedConstructorParamsForThirdwebContract.ts index 6b1a8145c35..adc06eeeb4f 100644 --- a/packages/sdk/src/evm/common/any-evm-utils/getEncodedConstructorParamsForThirdwebContract.ts +++ b/packages/sdk/src/evm/common/any-evm-utils/getEncodedConstructorParamsForThirdwebContract.ts @@ -41,15 +41,12 @@ export async function getEncodedConstructorParamsForThirdwebContract( secretKey, ); const publishUri = publishedContract.metadataUri; - const metadata = await fetchAndCacheDeployMetadata(publishUri, storage); - const create2Factory = await getCreate2FactoryAddress(provider); + const [metadata, create2Factory, { extendedMetadata }] = await Promise.all([ + fetchAndCacheDeployMetadata(publishUri, storage), + getCreate2FactoryAddress(provider), + fetchAndCacheDeployMetadata(publishUri, storage), + ]); invariant(create2Factory, "Thirdweb stack not found"); - - const { extendedMetadata } = await fetchAndCacheDeployMetadata( - publishUri, - storage, - ); - let encodedArgs; // if pluginMetadata is not empty, then it's a plugin-pattern router contract diff --git a/packages/sdk/src/evm/common/any-evm-utils/predictThirdwebContractAddress.ts b/packages/sdk/src/evm/common/any-evm-utils/predictThirdwebContractAddress.ts index 43ba6266154..d7366410cd2 100644 --- a/packages/sdk/src/evm/common/any-evm-utils/predictThirdwebContractAddress.ts +++ b/packages/sdk/src/evm/common/any-evm-utils/predictThirdwebContractAddress.ts @@ -38,14 +38,11 @@ export async function predictThirdwebContractAddress( secretKey, ); const publishUri = publishedContract.metadataUri; - const create2Factory = await getCreate2FactoryAddress(provider); + const [create2Factory, { extendedMetadata }] = await Promise.all([ + getCreate2FactoryAddress(provider), + fetchAndCacheDeployMetadata(publishUri, storage), + ]); invariant(create2Factory, "Thirdweb stack not found"); - - const { extendedMetadata } = await fetchAndCacheDeployMetadata( - publishUri, - storage, - ); - if ( extendedMetadata?.routerType === "plugin" || extendedMetadata?.routerType === "dynamic" diff --git a/packages/sdk/src/evm/common/deploy.ts b/packages/sdk/src/evm/common/deploy.ts index 411a3c2b864..cffd98ec314 100644 --- a/packages/sdk/src/evm/common/deploy.ts +++ b/packages/sdk/src/evm/common/deploy.ts @@ -41,8 +41,10 @@ export async function getDeployArguments< signer: Signer, storage: ThirdwebStorage, ): Promise { - const chainId = await signer.getChainId(); - const signerAddress = await signer.getAddress(); + const [chainId, signerAddress] = await Promise.all([ + signer.getChainId(), + signer.getAddress(), + ]); const chainEnum = SUPPORTED_CHAIN_IDS.find((c) => c === chainId); let trustedForwarders: string[] = []; if (!chainEnum) { diff --git a/packages/sdk/src/evm/common/verification.ts b/packages/sdk/src/evm/common/verification.ts index 44efeff66ed..b8cfa2d43fb 100644 --- a/packages/sdk/src/evm/common/verification.ts +++ b/packages/sdk/src/evm/common/verification.ts @@ -64,23 +64,25 @@ export async function verifyThirdwebPrebuiltImplementation( secretKey?: string, constructorArgs?: ConstructorParamMap, ): Promise { - const contractAddress = await getThirdwebContractAddress( - contractName, - chainId, - storage, - contractVersion, - clientId, - secretKey, - ); - const encodedArgs = await getEncodedConstructorParamsForThirdwebContract( - contractName, - chainId, - storage, - contractVersion, - clientId, - secretKey, - constructorArgs, - ); + const [contractAddress, encodedArgs] = await Promise.all([ + getThirdwebContractAddress( + contractName, + chainId, + storage, + contractVersion, + clientId, + secretKey, + ), + getEncodedConstructorParamsForThirdwebContract( + contractName, + chainId, + storage, + contractVersion, + clientId, + secretKey, + constructorArgs, + ), + ]); console.info(`Verifying ${contractName} at address ${contractAddress}`); diff --git a/packages/sdk/src/evm/contracts/prebuilt-implementations/marketplace.ts b/packages/sdk/src/evm/contracts/prebuilt-implementations/marketplace.ts index a1612a2633b..08488b9643d 100644 --- a/packages/sdk/src/evm/contracts/prebuilt-implementations/marketplace.ts +++ b/packages/sdk/src/evm/contracts/prebuilt-implementations/marketplace.ts @@ -596,17 +596,12 @@ export class Marketplace implements UpdateableNetwork { private async getAllListingsNoFilter( filterInvalidListings: boolean, ): Promise<(AuctionListing | DirectListing)[]> { - const listings = await Promise.all( - Array.from( - Array( - (await this.contractWrapper.read("totalListings", [])).toNumber(), - ).keys(), - ).map(async (i) => { - let listing; - - try { - listing = await this.getListing(i); - } catch (err) { + const _totalListings = ( + await this.contractWrapper.read("totalListings", []) + ).toNumber(); + const _listings = await Promise.all( + Array.from(Array(_totalListings).keys()).map((i) => + this.getListing(i).catch((err) => { if (err instanceof ListingNotFoundError) { return undefined; } else { @@ -615,20 +610,29 @@ export class Marketplace implements UpdateableNetwork { ); return undefined; } - } - - if (listing.type === ListingType.Auction) { - return listing; - } - + }), + ), + ); + const _listingValidity = await Promise.all( + _listings.map((_listing) => { + if (!_listing || _listing === undefined) return { valid: false }; + if (_listing.type === ListingType.Auction) return { valid: false }; + if (filterInvalidListings) + return this.direct.isStillValidListing(_listing); + return { valid: false }; + }), + ); + const listings = await Promise.all( + _listings.map((_listing, index) => { + if (!_listing || _listing === undefined) return undefined; + if (_listing.type === ListingType.Auction) return _listing; if (filterInvalidListings) { - const { valid } = await this.direct.isStillValidListing(listing); + const { valid } = _listingValidity[index]; if (!valid) { return undefined; } } - - return listing; + return _listing; }), ); return listings.filter((l) => l !== undefined) as ( diff --git a/packages/sdk/src/evm/core/classes/account-permissions.ts b/packages/sdk/src/evm/core/classes/account-permissions.ts index 819d621e42e..8119ef6e5d8 100644 --- a/packages/sdk/src/evm/core/classes/account-permissions.ts +++ b/packages/sdk/src/evm/core/classes/account-permissions.ts @@ -434,18 +434,21 @@ export class AccountPermissions implements DetectableFeature { signerAddress: AddressOrEns, permissions: SignerPermissionsInput, ): Promise => { - const resolvedSignerAddress = await resolveAddress(signerAddress); - const resolvedPermissions = await SignerPermissionsSchema.parseAsync( - permissions, - ); - - if (await this.isAdmin(resolvedSignerAddress)) { + const [resolvedSignerAddress, resolvedPermissions] = await Promise.all([ + resolveAddress(signerAddress), + SignerPermissionsSchema.parseAsync(permissions), + ]); + const [isAdmin, isSigner] = await Promise.all([ + this.isAdmin(resolvedSignerAddress), + this.isSigner(resolvedSignerAddress), + ]); + if (isAdmin) { throw new Error( "Signer is already an admin. Cannot grant permissions to an existing admin.", ); } - if (await this.isSigner(resolvedSignerAddress)) { + if (isSigner) { throw new Error( "Signer already has permissions. Cannot grant permissions to an existing signer. You can update permissions using `updatePermissions`.", ); @@ -480,18 +483,23 @@ export class AccountPermissions implements DetectableFeature { signerAddress: AddressOrEns, permissions: SignerPermissionsInput, ): Promise => { - const resolvedSignerAddress = await resolveAddress(signerAddress); - const resolvedPermissions = await SignerPermissionsSchema.parseAsync( - permissions, - ); + const [resolvedSignerAddress, resolvedPermissions] = await Promise.all([ + resolveAddress(signerAddress), + SignerPermissionsSchema.parseAsync(permissions), + ]); + + const [isAdmin, isSigner] = await Promise.all([ + this.isAdmin(resolvedSignerAddress), + this.isSigner(resolvedSignerAddress), + ]); - if (await this.isAdmin(resolvedSignerAddress)) { + if (isAdmin) { throw new Error( "Signer is already an admin. Cannot update permissions of an existing admin.", ); } - if (!(await this.isSigner(resolvedSignerAddress))) { + if (!isSigner) { throw new Error( "Signer does not already have permissions. You can grant permissions using `grantPermissions`.", ); @@ -523,14 +531,17 @@ export class AccountPermissions implements DetectableFeature { revokeAccess = /* @__PURE__ */ buildTransactionFunction( async (signerAddress: AddressOrEns): Promise => { const resolvedSignerAddress = await resolveAddress(signerAddress); - - if (await this.isAdmin(resolvedSignerAddress)) { + const [isAdmin, isSigner] = await Promise.all([ + this.isAdmin(resolvedSignerAddress), + this.isSigner(resolvedSignerAddress), + ]); + if (isAdmin) { throw new Error( "Signer is already an admin. Cannot revoke permissions of an admin.", ); } - if (!(await this.isSigner(resolvedSignerAddress))) { + if (!isSigner) { throw new Error( "Signer does not already have permissions. You can grant permissions using `grantPermissions`.", ); @@ -570,16 +581,21 @@ export class AccountPermissions implements DetectableFeature { signerAddress: AddressOrEns, target: AddressOrEns, ): Promise => { - const resolvedSignerAddress = await resolveAddress(signerAddress); - const resolvedTarget = await resolveAddress(target); - - if (await this.isAdmin(resolvedSignerAddress)) { + const [resolvedSignerAddress, resolvedTarget] = await Promise.all([ + resolveAddress(signerAddress), + resolveAddress(target), + ]); + const [isAdmin, isSigner] = await Promise.all([ + this.isAdmin(resolvedSignerAddress), + this.isSigner(resolvedSignerAddress), + ]); + if (isAdmin) { throw new Error( "Signer is already an admin. Cannot approve targets for an admin.", ); } - if (!(await this.isSigner(resolvedSignerAddress))) { + if (!isSigner) { throw new Error( "Signer does not already have permissions. You can grant permissions using `grantPermissions`.", ); @@ -631,16 +647,21 @@ export class AccountPermissions implements DetectableFeature { signerAddress: AddressOrEns, target: AddressOrEns, ): Promise => { - const resolvedSignerAddress = await resolveAddress(signerAddress); - const resolvedTarget = await resolveAddress(target); - - if (await this.isAdmin(resolvedSignerAddress)) { + const [resolvedSignerAddress, resolvedTarget] = await Promise.all([ + resolveAddress(signerAddress), + resolveAddress(target), + ]); + const [isAdmin, isSigner] = await Promise.all([ + this.isAdmin(resolvedSignerAddress), + this.isSigner(resolvedSignerAddress), + ]); + if (isAdmin) { throw new Error( "Signer is already an admin. Cannot approve targets for an admin.", ); } - if (!(await this.isSigner(resolvedSignerAddress))) { + if (!isSigner) { throw new Error( "Signer does not already have permissions. You can grant permissions using `grantPermissions`.", ); @@ -719,8 +740,12 @@ export class AccountPermissions implements DetectableFeature { const addOrUpdateSignerData: string[] = []; const removeSignerData: string[] = []; + const [allAdmins, allSigners] = await Promise.all([ + this.getAllAdmins(), + this.getAllSigners(), + ]); + // Remove all existing admins not included in the passed snapshot. - const allAdmins = await this.getAllAdmins(); const allToMakeAdmin = resolvedSnapshot .filter((item) => item.makeAdmin) .map((item) => item.signer); @@ -738,7 +763,6 @@ export class AccountPermissions implements DetectableFeature { }); // Remove all existing signers not included in the passed snapshot. - const allSigners = await this.getAllSigners(); const allToMakeSigners = resolvedSnapshot .filter((item) => { return !item.makeAdmin; @@ -783,6 +807,19 @@ export class AccountPermissions implements DetectableFeature { } } + ( + await Promise.all( + resolvedSnapshot + .filter((member) => !member.makeAdmin) + .map((member) => + this.buildSignerPermissionRequest( + member.signer, + member.permissions, + ), + ), + ) + ).map((data) => addOrUpdateSignerData.push(data)); + const data: string[] = []; removeAdminData.forEach((item) => { data.push(item); diff --git a/packages/sdk/src/evm/core/classes/contract-publisher.ts b/packages/sdk/src/evm/core/classes/contract-publisher.ts index f171d73f75a..d8b7aacf44f 100644 --- a/packages/sdk/src/evm/core/classes/contract-publisher.ts +++ b/packages/sdk/src/evm/core/classes/contract-publisher.ts @@ -255,9 +255,10 @@ export class ContractPublisher extends RPCConnectionHandler { async (profileMetadata: ProfileMetadataInput) => { const signer = this.getSigner(); invariant(signer, "A signer is required"); - const publisher = await signer.getAddress(); - const profileUri = await this.storage.upload(profileMetadata); - + const [publisher, profileUri] = await Promise.all([ + signer.getAddress(), + this.storage.upload(profileMetadata), + ]); return Transaction.fromContractWrapper({ contractWrapper: this.publisher, method: "setPublisherProfileUri", @@ -382,13 +383,11 @@ export class ContractPublisher extends RPCConnectionHandler { ): Promise>> => { const signer = this.getSigner(); invariant(signer, "A signer is required"); - const publisher = await signer.getAddress(); - - const predeployMetadata = await fetchRawPredeployMetadata( - predeployUri, - this.storage, - ); - + const [publisher, predeployMetadata] = await Promise.all([ + signer.getAddress(), + fetchRawPredeployMetadata(predeployUri, this.storage), + ]); + const compilerMetadata = await fetchContractMetadata( predeployMetadata.metadataUri, this.storage, diff --git a/packages/sdk/src/evm/core/classes/erc-1155-batch-mintable.ts b/packages/sdk/src/evm/core/classes/erc-1155-batch-mintable.ts index 43d96c6d154..32f8f0c7ae2 100644 --- a/packages/sdk/src/evm/core/classes/erc-1155-batch-mintable.ts +++ b/packages/sdk/src/evm/core/classes/erc-1155-batch-mintable.ts @@ -83,8 +83,10 @@ export class Erc1155BatchMintable implements DetectableFeature { ): Promise[]>> => { const metadatas = metadataWithSupply.map((a) => a.metadata); const supplies = metadataWithSupply.map((a) => a.supply); - const uris = await uploadOrExtractURIs(metadatas, this.storage); - const resolvedAddress = await resolveAddress(to); + const [uris, resolvedAddress] = await Promise.all([ + uploadOrExtractURIs(metadatas, this.storage), + resolveAddress(to), + ]); const contractEncoder = new ContractEncoder(this.contractWrapper); const encoded = await Promise.all( uris.map(async (uri, index) => diff --git a/packages/sdk/src/evm/core/classes/erc-1155-mintable.ts b/packages/sdk/src/evm/core/classes/erc-1155-mintable.ts index a99b1fb86ea..b042abb58c3 100644 --- a/packages/sdk/src/evm/core/classes/erc-1155-mintable.ts +++ b/packages/sdk/src/evm/core/classes/erc-1155-mintable.ts @@ -115,19 +115,14 @@ export class Erc1155Mintable implements DetectableFeature { to: AddressOrEns, metadataWithSupply: EditionMetadataOrUri, ): Promise { - const uri = await uploadOrExtractURI( - metadataWithSupply.metadata, - this.storage, - ); + const [uri, toAddress] = await Promise.all([ + uploadOrExtractURI(metadataWithSupply.metadata, this.storage), + resolveAddress(to), + ]); return Transaction.fromContractWrapper({ contractWrapper: this.contractWrapper, method: "mintTo", - args: [ - await resolveAddress(to), - constants.MaxUint256, - uri, - metadataWithSupply.supply, - ], + args: [toAddress, constants.MaxUint256, uri, metadataWithSupply.supply], }); } @@ -154,16 +149,14 @@ export class Erc1155Mintable implements DetectableFeature { tokenId: BigNumberish, additionalSupply: BigNumberish, ): Promise>> => { - const metadata = await this.erc1155.getTokenMetadata(tokenId); + const [metadata, toAddress] = await Promise.all([ + this.erc1155.getTokenMetadata(tokenId), + resolveAddress(to), + ]); return Transaction.fromContractWrapper({ contractWrapper: this.contractWrapper, method: "mintTo", - args: [ - await resolveAddress(to), - tokenId, - metadata.uri, - additionalSupply, - ], + args: [toAddress, tokenId, metadata.uri, additionalSupply], parse: (receipt) => { return { id: BigNumber.from(tokenId), diff --git a/packages/sdk/src/evm/core/classes/erc-1155.ts b/packages/sdk/src/evm/core/classes/erc-1155.ts index d9069443d08..1ba612f9127 100644 --- a/packages/sdk/src/evm/core/classes/erc-1155.ts +++ b/packages/sdk/src/evm/core/classes/erc-1155.ts @@ -231,14 +231,15 @@ export class Erc1155< address: AddressOrEns, operator: AddressOrEns, ): Promise { + const args = await Promise.all([ + resolveAddress(address), + resolveAddress(operator), + ]); return await ( this.contractWrapper as ContractWrapper< BaseERC1155 | BaseSignatureMintERC1155 > - ).read("isApprovedForAll", [ - await resolveAddress(address), - await resolveAddress(operator), - ]); + ).read("isApprovedForAll", args); } /** @@ -263,11 +264,14 @@ export class Erc1155< amount: BigNumberish, data: BytesLike = [0], ) => { - const from = await this.contractWrapper.getSignerAddress(); + const [from, toAddress] = await Promise.all([ + this.contractWrapper.getSignerAddress(), + resolveAddress(to), + ]); return Transaction.fromContractWrapper({ contractWrapper: this.contractWrapper, method: "safeTransferFrom", - args: [from, await resolveAddress(to), tokenId, amount, data], + args: [from, toAddress, tokenId, amount, data], }); }, ); @@ -295,16 +299,14 @@ export class Erc1155< amount: BigNumberish, data: BytesLike = [0], ) => { + const [fromAddress, toAddress] = await Promise.all([ + resolveAddress(from), + resolveAddress(to), + ]); return Transaction.fromContractWrapper({ contractWrapper: this.contractWrapper, method: "safeTransferFrom", - args: [ - await resolveAddress(from), - await resolveAddress(to), - tokenId, - amount, - data, - ], + args: [fromAddress, toAddress, tokenId, amount, data], }); }, ); @@ -372,10 +374,10 @@ export class Erc1155< const from = fromAddress ? await resolveAddress(fromAddress) : await this.contractWrapper.getSignerAddress(); - - const balanceOf = await this.balanceOf(from, tokenId); - - const input = await AirdropInputSchema.parseAsync(addresses); + const [balanceOf, input] = await Promise.all([ + this.balanceOf(from, tokenId), + AirdropInputSchema.parseAsync(addresses), + ]); const totalToAirdrop = input.reduce((prev, curr) => { return BigNumber.from(prev).add(BigNumber.from(curr?.quantity || 1)); diff --git a/packages/sdk/src/evm/core/classes/multichain-registry.ts b/packages/sdk/src/evm/core/classes/multichain-registry.ts index 152252cb4f8..85cb70430e8 100644 --- a/packages/sdk/src/evm/core/classes/multichain-registry.ts +++ b/packages/sdk/src/evm/core/classes/multichain-registry.ts @@ -149,17 +149,17 @@ export class MultichainRegistry { ): Promise> => { const deployerAddress = await this.registryRouter.getSignerAddress(); const contractEncoder = new ContractEncoder(this.registryLogic); - - const encoded: string[] = await Promise.all( - contracts.map(async (contract) => - contractEncoder.encode("remove", [ - deployerAddress, - await resolveAddress(contract.address), - contract.chainId, - ]), - ), + const encoded: string[] = ( + await Promise.all( + contracts.map((contract) => resolveAddress(contract.address)), + ) + ).map((address, index) => + contractEncoder.encode("remove", [ + deployerAddress, + address, + contracts[index].chainId, + ]), ); - return Transaction.fromContractWrapper({ contractWrapper: this.registryRouter, method: "multicall",