@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,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
@@ -53,22 +54,26 @@ class Web3InfrastructureApi {
53
54
 
54
55
  /**
55
56
  * IPFSInfrastructureApi - Infrastructure implementation for IPFS operations
56
- * Uses Web3ChainService for IPFS gateway resolution
57
+ * Uses Web3ChainService for IPFS gateway resolution with centralized caching
57
58
  */
58
59
  class IPFSInfrastructureApi {
59
60
  constructor(web3ChainService) {
60
61
  this.web3ChainService = web3ChainService;
61
62
  this.defaultIpfsGatewayDomain = 'pers.mypinata.cloud';
63
+ this.cache = index.globalCacheService.createNamespace('ipfs');
62
64
  }
63
65
  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
- }
66
+ const cacheKey = `gateway:${chainId}`;
67
+ return this.cache.getOrSet(cacheKey, async () => {
68
+ try {
69
+ const chainData = await this.web3ChainService.getChainDataWithCache(chainId);
70
+ return chainData.ipfsGatewayDomain || this.defaultIpfsGatewayDomain;
71
+ }
72
+ catch (error) {
73
+ console.warn(`Failed to get chain data for chainId ${chainId}, using default IPFS gateway:`, error);
74
+ return this.defaultIpfsGatewayDomain;
75
+ }
76
+ }, index.CacheTTL.GATEWAY);
72
77
  }
73
78
  async resolveIPFSUrl(url, chainId) {
74
79
  if (url.startsWith('ipfs://')) {
@@ -113,246 +118,260 @@ class IPFSInfrastructureApi {
113
118
  throw error;
114
119
  }
115
120
  }
121
+ /**
122
+ * Clear IPFS cache for this service
123
+ */
124
+ clearCache() {
125
+ this.cache.clear();
126
+ }
116
127
  }
117
128
 
129
+ // type ContractAnalysis = ReturnType<ContractDomainService['analyzeContract']>;
118
130
  /**
119
- * TokenDomainService - Domain service for token operations
120
- * Implements business logic for token balance, metadata, and collection operations
131
+ * TokenDomainService - Clean, focused token operations with smart caching
121
132
  */
122
133
  class TokenDomainService {
123
134
  constructor(web3Api, metadataService, contractService) {
124
135
  this.web3Api = web3Api;
125
136
  this.metadataService = metadataService;
126
137
  this.contractService = contractService;
138
+ this.cache = index.globalCacheService.createNamespace('token-domain');
127
139
  }
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
- });
140
+ async getTokenBalance(params) {
141
+ const abi = ethers.convertAbiToInterface(params.abi);
142
+ const balance = await this.web3Api.getTokenBalance({ ...params, abi });
136
143
  return {
137
- tokenId: request.tokenId,
144
+ tokenId: params.tokenId,
138
145
  balance,
139
146
  hasBalance: balance > 0,
140
147
  metadata: null
141
148
  };
142
149
  }
