From f7e815f5c8d9b042935f0acc77f2761bd4d2d741 Mon Sep 17 00:00:00 2001 From: Kien Ngo Date: Tue, 26 Sep 2023 22:08:38 -0400 Subject: [PATCH 1/3] Code --- .../core/classes/erc-721-batch-mintable.ts | 12 ++--- .../src/evm/core/classes/erc-721-mintable.ts | 7 ++- .../src/evm/core/classes/erc-721-supply.ts | 18 ++++---- ...rc-721-with-quantity-signature-mintable.ts | 46 +++++++++---------- packages/sdk/src/evm/core/classes/erc-721.ts | 13 ++++-- 5 files changed, 51 insertions(+), 45 deletions(-) diff --git a/packages/sdk/src/evm/core/classes/erc-721-batch-mintable.ts b/packages/sdk/src/evm/core/classes/erc-721-batch-mintable.ts index 44134219289..702d4913f49 100644 --- a/packages/sdk/src/evm/core/classes/erc-721-batch-mintable.ts +++ b/packages/sdk/src/evm/core/classes/erc-721-batch-mintable.ts @@ -73,13 +73,13 @@ export class Erc721BatchMintable implements DetectableFeature { to: AddressOrEns, metadatas: NFTMetadataOrUri[], ): Promise[]>> => { - 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) => - contractEncoder.encode("mintTo", [resolvedAddress, uri]), - ), + const encoded = uris.map((uri) => + contractEncoder.encode("mintTo", [resolvedAddress, uri]), ); return Transaction.fromContractWrapper({ diff --git a/packages/sdk/src/evm/core/classes/erc-721-mintable.ts b/packages/sdk/src/evm/core/classes/erc-721-mintable.ts index 6c5243c4bcd..ba9dba936bd 100644 --- a/packages/sdk/src/evm/core/classes/erc-721-mintable.ts +++ b/packages/sdk/src/evm/core/classes/erc-721-mintable.ts @@ -74,11 +74,14 @@ export class Erc721Mintable implements DetectableFeature { to: AddressOrEns, metadata: NFTMetadataOrUri, ): Promise>> => { - const uri = await uploadOrExtractURI(metadata, this.storage); + const [uri, toAddress] = await Promise.all([ + uploadOrExtractURI(metadata, this.storage), + resolveAddress(to), + ]); return Transaction.fromContractWrapper({ contractWrapper: this.contractWrapper, method: "mintTo", - args: [await resolveAddress(to), uri], + args: [toAddress, uri], parse: (receipt) => { const event = this.contractWrapper.parseLogs( "Transfer", diff --git a/packages/sdk/src/evm/core/classes/erc-721-supply.ts b/packages/sdk/src/evm/core/classes/erc-721-supply.ts index 884f0675c28..d75d3a22a04 100644 --- a/packages/sdk/src/evm/core/classes/erc-721-supply.ts +++ b/packages/sdk/src/evm/core/classes/erc-721-supply.ts @@ -103,16 +103,14 @@ export class Erc721Supply implements DetectableFeature { // TODO use multicall3 if available // TODO can't call toNumber() here, this can be a very large number - return ( - await Promise.all( - [...new Array(totalCount.toNumber()).keys()].map(async (i) => ({ - tokenId: i, - owner: await this.erc721 - .ownerOf(i) - .catch(() => constants.AddressZero), - })), - ) - ).filter((o) => o.owner !== constants.AddressZero); + const arr = [...new Array(totalCount.toNumber()).keys()]; + const owners = await Promise.all( + arr.map((i) => this.erc721.ownerOf(i).catch(() => constants.AddressZero)), + ); + return arr.map((i) => ({ + tokenId: i, + owner: owners[i], + })); } /** 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 561dc2393ba..b9158d6b3ca 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 @@ -147,30 +147,28 @@ export class Erc721WithQuantitySignatureMintable implements DetectableFeature { signedPayloads: SignedPayload721WithQuantitySignature[], ): Promise> => { const isLegacyNFTContract = await this.isLegacyNFTContract(); - - const contractPayloads = await Promise.all( - signedPayloads.map(async (s) => { - let message; - - if (isLegacyNFTContract) { - message = await this.mapLegacyPayloadToContractStruct(s.payload); - } else { - message = await this.mapPayloadToContractStruct(s.payload); - } - - const signature = s.signature; - const price = s.payload.price; - if (BigNumber.from(price).gt(0)) { - throw new Error( - "Can only batch free mints. For mints with a price, use regular mint()", - ); - } - return { - message, - signature, - }; - }), - ); + const contractPayloads = ( + await Promise.all( + signedPayloads.map((s) => + isLegacyNFTContract + ? this.mapLegacyPayloadToContractStruct(s.payload) + : this.mapPayloadToContractStruct(s.payload), + ), + ) + ).map((message, index) => { + const s = signedPayloads[index]; + const signature = s.signature; + const price = s.payload.price; + if (BigNumber.from(price).gt(0)) { + throw new Error( + "Can only batch free mints. For mints with a price, use regular mint()", + ); + } + return { + message, + signature, + }; + }); const contractEncoder = new ContractEncoder(this.contractWrapper); const encoded = contractPayloads.map((p) => { if (isLegacyNFTContract) { diff --git a/packages/sdk/src/evm/core/classes/erc-721.ts b/packages/sdk/src/evm/core/classes/erc-721.ts index f1e6a5acab3..e077de058bc 100644 --- a/packages/sdk/src/evm/core/classes/erc-721.ts +++ b/packages/sdk/src/evm/core/classes/erc-721.ts @@ -226,9 +226,13 @@ export class Erc721< address: AddressOrEns, operator: AddressOrEns, ): Promise { + const [_address, _operator] = await Promise.all([ + resolveAddress(address), + resolveAddress(operator), + ]); return await (this.contractWrapper as ContractWrapper).read( "isApprovedForAll", - [await resolveAddress(address), await resolveAddress(operator)], + [_address, _operator], ); } @@ -247,11 +251,14 @@ export class Erc721< */ transfer = /* @__PURE__ */ buildTransactionFunction( async (to: AddressOrEns, tokenId: BigNumberish) => { - const from = await this.contractWrapper.getSignerAddress(); + const [from, _to] = await Promise.all([ + this.contractWrapper.getSignerAddress(), + resolveAddress(to), + ]); return Transaction.fromContractWrapper({ contractWrapper: this.contractWrapper, method: "transferFrom(address,address,uint256)", - args: [from, await resolveAddress(to), tokenId], + args: [from, _to, tokenId], }); }, ); From 14fab45969587cdbdabcb6ce0f761a9047d3163d Mon Sep 17 00:00:00 2001 From: Kien Ngo Date: Tue, 26 Sep 2023 22:18:07 -0400 Subject: [PATCH 2/3] Add changeset --- .changeset/quiet-dragons-worry.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/quiet-dragons-worry.md diff --git a/.changeset/quiet-dragons-worry.md b/.changeset/quiet-dragons-worry.md new file mode 100644 index 00000000000..0d0d4bfab19 --- /dev/null +++ b/.changeset/quiet-dragons-worry.md @@ -0,0 +1,5 @@ +--- +"@thirdweb-dev/sdk": minor +--- + +Improve data fetching for some ERC721 modules From c9a6216976f6bca1a7d6e433ee3185bb1638f069 Mon Sep 17 00:00:00 2001 From: Kien Ngo Date: Wed, 27 Sep 2023 10:03:40 -0400 Subject: [PATCH 3/3] Fix --- packages/sdk/src/evm/core/classes/erc-721-supply.ts | 10 ++++++---- packages/sdk/src/evm/functions/getContractFromAbi.ts | 7 ++++--- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/sdk/src/evm/core/classes/erc-721-supply.ts b/packages/sdk/src/evm/core/classes/erc-721-supply.ts index d75d3a22a04..aed10a9dff4 100644 --- a/packages/sdk/src/evm/core/classes/erc-721-supply.ts +++ b/packages/sdk/src/evm/core/classes/erc-721-supply.ts @@ -107,10 +107,12 @@ export class Erc721Supply implements DetectableFeature { const owners = await Promise.all( arr.map((i) => this.erc721.ownerOf(i).catch(() => constants.AddressZero)), ); - return arr.map((i) => ({ - tokenId: i, - owner: owners[i], - })); + return arr + .map((i) => ({ + tokenId: i, + owner: owners[i], + })) + .filter((o) => o.owner !== constants.AddressZero); } /** diff --git a/packages/sdk/src/evm/functions/getContractFromAbi.ts b/packages/sdk/src/evm/functions/getContractFromAbi.ts index 1d1082f5dc6..6f2a1c299a4 100644 --- a/packages/sdk/src/evm/functions/getContractFromAbi.ts +++ b/packages/sdk/src/evm/functions/getContractFromAbi.ts @@ -26,13 +26,14 @@ export type GetContractFromAbiParams = { export async function getContractFromAbi( params: GetContractFromAbiParams, ): Promise { - const resolvedAddress = await resolveAddress(params.address); - const [signer, provider] = getSignerAndProvider( params.network, params.sdkOptions, ); - const chainId = (await provider.getNetwork()).chainId; + const [resolvedAddress, { chainId }] = await Promise.all([ + resolveAddress(params.address), + provider.getNetwork(), + ]); if (inContractCache(resolvedAddress, chainId)) { return getCachedContract(resolvedAddress, chainId) as SmartContract;