@explorins/pers-sdk 1.6.10 → 1.6.12

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