@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.
Files changed (72) hide show
  1. package/dist/chunks/{explorer.utils-D7EVBxr7.js → explorer.utils-BBs-6DZI.js} +217 -253
  2. package/dist/chunks/explorer.utils-BBs-6DZI.js.map +1 -0
  3. package/dist/chunks/{explorer.utils-Bq1zyCPD.cjs → explorer.utils-mn6hK7S2.cjs} +217 -253
  4. package/dist/chunks/explorer.utils-mn6hK7S2.cjs.map +1 -0
  5. package/dist/chunks/index-60201NKa.js +265 -0
  6. package/dist/chunks/index-60201NKa.js.map +1 -0
  7. package/dist/chunks/index-CcQkbZBZ.cjs +269 -0
  8. package/dist/chunks/index-CcQkbZBZ.cjs.map +1 -0
  9. package/dist/chunks/{pers-sdk-DoLwmPFK.js → pers-sdk-Doc9KxB7.js} +31 -99
  10. package/dist/chunks/pers-sdk-Doc9KxB7.js.map +1 -0
  11. package/dist/chunks/{pers-sdk-DLSGm4gV.cjs → pers-sdk-RNGAnn-O.cjs} +35 -103
  12. package/dist/chunks/pers-sdk-RNGAnn-O.cjs.map +1 -0
  13. package/dist/chunks/web3-chain-service-DtNLaIGT.cjs +386 -0
  14. package/dist/chunks/web3-chain-service-DtNLaIGT.cjs.map +1 -0
  15. package/dist/chunks/web3-chain-service-Dww1Hert.js +380 -0
  16. package/dist/chunks/web3-chain-service-Dww1Hert.js.map +1 -0
  17. package/dist/core/auth/default-auth-provider.d.ts.map +1 -1
  18. package/dist/core/auth/refresh-manager.d.ts.map +1 -1
  19. package/dist/core/auth/services/auth-service.d.ts +5 -0
  20. package/dist/core/auth/services/auth-service.d.ts.map +1 -1
  21. package/dist/core/cache/cache.service.d.ts +82 -0
  22. package/dist/core/cache/cache.service.d.ts.map +1 -0
  23. package/dist/core/cache/index.d.ts +13 -0
  24. package/dist/core/cache/index.d.ts.map +1 -0
  25. package/dist/core/index.d.ts +1 -0
  26. package/dist/core/index.d.ts.map +1 -1
  27. package/dist/core/pers-api-client.d.ts.map +1 -1
  28. package/dist/core.cjs +7 -3
  29. package/dist/core.cjs.map +1 -1
  30. package/dist/core.js +4 -3
  31. package/dist/core.js.map +1 -1
  32. package/dist/index.cjs +9 -5
  33. package/dist/index.cjs.map +1 -1
  34. package/dist/index.js +4 -3
  35. package/dist/index.js.map +1 -1
  36. package/dist/package.json +1 -1
  37. package/dist/web3/domain/services/metadata-domain.service.d.ts +6 -1
  38. package/dist/web3/domain/services/metadata-domain.service.d.ts.map +1 -1
  39. package/dist/web3/domain/services/token-domain.service.d.ts +24 -22
  40. package/dist/web3/domain/services/token-domain.service.d.ts.map +1 -1
  41. package/dist/web3/infrastructure/api/ipfs-api.d.ts +6 -1
  42. package/dist/web3/infrastructure/api/ipfs-api.d.ts.map +1 -1
  43. package/dist/web3/infrastructure/api/web3-api.d.ts.map +1 -1
  44. package/dist/web3-chain/api/web3-chain-api.d.ts +0 -1
  45. package/dist/web3-chain/api/web3-chain-api.d.ts.map +1 -1
  46. package/dist/web3-chain/services/getWeb3FCD.service.d.ts +9 -10
  47. package/dist/web3-chain/services/getWeb3FCD.service.d.ts.map +1 -1
  48. package/dist/web3-chain/services/web3-chain-service.d.ts +11 -5
  49. package/dist/web3-chain/services/web3-chain-service.d.ts.map +1 -1
  50. package/dist/web3-chain.cjs +2 -1
  51. package/dist/web3-chain.cjs.map +1 -1
  52. package/dist/web3-chain.js +2 -1
  53. package/dist/web3-chain.js.map +1 -1
  54. package/dist/web3.cjs +2 -1
  55. package/dist/web3.cjs.map +1 -1
  56. package/dist/web3.js +2 -1
  57. package/dist/web3.js.map +1 -1
  58. package/package.json +1 -1
  59. package/dist/chunks/explorer.utils-Bq1zyCPD.cjs.map +0 -1
  60. package/dist/chunks/explorer.utils-D7EVBxr7.js.map +0 -1
  61. package/dist/chunks/pers-sdk-DLSGm4gV.cjs.map +0 -1
  62. package/dist/chunks/pers-sdk-DoLwmPFK.js.map +0 -1
  63. package/dist/chunks/web3-chain-service-D75TcHkh.cjs +0 -312
  64. package/dist/chunks/web3-chain-service-D75TcHkh.cjs.map +0 -1
  65. package/dist/chunks/web3-chain-service-Dp5Z8p9I.js +0 -308
  66. package/dist/chunks/web3-chain-service-Dp5Z8p9I.js.map +0 -1
  67. package/dist/web3-chain/services/ethers-provider.service.d.ts +0 -11
  68. package/dist/web3-chain/services/ethers-provider.service.d.ts.map +0 -1
  69. package/dist/web3-chain/services/public-http-provider.service.d.ts +0 -1
  70. package/dist/web3-chain/services/public-http-provider.service.d.ts.map +0 -1
  71. package/dist/web3-chain/services/web3-provider.service.d.ts +0 -1
  72. 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