143
- async getTokenWithMetadata(params) {
144
- try {
145
- const balance = await this.web3Api.getTokenBalance({
146
- accountAddress: params.accountAddress,
147
- contractAddress: params.contractAddress,
148
- abi: ethers.convertAbiToInterface(params.abi),
149
- tokenId: params.tokenId,
150
- chainId: params.chainId
151
- });
152
- let metadata = null;
153
- if (balance > 0) {
154
- const tokenUri = await this.web3Api.getTokenUri({
155
- contractAddress: params.contractAddress,
156
- abi: ethers.convertAbiToInterface(params.abi),
157
- tokenId: params.tokenId,
158
- chainId: params.chainId
159
- });
160
- if (tokenUri) {
161
- metadata = await this.metadataService.fetchAndProcessMetadata(tokenUri, params.chainId);
162
- }
150
+ async getTokenMetadata(params) {
151
+ const cacheKey = `metadata:${params.contractAddress}:${params.tokenId}:${params.chainId}`;
152
+ return this.cache.getOrSet(cacheKey, async () => {
153
+ try {
154
+ const abi = ethers.convertAbiToInterface(params.abi);
155
+ const tokenUri = await this.web3Api.getTokenUri({ ...params, abi });
156
+ const metadata = tokenUri
157
+ ? await this.metadataService.fetchAndProcessMetadata(tokenUri, params.chainId)
158
+ : null;
159
+ return { tokenId: params.tokenId, tokenUri, metadata };
163
160
  }
164
- return {
165
- tokenId: params.tokenId,
166
- balance,
167
- hasBalance: balance > 0,
168
- metadata
169
- };
170
- }
171
- catch (error) {
172
- console.error('Error getting token with metadata:', error);
173
- return {
174
- tokenId: params.tokenId,
175
- balance: 0,
176
- hasBalance: false,
177
- metadata: null
178
- };
161
+ catch (error) {
162
+ console.error('Error fetching token metadata:', error);
163
+ return { tokenId: params.tokenId, tokenUri: null, metadata: null };
164
+ }
165
+ }, index.CacheTTL.METADATA);
166
+ }
167
+ async getTokenWithBalance(params) {
168
+ const [balanceResult, metadataResult] = await Promise.all([
169
+ this.getTokenBalance({ ...params, tokenId: params.tokenId }),
170
+ this.getTokenMetadata(params)
171
+ ]);
172
+ return {
173
+ ...balanceResult,
174
+ metadata: metadataResult.metadata
175
+ };
176
+ }
177
+ async getSpecificTokenBalance(params) {
178
+ // Handle empty tokenId (ERC-20 case)
179
+ if (!params.tokenId) {
180
+ return this.getTokenBalance({ ...params, tokenId: null });
179
181
  }
182
+ // Get both balance and metadata for NFTs
183
+ return this.getTokenWithBalance(params);
180
184
  }
181
185
  async getTokenCollection(params) {
182
- params.abi = ethers.convertAbiToInterface(params.abi);
186
+ // Input validation
187
+ if (!params.accountAddress || !params.contractAddress) {
188
+ return this.emptyCollection(params, 'Invalid accountAddress or contractAddress');
189
+ }
183
190
  try {
184
- const contractAnalysis = this.contractService.analyzeContract(params.abi);
185
- const tokens = [];
186
- if (!contractAnalysis.hasEnumeration && !contractAnalysis.isERC1155) {
187
- console.warn('Contract does not support enumeration, cannot retrieve full collection');
188
- return {
189
- accountAddress: params.accountAddress,
190
- contractAddress: params.contractAddress,
191
- totalBalance: 0,
192
- tokensRetrieved: 0,
193
- tokens: [],
194
- note: 'Contract does not support enumeration'
195
- };
191
+ const abi = ethers.convertAbiToInterface(params.abi);
192
+ const analysis = this.contractService.analyzeContract(abi);
193
+ const batchSize = Math.min(params.batchSize || 10, 20); // Cap at 20 for safety
194
+ // ERC-1155: Requires specific token IDs
195
+ if (analysis.isERC1155) {
196
+ if (!params.tokenIds?.length) {
197
+ return this.emptyCollection(params, 'ERC-1155 requires specific tokenIds parameter');
198
+ }
199
+ return this.processTokenBatch(params, params.tokenIds, batchSize, 'ERC-1155');
196
200
  }
197
- else if (contractAnalysis.isERC1155) {
198
- const tokenIdsToProcess = params.tokenIds || [];
199
- if (tokenIdsToProcess.length > 0) {
200
- for (const tokenId of tokenIdsToProcess) {
201
- const tokenBalance = await this.getTokenWithMetadata({
202
- accountAddress: params.accountAddress,
203
- contractAddress: params.contractAddress,
204
- abi: params.abi,
205
- tokenId,
206
- chainId: params.chainId
207
- });
208
- tokens.push(tokenBalance);
201
+ // ERC-721: Use cached token ownership to minimize enumeration calls
202
+ if (analysis.isERC721) {
203
+ if (analysis.hasEnumeration) {
204
+ const { tokenIds, fromCache } = await this.getCachedTokenOwnership(params, abi);
205
+ if (tokenIds.length === 0) {
206
+ return this.emptyCollection(params, fromCache ? 'No tokens owned (cached)' : 'No tokens owned');
209
207
  }
208
+ return this.processTokenBatch(params, tokenIds, batchSize, 'ERC-721');
210
209
  }
211
- console.log('ERC-1155 User balances:', tokens);
212
- // ERC-1155: Cannot enumerate without knowing token IDs
213
- // Would need to use events or provide specific token IDs
214
- console.warn('ERC-1155 collection retrieval requires specific token IDs or event analysis');
215
- return {
216
- accountAddress: params.accountAddress,
217
- contractAddress: params.contractAddress,
218
- totalBalance: 0,
219
- tokensRetrieved: 0,
220
- tokens: tokens,
221
- note: 'ERC-1155 collection retrieval requires specific token IDs. Use getTokenWithMetadata() for individual tokens.'
222
- };
223
- }
224
- // Handle different token standards
225
- if (contractAnalysis.isERC721) {
226
- // ERC-721: Get user's total balance and enumerate through tokens
227
- const userBalance = await this.web3Api.getTokenBalance({
228
- accountAddress: params.accountAddress,
229
- contractAddress: params.contractAddress,
230
- abi: params.abi,
231
- tokenId: null, // null for ERC-721 total balance
232
- chainId: params.chainId
233
- });
234
- console.log(`ERC-721 User balance for ${params.accountAddress}:`, userBalance);
235
- if (userBalance === 0) {
236
- return {
237
- accountAddress: params.accountAddress,
238
- contractAddress: params.contractAddress,
239
- totalBalance: 0,
240
- tokensRetrieved: 0,
241
- tokens: []
242
- };
210
+ else if (params.tokenIds?.length) {
211
+ return this.processTokenBatch(params, params.tokenIds, batchSize, 'ERC-721');
243
212
  }
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
- if (tokenWithMetadata.hasBalance) {
264
- tokens.push(tokenWithMetadata);
265
- }
266
- }
267
- catch (error) {
268
- console.warn(`Error retrieving ERC-721 token at index ${i}:`, error);
269
- continue;
270
- }
213
+ else {
214
+ return this.emptyCollection(params, 'ERC-721 without enumeration requires tokenIds parameter');
271
215
  }
272
216
  }
273
- else {
274
- // Unknown standard
275
- return {
276
- accountAddress: params.accountAddress,
277
- contractAddress: params.contractAddress,
278
- totalBalance: 0,
279
- tokensRetrieved: 0,
280
- tokens: [],
281
- note: 'Unsupported token standard for collection retrieval'
282
- };
283
- }
284
- // Calculate total balance based on retrieved tokens
285
- let totalBalance = 0;
286
- if (contractAnalysis.isERC721) {
287
- // For ERC-721, total balance is the number of unique tokens owned
288
- totalBalance = tokens.length;
289
- }
290
- else {
291
- // For other standards, sum up individual token balances
292
- totalBalance = tokens.reduce((sum, token) => sum + token.balance, 0);
293
- }
294
- return {
295
- accountAddress: params.accountAddress,
296
- contractAddress: params.contractAddress,
297
- totalBalance,
298
- tokensRetrieved: tokens.length,
299
- tokens
300
- };
217
+ return this.emptyCollection(params, `Unsupported token standard (ERC721: ${analysis.isERC721}, ERC1155: ${analysis.isERC1155})`);
301
218
  }
302
219
  catch (error) {
303
- console.error('Error getting token collection:', error);
304
- return {
305
- accountAddress: params.accountAddress,
306
- contractAddress: params.contractAddress,
307
- totalBalance: 0,
308
- tokensRetrieved: 0,
309
- tokens: [],
310
- note: 'Error retrieving collection'
311
- };
220
+ const message = error instanceof Error ? error.message : 'Unknown error';
221
+ console.error('Collection retrieval error:', error);
222
+ return this.emptyCollection(params, `Collection retrieval failed: ${message}`);
312
223
  }
313
224
  }
314
- async getTokenMetadata(params) {
315
- params.abi = ethers.convertAbiToInterface(params.abi);
316
- try {
317
- const tokenUri = await this.web3Api.getTokenUri({
318
- contractAddress: params.contractAddress,
319
- abi: params.abi,
320
- tokenId: params.tokenId,
321
- chainId: params.chainId
225
+ /**
226
+ * Get cached token ownership for ERC-721 with separate longer TTL
227
+ */
228
+ async getCachedTokenOwnership(params, abi) {
229
+ const ownershipCacheKey = `ownership:${params.contractAddress}:${params.accountAddress}:${params.chainId}`;
230
+ // ALWAYS check current balance first to detect changes
231
+ const currentBalance = await this.web3Api.getTokenBalance({
232
+ ...params, abi, tokenId: null
233
+ });
234
+ if (currentBalance === 0) {
235
+ // Clear any existing cache and return empty
236
+ this.cache.delete(ownershipCacheKey);
237
+ return { tokenIds: [], fromCache: false };
238
+ }
239
+ // Check ownership cache with balance validation
240
+ const cached = this.cache.get(ownershipCacheKey);
241
+ const cacheAge = cached ? Date.now() - cached.timestamp : Infinity;
242
+ if (cached && cacheAge < index.CacheTTL.SHORT && cached.balance === currentBalance) {
243
+ return { tokenIds: cached.tokenIds, fromCache: true };
244
+ }
245
+ // Enumerate tokens
246
+ const maxTokens = Math.min(params.maxTokens || currentBalance, currentBalance, 100);
247
+ const tokenIds = await this.getTokenIdsByEnumeration(params, abi, maxTokens);
248
+ // Cache with current balance for validation
249
+ this.cache.set(ownershipCacheKey, { tokenIds, balance: currentBalance, timestamp: Date.now() }, index.CacheTTL.SHORT);
250
+ return { tokenIds, fromCache: false };
251
+ }
252
+ async getTokenIdsByEnumeration(params, abi, maxTokens) {
253
+ // Cache individual enumeration calls to avoid repeated tokenOfOwnerByIndex calls
254
+ const promises = Array.from({ length: maxTokens }, (_, i) => {
255
+ const enumerationCacheKey = `enumeration:${params.contractAddress}:${params.accountAddress}:${i}:${params.chainId}`;
256
+ return this.cache.getOrSet(enumerationCacheKey, () => this.web3Api.getTokenOfOwnerByIndex({
257
+ ...params, abi, tokenIndex: i
258
+ }).catch(error => {
259
+ // Silently handle token enumeration errors (index out of bounds is normal)
260
+ return null;
261
+ }), index.CacheTTL.SHORT // 5 minutes - enumeration results rarely change
262
+ );
263
+ });
264
+ const results = await Promise.all(promises);
265
+ return results.filter((id) => id !== null);
266
+ }
267
+ async processTokenBatch(params, tokenIds, batchSize, tokenStandard) {
268
+ const tokens = [];
269
+ const errors = [];
270
+ // Process in batches
271
+ for (let i = 0; i < tokenIds.length; i += batchSize) {
272
+ const batch = tokenIds.slice(i, i + batchSize);
273
+ // Step 1: Check balance for each token (handle ERC-721 vs ERC-1155 differences)
274
+ const balancePromises = batch.map(tokenId => {
275
+ if (tokenStandard === 'ERC-721') {
276
+ // For ERC-721: Skip balance check, we know ownership from enumeration or explicit tokenIds
277
+ return Promise.resolve({
278
+ tokenId,
279
+ balance: 1,
280
+ hasBalance: true,
281
+ metadata: null
282
+ });
283
+ }
284
+ else {
285
+ // For ERC-1155: Check actual balance
286
+ return this.getTokenBalance({ ...params, tokenId })
287
+ .catch(error => {
288
+ errors.push(`${tokenId}: ${error.message}`);
289
+ return null;
290
+ });
291
+ }
322
292
  });
323
- let metadata = null;
324
- if (tokenUri) {
325
- metadata = await this.metadataService.fetchAndProcessMetadata(tokenUri, params.chainId);
293
+ const balanceResults = await Promise.all(balancePromises);
294
+ const validTokens = balanceResults.filter((token) => token !== null && token.hasBalance);
295
+ // Step 2: Get metadata for tokens that have balance
296
+ if (validTokens.length > 0) {
297
+ const metadataPromises = validTokens.map(token => this.getTokenMetadata({
298
+ contractAddress: params.contractAddress,
299
+ abi: params.abi,
300
+ tokenId: token.tokenId,
301
+ chainId: params.chainId
302
+ })
303
+ .then(metadata => ({
304
+ tokenId: token.tokenId,
305
+ balance: token.balance,
306
+ hasBalance: token.hasBalance,
307
+ metadata: metadata.metadata
308
+ }))
309
+ .catch(error => {
310
+ console.warn(`Metadata fetch failed for ${token.tokenId}:`, error.message);
311
+ return {
312
+ tokenId: token.tokenId,
313
+ balance: token.balance,
314
+ hasBalance: token.hasBalance,
315
+ metadata: null
316
+ };
317
+ }));
318
+ const finalTokens = await Promise.all(metadataPromises);
319
+ tokens.push(...finalTokens);
326
320
  }
327
- return {
328
- tokenId: params.tokenId,
329
- tokenUri,
330
- metadata
331
- };
332
- }
333
- catch (error) {
334
- console.error('Error getting token metadata:', error);
335
- return {
336
- tokenId: params.tokenId,
337
- tokenUri: null,
338
- metadata: null
339
- };
340
321
  }
322
+ return {
323
+ accountAddress: params.accountAddress,
324
+ contractAddress: params.contractAddress,
325
+ totalBalance: tokens.reduce((sum, token) => sum + token.balance, 0),
326
+ tokensRetrieved: tokens.length,
327
+ tokens,
328
+ note: errors.length > 0 ? `${errors.length} tokens failed to load` : undefined
329
+ };
330
+ }
331
+ emptyCollection(params, note) {
332
+ return {
333
+ accountAddress: params.accountAddress,
334
+ contractAddress: params.contractAddress,
335
+ totalBalance: 0,
336
+ tokensRetrieved: 0,
337
+ tokens: [],
338
+ note
339
+ };
340
+ }
341
+ clearCache() {
342
+ this.cache.clear();
341
343
  }
342
344
  }
343
345
 
344
346
  /**
345
- * MetadataDomainService - Clean IPFS metadata resolution
347
+ * MetadataDomainService - Clean IPFS metadata resolution with centralized caching
346
348
  */
347
349
  class MetadataDomainService {
348
350
  constructor(ipfsApi) {
349
351
  this.ipfsApi = ipfsApi;
352
+ this.cache = index.globalCacheService.createNamespace('metadata');
350
353
  }
351
354
  async fetchAndProcessMetadata(tokenUri, chainId) {
352
- return this.ipfsApi.fetchAndProcessMetadata(tokenUri, chainId);
355
+ const cacheKey = `fetch:${tokenUri}:${chainId}`;
356
+ return this.cache.getOrSet(cacheKey, async () => {
357
+ try {
358
+ return await this.ipfsApi.fetchAndProcessMetadata(tokenUri, chainId);
359
+ }
360
+ catch (error) {
361
+ console.error(`Error fetching metadata for ${tokenUri}:`, error);
362
+ return null;
363
+ }
364
+ }, index.CacheTTL.METADATA);
353
365
  }
354
366
  async resolveIPFSUrl(url, chainId) {
355
- return this.ipfsApi.resolveIPFSUrl(url, chainId);
367
+ const cacheKey = `resolve:${url}:${chainId}`;
368
+ return this.cache.getOrSet(cacheKey, () => this.ipfsApi.resolveIPFSUrl(url, chainId), index.CacheTTL.GATEWAY);
369
+ }
370
+ /**
371
+ * Clear all cached metadata and URLs for this service
372
+ */
373
+ clearCache() {
374
+ this.cache.clear();
356
375
  }
357
376
  }
358
377
 
@@ -425,16 +444,7 @@ class Web3ApplicationService {
425
444
  * Get balance and metadata for a specific token
426
445
  */
427
446
  async getSpecificTokenBalance(request) {
428
- if (!request.tokenId) {
429
- return this.tokenDomainService.getTokenBalance({
430
- accountAddress: request.accountAddress || '',
431
- contractAddress: request.contractAddress,
432
- abi: request.abi,
433
- tokenId: '',
434
- chainId: request.chainId
435
- });
436
- }
437
- return this.tokenDomainService.getTokenWithMetadata({
447
+ return this.tokenDomainService.getSpecificTokenBalance({
438
448
  accountAddress: request.accountAddress || '',
439
449
  contractAddress: request.contractAddress,
440
450
  abi: request.abi,
@@ -554,4 +564,4 @@ exports.Web3ApplicationService = Web3ApplicationService;
554
564
  exports.Web3InfrastructureApi = Web3InfrastructureApi;
555
565
  exports.getExplorerUrl = getExplorerUrl;
556
566
  exports.getExplorerUrlByChainId = getExplorerUrlByChainId;
557
- //# sourceMappingURL=explorer.utils-GpskbLl1.cjs.map
567
+ //# sourceMappingURL=explorer.utils-BfWBpq26.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explorer.utils-BfWBpq26.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":";;;;;AASA;;;AAGG;MACU,qBAAqB,CAAA;AAEhC,IAAA,WAAA,CAAoB,gBAAkC,EAAA;QAAlC,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;IAAqB;IAEzD,MAAM,eAAe,CAAC,OAMrB,EAAA;AACC,QAAA,IAAI;AACF,YAAA,IAAG,OAAO,CAAC,OAAO,KAAK,IAAI;gBAAE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE;AACzE,YAAA,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,OAAO,CAAC,OAAO,CAAC;AAE9F,YAAA,OAAO,CAAC,GAAG,CAAC,2EAA2E,EAAE,cAAc,CAAC;AACxG,YAAA,MAAM,QAAQ,GAAGA,yBAAkB,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC;AAEzF,YAAA,OAAO,MAAMC,6BAAsB,CAAC,QAAQ,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC;QACxF;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,mCAAmC,OAAO,CAAC,cAAc,CAAA,KAAA,EAAQ,OAAO,CAAC,eAAe,CAAA,aAAA,EAAgB,OAAO,CAAC,OAAO,qBAAqB,EAAE,KAAK,CAAC;AAClK,YAAA,OAAO,CAAC;QACV;IACF;IAEA,MAAM,WAAW,CAAC,OAKjB,EAAA;AACC,QAAA,IAAI;AACF,YAAA,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,OAAO,CAAC,OAAO,CAAC;AAC9F,YAAA,MAAM,QAAQ,GAAGD,yBAAkB,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,GAAU,EAAE,cAAqB,CAAC;YAEvG,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;YACvC,MAAM,QAAQ,GAAG,MAAME,kBAAW,CAAC,QAAQ,EAAE,OAAO,CAAC;AAErD,YAAA,OAAO,MAAM,CAAC,QAAQ,CAAC;QACzB;QAAE,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,CAAA,oCAAA,EAAuC,OAAO,CAAC,OAAO,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC;AAC/E,YAAA,MAAM,KAAK;QACb;IACF;IAEA,MAAM,sBAAsB,CAAC,OAM5B,EAAA;AACC,QAAA,IAAI;AACF,YAAA,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,OAAO,CAAC,OAAO,CAAC;AAC9F,YAAA,MAAM,aAAa,GAAGF,yBAAkB,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,GAAU,EAAE,cAAqB,CAAC;AAE5G,YAAA,MAAM,OAAO,GAAG,MAAMG,6BAAsB,CAAC,aAAa,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC;AACvG,YAAA,OAAO,MAAM,CAAC,OAAO,CAAC;QACxB;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,CAAA,6BAAA,EAAgC,OAAO,CAAC,UAAU,CAAA,KAAA,EAAQ,OAAO,CAAC,cAAc,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC;AACzG,YAAA,MAAM,KAAK;QACb;IACF;AACD;;ACzED;;;AAGG;MACU,qBAAqB,CAAA;AAIhC,IAAA,WAAA,CAAoB,gBAAkC,EAAA;QAAlC,IAAA,CAAA,gBAAgB,GAAhB,gBAAgB;QAHnB,IAAA,CAAA,wBAAwB,GAAG,qBAAqB;AACzD,QAAA,IAAA,CAAA,KAAK,GAAGC,wBAAkB,CAAC,eAAe,CAAC,MAAM,CAAC;IAED;IAEzD,MAAM,oBAAoB,CAAC,OAAe,EAAA;AACxC,QAAA,MAAM,QAAQ,GAAG,CAAA,QAAA,EAAW,OAAO,EAAE;QAErC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxB,QAAQ,EACR,YAAW;AACT,YAAA,IAAI;gBACF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,OAAO,CAAC;AAC5E,gBAAA,OAAO,SAAS,CAAC,iBAAiB,IAAI,IAAI,CAAC,wBAAwB;YACrE;YAAE,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,IAAI,CAAC,CAAA,qCAAA,EAAwC,OAAO,CAAA,6BAAA,CAA+B,EAAE,KAAK,CAAC;gBACnG,OAAO,IAAI,CAAC,wBAAwB;YACtC;AACF,QAAA,CAAC,EACDC,cAAQ,CAAC,OAAO,CACjB;IACH;AAEA,IAAA,MAAM,cAAc,CAAC,GAAW,EAAE,OAAe,EAAA;AAC/C,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;YAC7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;YACxD,OAAO,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAA,QAAA,EAAW,OAAO,CAAA,MAAA,CAAQ,CAAC;QAC3D;AACA,QAAA,OAAO,GAAG;IACZ;AAEA,IAAA,MAAM,uBAAuB,CAAC,QAAgB,EAAE,OAAe,EAAA;AAC7D,QAAA,IAAI;YACF,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC;AAChE,YAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC;AACzC,YAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAChB,MAAM,IAAI,KAAK,CAAC,CAAA,oBAAA,EAAuB,QAAQ,CAAC,MAAM,CAAA,CAAE,CAAC;YAC3D;AAEA,YAAA,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE;;YAGtC,OAAO;AACL,gBAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE;AACzB,gBAAA,WAAW,EAAE,QAAQ,CAAC,WAAW,IAAI,EAAE;gBACvC,KAAK,EAAE,QAAQ,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,GAAG,EAAE;AAC/E,gBAAA,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,EAAE;gBACrC,aAAa,EAAE,QAAQ,CAAC,aAAa,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,GAAG,SAAS;AAC9G,gBAAA,YAAY,EAAE,QAAQ,CAAC,YAAY,IAAI;aACxC;QACH;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC;AAChD,YAAA,OAAO,IAAI;QACb;IACF;IAEA,MAAM,YAAY,CAAC,GAAW,EAAA;AAC5B,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC;AAEjC,YAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;gBAChB,MAAM,IAAI,KAAK,CAAC,CAAA,qBAAA,EAAwB,GAAG,CAAA,EAAA,EAAK,QAAQ,CAAC,UAAU,CAAA,CAAE,CAAC;YACxE;AAEA,YAAA,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE;QAC9B;QAAE,OAAO,KAAK,EAAE;YACd,OAAO,CAAC,KAAK,CAAC,CAAA,wBAAA,EAA2B,GAAG,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC;AACvD,YAAA,MAAM,KAAK;QACb;IACF;AAEA;;AAEG;IACI,UAAU,GAAA;AACf,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;IACpB;AACD;;AC7ED;AAEA;;AAEG;MACU,kBAAkB,CAAA;AAG7B,IAAA,WAAA,CACU,OAA8B,EAC9B,eAAsC,EACtC,eAAsC,EAAA;QAFtC,IAAA,CAAA,OAAO,GAAP,OAAO;QACP,IAAA,CAAA,eAAe,GAAf,eAAe;QACf,IAAA,CAAA,eAAe,GAAf,eAAe;AALjB,QAAA,IAAA,CAAA,KAAK,GAAGD,wBAAkB,CAAC,eAAe,CAAC,cAAc,CAAC;IAOlE;IAEA,MAAM,eAAe,CAAC,MAMrB,EAAA;QACC,MAAM,GAAG,GAAGE,4BAAqB,CAAC,MAAM,CAAC,GAAG,CAAC;AAC7C,QAAA,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAC,GAAG,MAAM,EAAE,GAAG,EAAC,CAAC;QAEpE,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,OAAO;YACP,UAAU,EAAE,OAAO,GAAG,CAAC;AACvB,YAAA,QAAQ,EAAE;SACX;IACH;IAEA,MAAM,gBAAgB,CAAC,MAKtB,EAAA;AAKC,QAAA,MAAM,QAAQ,GAAG,CAAA,SAAA,EAAY,MAAM,CAAC,eAAe,CAAA,CAAA,EAAI,MAAM,CAAC,OAAO,CAAA,CAAA,EAAI,MAAM,CAAC,OAAO,EAAE;QAEzF,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAW;AAC9C,YAAA,IAAI;gBACF,MAAM,GAAG,GAAGA,4BAAqB,CAAC,MAAM,CAAC,GAAG,CAAC;AAC7C,gBAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,EAAC,GAAG,MAAM,EAAE,GAAG,EAAC,CAAC;gBAEjE,MAAM,QAAQ,GAAG;AACf,sBAAE,MAAM,IAAI,CAAC,eAAe,CAAC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO;sBAC3E,IAAI;gBAER,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;YACxD;YAAE,OAAO,KAAK,EAAE;AACd,gBAAA,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC;AACtD,gBAAA,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE;YACpE;AACF,QAAA,CAAC,EAAED,cAAQ,CAAC,QAAQ,CAAC;IACvB;IAEA,MAAM,mBAAmB,CAAC,MAMzB,EAAA;QACC,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AACxD,YAAA,IAAI,CAAC,eAAe,CAAC,EAAC,GAAG,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAC,CAAC;AAC1D,YAAA,IAAI,CAAC,gBAAgB,CAAC,MAAM;AAC7B,SAAA,CAAC;QAEF,OAAO;AACL,YAAA,GAAG,aAAa;YAChB,QAAQ,EAAE,cAAc,CAAC;SAC1B;IACH;IAEA,MAAM,uBAAuB,CAAC,MAM7B,EAAA;;AAEC,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACnB,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,EAAC,GAAG,MAAM,EAAE,OAAO,EAAE,IAAI,EAAC,CAAC;QACzD;;AAGA,QAAA,OAAO,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC;IACzC;IAEA,MAAM,kBAAkB,CAAC,MAQxB,EAAA;;QAEC,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;YACrD,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,2CAA2C,CAAC;QAClF;AAEA,QAAA,IAAI;YACF,MAAM,GAAG,GAAGC,4BAAqB,CAAC,MAAM,CAAC,GAAG,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,GAAG,CAAC;AAC1D,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;;AAGvD,YAAA,IAAI,QAAQ,CAAC,SAAS,EAAE;AACtB,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE;oBAC5B,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,+CAA+C,CAAC;gBACtF;AACA,gBAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC;YAC/E;;AAGA,YAAA,IAAI,QAAQ,CAAC,QAAQ,EAAE;AACrB,gBAAA,IAAI,QAAQ,CAAC,cAAc,EAAE;AAC3B,oBAAA,MAAM,EAAC,QAAQ,EAAE,SAAS,EAAC,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,GAAG,CAAC;AAE7E,oBAAA,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE;AACzB,wBAAA,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,GAAG,0BAA0B,GAAG,iBAAiB,CAAC;oBACjG;AAEA,oBAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;gBACvE;AAAO,qBAAA,IAAI,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE;AAClC,oBAAA,OAAO,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;gBAC9E;qBAAO;oBACL,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,yDAAyD,CAAC;gBAChG;YACF;AAEA,YAAA,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAA,oCAAA,EAAuC,QAAQ,CAAC,QAAQ,cAAc,QAAQ,CAAC,SAAS,CAAA,CAAA,CAAG,CAAC;QAClI;QAAE,OAAO,KAAK,EAAE;AACd,YAAA,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,GAAG,KAAK,CAAC,OAAO,GAAG,eAAe;AACxE,YAAA,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC;YACnD,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAA,6BAAA,EAAgC,OAAO,CAAA,CAAE,CAAC;QAChF;IACF;AAEA;;AAEG;AACK,IAAA,MAAM,uBAAuB,CAAC,MAKrC,EAAE,GAAc,EAAA;AACf,QAAA,MAAM,iBAAiB,GAAG,CAAA,UAAA,EAAa,MAAM,CAAC,eAAe,CAAA,CAAA,EAAI,MAAM,CAAC,cAAc,CAAA,CAAA,EAAI,MAAM,CAAC,OAAO,EAAE;;QAG1G,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;AACxD,YAAA,GAAG,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE;AAC1B,SAAA,CAAC;AAEF,QAAA,IAAI,cAAc,KAAK,CAAC,EAAE;;AAExB,YAAA,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC;YACpC,OAAO,EAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAC;QACzC;;QAGA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA2D,iBAAiB,CAAC;AAC1G,QAAA,MAAM,QAAQ,GAAG,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,QAAQ;AAElE,QAAA,IAAI,MAAM,IAAI,QAAQ,GAAGD,cAAQ,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,KAAK,cAAc,EAAE;YAC5E,OAAO,EAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAC;QACrD;;AAGA,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,IAAI,cAAc,EAAE,cAAc,EAAE,GAAG,CAAC;AACnF,QAAA,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,EAAE,SAAS,CAAC;;QAG5E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAC,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAC,EAAEA,cAAQ,CAAC,KAAK,CAAC;AAE7G,QAAA,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAC;IACrC;AAEQ,IAAA,MAAM,wBAAwB,CAAC,MAItC,EAAE,GAAc,EAAE,SAAiB,EAAA;;AAElC,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAC,MAAM,EAAE,SAAS,EAAC,EAAE,CAAC,CAAC,EAAE,CAAC,KAAI;AACxD,YAAA,MAAM,mBAAmB,GAAG,CAAA,YAAA,EAAe,MAAM,CAAC,eAAe,CAAA,CAAA,EAAI,MAAM,CAAC,cAAc,IAAI,CAAC,CAAA,CAAA,EAAI,MAAM,CAAC,OAAO,EAAE;AAEnH,YAAA,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxB,mBAAmB,EACnB,MAAM,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;AACxC,gBAAA,GAAG,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE;AAC7B,aAAA,CAAC,CAAC,KAAK,CAAC,KAAK,IAAG;;AAEf,gBAAA,OAAO,IAAI;AACb,YAAA,CAAC,CAAC,EACFA,cAAQ,CAAC,KAAK;aACf;AACH,QAAA,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC3C,QAAA,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAmB,EAAE,KAAK,IAAI,CAAC;IAC1D;IAEQ,MAAM,iBAAiB,CAAC,MAK/B,EAAE,QAAkB,EAAE,SAAiB,EAAE,aAAqC,EAAA;QAC7E,MAAM,MAAM,GAAmB,EAAE;QACjC,MAAM,MAAM,GAAa,EAAE;;AAG3B,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE;AACnD,YAAA,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;;YAG9C,MAAM,eAAe,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,IAAG;AAC1C,gBAAA,IAAI,aAAa,KAAK,SAAS,EAAE;;oBAE/B,OAAO,OAAO,CAAC,OAAO,CAAC;wBACrB,OAAO;AACP,wBAAA,OAAO,EAAE,CAAC;AACV,wBAAA,UAAU,EAAE,IAAI;AAChB,wBAAA,QAAQ,EAAE;AACX,qBAAA,CAAC;gBACJ;qBAAO;;oBAEL,OAAO,IAAI,CAAC,eAAe,CAAC,EAAC,GAAG,MAAM,EAAE,OAAO,EAAC;yBAC7C,KAAK,CAAC,KAAK,IAAG;wBACb,MAAM,CAAC,IAAI,CAAC,CAAA,EAAG,OAAO,CAAA,EAAA,EAAK,KAAK,CAAC,OAAO,CAAA,CAAE,CAAC;AAC3C,wBAAA,OAAO,IAAI;AACb,oBAAA,CAAC,CAAC;gBACN;AACF,YAAA,CAAC,CAAC;YAEF,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;AACzD,YAAA,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,KAAK,KAC9C,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,UAAU,CACnC;;AAGD,YAAA,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE;AAC1B,gBAAA,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,IAC5C,IAAI,CAAC,gBAAgB,CAAC;oBACpB,eAAe,EAAE,MAAM,CAAC,eAAe;oBACvC,GAAG,EAAE,MAAM,CAAC,GAAG;oBACf,OAAO,EAAE,KAAK,CAAC,OAAQ;oBACvB,OAAO,EAAE,MAAM,CAAC;iBACjB;AACA,qBAAA,IAAI,CAAC,QAAQ,KAAK;oBACjB,OAAO,EAAE,KAAK,CAAC,OAAQ;oBACvB,OAAO,EAAE,KAAK,CAAC,OAAO;oBACtB,UAAU,EAAE,KAAK,CAAC,UAAU;oBAC5B,QAAQ,EAAE,QAAQ,CAAC;AACH,iBAAA,CAAA;qBACjB,KAAK,CAAC,KAAK,IAAG;AACb,oBAAA,OAAO,CAAC,IAAI,CAAC,CAAA,0BAAA,EAA6B,KAAK,CAAC,OAAO,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC,OAAO,CAAC;oBAC1E,OAAO;wBACL,OAAO,EAAE,KAAK,CAAC,OAAQ;wBACvB,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,UAAU,EAAE,KAAK,CAAC,UAAU;AAC5B,wBAAA,QAAQ,EAAE;qBACK;gBACnB,CAAC,CAAC,CACH;gBAED,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;AACvD,gBAAA,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;YAC7B;QACF;QAEA,OAAO;YACL,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,eAAe,EAAE,MAAM,CAAC,eAAe;AACvC,YAAA,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;YACnE,eAAe,EAAE,MAAM,CAAC,MAAM;YAC9B,MAAM;AACN,YAAA,IAAI,EAAE,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,CAAA,EAAG,MAAM,CAAC,MAAM,wBAAwB,GAAG;SACtE;IACH;IAEQ,eAAe,CAAC,MAGvB,EAAE,IAAa,EAAA;QACd,OAAO;YACL,cAAc,EAAE,MAAM,CAAC,cAAc;YACrC,eAAe,EAAE,MAAM,CAAC,eAAe;AACvC,YAAA,YAAY,EAAE,CAAC;AACf,YAAA,eAAe,EAAE,CAAC;AAClB,YAAA,MAAM,EAAE,EAAE;YACV;SACD;IACH;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;IACpB;AACD;;ACzTD;;AAEG;MACU,qBAAqB,CAAA;AAGhC,IAAA,WAAA,CAAoB,OAA8B,EAAA;QAA9B,IAAA,CAAA,OAAO,GAAP,OAAO;AAFnB,QAAA,IAAA,CAAA,KAAK,GAAGD,wBAAkB,CAAC,eAAe,CAAC,UAAU,CAAC;IAET;AAErD,IAAA,MAAM,uBAAuB,CAAC,QAAgB,EAAE,OAAe,EAAA;AAC7D,QAAA,MAAM,QAAQ,GAAG,CAAA,MAAA,EAAS,QAAQ,CAAA,CAAA,EAAI,OAAO,EAAE;QAE/C,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxB,QAAQ,EACR,YAAW;AACT,YAAA,IAAI;gBACF,OAAO,MAAM,IAAI,CAAC,OAAO,CAAC,uBAAuB,CAAC,QAAQ,EAAE,OAAO,CAAC;YACtE;YAAE,OAAO,KAAK,EAAE;gBACd,OAAO,CAAC,KAAK,CAAC,CAAA,4BAAA,EAA+B,QAAQ,CAAA,CAAA,CAAG,EAAE,KAAK,CAAC;AAChE,gBAAA,OAAO,IAAI;YACb;AACF,QAAA,CAAC,EACDC,cAAQ,CAAC,QAAQ,CAClB;IACH;AAEA,IAAA,MAAM,cAAc,CAAC,GAAW,EAAE,OAAe,EAAA;AAC/C,QAAA,MAAM,QAAQ,GAAG,CAAA,QAAA,EAAW,GAAG,CAAA,CAAA,EAAI,OAAO,EAAE;QAE5C,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CACxB,QAAQ,EACR,MAAM,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,EAC/CA,cAAQ,CAAC,OAAO,CACjB;IACH;AAEA;;AAEG;IACI,UAAU,GAAA;AACf,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;IACpB;AACD;;AC3CD;;AAEG;MACU,qBAAqB,CAAA;AAChC,IAAA,WAAA,GAAA,EAAe;AAEf,IAAA,eAAe,CAAC,GAAc,EAAA;AAU5B,QAAA,GAAG,GAAGC,4BAAqB,CAAC,GAAG,CAAC;AAChC,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,GAAG,CAAC,IAAI,IAAK,IAAY,CAAC,IAAI,CAAC;;QAGtG,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;QAC9C,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;QAChD,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;AACxD,QAAA,MAAM,QAAQ,GAAG,UAAU,IAAI,WAAW,IAAI,eAAe;;QAG7D,MAAM,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC;QAC5D,MAAM,wBAAwB,GAAG,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAC1E,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;AACtC,QAAA,MAAM,SAAS,GAAG,iBAAiB,IAAI,wBAAwB,IAAI,MAAM;QAEzE,OAAO;AACL,YAAA,cAAc,EAAE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;YACnF,UAAU;AACV,YAAA,YAAY,EAAE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC3C,WAAW;AACX,YAAA,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC;AAC7E,YAAA,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;YACvC,QAAQ;YACR;SACD;IACH;AACD;;ACVD;;;;AAIG;MACU,sBAAsB,CAAA;IAKjC,WAAA,CACE,OAA8B,EAC9B,OAA8B,EAAA;;AAsDf,QAAA,IAAA,CAAA,cAAc,GAAmB;AAChD,YAAA,eAAe,EAAE,CAAC,WAAW,MAAM;AACjC,gBAAA,IAAI,EAAE,WAAW,CAAC,IAAI,IAAI,EAAE;AAC5B,gBAAA,WAAW,EAAE,WAAW,CAAC,WAAW,IAAI,EAAE;AAC1C,gBAAA,QAAQ,EAAE,WAAW,CAAC,KAAK,IAAI,EAAE;gBACjC,WAAW,EAAE,WAAW,CAAC,YAAY;gBACrC,YAAY,EAAE,WAAW,CAAC,aAAa;gBACvC,qBAAqB,EAAE,SAAS;AAChC,gBAAA,UAAU,EAAE,WAAW,CAAC,UAAU,IAAI,EAAE;AACxC,gBAAA,GAAG;aACJ,CAAC;AAEF,YAAA,aAAa,EAAE,CAAC,QAAQ,MAAM;gBAC5B,IAAI,EAAE,QAAQ,CAAC,IAAI;gBACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;gBACjC,KAAK,EAAE,QAAQ,CAAC,QAAQ;gBACxB,aAAa,EAAE,QAAQ,CAAC,YAAY;gBACpC,YAAY,EAAE,QAAQ,CAAC,WAAW;gBAClC,UAAU,EAAE,QAAQ,CAAC,UAAU;AAC/B,gBAAA,GAAG,MAAM,CAAC,WAAW,CACnB,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KACpC,CAAC,CAAC,MAAM,EAAE,aAAa,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,uBAAuB,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CACzH;aAEJ;SACF;;AA5EC,QAAA,IAAI,CAAC,qBAAqB,GAAG,IAAI,qBAAqB,EAAE;QACxD,IAAI,CAAC,qBAAqB,GAAG,IAAI,qBAAqB,CAAC,OAAO,CAAC;AAC/D,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,kBAAkB,CAC9C,OAAO,EACP,IAAI,CAAC,qBAAqB,EAC1B,IAAI,CAAC,qBAAqB,CAC3B;IACH;AAEA;;AAEG;IACH,MAAM,uBAAuB,CAAC,OAA4B,EAAA;AACxD,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,uBAAuB,CAAC;AACrD,YAAA,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;YAC5C,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,GAAG,EAAE,OAAO,CAAC,GAAG;AAChB,YAAA,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,OAAO,EAAE,OAAO,CAAC;AAClB,SAAA,CAAC;IACJ;AAEA;;AAEG;IACH,MAAM,gBAAgB,CAAC,OAA4B,EAAA;QACjD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC;YAClE,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,GAAG,EAAE,OAAO,CAAC,GAAG;AAChB,YAAA,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC9B,OAAO,EAAE,OAAO,CAAC;AAClB,SAAA,CAAC;QAEF,OAAO,YAAY,CAAC,QAAQ;IAC9B;AAEA;;AAEG;IACH,MAAM,kBAAkB,CAAC,OAA+B,EAAA;AACtD,QAAA,OAAO,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC;AAChD,YAAA,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,EAAE;YAC5C,eAAe,EAAE,OAAO,CAAC,eAAe;YACxC,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,OAAO,CAAC;AACnB,SAAA,CAAC;IACJ;AA8BA;;AAEG;AACH,IAAA,MAAM,cAAc,CAAC,GAAW,EAAE,OAAe,EAAA;QAC/C,OAAO,IAAI,CAAC,qBAAqB,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC;IAChE;AAEA;;AAEG;AACH,IAAA,MAAM,uBAAuB,CAAC,QAAgB,EAAE,OAAe,EAAA;AAC7D,QAAA,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,uBAAuB,CAAC,QAAQ,EAAE,OAAO,CAAC;AAClG,QAAA,IAAI,CAAC,cAAc;AAAE,YAAA,OAAO,IAAI;;QAGhC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,eAAe,CAAC,cAAc,CAAC;;QAGzE,IAAI,aAAa,CAAC,YAAY,EAAE,UAAU,CAAC,SAAS,CAAC,EAAE;YACrD,OAAO;AACL,gBAAA,GAAG,aAAa;gBAChB,qBAAqB,EAAE,MAAM,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,YAAY,EAAE,OAAO;aACrF;QACH;AAEA,QAAA,OAAO,aAAa;IACtB;AACD;;ACxJD;;;;;;;AAOG;SACa,cAAc,CAC5B,SAA2B,EAC3B,OAAe,EACf,IAAsB,EAAA;AAEtB,IAAA,IAAI,SAAS,EAAE,WAAW,EAAE;QAC1B,OAAO,CAAA,EAAG,SAAS,CAAC,WAAW,IAAI,IAAI,CAAA,CAAA,EAAI,OAAO,CAAA,CAAE;IACtD;;AAGA,IAAA,MAAM,OAAO,GAAG,SAAS,EAAE,OAAO;IAClC,IAAI,GAAG,GAAG,EAAE;IACZ,QAAQ,OAAO;AACb,QAAA,KAAK,CAAC;AACJ,YAAA,GAAG,GAAG,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,EAAI,OAAO,EAAE;YAC/C;AACF,QAAA,KAAK,CAAC;AACJ,YAAA,GAAG,GAAG,CAAA,6BAAA,EAAgC,IAAI,CAAA,CAAA,EAAI,OAAO,EAAE;YACvD;AACF,QAAA,KAAK,EAAE;AACL,YAAA,GAAG,GAAG,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAA,EAAI,OAAO,EAAE;YAC9C;AACF,QAAA,KAAK,EAAE;AACL,YAAA,GAAG,GAAG,CAAA,4BAAA,EAA+B,IAAI,CAAA,CAAA,EAAI,OAAO,EAAE;YACtD;AACF,QAAA,KAAK,GAAG;AACN,YAAA,GAAG,GAAG,CAAA,wCAAA,EAA2C,IAAI,CAAA,CAAA,EAAI,OAAO,EAAE;YAClE;AACF,QAAA,KAAK,KAAK;AACR,YAAA,GAAG,GAAG,CAAA,uCAAA,EAA0C,IAAI,CAAA,CAAA,EAAI,OAAO,EAAE;YACjE;AACF,QAAA,KAAK,KAAK;AACR,YAAA,GAAG,GAAG,CAAA,4BAAA,EAA+B,IAAI,CAAA,CAAA,EAAI,OAAO,EAAE;YACtD;AACF,QAAA;AACE,YAAA,GAAG,GAAG,CAAA,qBAAA,EAAwB,IAAI,CAAA,CAAA,EAAI,OAAO,EAAE;;AAEnD,IAAA,OAAO,GAAG;AACZ;AAEA;;;;;;;;AAQG;AACI,eAAe,uBAAuB,CAC3C,YAA4D,EAC5D,OAAe,EACf,OAAe,EACf,IAAsB,EAAA;AAEtB,IAAA,MAAM,SAAS,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC;IAC7C,OAAO,cAAc,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,CAAC;AACjD;;;;;;;;"}