Skip to content

Commit 03e2385

Browse files
[SDK] Improve NFT data fallbacks for indexer cache misses (#6765)
1 parent 72875f9 commit 03e2385

File tree

7 files changed

+60
-52
lines changed

7 files changed

+60
-52
lines changed

.changeset/sour-kiwis-wink.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"thirdweb": patch
3+
---
4+
5+
Better fallbacks for live NFT data cache miss

apps/dashboard/src/@/constants/thirdweb.server.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
import {
77
THIRDWEB_BUNDLER_DOMAIN,
88
THIRDWEB_INAPP_WALLET_DOMAIN,
9+
THIRDWEB_INSIGHT_API_DOMAIN,
910
THIRDWEB_PAY_DOMAIN,
1011
THIRDWEB_RPC_DOMAIN,
1112
THIRDWEB_SOCIAL_API_DOMAIN,
@@ -32,6 +33,7 @@ export function getThirdwebClient(jwt?: string) {
3233
storage: THIRDWEB_STORAGE_DOMAIN,
3334
social: THIRDWEB_SOCIAL_API_DOMAIN,
3435
bundler: THIRDWEB_BUNDLER_DOMAIN,
36+
insight: THIRDWEB_INSIGHT_API_DOMAIN,
3537
});
3638
}
3739

apps/dashboard/src/constants/urls.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,6 @@ export const THIRDWEB_SOCIAL_API_DOMAIN =
2020

2121
export const THIRDWEB_BUNDLER_DOMAIN =
2222
process.env.NEXT_PUBLIC_BUNDLER_URL || "bundler.thirdweb-dev.com";
23+
24+
export const THIRDWEB_INSIGHT_API_DOMAIN =
25+
process.env.NEXT_PUBLIC_INSIGHT_API_URL || "insight.thirdweb-dev.com";

packages/thirdweb/src/extensions/erc1155/read/getNFT.ts

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -50,30 +50,15 @@ export async function getNFT(
5050
async function getNFTFromInsight(
5151
options: BaseTransactionOptions<GetNFTParams>,
5252
): Promise<NFT> {
53-
const tokenId = options.tokenId;
5453
const nft = await getNFTInsight({
5554
client: options.contract.client,
5655
chain: options.contract.chain,
5756
contractAddress: options.contract.address,
5857
tokenId: options.tokenId,
5958
});
6059
if (!nft) {
61-
return parseNFT(
62-
{
63-
id: tokenId,
64-
type: "ERC1155",
65-
uri: "",
66-
},
67-
{
68-
tokenId: options.tokenId,
69-
tokenUri: "",
70-
type: "ERC1155",
71-
owner: null,
72-
supply: 0n,
73-
tokenAddress: options.contract.address,
74-
chainId: options.contract.chain.id,
75-
},
76-
);
60+
// fresh contracts might be delayed in indexing, so we fallback to RPC
61+
return getNFTFromRPC(options);
7762
}
7863
return nft;
7964
}

packages/thirdweb/src/extensions/erc1155/read/getNFTs.ts

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,28 @@ async function getNFTsFromInsight(
6565
): Promise<NFT[]> {
6666
const { contract, start, count = Number(DEFAULT_QUERY_ALL_COUNT) } = options;
6767

68-
const result = await getContractNFTs({
69-
client: contract.client,
70-
chains: [contract.chain],
71-
contractAddress: contract.address,
72-
queryOptions: {
73-
limit: count,
74-
page: start ? Math.floor(start / count) : undefined,
75-
},
76-
});
68+
const [result, supply] = await Promise.all([
69+
getContractNFTs({
70+
client: contract.client,
71+
chains: [contract.chain],
72+
contractAddress: contract.address,
73+
queryOptions: {
74+
limit: count,
75+
page: start ? Math.floor(start / count) : undefined,
76+
},
77+
}),
78+
nextTokenIdToMint(options).catch(() => maxUint256),
79+
]);
7780

81+
const currentOffset = start ?? 0;
82+
const expectedResultLength = Math.min(
83+
count,
84+
Math.max(0, Number(supply) - currentOffset),
85+
);
86+
if (result.length < expectedResultLength) {
87+
// fresh contracts might be delayed in indexing, so we fallback to RPC
88+
return getNFTsFromRPC(options);
89+
}
7890
return result;
7991
}
8092

@@ -95,6 +107,7 @@ async function getNFTsFromRPC(
95107
getNFT({
96108
...options,
97109
tokenId: i,
110+
useIndexer: false,
98111
}),
99112
);
100113
}

packages/thirdweb/src/extensions/erc721/read/getNFT.ts

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ export async function getNFT(
7878
async function getNFTFromInsight(
7979
options: BaseTransactionOptions<GetNFTParams>,
8080
): Promise<NFT> {
81-
const tokenId = options.tokenId;
8281
const nft = await getNFTInsight({
8382
client: options.contract.client,
8483
chain: options.contract.chain,
@@ -87,21 +86,8 @@ async function getNFTFromInsight(
8786
includeOwners: options.includeOwner,
8887
});
8988
if (!nft) {
90-
return parseNFT(
91-
{
92-
id: tokenId,
93-
type: "ERC721",
94-
uri: "",
95-
},
96-
{
97-
tokenId,
98-
tokenUri: "",
99-
type: "ERC721",
100-
owner: null,
101-
tokenAddress: options.contract.address,
102-
chainId: options.contract.chain.id,
103-
},
104-
);
89+
// fresh contracts might be delayed in indexing, so we fallback to RPC
90+
return getNFTFromRPC(options);
10591
}
10692
return nft;
10793
}

packages/thirdweb/src/extensions/erc721/read/getNFTs.ts

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,29 @@ async function getNFTsFromInsight(
104104
): Promise<NFT[]> {
105105
const { contract, start, count = Number(DEFAULT_QUERY_ALL_COUNT) } = options;
106106

107-
const result = await getContractNFTs({
108-
client: contract.client,
109-
chains: [contract.chain],
110-
contractAddress: contract.address,
111-
includeOwners: options.includeOwners ?? false,
112-
queryOptions: {
113-
limit: count,
114-
page: start ? Math.floor(start / count) : undefined,
115-
},
116-
});
107+
const [result, supply] = await Promise.all([
108+
getContractNFTs({
109+
client: contract.client,
110+
chains: [contract.chain],
111+
contractAddress: contract.address,
112+
includeOwners: options.includeOwners ?? false,
113+
queryOptions: {
114+
limit: count,
115+
page: start ? Math.floor(start / count) : undefined,
116+
},
117+
}),
118+
totalSupply(options),
119+
]);
120+
121+
const currentOffset = start ?? 0;
122+
const expectedResultLength = Math.min(
123+
count,
124+
Math.max(0, Number(supply) - currentOffset),
125+
);
126+
if (result.length < expectedResultLength) {
127+
// fresh contracts might be delayed in indexing, so we fallback to RPC
128+
return getNFTsFromRPC(options);
129+
}
117130

118131
return result;
119132
}
@@ -158,6 +171,7 @@ async function getNFTsFromRPC(
158171
...options,
159172
tokenId: i,
160173
includeOwner: options.includeOwners ?? false,
174+
useIndexer: false,
161175
}),
162176
);
163177
}

0 commit comments

Comments
 (0)