@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.
- package/dist/chunks/{explorer.utils-GpskbLl1.cjs → explorer.utils-BfWBpq26.cjs} +224 -214
- package/dist/chunks/explorer.utils-BfWBpq26.cjs.map +1 -0
- package/dist/chunks/{explorer.utils-Ckll15ja.js → explorer.utils-O4TGwQB1.js} +224 -214
- package/dist/chunks/explorer.utils-O4TGwQB1.js.map +1 -0
- package/dist/chunks/index-60201NKa.js +265 -0
- package/dist/chunks/index-60201NKa.js.map +1 -0
- package/dist/chunks/index-CcQkbZBZ.cjs +269 -0
- package/dist/chunks/index-CcQkbZBZ.cjs.map +1 -0
- package/dist/chunks/{pers-sdk-DOuNyWFC.js → pers-sdk-CpK-yTid.js} +31 -99
- package/dist/chunks/pers-sdk-CpK-yTid.js.map +1 -0
- package/dist/chunks/{pers-sdk-kb7j1DVU.cjs → pers-sdk-nfljnU3z.cjs} +35 -103
- package/dist/chunks/pers-sdk-nfljnU3z.cjs.map +1 -0
- package/dist/chunks/{web3-chain-service-D75TcHkh.cjs → web3-chain-service-CCs1U95-.cjs} +191 -109
- package/dist/chunks/web3-chain-service-CCs1U95-.cjs.map +1 -0
- package/dist/chunks/{web3-chain-service-Dp5Z8p9I.js → web3-chain-service-DniirmTp.js} +190 -110
- package/dist/chunks/web3-chain-service-DniirmTp.js.map +1 -0
- package/dist/core/auth/default-auth-provider.d.ts.map +1 -1
- package/dist/core/auth/refresh-manager.d.ts.map +1 -1
- package/dist/core/auth/services/auth-service.d.ts +5 -0
- package/dist/core/auth/services/auth-service.d.ts.map +1 -1
- package/dist/core/cache/cache.service.d.ts +82 -0
- package/dist/core/cache/cache.service.d.ts.map +1 -0
- package/dist/core/cache/index.d.ts +13 -0
- package/dist/core/cache/index.d.ts.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/pers-api-client.d.ts.map +1 -1
- package/dist/core/pers-config.d.ts +4 -0
- package/dist/core/pers-config.d.ts.map +1 -1
- package/dist/core.cjs +7 -3
- package/dist/core.cjs.map +1 -1
- package/dist/core.js +4 -3
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +9 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +4 -3
- package/dist/index.js.map +1 -1
- package/dist/package.json +1 -1
- package/dist/web3/application/web3-application.service.d.ts.map +1 -1
- package/dist/web3/domain/models/index.d.ts +1 -1
- package/dist/web3/domain/models/index.d.ts.map +1 -1
- package/dist/web3/domain/services/metadata-domain.service.d.ts +6 -1
- package/dist/web3/domain/services/metadata-domain.service.d.ts.map +1 -1
- package/dist/web3/domain/services/token-domain.service.d.ts +30 -14
- package/dist/web3/domain/services/token-domain.service.d.ts.map +1 -1
- package/dist/web3/infrastructure/api/ipfs-api.d.ts +6 -1
- package/dist/web3/infrastructure/api/ipfs-api.d.ts.map +1 -1
- package/dist/web3/infrastructure/api/web3-api.d.ts.map +1 -1
- package/dist/web3-chain/api/web3-chain-api.d.ts +0 -1
- package/dist/web3-chain/api/web3-chain-api.d.ts.map +1 -1
- package/dist/web3-chain/services/getWeb3FCD.service.d.ts +2 -10
- package/dist/web3-chain/services/getWeb3FCD.service.d.ts.map +1 -1
- package/dist/web3-chain/services/web3-chain-service.d.ts +11 -5
- package/dist/web3-chain/services/web3-chain-service.d.ts.map +1 -1
- package/dist/web3-chain.cjs +2 -1
- package/dist/web3-chain.cjs.map +1 -1
- package/dist/web3-chain.js +2 -1
- package/dist/web3-chain.js.map +1 -1
- package/dist/web3.cjs +2 -1
- package/dist/web3.cjs.map +1 -1
- package/dist/web3.js +2 -1
- package/dist/web3.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunks/explorer.utils-Ckll15ja.js.map +0 -1
- package/dist/chunks/explorer.utils-GpskbLl1.cjs.map +0 -1
- package/dist/chunks/pers-sdk-DOuNyWFC.js.map +0 -1
- package/dist/chunks/pers-sdk-kb7j1DVU.cjs.map +0 -1
- package/dist/chunks/web3-chain-service-D75TcHkh.cjs.map +0 -1
- package/dist/chunks/web3-chain-service-Dp5Z8p9I.js.map +0 -1
- package/dist/web3-chain/services/ethers-provider.service.d.ts +0 -11
- package/dist/web3-chain/services/ethers-provider.service.d.ts.map +0 -1
- package/dist/web3-chain/services/public-http-provider.service.d.ts +0 -1
- package/dist/web3-chain/services/public-http-provider.service.d.ts.map +0 -1
- package/dist/web3-chain/services/web3-provider.service.d.ts +0 -1
- package/dist/web3-chain/services/web3-provider.service.d.ts.map +0 -1
|
@@ -1,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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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 -
|
|
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(
|
|
127
|
-
const
|
|
128
|
-
|
|
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:
|
|
142
|
+
tokenId: params.tokenId,
|
|
136
143
|
balance,
|
|
137
144
|
hasBalance: balance > 0,
|
|
138
145
|
metadata: null
|
|
139
146
|
};
|
|
140
147
|
}
|
|
141
|
-
async
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
|
|
184
|
+
// Input validation
|
|
185
|
+
if (!params.accountAddress || !params.contractAddress) {
|
|
186
|
+
return this.emptyCollection(params, 'Invalid accountAddress or contractAddress');
|
|
187
|
+
}
|
|
181
188
|
try {
|
|
182
|
-
const
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
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
|
-
|
|
196
|
-
|
|
197
|
-
if (
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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
|
-
|
|
210
|
-
|
|
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
|
-
|
|
243
|
-
|
|
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
|
-
|
|
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
|
-
|
|
302
|
-
|
|
303
|
-
|
|
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
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
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
|
-
|
|
322
|
-
|
|
323
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
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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"}
|