diff --git a/.changeset/fair-bikes-attend.md b/.changeset/fair-bikes-attend.md new file mode 100644 index 00000000000..5cab9cdaa3b --- /dev/null +++ b/.changeset/fair-bikes-attend.md @@ -0,0 +1,5 @@ +--- +"@thirdweb-dev/sdk": patch +--- + +Improve performance for prebuilt implementations" diff --git a/packages/sdk/src/evm/contracts/prebuilt-implementations/marketplace.ts b/packages/sdk/src/evm/contracts/prebuilt-implementations/marketplace.ts index 0b9c2bb8d04..8f1a4fa2af5 100644 --- a/packages/sdk/src/evm/contracts/prebuilt-implementations/marketplace.ts +++ b/packages/sdk/src/evm/contracts/prebuilt-implementations/marketplace.ts @@ -348,8 +348,8 @@ export class Marketplace implements UpdateableNetwork { ); // derive the offers from the events return await Promise.all( - listingEvents.map(async (e): Promise => { - return await mapOffer( + listingEvents.map((e): Promise => { + return mapOffer( this.contractWrapper.getProvider(), BigNumber.from(listingId), { diff --git a/packages/sdk/src/evm/contracts/prebuilt-implementations/multiwrap.ts b/packages/sdk/src/evm/contracts/prebuilt-implementations/multiwrap.ts index c571e29980b..5a3188332dd 100644 --- a/packages/sdk/src/evm/contracts/prebuilt-implementations/multiwrap.ts +++ b/packages/sdk/src/evm/contracts/prebuilt-implementations/multiwrap.ts @@ -238,15 +238,15 @@ export class Multiwrap extends StandardErc721 { wrappedTokenMetadata: NFTMetadataOrUri, recipientAddress?: AddressOrEns, ): Promise>> => { - const uri = await uploadOrExtractURI(wrappedTokenMetadata, this.storage); - - const recipient = await resolveAddress( - recipientAddress - ? recipientAddress - : await this.contractWrapper.getSignerAddress(), - ); - - const tokens = await this.toTokenStructList(contents); + const [uri, tokens, recipient] = await Promise.all([ + uploadOrExtractURI(wrappedTokenMetadata, this.storage), + this.toTokenStructList(contents), + resolveAddress( + recipientAddress + ? recipientAddress + : await this.contractWrapper.getSignerAddress(), + ), + ]); return Transaction.fromContractWrapper({ contractWrapper: this.contractWrapper, diff --git a/packages/sdk/src/evm/contracts/prebuilt-implementations/pack.ts b/packages/sdk/src/evm/contracts/prebuilt-implementations/pack.ts index 1301ea6b175..f3107c848ce 100644 --- a/packages/sdk/src/evm/contracts/prebuilt-implementations/pack.ts +++ b/packages/sdk/src/evm/contracts/prebuilt-implementations/pack.ts @@ -436,10 +436,10 @@ export class Pack extends StandardErc1155 { */ addPackContents = /* @__PURE__ */ buildTransactionFunction( async (packId: BigNumberish, packContents: PackRewards) => { - const signerAddress = await this.contractWrapper.getSignerAddress(); - const parsedContents = await PackRewardsOutputSchema.parseAsync( - packContents, - ); + const [signerAddress, parsedContents] = await Promise.all([ + this.contractWrapper.getSignerAddress(), + PackRewardsOutputSchema.parseAsync(packContents), + ]); const { contents, numOfRewardUnits } = await this.toPackContentArgs( parsedContents, ); @@ -521,14 +521,11 @@ export class Pack extends StandardErc1155 { to: AddressOrEns, metadataWithRewards: PackMetadataInput, ): Promise>> => { - const uri = await uploadOrExtractURI( - metadataWithRewards.packMetadata, - this.storage, - ); - - const parsedMetadata = await PackMetadataInputSchema.parseAsync( - metadataWithRewards, - ); + const [uri, parsedMetadata, toAddress] = await Promise.all([ + uploadOrExtractURI(metadataWithRewards.packMetadata, this.storage), + PackMetadataInputSchema.parseAsync(metadataWithRewards), + resolveAddress(to), + ]); const { erc20Rewards, erc721Rewards, erc1155Rewards } = parsedMetadata; const rewardsData: PackRewardsOutput = { erc20Rewards, @@ -548,7 +545,7 @@ export class Pack extends StandardErc1155 { uri, parsedMetadata.openStartTime, parsedMetadata.rewardsPerPack, - await resolveAddress(to), + toAddress, ], parse: (receipt) => { const event = this.contractWrapper.parseLogs( diff --git a/packages/sdk/src/evm/contracts/prebuilt-implementations/split.ts b/packages/sdk/src/evm/contracts/prebuilt-implementations/split.ts index 99a9121cb99..fa5e86e8492 100644 --- a/packages/sdk/src/evm/contracts/prebuilt-implementations/split.ts +++ b/packages/sdk/src/evm/contracts/prebuilt-implementations/split.ts @@ -179,9 +179,11 @@ export class Split implements UpdateableNetwork { * @returns A map of recipient addresses to their balances in the specified currency. */ public async balanceOfTokenAllRecipients(tokenAddress: AddressOrEns) { - const resolvedToken = await resolveAddress(tokenAddress); + const [resolvedToken, recipients] = await Promise.all([ + resolveAddress(tokenAddress), + this.getAllRecipients(), + ]); - const recipients = await this.getAllRecipients(); const balances: { [key: string]: CurrencyValue } = {}; for (const recipient of recipients) { balances[recipient.address] = await this.balanceOfToken( @@ -206,14 +208,11 @@ export class Split implements UpdateableNetwork { * ``` */ public async balanceOf(address: AddressOrEns): Promise { - const resolvedAddress = await resolveAddress(address); - const walletBalance = await this.contractWrapper - .getProvider() - .getBalance(this.getAddress()); - const totalReleased = await this.contractWrapper.read( - "totalReleased" as "totalReleased()", - [], - ); + const [resolvedAddress, walletBalance, totalReleased] = await Promise.all([ + resolveAddress(address), + this.contractWrapper.getProvider().getBalance(this.getAddress()), + this.contractWrapper.read("totalReleased" as "totalReleased()", []), + ]); const totalReceived = walletBalance.add(totalReleased); return this._pendingPayment( @@ -244,27 +243,30 @@ export class Split implements UpdateableNetwork { walletAddress: AddressOrEns, tokenAddress: AddressOrEns, ): Promise { - const resolvedToken = await resolveAddress(tokenAddress); - const resolvedWallet = await resolveAddress(walletAddress); - + const [resolvedToken, resolvedWallet] = await Promise.all([ + resolveAddress(tokenAddress), + resolveAddress(walletAddress), + ]); const erc20 = new Contract( resolvedToken, ERC20Abi, this.contractWrapper.getProvider(), ) as IERC20; - const walletBalance = await erc20.balanceOf(this.getAddress()); - const totalReleased = await this.contractWrapper.read( - "totalReleased" as "totalReleased(address)", - [resolvedToken], - ); + const [walletBalance, totalReleased, alreadyReleased] = await Promise.all([ + erc20.balanceOf(this.getAddress()), + this.contractWrapper.read("totalReleased" as "totalReleased(address)", [ + resolvedToken, + ]), + this.contractWrapper.read("released" as "released(address,address)", [ + resolvedToken, + resolvedWallet, + ]), + ]); const totalReceived = walletBalance.add(totalReleased); const value = await this._pendingPayment( resolvedWallet, totalReceived, - await this.contractWrapper.read( - "released" as "released(address,address)", - [resolvedToken, resolvedWallet], - ), + alreadyReleased, ); return await fetchCurrencyValue( this.contractWrapper.getProvider(), @@ -280,9 +282,8 @@ export class Split implements UpdateableNetwork { public async getRecipientSplitPercentage( address: AddressOrEns, ): Promise { - const resolvedAddress = await resolveAddress(address); - - const [totalShares, walletsShares] = await Promise.all([ + const [resolvedAddress, totalShares, walletsShares] = await Promise.all([ + resolveAddress(address), this.contractWrapper.read("totalShares", []), this.contractWrapper.read("shares", [address]), ]); @@ -333,10 +334,10 @@ export class Split implements UpdateableNetwork { return Transaction.fromContractWrapper({ contractWrapper: this.contractWrapper, method: "release(address,address)", - args: [ - await resolveAddress(tokenAddress), - await resolveAddress(walletAddress), - ], + args: await Promise.all([ + resolveAddress(tokenAddress), + resolveAddress(walletAddress), + ]), }); }, ); @@ -392,14 +393,14 @@ export class Split implements UpdateableNetwork { totalReceived: BigNumber, alreadyReleased: BigNumber, ): Promise { + const [resolvedAddress, totalShares] = await Promise.all([ + resolveAddress(address), + this.contractWrapper.read("totalShares", []), + ]); const addressReceived = totalReceived.mul( - await this.contractWrapper.read("shares", [ - await resolveAddress(address), - ]), - ); - const totalRoyaltyAvailable = addressReceived.div( - await this.contractWrapper.read("totalShares", []), + await this.contractWrapper.read("shares", [resolvedAddress]), ); + const totalRoyaltyAvailable = addressReceived.div(totalShares); return totalRoyaltyAvailable.sub(alreadyReleased); } diff --git a/packages/sdk/src/evm/contracts/prebuilt-implementations/vote.ts b/packages/sdk/src/evm/contracts/prebuilt-implementations/vote.ts index bda9203103a..2e23db42347 100644 --- a/packages/sdk/src/evm/contracts/prebuilt-implementations/vote.ts +++ b/packages/sdk/src/evm/contracts/prebuilt-implementations/vote.ts @@ -150,24 +150,33 @@ export class Vote implements UpdateableNetwork { * @returns - All the proposals in the contract. */ public async getAll(): Promise { - return Promise.all( - (await this.contractWrapper.read("getAllProposals", [])).map( - async (data) => ({ - proposalId: data.proposalId, - proposer: data.proposer, - description: data.description, - startBlock: data.startBlock, - endBlock: data.endBlock, - state: await this.contractWrapper.read("state", [data.proposalId]), - votes: await this.getProposalVotes(data.proposalId), - executions: data[3].map((c, i) => ({ - toAddress: data.targets[i], - nativeTokenValue: c, - transactionData: data.calldatas[i], - })), - }), + const _proposals = + (await this.contractWrapper.read("getAllProposals", [])) ?? []; + const _items = await Promise.all( + _proposals.map((item) => + Promise.all([ + this.contractWrapper.read("state", [item.proposalId]), + this.getProposalVotes(item.proposalId), + ]), ), ); + return _items.map(([state, votes], index) => { + const data = _proposals[index]; + return { + proposalId: data.proposalId, + proposer: data.proposer, + description: data.description, + startBlock: data.startBlock, + endBlock: data.endBlock, + state: state, + votes: votes, + executions: data[3].map((c, i) => ({ + toAddress: data.targets[i], + nativeTokenValue: c, + transactionData: data.calldatas[i], + })), + }; + }); } /**