@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.
Files changed (276) hide show
  1. package/dist/analytics/api/analytics-api.d.ts +17 -0
  2. package/dist/analytics/api/analytics-api.d.ts.map +1 -0
  3. package/{src/analytics/index.ts → dist/analytics/index.d.ts} +28 -52
  4. package/dist/analytics/index.d.ts.map +1 -0
  5. package/dist/analytics/models/index.d.ts +61 -0
  6. package/dist/analytics/models/index.d.ts.map +1 -0
  7. package/dist/analytics/services/analytics-service.d.ts +19 -0
  8. package/dist/analytics/services/analytics-service.d.ts.map +1 -0
  9. package/dist/analytics.cjs +76 -0
  10. package/dist/analytics.cjs.map +1 -0
  11. package/dist/analytics.js +72 -0
  12. package/dist/analytics.js.map +1 -0
  13. package/dist/auth-admin/api/auth-admin-api.d.ts +27 -0
  14. package/dist/auth-admin/api/auth-admin-api.d.ts.map +1 -0
  15. package/dist/auth-admin/index.d.ts +26 -0
  16. package/dist/auth-admin/index.d.ts.map +1 -0
  17. package/dist/auth-admin/services/auth-admin-service.d.ts +23 -0
  18. package/dist/auth-admin/services/auth-admin-service.d.ts.map +1 -0
  19. package/dist/auth-admin.cjs +96 -0
  20. package/dist/auth-admin.cjs.map +1 -0
  21. package/dist/auth-admin.js +92 -0
  22. package/dist/auth-admin.js.map +1 -0
  23. package/dist/business/api/business-api.d.ts +133 -0
  24. package/dist/business/api/business-api.d.ts.map +1 -0
  25. package/dist/business/index.d.ts +34 -0
  26. package/dist/business/index.d.ts.map +1 -0
  27. package/dist/business/models/index.d.ts +8 -0
  28. package/dist/business/models/index.d.ts.map +1 -0
  29. package/dist/business/services/business-service.d.ts +51 -0
  30. package/dist/business/services/business-service.d.ts.map +1 -0
  31. package/dist/business.cjs +303 -0
  32. package/dist/business.cjs.map +1 -0
  33. package/dist/business.js +299 -0
  34. package/dist/business.js.map +1 -0
  35. package/dist/campaign/api/campaign-api.d.ts +213 -0
  36. package/dist/campaign/api/campaign-api.d.ts.map +1 -0
  37. package/dist/campaign/index.d.ts +44 -0
  38. package/dist/campaign/index.d.ts.map +1 -0
  39. package/dist/campaign/services/campaign-service.d.ts +88 -0
  40. package/dist/campaign/services/campaign-service.d.ts.map +1 -0
  41. package/dist/campaign.cjs +506 -0
  42. package/dist/campaign.cjs.map +1 -0
  43. package/dist/campaign.js +502 -0
  44. package/dist/campaign.js.map +1 -0
  45. package/dist/core/abstractions/http-client.d.ts +22 -0
  46. package/dist/core/abstractions/http-client.d.ts.map +1 -0
  47. package/dist/core/auth/auth-provider.interface.d.ts +12 -0
  48. package/dist/core/auth/auth-provider.interface.d.ts.map +1 -0
  49. package/dist/core/auth/create-auth-provider.d.ts +27 -0
  50. package/dist/core/auth/create-auth-provider.d.ts.map +1 -0
  51. package/dist/core/auth/simple-auth-config.interface.d.ts +15 -0
  52. package/dist/core/auth/simple-auth-config.interface.d.ts.map +1 -0
  53. package/dist/core/index.d.ts +13 -0
  54. package/dist/core/index.d.ts.map +1 -0
  55. package/dist/core/pers-api-client.d.ts +54 -0
  56. package/dist/core/pers-api-client.d.ts.map +1 -0
  57. package/dist/core/pers-config.d.ts +38 -0
  58. package/dist/core/pers-config.d.ts.map +1 -0
  59. package/dist/core/utils/jwt.function.d.ts +2 -0
  60. package/dist/core/utils/jwt.function.d.ts.map +1 -0
  61. package/dist/core.cjs +506 -0
  62. package/dist/core.cjs.map +1 -0
  63. package/dist/core.js +497 -0
  64. package/dist/core.js.map +1 -0
  65. package/dist/donation/api/donation-api.d.ts +18 -0
  66. package/dist/donation/api/donation-api.d.ts.map +1 -0
  67. package/dist/donation/index.d.ts +25 -0
  68. package/dist/donation/index.d.ts.map +1 -0
  69. package/{src/donation/models/index.ts → dist/donation/models/index.d.ts} +8 -11
  70. package/dist/donation/models/index.d.ts.map +1 -0
  71. package/dist/donation/services/donation-service.d.ts +19 -0
  72. package/dist/donation/services/donation-service.d.ts.map +1 -0
  73. package/dist/donation.cjs +78 -0
  74. package/dist/donation.cjs.map +1 -0
  75. package/dist/donation.js +74 -0
  76. package/dist/donation.js.map +1 -0
  77. package/dist/index.cjs +4217 -0
  78. package/dist/index.cjs.map +1 -0
  79. package/dist/index.d.ts +21 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +4164 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/package.json +129 -0
  84. package/dist/payment/api/payment-api.d.ts +105 -0
  85. package/dist/payment/api/payment-api.d.ts.map +1 -0
  86. package/dist/payment/index.d.ts +36 -0
  87. package/dist/payment/index.d.ts.map +1 -0
  88. package/dist/payment/models/index.d.ts +12 -0
  89. package/dist/payment/models/index.d.ts.map +1 -0
  90. package/dist/payment/services/payment-service.d.ts +40 -0
  91. package/dist/payment/services/payment-service.d.ts.map +1 -0
  92. package/dist/payment.cjs +258 -0
  93. package/dist/payment.cjs.map +1 -0
  94. package/dist/payment.js +254 -0
  95. package/dist/payment.js.map +1 -0
  96. package/dist/pers-sdk.d.ts +29 -0
  97. package/dist/pers-sdk.d.ts.map +1 -0
  98. package/dist/redemption/api/redemption-api.d.ts +147 -0
  99. package/dist/redemption/api/redemption-api.d.ts.map +1 -0
  100. package/dist/redemption/index.d.ts +35 -0
  101. package/dist/redemption/index.d.ts.map +1 -0
  102. package/dist/redemption/models/index.d.ts +8 -0
  103. package/dist/redemption/models/index.d.ts.map +1 -0
  104. package/dist/redemption/services/redemption-service.d.ts +56 -0
  105. package/dist/redemption/services/redemption-service.d.ts.map +1 -0
  106. package/dist/redemption.cjs +333 -0
  107. package/dist/redemption.cjs.map +1 -0
  108. package/dist/redemption.js +329 -0
  109. package/dist/redemption.js.map +1 -0
  110. package/dist/shared/interfaces/pers-shared-lib.interfaces.d.ts +18 -0
  111. package/dist/shared/interfaces/pers-shared-lib.interfaces.d.ts.map +1 -0
  112. package/dist/tenant/api/tenant-api.d.ts +56 -0
  113. package/dist/tenant/api/tenant-api.d.ts.map +1 -0
  114. package/dist/tenant/index.d.ts +34 -0
  115. package/dist/tenant/index.d.ts.map +1 -0
  116. package/dist/tenant/models/index.d.ts +11 -0
  117. package/dist/tenant/models/index.d.ts.map +1 -0
  118. package/dist/tenant/services/tenant-service.d.ts +46 -0
  119. package/dist/tenant/services/tenant-service.d.ts.map +1 -0
  120. package/dist/tenant.cjs +177 -0
  121. package/dist/tenant.cjs.map +1 -0
  122. package/dist/tenant.js +173 -0
  123. package/dist/tenant.js.map +1 -0
  124. package/dist/token/api/token-api.d.ts +64 -0
  125. package/dist/token/api/token-api.d.ts.map +1 -0
  126. package/dist/token/base/base-token-service.d.ts +87 -0
  127. package/dist/token/base/base-token-service.d.ts.map +1 -0
  128. package/dist/token/index.d.ts +13 -0
  129. package/dist/token/index.d.ts.map +1 -0
  130. package/dist/token/models/index.d.ts +18 -0
  131. package/dist/token/models/index.d.ts.map +1 -0
  132. package/dist/token/services/token-service.d.ts +68 -0
  133. package/dist/token/services/token-service.d.ts.map +1 -0
  134. package/dist/token/token-sdk.d.ts +140 -0
  135. package/dist/token/token-sdk.d.ts.map +1 -0
  136. package/dist/token.cjs +537 -0
  137. package/dist/token.cjs.map +1 -0
  138. package/dist/token.js +532 -0
  139. package/dist/token.js.map +1 -0
  140. package/dist/transaction/api/transaction-api.d.ts +133 -0
  141. package/dist/transaction/api/transaction-api.d.ts.map +1 -0
  142. package/dist/transaction/index.d.ts +38 -0
  143. package/dist/transaction/index.d.ts.map +1 -0
  144. package/dist/transaction/models/index.d.ts +42 -0
  145. package/dist/transaction/models/index.d.ts.map +1 -0
  146. package/dist/transaction/services/transaction-service.d.ts +56 -0
  147. package/dist/transaction/services/transaction-service.d.ts.map +1 -0
  148. package/dist/transaction.cjs +394 -0
  149. package/dist/transaction.cjs.map +1 -0
  150. package/dist/transaction.js +390 -0
  151. package/dist/transaction.js.map +1 -0
  152. package/dist/user/api/user-api.d.ts +56 -0
  153. package/dist/user/api/user-api.d.ts.map +1 -0
  154. package/dist/user/index.d.ts +36 -0
  155. package/dist/user/index.d.ts.map +1 -0
  156. package/{src/user/models/index.ts → dist/user/models/index.d.ts} +12 -10
  157. package/dist/user/models/index.d.ts.map +1 -0
  158. package/dist/user/services/user-service.d.ts +46 -0
  159. package/dist/user/services/user-service.d.ts.map +1 -0
  160. package/dist/user-status/api/user-status-api.d.ts +37 -0
  161. package/dist/user-status/api/user-status-api.d.ts.map +1 -0
  162. package/dist/user-status/index.d.ts +28 -0
  163. package/dist/user-status/index.d.ts.map +1 -0
  164. package/{src/user-status/models/index.ts → dist/user-status/models/index.d.ts} +8 -11
  165. package/dist/user-status/models/index.d.ts.map +1 -0
  166. package/dist/user-status/services/user-status-service.d.ts +26 -0
  167. package/dist/user-status/services/user-status-service.d.ts.map +1 -0
  168. package/dist/user-status.cjs +147 -0
  169. package/dist/user-status.cjs.map +1 -0
  170. package/dist/user-status.js +143 -0
  171. package/dist/user-status.js.map +1 -0
  172. package/dist/user.cjs +188 -0
  173. package/dist/user.cjs.map +1 -0
  174. package/dist/user.js +184 -0
  175. package/dist/user.js.map +1 -0
  176. package/dist/web3/api/web3-api.d.ts +27 -0
  177. package/dist/web3/api/web3-api.d.ts.map +1 -0
  178. package/dist/web3/index.d.ts +16 -0
  179. package/dist/web3/index.d.ts.map +1 -0
  180. package/dist/web3/models/index.d.ts +92 -0
  181. package/dist/web3/models/index.d.ts.map +1 -0
  182. package/dist/web3/services/web3-service.d.ts +21 -0
  183. package/dist/web3/services/web3-service.d.ts.map +1 -0
  184. package/dist/web3-chain/api/web3-chain-api.d.ts +19 -0
  185. package/dist/web3-chain/api/web3-chain-api.d.ts.map +1 -0
  186. package/dist/web3-chain/index.d.ts +17 -0
  187. package/dist/web3-chain/index.d.ts.map +1 -0
  188. package/{src/web3-chain/models/index.ts → dist/web3-chain/models/index.d.ts} +38 -45
  189. package/dist/web3-chain/models/index.d.ts.map +1 -0
  190. package/dist/web3-chain/services/getWeb3FCD.service.d.ts +8 -0
  191. package/dist/web3-chain/services/getWeb3FCD.service.d.ts.map +1 -0
  192. package/dist/web3-chain/services/provider.service.d.ts +15 -0
  193. package/dist/web3-chain/services/provider.service.d.ts.map +1 -0
  194. package/dist/web3-chain/services/public-http-provider.service.d.ts +8 -0
  195. package/dist/web3-chain/services/public-http-provider.service.d.ts.map +1 -0
  196. package/dist/web3-chain/services/web3-chain-service.d.ts +17 -0
  197. package/dist/web3-chain/services/web3-chain-service.d.ts.map +1 -0
  198. package/dist/web3-chain.cjs +316 -0
  199. package/dist/web3-chain.cjs.map +1 -0
  200. package/dist/web3-chain.js +310 -0
  201. package/dist/web3-chain.js.map +1 -0
  202. package/dist/web3.cjs +516 -0
  203. package/dist/web3.cjs.map +1 -0
  204. package/dist/web3.js +513 -0
  205. package/dist/web3.js.map +1 -0
  206. package/package.json +56 -72
  207. package/config/domains.js +0 -22
  208. package/explorins-pers-sdk-1.0.0-alpha.1.tgz +0 -0
  209. package/rollup.config.js +0 -74
  210. package/scripts/copy-declarations.js +0 -147
  211. package/src/analytics/api/analytics-api.ts +0 -24
  212. package/src/analytics/models/index.ts +0 -74
  213. package/src/analytics/services/analytics-service.ts +0 -28
  214. package/src/auth-admin/api/auth-admin-api.ts +0 -42
  215. package/src/auth-admin/index.ts +0 -47
  216. package/src/auth-admin/services/auth-admin-service.ts +0 -36
  217. package/src/business/api/business-api.ts +0 -234
  218. package/src/business/index.ts +0 -53
  219. package/src/business/models/index.ts +0 -13
  220. package/src/business/services/business-service.ts +0 -88
  221. package/src/campaign/api/campaign-api.ts +0 -376
  222. package/src/campaign/index.ts +0 -67
  223. package/src/campaign/services/campaign-service.ts +0 -164
  224. package/src/core/abstractions/http-client.ts +0 -24
  225. package/src/core/auth/auth-provider.interface.ts +0 -16
  226. package/src/core/auth/create-auth-provider.ts +0 -136
  227. package/src/core/auth/simple-auth-config.interface.ts +0 -15
  228. package/src/core/index.ts +0 -33
  229. package/src/core/pers-api-client.ts +0 -343
  230. package/src/core/pers-config.ts +0 -65
  231. package/src/core/utils/jwt.function.ts +0 -24
  232. package/src/donation/api/donation-api.ts +0 -24
  233. package/src/donation/index.ts +0 -47
  234. package/src/donation/services/donation-service.ts +0 -25
  235. package/src/index.ts +0 -55
  236. package/src/payment/api/payment-api.ts +0 -185
  237. package/src/payment/index.ts +0 -64
  238. package/src/payment/models/index.ts +0 -29
  239. package/src/payment/services/payment-service.ts +0 -70
  240. package/src/pers-sdk.ts +0 -45
  241. package/src/redemption/api/redemption-api.ts +0 -241
  242. package/src/redemption/index.ts +0 -60
  243. package/src/redemption/models/index.ts +0 -17
  244. package/src/redemption/services/redemption-service.ts +0 -103
  245. package/src/shared/interfaces/pers-shared-lib.interfaces.ts +0 -99
  246. package/src/tenant/api/tenant-api.ts +0 -92
  247. package/src/tenant/index.ts +0 -61
  248. package/src/tenant/models/index.ts +0 -20
  249. package/src/tenant/services/tenant-service.ts +0 -78
  250. package/src/token/api/token-api.ts +0 -129
  251. package/src/token/base/base-token-service.ts +0 -167
  252. package/src/token/index.ts +0 -38
  253. package/src/token/models/index.ts +0 -30
  254. package/src/token/services/token-service.ts +0 -125
  255. package/src/token/token-sdk.ts +0 -231
  256. package/src/transaction/api/transaction-api.ts +0 -296
  257. package/src/transaction/index.ts +0 -65
  258. package/src/transaction/models/index.ts +0 -60
  259. package/src/transaction/services/transaction-service.ts +0 -104
  260. package/src/user/api/user-api.ts +0 -98
  261. package/src/user/index.ts +0 -62
  262. package/src/user/services/user-service.ts +0 -75
  263. package/src/user-status/api/user-status-api.ts +0 -78
  264. package/src/user-status/index.ts +0 -55
  265. package/src/user-status/services/user-status-service.ts +0 -51
  266. package/src/web3/api/web3-api.ts +0 -68
  267. package/src/web3/index.ts +0 -38
  268. package/src/web3/models/index.ts +0 -150
  269. package/src/web3/services/web3-service.ts +0 -338
  270. package/src/web3-chain/api/web3-chain-api.ts +0 -42
  271. package/src/web3-chain/index.ts +0 -27
  272. package/src/web3-chain/services/getWeb3FCD.service.ts +0 -47
  273. package/src/web3-chain/services/provider.service.ts +0 -123
  274. package/src/web3-chain/services/public-http-provider.service.ts +0 -26
  275. package/src/web3-chain/services/web3-chain-service.ts +0 -131
  276. 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
@@ -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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"}