@explorins/pers-sdk 1.1.2 → 1.2.0
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/analytics/api/analytics-api.d.ts +17 -0
- package/dist/analytics/api/analytics-api.d.ts.map +1 -0
- package/{src/analytics/index.ts → dist/analytics/index.d.ts} +28 -52
- package/dist/analytics/index.d.ts.map +1 -0
- package/dist/analytics/models/index.d.ts +61 -0
- package/dist/analytics/models/index.d.ts.map +1 -0
- package/dist/analytics/services/analytics-service.d.ts +19 -0
- package/dist/analytics/services/analytics-service.d.ts.map +1 -0
- package/dist/analytics.cjs +76 -0
- package/dist/analytics.cjs.map +1 -0
- package/dist/analytics.js +72 -0
- package/dist/analytics.js.map +1 -0
- package/dist/auth-admin/api/auth-admin-api.d.ts +27 -0
- package/dist/auth-admin/api/auth-admin-api.d.ts.map +1 -0
- package/dist/auth-admin/index.d.ts +26 -0
- package/dist/auth-admin/index.d.ts.map +1 -0
- package/dist/auth-admin/services/auth-admin-service.d.ts +23 -0
- package/dist/auth-admin/services/auth-admin-service.d.ts.map +1 -0
- package/dist/auth-admin.cjs +96 -0
- package/dist/auth-admin.cjs.map +1 -0
- package/dist/auth-admin.js +92 -0
- package/dist/auth-admin.js.map +1 -0
- package/dist/business/api/business-api.d.ts +133 -0
- package/dist/business/api/business-api.d.ts.map +1 -0
- package/dist/business/index.d.ts +34 -0
- package/dist/business/index.d.ts.map +1 -0
- package/dist/business/models/index.d.ts +8 -0
- package/dist/business/models/index.d.ts.map +1 -0
- package/dist/business/services/business-service.d.ts +51 -0
- package/dist/business/services/business-service.d.ts.map +1 -0
- package/dist/business.cjs +303 -0
- package/dist/business.cjs.map +1 -0
- package/dist/business.js +299 -0
- package/dist/business.js.map +1 -0
- package/dist/campaign/api/campaign-api.d.ts +213 -0
- package/dist/campaign/api/campaign-api.d.ts.map +1 -0
- package/dist/campaign/index.d.ts +44 -0
- package/dist/campaign/index.d.ts.map +1 -0
- package/dist/campaign/services/campaign-service.d.ts +88 -0
- package/dist/campaign/services/campaign-service.d.ts.map +1 -0
- package/dist/campaign.cjs +506 -0
- package/dist/campaign.cjs.map +1 -0
- package/dist/campaign.js +502 -0
- package/dist/campaign.js.map +1 -0
- package/dist/core/abstractions/http-client.d.ts +22 -0
- package/dist/core/abstractions/http-client.d.ts.map +1 -0
- package/dist/core/auth/auth-provider.interface.d.ts +12 -0
- package/dist/core/auth/auth-provider.interface.d.ts.map +1 -0
- package/dist/core/auth/create-auth-provider.d.ts +27 -0
- package/dist/core/auth/create-auth-provider.d.ts.map +1 -0
- package/dist/core/auth/simple-auth-config.interface.d.ts +15 -0
- package/dist/core/auth/simple-auth-config.interface.d.ts.map +1 -0
- package/dist/core/index.d.ts +13 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/pers-api-client.d.ts +54 -0
- package/dist/core/pers-api-client.d.ts.map +1 -0
- package/dist/core/pers-config.d.ts +38 -0
- package/dist/core/pers-config.d.ts.map +1 -0
- package/dist/core/utils/jwt.function.d.ts +2 -0
- package/dist/core/utils/jwt.function.d.ts.map +1 -0
- package/dist/core.cjs +506 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.js +497 -0
- package/dist/core.js.map +1 -0
- package/dist/donation/api/donation-api.d.ts +18 -0
- package/dist/donation/api/donation-api.d.ts.map +1 -0
- package/dist/donation/index.d.ts +25 -0
- package/dist/donation/index.d.ts.map +1 -0
- package/{src/donation/models/index.ts → dist/donation/models/index.d.ts} +8 -11
- package/dist/donation/models/index.d.ts.map +1 -0
- package/dist/donation/services/donation-service.d.ts +19 -0
- package/dist/donation/services/donation-service.d.ts.map +1 -0
- package/dist/donation.cjs +78 -0
- package/dist/donation.cjs.map +1 -0
- package/dist/donation.js +74 -0
- package/dist/donation.js.map +1 -0
- package/dist/index.cjs +4217 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4164 -0
- package/dist/index.js.map +1 -0
- package/dist/package.json +129 -0
- package/dist/payment/api/payment-api.d.ts +105 -0
- package/dist/payment/api/payment-api.d.ts.map +1 -0
- package/dist/payment/index.d.ts +36 -0
- package/dist/payment/index.d.ts.map +1 -0
- package/dist/payment/models/index.d.ts +12 -0
- package/dist/payment/models/index.d.ts.map +1 -0
- package/dist/payment/services/payment-service.d.ts +40 -0
- package/dist/payment/services/payment-service.d.ts.map +1 -0
- package/dist/payment.cjs +258 -0
- package/dist/payment.cjs.map +1 -0
- package/dist/payment.js +254 -0
- package/dist/payment.js.map +1 -0
- package/dist/pers-sdk.d.ts +29 -0
- package/dist/pers-sdk.d.ts.map +1 -0
- package/dist/redemption/api/redemption-api.d.ts +147 -0
- package/dist/redemption/api/redemption-api.d.ts.map +1 -0
- package/dist/redemption/index.d.ts +35 -0
- package/dist/redemption/index.d.ts.map +1 -0
- package/dist/redemption/models/index.d.ts +8 -0
- package/dist/redemption/models/index.d.ts.map +1 -0
- package/dist/redemption/services/redemption-service.d.ts +56 -0
- package/dist/redemption/services/redemption-service.d.ts.map +1 -0
- package/dist/redemption.cjs +333 -0
- package/dist/redemption.cjs.map +1 -0
- package/dist/redemption.js +329 -0
- package/dist/redemption.js.map +1 -0
- package/dist/shared/interfaces/pers-shared-lib.interfaces.d.ts +18 -0
- package/dist/shared/interfaces/pers-shared-lib.interfaces.d.ts.map +1 -0
- package/dist/tenant/api/tenant-api.d.ts +56 -0
- package/dist/tenant/api/tenant-api.d.ts.map +1 -0
- package/dist/tenant/index.d.ts +34 -0
- package/dist/tenant/index.d.ts.map +1 -0
- package/dist/tenant/models/index.d.ts +11 -0
- package/dist/tenant/models/index.d.ts.map +1 -0
- package/dist/tenant/services/tenant-service.d.ts +46 -0
- package/dist/tenant/services/tenant-service.d.ts.map +1 -0
- package/dist/tenant.cjs +177 -0
- package/dist/tenant.cjs.map +1 -0
- package/dist/tenant.js +173 -0
- package/dist/tenant.js.map +1 -0
- package/dist/token/api/token-api.d.ts +64 -0
- package/dist/token/api/token-api.d.ts.map +1 -0
- package/dist/token/base/base-token-service.d.ts +87 -0
- package/dist/token/base/base-token-service.d.ts.map +1 -0
- package/dist/token/index.d.ts +13 -0
- package/dist/token/index.d.ts.map +1 -0
- package/dist/token/models/index.d.ts +18 -0
- package/dist/token/models/index.d.ts.map +1 -0
- package/dist/token/services/token-service.d.ts +68 -0
- package/dist/token/services/token-service.d.ts.map +1 -0
- package/dist/token/token-sdk.d.ts +140 -0
- package/dist/token/token-sdk.d.ts.map +1 -0
- package/dist/token.cjs +537 -0
- package/dist/token.cjs.map +1 -0
- package/dist/token.js +532 -0
- package/dist/token.js.map +1 -0
- package/dist/transaction/api/transaction-api.d.ts +133 -0
- package/dist/transaction/api/transaction-api.d.ts.map +1 -0
- package/dist/transaction/index.d.ts +38 -0
- package/dist/transaction/index.d.ts.map +1 -0
- package/dist/transaction/models/index.d.ts +42 -0
- package/dist/transaction/models/index.d.ts.map +1 -0
- package/dist/transaction/services/transaction-service.d.ts +56 -0
- package/dist/transaction/services/transaction-service.d.ts.map +1 -0
- package/dist/transaction.cjs +394 -0
- package/dist/transaction.cjs.map +1 -0
- package/dist/transaction.js +390 -0
- package/dist/transaction.js.map +1 -0
- package/dist/user/api/user-api.d.ts +56 -0
- package/dist/user/api/user-api.d.ts.map +1 -0
- package/dist/user/index.d.ts +36 -0
- package/dist/user/index.d.ts.map +1 -0
- package/{src/user/models/index.ts → dist/user/models/index.d.ts} +12 -10
- package/dist/user/models/index.d.ts.map +1 -0
- package/dist/user/services/user-service.d.ts +46 -0
- package/dist/user/services/user-service.d.ts.map +1 -0
- package/dist/user-status/api/user-status-api.d.ts +37 -0
- package/dist/user-status/api/user-status-api.d.ts.map +1 -0
- package/dist/user-status/index.d.ts +28 -0
- package/dist/user-status/index.d.ts.map +1 -0
- package/{src/user-status/models/index.ts → dist/user-status/models/index.d.ts} +8 -11
- package/dist/user-status/models/index.d.ts.map +1 -0
- package/dist/user-status/services/user-status-service.d.ts +26 -0
- package/dist/user-status/services/user-status-service.d.ts.map +1 -0
- package/dist/user-status.cjs +147 -0
- package/dist/user-status.cjs.map +1 -0
- package/dist/user-status.js +143 -0
- package/dist/user-status.js.map +1 -0
- package/dist/user.cjs +188 -0
- package/dist/user.cjs.map +1 -0
- package/dist/user.js +184 -0
- package/dist/user.js.map +1 -0
- package/dist/web3/api/web3-api.d.ts +27 -0
- package/dist/web3/api/web3-api.d.ts.map +1 -0
- package/dist/web3/index.d.ts +16 -0
- package/dist/web3/index.d.ts.map +1 -0
- package/dist/web3/models/index.d.ts +92 -0
- package/dist/web3/models/index.d.ts.map +1 -0
- package/dist/web3/services/web3-service.d.ts +21 -0
- package/dist/web3/services/web3-service.d.ts.map +1 -0
- package/dist/web3-chain/api/web3-chain-api.d.ts +19 -0
- package/dist/web3-chain/api/web3-chain-api.d.ts.map +1 -0
- package/dist/web3-chain/index.d.ts +17 -0
- package/dist/web3-chain/index.d.ts.map +1 -0
- package/{src/web3-chain/models/index.ts → dist/web3-chain/models/index.d.ts} +38 -45
- package/dist/web3-chain/models/index.d.ts.map +1 -0
- package/dist/web3-chain/services/getWeb3FCD.service.d.ts +8 -0
- package/dist/web3-chain/services/getWeb3FCD.service.d.ts.map +1 -0
- package/dist/web3-chain/services/provider.service.d.ts +15 -0
- package/dist/web3-chain/services/provider.service.d.ts.map +1 -0
- package/dist/web3-chain/services/public-http-provider.service.d.ts +8 -0
- package/dist/web3-chain/services/public-http-provider.service.d.ts.map +1 -0
- package/dist/web3-chain/services/web3-chain-service.d.ts +17 -0
- package/dist/web3-chain/services/web3-chain-service.d.ts.map +1 -0
- package/dist/web3-chain.cjs +316 -0
- package/dist/web3-chain.cjs.map +1 -0
- package/dist/web3-chain.js +310 -0
- package/dist/web3-chain.js.map +1 -0
- package/dist/web3.cjs +516 -0
- package/dist/web3.cjs.map +1 -0
- package/dist/web3.js +513 -0
- package/dist/web3.js.map +1 -0
- package/package.json +56 -72
- package/config/domains.js +0 -22
- package/explorins-pers-sdk-1.0.0-alpha.1.tgz +0 -0
- package/rollup.config.js +0 -74
- package/scripts/copy-declarations.js +0 -147
- package/src/analytics/api/analytics-api.ts +0 -24
- package/src/analytics/models/index.ts +0 -74
- package/src/analytics/services/analytics-service.ts +0 -28
- package/src/auth-admin/api/auth-admin-api.ts +0 -42
- package/src/auth-admin/index.ts +0 -47
- package/src/auth-admin/services/auth-admin-service.ts +0 -36
- package/src/business/api/business-api.ts +0 -234
- package/src/business/index.ts +0 -53
- package/src/business/models/index.ts +0 -13
- package/src/business/services/business-service.ts +0 -88
- package/src/campaign/api/campaign-api.ts +0 -376
- package/src/campaign/index.ts +0 -67
- package/src/campaign/services/campaign-service.ts +0 -164
- package/src/core/abstractions/http-client.ts +0 -24
- package/src/core/auth/auth-provider.interface.ts +0 -16
- package/src/core/auth/create-auth-provider.ts +0 -136
- package/src/core/auth/simple-auth-config.interface.ts +0 -15
- package/src/core/index.ts +0 -33
- package/src/core/pers-api-client.ts +0 -343
- package/src/core/pers-config.ts +0 -65
- package/src/core/utils/jwt.function.ts +0 -24
- package/src/donation/api/donation-api.ts +0 -24
- package/src/donation/index.ts +0 -47
- package/src/donation/services/donation-service.ts +0 -25
- package/src/index.ts +0 -55
- package/src/payment/api/payment-api.ts +0 -185
- package/src/payment/index.ts +0 -64
- package/src/payment/models/index.ts +0 -29
- package/src/payment/services/payment-service.ts +0 -70
- package/src/pers-sdk.ts +0 -45
- package/src/redemption/api/redemption-api.ts +0 -241
- package/src/redemption/index.ts +0 -60
- package/src/redemption/models/index.ts +0 -17
- package/src/redemption/services/redemption-service.ts +0 -103
- package/src/shared/interfaces/pers-shared-lib.interfaces.ts +0 -99
- package/src/tenant/api/tenant-api.ts +0 -92
- package/src/tenant/index.ts +0 -61
- package/src/tenant/models/index.ts +0 -20
- package/src/tenant/services/tenant-service.ts +0 -78
- package/src/token/api/token-api.ts +0 -129
- package/src/token/base/base-token-service.ts +0 -167
- package/src/token/index.ts +0 -38
- package/src/token/models/index.ts +0 -30
- package/src/token/services/token-service.ts +0 -125
- package/src/token/token-sdk.ts +0 -231
- package/src/transaction/api/transaction-api.ts +0 -296
- package/src/transaction/index.ts +0 -65
- package/src/transaction/models/index.ts +0 -60
- package/src/transaction/services/transaction-service.ts +0 -104
- package/src/user/api/user-api.ts +0 -98
- package/src/user/index.ts +0 -62
- package/src/user/services/user-service.ts +0 -75
- package/src/user-status/api/user-status-api.ts +0 -78
- package/src/user-status/index.ts +0 -55
- package/src/user-status/services/user-status-service.ts +0 -51
- package/src/web3/api/web3-api.ts +0 -68
- package/src/web3/index.ts +0 -38
- package/src/web3/models/index.ts +0 -150
- package/src/web3/services/web3-service.ts +0 -338
- package/src/web3-chain/api/web3-chain-api.ts +0 -42
- package/src/web3-chain/index.ts +0 -27
- package/src/web3-chain/services/getWeb3FCD.service.ts +0 -47
- package/src/web3-chain/services/provider.service.ts +0 -123
- package/src/web3-chain/services/public-http-provider.service.ts +0 -26
- package/src/web3-chain/services/web3-chain-service.ts +0 -131
- package/tsconfig.json +0 -28
package/dist/web3.js
ADDED
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
import { getSmartContractInstance, getAddressTokenBalanceByContract, getTokenUri, getTokenOfOwnerByIndex } from '@explorins/web3-ts';
|
|
2
|
+
import { jwtDecode } from 'jwt-decode';
|
|
3
|
+
import 'web3';
|
|
4
|
+
import 'ethers';
|
|
5
|
+
|
|
6
|
+
class Web3Api {
|
|
7
|
+
constructor(web3ChainService) {
|
|
8
|
+
this.web3ChainService = web3ChainService;
|
|
9
|
+
}
|
|
10
|
+
async getTokenBalance(request) {
|
|
11
|
+
const web3 = await this.web3ChainService.getWeb3ByChainId(request.chainId);
|
|
12
|
+
const tokenContract = getSmartContractInstance(request.contractAddress, request.abi, web3);
|
|
13
|
+
const balance = await getAddressTokenBalanceByContract(tokenContract, request.accountAddress, request.tokenId);
|
|
14
|
+
return Number(balance);
|
|
15
|
+
}
|
|
16
|
+
async getTokenUri(request) {
|
|
17
|
+
const web3 = await this.web3ChainService.getWeb3ByChainId(request.chainId);
|
|
18
|
+
// ✅ DIRECT: Use web3-ts functions directly
|
|
19
|
+
const tokenContract = getSmartContractInstance(request.contractAddress, request.abi, web3);
|
|
20
|
+
const tokenId = Number(request.tokenId);
|
|
21
|
+
const tokenUri = await getTokenUri(tokenContract, tokenId);
|
|
22
|
+
return String(tokenUri);
|
|
23
|
+
}
|
|
24
|
+
async getTokenOfOwnerByIndex(request) {
|
|
25
|
+
const web3 = await this.web3ChainService.getWeb3ByChainId(request.chainId);
|
|
26
|
+
// ✅ DIRECT: Use web3-ts functions directly
|
|
27
|
+
const tokenContract = getSmartContractInstance(request.contractAddress, request.abi, web3);
|
|
28
|
+
const tokenId = await getTokenOfOwnerByIndex(tokenContract, request.accountAddress, request.tokenIndex);
|
|
29
|
+
return String(tokenId);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
class SimpleCache {
|
|
34
|
+
constructor() {
|
|
35
|
+
this.storage = {};
|
|
36
|
+
this.defaultTTL = 10 * 1000; // 10 seconds
|
|
37
|
+
}
|
|
38
|
+
set(key, data, ttl) {
|
|
39
|
+
this.storage[key] = {
|
|
40
|
+
data,
|
|
41
|
+
timestamp: Date.now(),
|
|
42
|
+
ttl: ttl ?? this.defaultTTL
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
get(key) {
|
|
46
|
+
const entry = this.storage[key];
|
|
47
|
+
if (!entry) {
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
const now = Date.now();
|
|
51
|
+
const isExpired = (now - entry.timestamp) > entry.ttl;
|
|
52
|
+
if (isExpired) {
|
|
53
|
+
delete this.storage[key];
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
return entry.data;
|
|
57
|
+
}
|
|
58
|
+
clear() {
|
|
59
|
+
this.storage = {};
|
|
60
|
+
}
|
|
61
|
+
cleanup() {
|
|
62
|
+
const now = Date.now();
|
|
63
|
+
Object.keys(this.storage).forEach(key => {
|
|
64
|
+
const entry = this.storage[key];
|
|
65
|
+
if ((now - entry.timestamp) > entry.ttl) {
|
|
66
|
+
delete this.storage[key];
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
class Web3Service {
|
|
73
|
+
constructor(web3Api, web3ChainService) {
|
|
74
|
+
this.web3Api = web3Api;
|
|
75
|
+
this.web3ChainService = web3ChainService;
|
|
76
|
+
//temporary fix, remove when the backend supports custom gateways
|
|
77
|
+
this.defaultIpfsGatewayDomain = 'pers.mypinata.cloud';
|
|
78
|
+
// ✅ CACHE: Simple 10-second cache instance
|
|
79
|
+
this.cache = new SimpleCache();
|
|
80
|
+
this.cleanupInterval = null;
|
|
81
|
+
this.cleanupInterval = setInterval(() => {
|
|
82
|
+
this.cache.cleanup();
|
|
83
|
+
}, 30 * 1000);
|
|
84
|
+
}
|
|
85
|
+
destroy() {
|
|
86
|
+
if (this.cleanupInterval) {
|
|
87
|
+
clearInterval(this.cleanupInterval);
|
|
88
|
+
this.cleanupInterval = null;
|
|
89
|
+
}
|
|
90
|
+
this.cache.clear();
|
|
91
|
+
}
|
|
92
|
+
async getERC20Balance(request) {
|
|
93
|
+
const cacheKey = `erc20_balance_${request.accountAddress}_${request.token.contractAddress}_${request.token.chainId}`;
|
|
94
|
+
// ✅ CACHE CHECK: Try to get from cache first
|
|
95
|
+
const cached = this.cache.get(cacheKey);
|
|
96
|
+
if (cached) {
|
|
97
|
+
console.debug(`💾 [Web3Service] Using cached ERC20 balance for ${request.token.symbol}`);
|
|
98
|
+
return cached;
|
|
99
|
+
}
|
|
100
|
+
console.debug(`🔄 [Web3Service] Fetching fresh ERC20 balance for ${request.token.symbol}`);
|
|
101
|
+
const rawBalance = await this.web3Api.getTokenBalance({
|
|
102
|
+
accountAddress: request.accountAddress,
|
|
103
|
+
contractAddress: request.token.contractAddress,
|
|
104
|
+
abi: request.token.abi,
|
|
105
|
+
tokenId: null, // Always null for ERC20
|
|
106
|
+
chainId: request.token.chainId
|
|
107
|
+
});
|
|
108
|
+
const decimals = request.token.decimals ?? 18;
|
|
109
|
+
const symbol = request.token.symbol ?? 'UNKNOWN';
|
|
110
|
+
const response = {
|
|
111
|
+
rawBalance,
|
|
112
|
+
formattedBalance: this.formatBalance(rawBalance, decimals),
|
|
113
|
+
decimals,
|
|
114
|
+
symbol,
|
|
115
|
+
hasBalance: rawBalance > 0
|
|
116
|
+
};
|
|
117
|
+
// ✅ CACHE SET: Store result in cache
|
|
118
|
+
this.cache.set(cacheKey, response);
|
|
119
|
+
return response;
|
|
120
|
+
}
|
|
121
|
+
async getERC1155Collection(request) {
|
|
122
|
+
// ✅ CACHE KEY: Create unique cache key for collection request
|
|
123
|
+
const contractAddresses = request.tokens.map(t => t.contractAddress).sort().join(',');
|
|
124
|
+
const cacheKey = `erc1155_collection_${request.accountAddress}_${contractAddresses}`;
|
|
125
|
+
// ✅ CACHE CHECK: Try to get from cache first
|
|
126
|
+
const cached = this.cache.get(cacheKey);
|
|
127
|
+
if (cached) {
|
|
128
|
+
console.debug(`💾 [Web3Service] Using cached ERC1155 collection for ${request.accountAddress}`);
|
|
129
|
+
return cached;
|
|
130
|
+
}
|
|
131
|
+
console.debug(`🔄 [Web3Service] Fetching fresh ERC1155 collection for ${request.accountAddress}`);
|
|
132
|
+
const tokenResults = await Promise.all(request.tokens.map(async (token) => {
|
|
133
|
+
// ✅ FIXED: Handle null metadata properly
|
|
134
|
+
const tokenIds = token.metadata?.map(m => m.tokenMetadataIncrementalId?.toString()).filter((id) => id !== undefined) ?? [];
|
|
135
|
+
// Check balance for each known tokenId
|
|
136
|
+
const balanceResults = await Promise.allSettled(tokenIds.map(async (tokenId) => {
|
|
137
|
+
try {
|
|
138
|
+
const rawBalance = await this.web3Api.getTokenBalance({
|
|
139
|
+
accountAddress: request.accountAddress,
|
|
140
|
+
contractAddress: token.contractAddress,
|
|
141
|
+
abi: token.abi,
|
|
142
|
+
tokenId,
|
|
143
|
+
chainId: token.chainId
|
|
144
|
+
});
|
|
145
|
+
const decimals = token.decimals ?? 0; // ERC1155 usually no decimals
|
|
146
|
+
return {
|
|
147
|
+
tokenId,
|
|
148
|
+
balance: rawBalance,
|
|
149
|
+
formattedBalance: this.formatBalance(rawBalance, decimals),
|
|
150
|
+
hasBalance: rawBalance > 0,
|
|
151
|
+
// ✅ FIXED: Convert null to undefined for findMetadata
|
|
152
|
+
metadata: this.findMetadata(token.metadata ?? undefined, tokenId)
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
console.warn(`Failed to get balance for token ${token.contractAddress}:${tokenId}`, error);
|
|
157
|
+
return null; // Skip failed tokens
|
|
158
|
+
}
|
|
159
|
+
}));
|
|
160
|
+
// Filter successful results with balance > 0
|
|
161
|
+
const successfulResults = [];
|
|
162
|
+
for (const result of balanceResults) {
|
|
163
|
+
if (result.status === 'fulfilled' && result.value !== null && result.value.hasBalance) {
|
|
164
|
+
successfulResults.push(result.value);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
token,
|
|
169
|
+
results: successfulResults
|
|
170
|
+
};
|
|
171
|
+
}));
|
|
172
|
+
const response = {
|
|
173
|
+
accountAddress: request.accountAddress,
|
|
174
|
+
tokens: tokenResults.filter(t => t.results.length > 0)
|
|
175
|
+
};
|
|
176
|
+
// ✅ CACHE SET: Store complete collection result
|
|
177
|
+
this.cache.set(cacheKey, response);
|
|
178
|
+
return response;
|
|
179
|
+
}
|
|
180
|
+
async getERC721Collection(request) {
|
|
181
|
+
// ✅ CACHE KEY: Create unique cache key for NFT collection
|
|
182
|
+
const contractAddresses = request.nftContracts.map(t => t.contractAddress).sort().join(',');
|
|
183
|
+
const maxNFTs = request.maxNFTsPerContract || 50;
|
|
184
|
+
const cacheKey = `erc721_collection_${request.accountAddress}_${contractAddresses}_${maxNFTs}`;
|
|
185
|
+
// ✅ CACHE CHECK: Try to get from cache first
|
|
186
|
+
const cached = this.cache.get(cacheKey);
|
|
187
|
+
if (cached) {
|
|
188
|
+
console.debug(`💾 [Web3Service] Using cached ERC721 collection for ${request.accountAddress}`);
|
|
189
|
+
return cached;
|
|
190
|
+
}
|
|
191
|
+
console.debug(`🔄 [Web3Service] Fetching fresh ERC721 collection for ${request.accountAddress}`);
|
|
192
|
+
const startTime = Date.now();
|
|
193
|
+
const contractResults = await Promise.all(request.nftContracts.map(async (token) => {
|
|
194
|
+
try {
|
|
195
|
+
const totalBalance = await this.web3Api.getTokenBalance({
|
|
196
|
+
accountAddress: request.accountAddress,
|
|
197
|
+
contractAddress: token.contractAddress,
|
|
198
|
+
abi: token.abi,
|
|
199
|
+
tokenId: null,
|
|
200
|
+
chainId: token.chainId
|
|
201
|
+
});
|
|
202
|
+
if (totalBalance === 0) {
|
|
203
|
+
return {
|
|
204
|
+
token,
|
|
205
|
+
totalNFTs: 0,
|
|
206
|
+
nfts: [],
|
|
207
|
+
hasMore: false
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
const nftsToLoad = Math.min(totalBalance, maxNFTs);
|
|
211
|
+
const nftResults = await Promise.allSettled(Array.from({ length: nftsToLoad }, async (_, index) => {
|
|
212
|
+
try {
|
|
213
|
+
const tokenId = await this.web3Api.getTokenOfOwnerByIndex({
|
|
214
|
+
contractAddress: token.contractAddress,
|
|
215
|
+
abi: token.abi,
|
|
216
|
+
accountAddress: request.accountAddress,
|
|
217
|
+
tokenIndex: index,
|
|
218
|
+
chainId: token.chainId
|
|
219
|
+
});
|
|
220
|
+
const tokenUri = await this.web3Api.getTokenUri({
|
|
221
|
+
contractAddress: token.contractAddress,
|
|
222
|
+
abi: token.abi,
|
|
223
|
+
tokenId,
|
|
224
|
+
chainId: token.chainId
|
|
225
|
+
});
|
|
226
|
+
const metadata = await this.fetchMetadata(tokenUri, token.chainId);
|
|
227
|
+
const nftItem = {
|
|
228
|
+
tokenId,
|
|
229
|
+
name: metadata?.name || `Token #${tokenId}`,
|
|
230
|
+
description: metadata?.description || '',
|
|
231
|
+
imageUrl: await this.resolveIPFSUrl(metadata?.image || '', token.chainId),
|
|
232
|
+
rawBalance: 1,
|
|
233
|
+
formattedBalance: '1',
|
|
234
|
+
hasBalance: true,
|
|
235
|
+
metadata,
|
|
236
|
+
tokenIndex: index
|
|
237
|
+
};
|
|
238
|
+
return nftItem;
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
console.warn(`Failed to load NFT at index ${index} for ${token.symbol}:`, error);
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
}));
|
|
245
|
+
// ✅ FIXED: Usar tipo específico NFTItem
|
|
246
|
+
const successfulNFTs = nftResults
|
|
247
|
+
.filter((result) => result.status === 'fulfilled' && result.value !== null)
|
|
248
|
+
.map(result => result.value);
|
|
249
|
+
return {
|
|
250
|
+
token,
|
|
251
|
+
totalNFTs: totalBalance,
|
|
252
|
+
nfts: successfulNFTs,
|
|
253
|
+
hasMore: totalBalance > maxNFTs
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
console.error(`Failed to load NFT collection for ${token.symbol}:`, error);
|
|
258
|
+
return {
|
|
259
|
+
token,
|
|
260
|
+
totalNFTs: 0,
|
|
261
|
+
nfts: [],
|
|
262
|
+
hasMore: false
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
}));
|
|
266
|
+
const totalNFTs = contractResults.reduce((sum, contract) => sum + contract.nfts.length, 0);
|
|
267
|
+
const loadingTime = Date.now() - startTime;
|
|
268
|
+
const response = {
|
|
269
|
+
accountAddress: request.accountAddress,
|
|
270
|
+
contracts: contractResults,
|
|
271
|
+
summary: {
|
|
272
|
+
totalContracts: request.nftContracts.length,
|
|
273
|
+
totalNFTs,
|
|
274
|
+
loadingTime
|
|
275
|
+
}
|
|
276
|
+
};
|
|
277
|
+
// ✅ CACHE SET: Store complete collection response
|
|
278
|
+
this.cache.set(cacheKey, response);
|
|
279
|
+
return response;
|
|
280
|
+
}
|
|
281
|
+
// ==========================================
|
|
282
|
+
// HELPER METHODS
|
|
283
|
+
// ==========================================
|
|
284
|
+
formatBalance(rawBalance, decimals) {
|
|
285
|
+
const balance = rawBalance / Math.pow(10, decimals);
|
|
286
|
+
return balance.toLocaleString('en-US', {
|
|
287
|
+
minimumFractionDigits: 0,
|
|
288
|
+
maximumFractionDigits: decimals > 0 ? 2 : 0
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
// ✅ FIXED: Update method signature to handle null properly
|
|
292
|
+
findMetadata(metadata, tokenId) {
|
|
293
|
+
if (!metadata || tokenId === null)
|
|
294
|
+
return null;
|
|
295
|
+
return metadata.find(m => m.tokenMetadataIncrementalId?.toString() === tokenId) || null;
|
|
296
|
+
}
|
|
297
|
+
async fetchMetadata(uri, chainId) {
|
|
298
|
+
try {
|
|
299
|
+
const httpUrl = await this.resolveIPFSUrl(uri, chainId);
|
|
300
|
+
const response = await fetch(httpUrl);
|
|
301
|
+
if (!response.ok) {
|
|
302
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
303
|
+
}
|
|
304
|
+
return await response.json();
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
console.warn('Failed to fetch NFT metadata:', error);
|
|
308
|
+
return null;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
async getIpfsGatewayDomain(chainId) {
|
|
312
|
+
try {
|
|
313
|
+
const chainData = await this.web3ChainService.getChainDataWithCache(chainId);
|
|
314
|
+
return chainData.ipfsGatewayDomain || this.defaultIpfsGatewayDomain;
|
|
315
|
+
}
|
|
316
|
+
catch (error) {
|
|
317
|
+
console.warn(`Failed to get chain data for chainId ${chainId}, using default IPFS gateway:`, error);
|
|
318
|
+
return this.defaultIpfsGatewayDomain;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
async resolveIPFSUrl(url, chainId) {
|
|
322
|
+
if (!url)
|
|
323
|
+
return '';
|
|
324
|
+
if (url.startsWith('ipfs://')) {
|
|
325
|
+
const gatewayDomain = await this.getIpfsGatewayDomain(chainId);
|
|
326
|
+
return `https://${gatewayDomain}/ipfs/${url.slice(7)}`;
|
|
327
|
+
}
|
|
328
|
+
return url;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Platform-Agnostic Web3 Chain API Client
|
|
334
|
+
*
|
|
335
|
+
* Handles blockchain chain operations using the PERS backend.
|
|
336
|
+
* Uses @explorins/web3-ts types for perfect framework compatibility.
|
|
337
|
+
*/
|
|
338
|
+
class Web3ChainApi {
|
|
339
|
+
constructor(apiClient) {
|
|
340
|
+
this.apiClient = apiClient;
|
|
341
|
+
this.basePath = '/chains';
|
|
342
|
+
}
|
|
343
|
+
// ==========================================
|
|
344
|
+
// PUBLIC OPERATIONS
|
|
345
|
+
// ==========================================
|
|
346
|
+
/**
|
|
347
|
+
* PUBLIC: Get chain data by chain ID
|
|
348
|
+
* ✅ Returns ChainData exactly as framework expects from @explorins/web3-ts
|
|
349
|
+
*/
|
|
350
|
+
async getChainData(chainId) {
|
|
351
|
+
try {
|
|
352
|
+
console.log('🔍 [Web3ChainApi] Fetching chain data for chainId:', chainId);
|
|
353
|
+
const response = await this.apiClient.get(`${this.basePath}/${chainId}`);
|
|
354
|
+
if (!response) {
|
|
355
|
+
throw new Error(`No chain data received for chainId: ${chainId}`);
|
|
356
|
+
}
|
|
357
|
+
return response;
|
|
358
|
+
}
|
|
359
|
+
catch (error) {
|
|
360
|
+
console.error('❌ [Web3ChainApi] Failed to get chain data:', {
|
|
361
|
+
chainId,
|
|
362
|
+
error: error instanceof Error ? error.message : String(error)
|
|
363
|
+
});
|
|
364
|
+
throw error;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
const isTokenExpired = (token, margin = 60) => {
|
|
370
|
+
// ✅ SANITIZE: Remove any words (Bearer etc) if exists and get the token
|
|
371
|
+
const cleanToken = token.split(' ')[1] || token;
|
|
372
|
+
// ✅ VALIDATION: Check if token is jwt
|
|
373
|
+
if (!cleanToken || cleanToken.split('.').length !== 3) {
|
|
374
|
+
return true; // Consider invalid tokens as expired
|
|
375
|
+
}
|
|
376
|
+
try {
|
|
377
|
+
// ✅ TYPE-SAFE: Decode with proper typing
|
|
378
|
+
const decoded = jwtDecode(cleanToken);
|
|
379
|
+
const currentTime = Math.floor(Date.now() / 1000);
|
|
380
|
+
// ✅ CONFIGURABLE: Use provided margin (default 60 seconds)
|
|
381
|
+
return decoded.exp < (currentTime + margin);
|
|
382
|
+
}
|
|
383
|
+
catch (error) {
|
|
384
|
+
console.error('[SDK JWT Utils] Error decoding JWT token:', error);
|
|
385
|
+
return true; // Consider unparseable tokens as expired
|
|
386
|
+
}
|
|
387
|
+
};
|
|
388
|
+
|
|
389
|
+
class Web3ChainService {
|
|
390
|
+
constructor(web3ChainApi, providerService) {
|
|
391
|
+
this.web3ChainApi = web3ChainApi;
|
|
392
|
+
this.providerService = providerService;
|
|
393
|
+
this.web3InstanceCache = new Map();
|
|
394
|
+
}
|
|
395
|
+
async getWeb3ByChainId(chainId) {
|
|
396
|
+
const cached = this.web3InstanceCache.get(chainId);
|
|
397
|
+
// ✅ SMART CACHE: Check if cache is valid based on token expiration
|
|
398
|
+
if (cached && !this.checkIsTokenExpired(cached.chainData.authHeader)) {
|
|
399
|
+
console.log(`♻️ [Web3ChainService] Using cached Web3 instance for chain ${chainId}`);
|
|
400
|
+
return cached.web3Instance;
|
|
401
|
+
}
|
|
402
|
+
// ✅ CREATE WITH ERROR RECOVERY: Handle auth errors gracefully
|
|
403
|
+
try {
|
|
404
|
+
console.log(`🔧 [Web3ChainService] Creating new Web3 instance for chain ${chainId}`);
|
|
405
|
+
const { web3, chainData } = await this.createWeb3Instance(chainId);
|
|
406
|
+
// ✅ CACHE NEW INSTANCE
|
|
407
|
+
this.web3InstanceCache.set(chainId, {
|
|
408
|
+
web3Instance: web3,
|
|
409
|
+
chainData: chainData,
|
|
410
|
+
createdAt: Date.now(),
|
|
411
|
+
chainId
|
|
412
|
+
});
|
|
413
|
+
return web3;
|
|
414
|
+
}
|
|
415
|
+
catch (error) {
|
|
416
|
+
// ✅ AUTH ERROR RECOVERY: Clear cache and retry once
|
|
417
|
+
if (this.isAuthError(error)) {
|
|
418
|
+
console.warn(`🔄 [Web3ChainService] Auth error detected, clearing cache and retrying...`);
|
|
419
|
+
this.web3InstanceCache.delete(chainId);
|
|
420
|
+
// Retry once with fresh instance
|
|
421
|
+
const { web3, chainData } = await this.createWeb3Instance(chainId);
|
|
422
|
+
this.web3InstanceCache.set(chainId, {
|
|
423
|
+
web3Instance: web3,
|
|
424
|
+
chainData: chainData,
|
|
425
|
+
createdAt: Date.now(),
|
|
426
|
+
chainId
|
|
427
|
+
});
|
|
428
|
+
return web3;
|
|
429
|
+
}
|
|
430
|
+
throw error;
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
async getChainDataWithCache(chainId) {
|
|
434
|
+
const cached = this.web3InstanceCache.get(chainId);
|
|
435
|
+
//const now = Date.now();
|
|
436
|
+
if (cached && !this.checkIsTokenExpired(cached.chainData.authHeader)) {
|
|
437
|
+
console.log(`♻️ [Web3ChainService] Using cached ChainData for chain ${chainId}`);
|
|
438
|
+
return cached.chainData;
|
|
439
|
+
}
|
|
440
|
+
// If not cached, fetch fresh data
|
|
441
|
+
const chainData = await this.getChainDataById(chainId);
|
|
442
|
+
if (!chainData) {
|
|
443
|
+
throw new Error(`Chain data not found for chainId: ${chainId}`);
|
|
444
|
+
}
|
|
445
|
+
return chainData;
|
|
446
|
+
}
|
|
447
|
+
checkIsTokenExpired(authHeader) {
|
|
448
|
+
// ✅ NULL CHECK: Handle undefined case
|
|
449
|
+
if (!authHeader) {
|
|
450
|
+
return false; // No token means no expiration (public chains)
|
|
451
|
+
}
|
|
452
|
+
// ✅ FUNCTION CALL: Use imported function, not method
|
|
453
|
+
return isTokenExpired(authHeader);
|
|
454
|
+
}
|
|
455
|
+
async createWeb3Instance(chainId) {
|
|
456
|
+
const chainData = await this.getChainDataById(chainId);
|
|
457
|
+
if (!chainData) {
|
|
458
|
+
throw new Error(`Chain data not found for chainId: ${chainId}`);
|
|
459
|
+
}
|
|
460
|
+
// ✅ CRITICAL CHECK: Ensure authHeader is present for private chains
|
|
461
|
+
if (chainData.chainType === 'PRIVATE' && !chainData.authHeader) {
|
|
462
|
+
console.error('❌ [Web3ChainService] CRITICAL: Private chain missing authHeader!');
|
|
463
|
+
throw new Error(`Private chain ${chainId} missing authentication header`);
|
|
464
|
+
}
|
|
465
|
+
const web3 = await this.providerService.getWeb3(chainId, chainData.chainType || 'PUBLIC', chainData);
|
|
466
|
+
return { web3, chainData };
|
|
467
|
+
}
|
|
468
|
+
// ✅ HELPER: Type-safe error checking
|
|
469
|
+
isAuthError(error) {
|
|
470
|
+
const message = error instanceof Error ? error.message.toLowerCase() : String(error).toLowerCase();
|
|
471
|
+
return (message.includes('unauthorized') ||
|
|
472
|
+
message.includes('401') ||
|
|
473
|
+
message.includes('token expired') ||
|
|
474
|
+
message.includes('invalid token'));
|
|
475
|
+
}
|
|
476
|
+
async getChainDataById(chainId) {
|
|
477
|
+
try {
|
|
478
|
+
return await this.web3ChainApi.getChainData(chainId);
|
|
479
|
+
}
|
|
480
|
+
catch (error) {
|
|
481
|
+
console.error('❌ [SDK Web3ChainService] Error getting chain data for chainId:', chainId, error);
|
|
482
|
+
return null;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
function createWeb3ChainSDK(apiClient, providerService) {
|
|
488
|
+
const web3ChainApi = new Web3ChainApi(apiClient);
|
|
489
|
+
const web3ChainService = new Web3ChainService(web3ChainApi, providerService); // ✅ DIRECT INJECTION
|
|
490
|
+
return {
|
|
491
|
+
// ✅ REPLICA: Same methods as framework
|
|
492
|
+
getChainDataById: (chainId) => web3ChainService.getChainDataById(chainId),
|
|
493
|
+
getWeb3ByChainId: (chainId) => web3ChainService.getWeb3ByChainId(chainId),
|
|
494
|
+
api: web3ChainApi,
|
|
495
|
+
service: web3ChainService
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
function createWeb3SDK(apiClient, web3ProviderService) {
|
|
500
|
+
const web3ChainSDK = createWeb3ChainSDK(apiClient, web3ProviderService);
|
|
501
|
+
const web3Api = new Web3Api(web3ChainSDK.service);
|
|
502
|
+
const web3Service = new Web3Service(web3Api, web3ChainSDK.service);
|
|
503
|
+
return {
|
|
504
|
+
getCreditsBalance: (request) => web3Service.getERC20Balance(request),
|
|
505
|
+
getRewardsCollection: (request) => web3Service.getERC1155Collection(request),
|
|
506
|
+
getStampsCollection: (request) => web3Service.getERC721Collection(request),
|
|
507
|
+
api: web3Api,
|
|
508
|
+
service: web3Service
|
|
509
|
+
};
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
export { SimpleCache, createWeb3SDK };
|
|
513
|
+
//# sourceMappingURL=web3.js.map
|
package/dist/web3.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web3.js","sources":["../src/web3/api/web3-api.ts","../src/web3/models/index.ts","../src/web3/services/web3-service.ts","../src/web3-chain/api/web3-chain-api.ts","../src/core/utils/jwt.function.ts","../src/web3-chain/services/web3-chain-service.ts","../src/web3-chain/index.ts","../src/web3/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":[],"mappings":"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"}
|