- try {
65
- const chainData = await this.web3ChainService.getChainDataWithCache(chainId);
66
- return chainData.ipfsGatewayDomain || this.defaultIpfsGatewayDomain;
67
- }
68
- catch (error) {
69
- console.warn(`Failed to get chain data for chainId ${chainId}, using default IPFS gateway:`, error);
70
- return this.defaultIpfsGatewayDomain;
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 - Domain service for token operations
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(request) {
129
- const balance = await this.web3Api.getTokenBalance({
130
- accountAddress: request.accountAddress,
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: request.tokenId,
143
+ tokenId: params.tokenId,
138
144
  balance,
139
145
  hasBalance: balance > 0,
140
146
  metadata: null
141
147
  };
142
148
  }
143
- async getTokenWithMetadata(params) {
144
- try {
145
- let metadata = null;
146
- const tokenUri = await this.web3Api.getTokenUri({
147
- contractAddress: params.contractAddress,
148
- abi: ethers.convertAbiToInterface(params.abi),
149
- tokenId: params.tokenId,
150
- chainId: params.chainId
151
- });
152
- if (tokenUri) {
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
- return {
156
- tokenId: params.tokenId,
157
- metadata
158
- };
159
- }
160
- catch (error) {
161
- console.error('Error getting token with metadata:', error);
162
- return {
163
- tokenId: params.tokenId,
164
- metadata: null
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
- params.abi = ethers.convertAbiToInterface(params.abi);
185
+ // Input validation
186
+ if (!params.accountAddress || !params.contractAddress) {
187
+ return this.emptyCollection(params, 'Invalid accountAddress or contractAddress');
188
+ }
170
189
  try {
171
- const contractAnalysis = this.contractService.analyzeContract(params.abi);
172
- const tokens = [];
173
- if (!contractAnalysis.hasEnumeration && !contractAnalysis.isERC1155) {
174
- console.warn('Contract does not support enumeration, cannot retrieve full collection');
175
- return {
176
- accountAddress: params.accountAddress,
177
- contractAddress: params.contractAddress,
178
- totalBalance: 0,
179
- tokensRetrieved: 0,
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
- else if (contractAnalysis.isERC1155) {
185
- const tokenIdsToProcess = params.tokenIds || [];
186
- if (tokenIdsToProcess.length > 0) {
187
- for (const tokenId of tokenIdsToProcess) {
188
- const balance = await this.web3Api.getTokenBalance({
189
- accountAddress: params.accountAddress,
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
- // ERC-1155: Cannot enumerate without knowing token IDs
215
- // Would need to use events or provide specific token IDs
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
- // Enumerate through user's tokens
245
- const maxTokens = params.maxTokens || userBalance;
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
- else {
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
- console.error('Error getting token collection:', error);
308
- return {
309
- accountAddress: params.accountAddress,
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
- async getTokenMetadata(params) {
319
- params.abi = ethers.convertAbiToInterface(params.abi);
320
- try {
321
- const tokenUri = await this.web3Api.getTokenUri({
322
- contractAddress: params.contractAddress,
323
- abi: params.abi,
324
- tokenId: params.tokenId,
325
- chainId: params.chainId
326
- });
327
- let metadata = null;
328
- if (tokenUri) {
329
- metadata = await this.metadataService.fetchAndProcessMetadata(tokenUri, params.chainId);
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
- catch (error) {
338
- console.error('Error getting token metadata:', error);
339
- return {
340
- tokenId: params.tokenId,
341
- tokenUri: null,
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
- * Get balance and metadata for a specific token in a single operation
348
- * Combines getTokenBalance and getTokenWithMetadata for efficiency
349
- */
350
- async getSpecificTokenBalance(params) {
351
- // Handle case where tokenId is empty (ERC-20 tokens)
352
- if (!params.tokenId) {
353
- return this.getTokenBalance({
354
- accountAddress: params.accountAddress,
355
- contractAddress: params.contractAddress,
356
- abi: params.abi,
357
- tokenId: null,
358
- chainId: params.chainId
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
- try {
362
- // Get balance and metadata in parallel for efficiency
363
- const [balance, tokenWithMetadata] = await Promise.all([
364
- this.getTokenBalance({
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: params.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
- return {
380
- tokenId: tokenWithMetadata.tokenId,
381
- metadata: tokenWithMetadata.metadata,
382
- balance: balance.balance,
383
- hasBalance: balance.hasBalance
384
- };
385
- }
386
- catch (error) {
387
- console.error('Error getting specific token balance:', error);
388
- return {
389
- tokenId: params.tokenId,
390
- metadata: null,
391
- balance: 0,
392
- hasBalance: false
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
- return this.ipfsApi.fetchAndProcessMetadata(tokenUri, chainId);
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
- return this.ipfsApi.resolveIPFSUrl(url, chainId);
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-Bq1zyCPD.cjs.map
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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"}