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