@explorins/pers-sdk 1.6.11 → 1.6.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunks/{explorer.utils-D7EVBxr7.js → explorer.utils-BBs-6DZI.js} +217 -253
- package/dist/chunks/explorer.utils-BBs-6DZI.js.map +1 -0
- package/dist/chunks/{explorer.utils-Bq1zyCPD.cjs → explorer.utils-mn6hK7S2.cjs} +217 -253
- package/dist/chunks/explorer.utils-mn6hK7S2.cjs.map +1 -0
- package/dist/chunks/index-60201NKa.js +265 -0
- package/dist/chunks/index-60201NKa.js.map +1 -0
- package/dist/chunks/index-CcQkbZBZ.cjs +269 -0
- package/dist/chunks/index-CcQkbZBZ.cjs.map +1 -0
- package/dist/chunks/{pers-sdk-DoLwmPFK.js → pers-sdk-Doc9KxB7.js} +31 -99
- package/dist/chunks/pers-sdk-Doc9KxB7.js.map +1 -0
- package/dist/chunks/{pers-sdk-DLSGm4gV.cjs → pers-sdk-RNGAnn-O.cjs} +35 -103
- package/dist/chunks/pers-sdk-RNGAnn-O.cjs.map +1 -0
- package/dist/chunks/web3-chain-service-DtNLaIGT.cjs +386 -0
- package/dist/chunks/web3-chain-service-DtNLaIGT.cjs.map +1 -0
- package/dist/chunks/web3-chain-service-Dww1Hert.js +380 -0
- package/dist/chunks/web3-chain-service-Dww1Hert.js.map +1 -0
- package/dist/core/auth/default-auth-provider.d.ts.map +1 -1
- package/dist/core/auth/refresh-manager.d.ts.map +1 -1
- package/dist/core/auth/services/auth-service.d.ts +5 -0
- package/dist/core/auth/services/auth-service.d.ts.map +1 -1
- package/dist/core/cache/cache.service.d.ts +82 -0
- package/dist/core/cache/cache.service.d.ts.map +1 -0
- package/dist/core/cache/index.d.ts +13 -0
- package/dist/core/cache/index.d.ts.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/pers-api-client.d.ts.map +1 -1
- package/dist/core.cjs +7 -3
- package/dist/core.cjs.map +1 -1
- package/dist/core.js +4 -3
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +9 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/web3/domain/services/metadata-domain.service.d.ts +6 -1
- package/dist/web3/domain/services/metadata-domain.service.d.ts.map +1 -1
- package/dist/web3/domain/services/token-domain.service.d.ts +24 -22
- package/dist/web3/domain/services/token-domain.service.d.ts.map +1 -1
- package/dist/web3/infrastructure/api/ipfs-api.d.ts +6 -1
- package/dist/web3/infrastructure/api/ipfs-api.d.ts.map +1 -1
- package/dist/web3/infrastructure/api/web3-api.d.ts.map +1 -1
- package/dist/web3-chain/api/web3-chain-api.d.ts +0 -1
- package/dist/web3-chain/api/web3-chain-api.d.ts.map +1 -1
- package/dist/web3-chain/services/getWeb3FCD.service.d.ts +9 -10
- package/dist/web3-chain/services/getWeb3FCD.service.d.ts.map +1 -1
- package/dist/web3-chain/services/web3-chain-service.d.ts +11 -5
- package/dist/web3-chain/services/web3-chain-service.d.ts.map +1 -1
- package/dist/web3-chain.cjs +2 -1
- package/dist/web3-chain.cjs.map +1 -1
- package/dist/web3-chain.js +2 -1
- package/dist/web3-chain.js.map +1 -1
- package/dist/web3.cjs +2 -1
- package/dist/web3.cjs.map +1 -1
- package/dist/web3.js +2 -1
- package/dist/web3.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/explorer.utils-Bq1zyCPD.cjs.map +0 -1
- package/dist/chunks/explorer.utils-D7EVBxr7.js.map +0 -1
- package/dist/chunks/pers-sdk-DLSGm4gV.cjs.map +0 -1
- package/dist/chunks/pers-sdk-DoLwmPFK.js.map +0 -1
- package/dist/chunks/web3-chain-service-D75TcHkh.cjs +0 -312
- package/dist/chunks/web3-chain-service-D75TcHkh.cjs.map +0 -1
- package/dist/chunks/web3-chain-service-Dp5Z8p9I.js +0 -308
- package/dist/chunks/web3-chain-service-Dp5Z8p9I.js.map +0 -1
- package/dist/web3-chain/services/ethers-provider.service.d.ts +0 -11
- package/dist/web3-chain/services/ethers-provider.service.d.ts.map +0 -1
- package/dist/web3-chain/services/public-http-provider.service.d.ts +0 -1
- package/dist/web3-chain/services/public-http-provider.service.d.ts.map +0 -1
- package/dist/web3-chain/services/web3-provider.service.d.ts +0 -1
- package/dist/web3-chain/services/web3-provider.service.d.ts.map +0 -1
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var ethers = require('@explorins/web3-ts/ethers');
|
|
4
|
+
var index = require('./index-CcQkbZBZ.cjs');
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Web3InfrastructureApi - Infrastructure implementation for blockchain operations
|
|
@@ -15,7 +16,6 @@ class Web3InfrastructureApi {
|
|
|
15
16
|
if (request.tokenId !== null)
|
|
16
17
|
request.tokenId = request.tokenId.toString();
|
|
17
18
|
const ethersProvider = await this.web3ChainService.getEthersProviderByChainId(request.chainId);
|
|
18
|
-
console.log(`[getTokenBalance] Ethers provider obtained, creating contract instance...`, ethersProvider);
|
|
19
19
|
const contract = ethers.createSafeContract(request.contractAddress, request.abi, ethersProvider);
|
|
20
20
|
return await ethers.getAccountTokenBalance(contract, request.accountAddress, request.tokenId);
|
|
21
21
|
}
|
|
@@ -53,22 +53,26 @@ class Web3InfrastructureApi {
|
|
|
53
53
|
|
|
54
54
|
/**
|
|
55
55
|
* IPFSInfrastructureApi - Infrastructure implementation for IPFS operations
|
|
56
|
-
* Uses Web3ChainService for IPFS gateway resolution
|
|
56
|
+
* Uses Web3ChainService for IPFS gateway resolution with centralized caching
|
|
57
57
|
*/
|
|
58
58
|
class IPFSInfrastructureApi {
|
|
59
59
|
constructor(web3ChainService) {
|
|
60
60
|
this.web3ChainService = web3ChainService;
|
|
61
61
|
this.defaultIpfsGatewayDomain = 'pers.mypinata.cloud';
|
|
62
|
+
this.cache = index.globalCacheService.createNamespace('ipfs');
|
|
62
63
|
}
|
|
63
64
|
async getIpfsGatewayDomain(chainId) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
65
|
+
const cacheKey = `gateway:${chainId}`;
|
|
66
|
+
return this.cache.getOrSet(cacheKey, async () => {
|
|
67
|
+
try {
|
|
68
|
+
const chainData = await this.web3ChainService.getChainDataWithCache(chainId);
|
|
69
|
+
return chainData.ipfsGatewayDomain || this.defaultIpfsGatewayDomain;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
console.warn(`Failed to get chain data for chainId ${chainId}, using default IPFS gateway:`, error);
|
|
73
|
+
return this.defaultIpfsGatewayDomain;
|
|
74
|
+
}
|
|
75
|
+
}, index.CacheTTL.GATEWAY);
|
|
72
76
|
}
|
|
73
77
|
async resolveIPFSUrl(url, chainId) {
|
|
74
78
|
if (url.startsWith('ipfs://')) {
|
|
@@ -113,300 +117,260 @@ class IPFSInfrastructureApi {
|
|
|
113
117
|
throw error;
|
|
114
118
|
}
|
|
115
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Clear IPFS cache for this service
|
|
122
|
+
*/
|
|
123
|
+
clearCache() {
|
|
124
|
+
this.cache.clear();
|
|
125
|
+
}
|
|
116
126
|
}
|
|
117
127
|
|
|
128
|
+
// type ContractAnalysis = ReturnType<ContractDomainService['analyzeContract']>;
|
|
118
129
|
/**
|
|
119
|
-
* TokenDomainService -
|
|
120
|
-
* Implements business logic for token balance, metadata, and collection operations
|
|
130
|
+
* TokenDomainService - Clean, focused token operations with smart caching
|
|
121
131
|
*/
|
|
122
132
|
class TokenDomainService {
|
|
123
133
|
constructor(web3Api, metadataService, contractService) {
|
|
124
134
|
this.web3Api = web3Api;
|
|
125
135
|
this.metadataService = metadataService;
|
|
126
136
|
this.contractService = contractService;
|
|
137
|
+
this.cache = index.globalCacheService.createNamespace('token-domain');
|
|
127
138
|
}
|
|
128
|
-
async getTokenBalance(
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
contractAddress: request.contractAddress,
|
|
132
|
-
abi: ethers.convertAbiToInterface(request.abi),
|
|
133
|
-
tokenId: request.tokenId,
|
|
134
|
-
chainId: request.chainId
|
|
135
|
-
});
|
|
139
|
+
async getTokenBalance(params) {
|
|
140
|
+
const abi = ethers.convertAbiToInterface(params.abi);
|
|
141
|
+
const balance = await this.web3Api.getTokenBalance({ ...params, abi });
|
|
136
142
|
return {
|
|
137
|
-
tokenId:
|
|
143
|
+
tokenId: params.tokenId,
|
|
138
144
|
balance,
|
|
139
145
|
hasBalance: balance > 0,
|
|
140
146
|
metadata: null
|
|
141
147
|
};
|
|
142
148
|
}
|
|
143
|
-
async
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
metadata = await this.metadataService.fetchAndProcessMetadata(tokenUri, params.chainId);
|
|
149
|
+
async getTokenMetadata(params) {
|
|
150
|
+
const cacheKey = `metadata:${params.contractAddress}:${params.tokenId}:${params.chainId}`;
|
|
151
|
+
return this.cache.getOrSet(cacheKey, async () => {
|
|
152
|
+
try {
|
|
153
|
+
const abi = ethers.convertAbiToInterface(params.abi);
|
|
154
|
+
const tokenUri = await this.web3Api.getTokenUri({ ...params, abi });
|
|
155
|
+
const metadata = tokenUri
|
|
156
|
+
? await this.metadataService.fetchAndProcessMetadata(tokenUri, params.chainId)
|
|
157
|
+
: null;
|
|
158
|
+
return { tokenId: params.tokenId, tokenUri, metadata };
|
|
154
159
|
}
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
metadata
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
160
|
+
catch (error) {
|
|
161
|
+
console.error('Error fetching token metadata:', error);
|
|
162
|
+
return { tokenId: params.tokenId, tokenUri: null, metadata: null };
|
|
163
|
+
}
|
|
164
|
+
}, index.CacheTTL.METADATA);
|
|
165
|
+
}
|
|
166
|
+
async getTokenWithBalance(params) {
|
|
167
|
+
const [balanceResult, metadataResult] = await Promise.all([
|
|
168
|
+
this.getTokenBalance({ ...params, tokenId: params.tokenId }),
|
|
169
|
+
this.getTokenMetadata(params)
|
|
170
|
+
]);
|
|
171
|
+
return {
|
|
172
|
+
...balanceResult,
|
|
173
|
+
metadata: metadataResult.metadata
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
async getSpecificTokenBalance(params) {
|
|
177
|
+
// Handle empty tokenId (ERC-20 case)
|
|
178
|
+
if (!params.tokenId) {
|
|
179
|
+
return this.getTokenBalance({ ...params, tokenId: null });
|
|
166
180
|
}
|
|
181
|
+
// Get both balance and metadata for NFTs
|
|
182
|
+
return this.getTokenWithBalance(params);
|
|
167
183
|
}
|
|
168
184
|
async getTokenCollection(params) {
|
|
169
|
-
|
|
185
|
+
// Input validation
|
|
186
|
+
if (!params.accountAddress || !params.contractAddress) {
|
|
187
|
+
return this.emptyCollection(params, 'Invalid accountAddress or contractAddress');
|
|
188
|
+
}
|
|
170
189
|
try {
|
|
171
|
-
const
|
|
172
|
-
const
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
tokens: [],
|
|
181
|
-
note: 'Contract does not support enumeration'
|
|
182
|
-
};
|
|
190
|
+
const abi = ethers.convertAbiToInterface(params.abi);
|
|
191
|
+
const analysis = this.contractService.analyzeContract(abi);
|
|
192
|
+
const batchSize = Math.min(params.batchSize || 10, 20); // Cap at 20 for safety
|
|
193
|
+
// ERC-1155: Requires specific token IDs
|
|
194
|
+
if (analysis.isERC1155) {
|
|
195
|
+
if (!params.tokenIds?.length) {
|
|
196
|
+
return this.emptyCollection(params, 'ERC-1155 requires specific tokenIds parameter');
|
|
197
|
+
}
|
|
198
|
+
return this.processTokenBatch(params, params.tokenIds, batchSize, 'ERC-1155');
|
|
183
199
|
}
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
if (
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
contractAddress: params.contractAddress,
|
|
191
|
-
abi: params.abi,
|
|
192
|
-
tokenId,
|
|
193
|
-
chainId: params.chainId
|
|
194
|
-
});
|
|
195
|
-
let metadata = null;
|
|
196
|
-
if (balance > 0) {
|
|
197
|
-
metadata = (await this.getTokenWithMetadata({
|
|
198
|
-
accountAddress: params.accountAddress,
|
|
199
|
-
contractAddress: params.contractAddress,
|
|
200
|
-
abi: params.abi,
|
|
201
|
-
tokenId,
|
|
202
|
-
chainId: params.chainId
|
|
203
|
-
})).metadata;
|
|
204
|
-
}
|
|
205
|
-
const tokenBalance = {
|
|
206
|
-
tokenId,
|
|
207
|
-
metadata,
|
|
208
|
-
balance,
|
|
209
|
-
hasBalance: balance > 0
|
|
210
|
-
};
|
|
211
|
-
tokens.push(tokenBalance);
|
|
200
|
+
// ERC-721: Use cached token ownership to minimize enumeration calls
|
|
201
|
+
if (analysis.isERC721) {
|
|
202
|
+
if (analysis.hasEnumeration) {
|
|
203
|
+
const { tokenIds, fromCache } = await this.getCachedTokenOwnership(params, abi);
|
|
204
|
+
if (tokenIds.length === 0) {
|
|
205
|
+
return this.emptyCollection(params, fromCache ? 'No tokens owned (cached)' : 'No tokens owned');
|
|
212
206
|
}
|
|
207
|
+
return this.processTokenBatch(params, tokenIds, batchSize, 'ERC-721');
|
|
213
208
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
return {
|
|
217
|
-
accountAddress: params.accountAddress,
|
|
218
|
-
contractAddress: params.contractAddress,
|
|
219
|
-
totalBalance: 0,
|
|
220
|
-
tokensRetrieved: 0,
|
|
221
|
-
tokens: tokens,
|
|
222
|
-
note: 'ERC-1155 collection retrieval requires specific token IDs. Use getTokenWithMetadata() for individual tokens.'
|
|
223
|
-
};
|
|
224
|
-
}
|
|
225
|
-
// Handle different token standards
|
|
226
|
-
if (contractAnalysis.isERC721) {
|
|
227
|
-
// ERC-721: Get user's total balance and enumerate through tokens
|
|
228
|
-
const userBalance = await this.web3Api.getTokenBalance({
|
|
229
|
-
accountAddress: params.accountAddress,
|
|
230
|
-
contractAddress: params.contractAddress,
|
|
231
|
-
abi: params.abi,
|
|
232
|
-
tokenId: null, // null for ERC-721 total balance
|
|
233
|
-
chainId: params.chainId
|
|
234
|
-
});
|
|
235
|
-
if (userBalance === 0) {
|
|
236
|
-
return {
|
|
237
|
-
accountAddress: params.accountAddress,
|
|
238
|
-
contractAddress: params.contractAddress,
|
|
239
|
-
totalBalance: 0,
|
|
240
|
-
tokensRetrieved: 0,
|
|
241
|
-
tokens: []
|
|
242
|
-
};
|
|
209
|
+
else if (params.tokenIds?.length) {
|
|
210
|
+
return this.processTokenBatch(params, params.tokenIds, batchSize, 'ERC-721');
|
|
243
211
|
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
const tokensToRetrieve = Math.min(maxTokens, userBalance);
|
|
247
|
-
for (let i = 0; i < tokensToRetrieve; i++) {
|
|
248
|
-
try {
|
|
249
|
-
const tokenId = await this.web3Api.getTokenOfOwnerByIndex({
|
|
250
|
-
contractAddress: params.contractAddress,
|
|
251
|
-
abi: params.abi,
|
|
252
|
-
accountAddress: params.accountAddress,
|
|
253
|
-
tokenIndex: i,
|
|
254
|
-
chainId: params.chainId
|
|
255
|
-
});
|
|
256
|
-
const tokenWithMetadata = await this.getTokenWithMetadata({
|
|
257
|
-
accountAddress: params.accountAddress,
|
|
258
|
-
contractAddress: params.contractAddress,
|
|
259
|
-
abi: params.abi,
|
|
260
|
-
tokenId,
|
|
261
|
-
chainId: params.chainId
|
|
262
|
-
});
|
|
263
|
-
const tokenBalance = {
|
|
264
|
-
tokenId: tokenWithMetadata.tokenId,
|
|
265
|
-
metadata: tokenWithMetadata.metadata,
|
|
266
|
-
balance: 1,
|
|
267
|
-
hasBalance: true
|
|
268
|
-
};
|
|
269
|
-
tokens.push(tokenBalance);
|
|
270
|
-
}
|
|
271
|
-
catch (error) {
|
|
272
|
-
console.warn(`Error retrieving ERC-721 token at index ${i}:`, error);
|
|
273
|
-
continue;
|
|
274
|
-
}
|
|
212
|
+
else {
|
|
213
|
+
return this.emptyCollection(params, 'ERC-721 without enumeration requires tokenIds parameter');
|
|
275
214
|
}
|
|
276
215
|
}
|
|
277
|
-
|
|
278
|
-
// Unknown standard
|
|
279
|
-
return {
|
|
280
|
-
accountAddress: params.accountAddress,
|
|
281
|
-
contractAddress: params.contractAddress,
|
|
282
|
-
totalBalance: 0,
|
|
283
|
-
tokensRetrieved: 0,
|
|
284
|
-
tokens: [],
|
|
285
|
-
note: 'Unsupported token standard for collection retrieval'
|
|
286
|
-
};
|
|
287
|
-
}
|
|
288
|
-
// Calculate total balance based on retrieved tokens
|
|
289
|
-
let totalBalance = 0;
|
|
290
|
-
if (contractAnalysis.isERC721) {
|
|
291
|
-
// For ERC-721, total balance is the number of unique tokens owned
|
|
292
|
-
totalBalance = tokens.length;
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
// For other standards, sum up individual token balances
|
|
296
|
-
totalBalance = tokens.reduce((sum, token) => sum + token.balance, 0);
|
|
297
|
-
}
|
|
298
|
-
return {
|
|
299
|
-
accountAddress: params.accountAddress,
|
|
300
|
-
contractAddress: params.contractAddress,
|
|
301
|
-
totalBalance,
|
|
302
|
-
tokensRetrieved: tokens.length,
|
|
303
|
-
tokens
|
|
304
|
-
};
|
|
216
|
+
return this.emptyCollection(params, `Unsupported token standard (ERC721: ${analysis.isERC721}, ERC1155: ${analysis.isERC1155})`);
|
|
305
217
|
}
|
|
306
218
|
catch (error) {
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
contractAddress: params.contractAddress,
|
|
311
|
-
totalBalance: 0,
|
|
312
|
-
tokensRetrieved: 0,
|
|
313
|
-
tokens: [],
|
|
314
|
-
note: 'Error retrieving collection'
|
|
315
|
-
};
|
|
219
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
220
|
+
console.error('Collection retrieval error:', error);
|
|
221
|
+
return this.emptyCollection(params, `Collection retrieval failed: ${message}`);
|
|
316
222
|
}
|
|
317
223
|
}
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
}
|
|
331
|
-
return {
|
|
332
|
-
tokenId: params.tokenId,
|
|
333
|
-
tokenUri,
|
|
334
|
-
metadata
|
|
335
|
-
};
|
|
224
|
+
/**
|
|
225
|
+
* Get cached token ownership for ERC-721 with separate longer TTL
|
|
226
|
+
*/
|
|
227
|
+
async getCachedTokenOwnership(params, abi) {
|
|
228
|
+
const ownershipCacheKey = `ownership:${params.contractAddress}:${params.accountAddress}:${params.chainId}`;
|
|
229
|
+
// ALWAYS check current balance first to detect changes
|
|
230
|
+
const currentBalance = await this.web3Api.getTokenBalance({
|
|
231
|
+
...params, abi, tokenId: null
|
|
232
|
+
});
|
|
233
|
+
if (currentBalance === 0) {
|
|
234
|
+
// Clear any existing cache and return empty
|
|
235
|
+
this.cache.delete(ownershipCacheKey);
|
|
236
|
+
return { tokenIds: [], fromCache: false };
|
|
336
237
|
}
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
metadata: null
|
|
343
|
-
};
|
|
238
|
+
// Check ownership cache with balance validation
|
|
239
|
+
const cached = this.cache.get(ownershipCacheKey);
|
|
240
|
+
const cacheAge = cached ? Date.now() - cached.timestamp : Infinity;
|
|
241
|
+
if (cached && cacheAge < index.CacheTTL.SHORT && cached.balance === currentBalance) {
|
|
242
|
+
return { tokenIds: cached.tokenIds, fromCache: true };
|
|
344
243
|
}
|
|
244
|
+
// Enumerate tokens
|
|
245
|
+
const maxTokens = Math.min(params.maxTokens || currentBalance, currentBalance, 100);
|
|
246
|
+
const tokenIds = await this.getTokenIdsByEnumeration(params, abi, maxTokens);
|
|
247
|
+
// Cache with current balance for validation
|
|
248
|
+
this.cache.set(ownershipCacheKey, { tokenIds, balance: currentBalance, timestamp: Date.now() }, index.CacheTTL.SHORT);
|
|
249
|
+
return { tokenIds, fromCache: false };
|
|
345
250
|
}
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
251
|
+
async getTokenIdsByEnumeration(params, abi, maxTokens) {
|
|
252
|
+
// Cache individual enumeration calls to avoid repeated tokenOfOwnerByIndex calls
|
|
253
|
+
const promises = Array.from({ length: maxTokens }, (_, i) => {
|
|
254
|
+
const enumerationCacheKey = `enumeration:${params.contractAddress}:${params.accountAddress}:${i}:${params.chainId}`;
|
|
255
|
+
return this.cache.getOrSet(enumerationCacheKey, () => this.web3Api.getTokenOfOwnerByIndex({
|
|
256
|
+
...params, abi, tokenIndex: i
|
|
257
|
+
}).catch(error => {
|
|
258
|
+
// Silently handle token enumeration errors (index out of bounds is normal)
|
|
259
|
+
return null;
|
|
260
|
+
}), index.CacheTTL.SHORT // 5 minutes - enumeration results rarely change
|
|
261
|
+
);
|
|
262
|
+
});
|
|
263
|
+
const results = await Promise.all(promises);
|
|
264
|
+
return results.filter((id) => id !== null);
|
|
265
|
+
}
|
|
266
|
+
async processTokenBatch(params, tokenIds, batchSize, tokenStandard) {
|
|
267
|
+
const tokens = [];
|
|
268
|
+
const errors = [];
|
|
269
|
+
// Process in batches
|
|
270
|
+
for (let i = 0; i < tokenIds.length; i += batchSize) {
|
|
271
|
+
const batch = tokenIds.slice(i, i + batchSize);
|
|
272
|
+
// Step 1: Check balance for each token (handle ERC-721 vs ERC-1155 differences)
|
|
273
|
+
const balancePromises = batch.map(tokenId => {
|
|
274
|
+
if (tokenStandard === 'ERC-721') {
|
|
275
|
+
// For ERC-721: Skip balance check, we know ownership from enumeration or explicit tokenIds
|
|
276
|
+
return Promise.resolve({
|
|
277
|
+
tokenId,
|
|
278
|
+
balance: 1,
|
|
279
|
+
hasBalance: true,
|
|
280
|
+
metadata: null
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
// For ERC-1155: Check actual balance
|
|
285
|
+
return this.getTokenBalance({ ...params, tokenId })
|
|
286
|
+
.catch(error => {
|
|
287
|
+
errors.push(`${tokenId}: ${error.message}`);
|
|
288
|
+
return null;
|
|
289
|
+
});
|
|
290
|
+
}
|
|
359
291
|
});
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
//
|
|
363
|
-
|
|
364
|
-
this.
|
|
365
|
-
accountAddress: params.accountAddress,
|
|
292
|
+
const balanceResults = await Promise.all(balancePromises);
|
|
293
|
+
const validTokens = balanceResults.filter((token) => token !== null && token.hasBalance);
|
|
294
|
+
// Step 2: Get metadata for tokens that have balance
|
|
295
|
+
if (validTokens.length > 0) {
|
|
296
|
+
const metadataPromises = validTokens.map(token => this.getTokenMetadata({
|
|
366
297
|
contractAddress: params.contractAddress,
|
|
367
298
|
abi: params.abi,
|
|
368
|
-
tokenId:
|
|
369
|
-
chainId: params.chainId
|
|
370
|
-
}),
|
|
371
|
-
this.getTokenWithMetadata({
|
|
372
|
-
accountAddress: params.accountAddress,
|
|
373
|
-
contractAddress: params.contractAddress,
|
|
374
|
-
abi: params.abi,
|
|
375
|
-
tokenId: params.tokenId,
|
|
299
|
+
tokenId: token.tokenId,
|
|
376
300
|
chainId: params.chainId
|
|
377
301
|
})
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
302
|
+
.then(metadata => ({
|
|
303
|
+
tokenId: token.tokenId,
|
|
304
|
+
balance: token.balance,
|
|
305
|
+
hasBalance: token.hasBalance,
|
|
306
|
+
metadata: metadata.metadata
|
|
307
|
+
}))
|
|
308
|
+
.catch(error => {
|
|
309
|
+
console.warn(`Metadata fetch failed for ${token.tokenId}:`, error.message);
|
|
310
|
+
return {
|
|
311
|
+
tokenId: token.tokenId,
|
|
312
|
+
balance: token.balance,
|
|
313
|
+
hasBalance: token.hasBalance,
|
|
314
|
+
metadata: null
|
|
315
|
+
};
|
|
316
|
+
}));
|
|
317
|
+
const finalTokens = await Promise.all(metadataPromises);
|
|
318
|
+
tokens.push(...finalTokens);
|
|
319
|
+
}
|
|
394
320
|
}
|
|
321
|
+
return {
|
|
322
|
+
accountAddress: params.accountAddress,
|
|
323
|
+
contractAddress: params.contractAddress,
|
|
324
|
+
totalBalance: tokens.reduce((sum, token) => sum + token.balance, 0),
|
|
325
|
+
tokensRetrieved: tokens.length,
|
|
326
|
+
tokens,
|
|
327
|
+
note: errors.length > 0 ? `${errors.length} tokens failed to load` : undefined
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
emptyCollection(params, note) {
|
|
331
|
+
return {
|
|
332
|
+
accountAddress: params.accountAddress,
|
|
333
|
+
contractAddress: params.contractAddress,
|
|
334
|
+
totalBalance: 0,
|
|
335
|
+
tokensRetrieved: 0,
|
|
336
|
+
tokens: [],
|
|
337
|
+
note
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
clearCache() {
|
|
341
|
+
this.cache.clear();
|
|
395
342
|
}
|
|
396
343
|
}
|
|
397
344
|
|
|
398
345
|
/**
|
|
399
|
-
* MetadataDomainService - Clean IPFS metadata resolution
|
|
346
|
+
* MetadataDomainService - Clean IPFS metadata resolution with centralized caching
|
|
400
347
|
*/
|
|
401
348
|
class MetadataDomainService {
|
|
402
349
|
constructor(ipfsApi) {
|
|
403
350
|
this.ipfsApi = ipfsApi;
|
|
351
|
+
this.cache = index.globalCacheService.createNamespace('metadata');
|
|
404
352
|
}
|
|
405
353
|
async fetchAndProcessMetadata(tokenUri, chainId) {
|
|
406
|
-
|
|
354
|
+
const cacheKey = `fetch:${tokenUri}:${chainId}`;
|
|
355
|
+
return this.cache.getOrSet(cacheKey, async () => {
|
|
356
|
+
try {
|
|
357
|
+
return await this.ipfsApi.fetchAndProcessMetadata(tokenUri, chainId);
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
console.error(`Error fetching metadata for ${tokenUri}:`, error);
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
}, index.CacheTTL.METADATA);
|
|
407
364
|
}
|
|
408
365
|
async resolveIPFSUrl(url, chainId) {
|
|
409
|
-
|
|
366
|
+
const cacheKey = `resolve:${url}:${chainId}`;
|
|
367
|
+
return this.cache.getOrSet(cacheKey, () => this.ipfsApi.resolveIPFSUrl(url, chainId), index.CacheTTL.GATEWAY);
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Clear all cached metadata and URLs for this service
|
|
371
|
+
*/
|
|
372
|
+
clearCache() {
|
|
373
|
+
this.cache.clear();
|
|
410
374
|
}
|
|
411
375
|
}
|
|
412
376
|
|
|
@@ -599,4 +563,4 @@ exports.Web3ApplicationService = Web3ApplicationService;
|
|
|
599
563
|
exports.Web3InfrastructureApi = Web3InfrastructureApi;
|
|
600
564
|
exports.getExplorerUrl = getExplorerUrl;
|
|
601
565
|
exports.getExplorerUrlByChainId = getExplorerUrlByChainId;
|
|
602
|
-
//# sourceMappingURL=explorer.utils-
|
|
566
|
+
//# sourceMappingURL=explorer.utils-mn6hK7S2.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"explorer.utils-mn6hK7S2.cjs","sources":["../../src/web3/infrastructure/api/web3-api.ts","../../src/web3/infrastructure/api/ipfs-api.ts","../../src/web3/domain/services/token-domain.service.ts","../../src/web3/domain/services/metadata-domain.service.ts","../../src/web3/domain/services/contract-domain.service.ts","../../src/web3/application/web3-application.service.ts","../../src/web3/utils/explorer.utils.ts"],"sourcesContent":[null,null,null,null,null,null,null],"names":["createSafeContract","getAccountTokenBalance","getTokenUri","getTokenOfOwnerByIndex","globalCacheService","CacheTTL","convertAbiToInterface"],"mappings":"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"}
|