@veridex/sdk 1.0.0-beta.9 → 1.1.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 (132) hide show
  1. package/LICENSE +170 -21
  2. package/README.md +574 -117
  3. package/dist/EVMClient-DtqvdfUP.d.mts +376 -0
  4. package/dist/auth/prepareAuth.d.mts +25 -0
  5. package/dist/auth/prepareAuth.js +2406 -0
  6. package/dist/auth/prepareAuth.js.map +1 -0
  7. package/dist/auth/prepareAuth.mjs +151 -0
  8. package/dist/auth/prepareAuth.mjs.map +1 -0
  9. package/dist/chains/aptos/index.d.mts +6 -5
  10. package/dist/chains/aptos/index.js +66 -39
  11. package/dist/chains/aptos/index.js.map +1 -1
  12. package/dist/chains/aptos/index.mjs +5 -547
  13. package/dist/chains/aptos/index.mjs.map +1 -1
  14. package/dist/chains/avalanche/index.d.mts +137 -0
  15. package/dist/chains/avalanche/index.js +1555 -0
  16. package/dist/chains/avalanche/index.js.map +1 -0
  17. package/dist/chains/avalanche/index.mjs +10 -0
  18. package/dist/chains/avalanche/index.mjs.map +1 -0
  19. package/dist/chains/evm/index.d.mts +5 -3
  20. package/dist/chains/evm/index.js +165 -3
  21. package/dist/chains/evm/index.js.map +1 -1
  22. package/dist/chains/evm/index.mjs +8 -1200
  23. package/dist/chains/evm/index.mjs.map +1 -1
  24. package/dist/chains/solana/index.d.mts +1 -1
  25. package/dist/chains/solana/index.js.map +1 -1
  26. package/dist/chains/solana/index.mjs +4 -486
  27. package/dist/chains/solana/index.mjs.map +1 -1
  28. package/dist/chains/stacks/index.d.mts +559 -0
  29. package/dist/chains/stacks/index.js +1207 -0
  30. package/dist/chains/stacks/index.js.map +1 -0
  31. package/dist/chains/stacks/index.mjs +71 -0
  32. package/dist/chains/stacks/index.mjs.map +1 -0
  33. package/dist/chains/starknet/index.d.mts +4 -5
  34. package/dist/chains/starknet/index.js +1 -13
  35. package/dist/chains/starknet/index.js.map +1 -1
  36. package/dist/chains/starknet/index.mjs +5 -503
  37. package/dist/chains/starknet/index.mjs.map +1 -1
  38. package/dist/chains/sui/index.d.mts +4 -4
  39. package/dist/chains/sui/index.js +2 -2
  40. package/dist/chains/sui/index.js.map +1 -1
  41. package/dist/chains/sui/index.mjs +5 -529
  42. package/dist/chains/sui/index.mjs.map +1 -1
  43. package/dist/chunk-5T6KPH7A.mjs +1082 -0
  44. package/dist/chunk-5T6KPH7A.mjs.map +1 -0
  45. package/dist/chunk-72ZA3OYQ.mjs +20 -0
  46. package/dist/chunk-72ZA3OYQ.mjs.map +1 -0
  47. package/dist/chunk-F3YAGZSW.mjs +269 -0
  48. package/dist/chunk-F3YAGZSW.mjs.map +1 -0
  49. package/dist/chunk-GWJRKDSA.mjs +549 -0
  50. package/dist/chunk-GWJRKDSA.mjs.map +1 -0
  51. package/dist/chunk-M3MM4YMF.mjs +417 -0
  52. package/dist/chunk-M3MM4YMF.mjs.map +1 -0
  53. package/dist/chunk-MLXQHIH2.mjs +426 -0
  54. package/dist/chunk-MLXQHIH2.mjs.map +1 -0
  55. package/dist/chunk-N4A2RMUN.mjs +216 -0
  56. package/dist/chunk-N4A2RMUN.mjs.map +1 -0
  57. package/dist/chunk-NUWSMJFJ.mjs +179 -0
  58. package/dist/chunk-NUWSMJFJ.mjs.map +1 -0
  59. package/dist/chunk-OVMMTL6H.mjs +330 -0
  60. package/dist/chunk-OVMMTL6H.mjs.map +1 -0
  61. package/dist/chunk-PDHZ5X5O.mjs +565 -0
  62. package/dist/chunk-PDHZ5X5O.mjs.map +1 -0
  63. package/dist/chunk-Q5O3M5LP.mjs +422 -0
  64. package/dist/chunk-Q5O3M5LP.mjs.map +1 -0
  65. package/dist/chunk-QDO6NQ7P.mjs +840 -0
  66. package/dist/chunk-QDO6NQ7P.mjs.map +1 -0
  67. package/dist/chunk-QT4ZZ4GM.mjs +509 -0
  68. package/dist/chunk-QT4ZZ4GM.mjs.map +1 -0
  69. package/dist/chunk-SXXGTQIR.mjs +464 -0
  70. package/dist/chunk-SXXGTQIR.mjs.map +1 -0
  71. package/dist/chunk-USDA5JTN.mjs +1249 -0
  72. package/dist/chunk-USDA5JTN.mjs.map +1 -0
  73. package/dist/chunk-V636MIV3.mjs +52 -0
  74. package/dist/chunk-V636MIV3.mjs.map +1 -0
  75. package/dist/chunk-X7BZMSPQ.mjs +407 -0
  76. package/dist/chunk-X7BZMSPQ.mjs.map +1 -0
  77. package/dist/chunk-YCUJZ6Z7.mjs +829 -0
  78. package/dist/chunk-YCUJZ6Z7.mjs.map +1 -0
  79. package/dist/constants.d.mts +1 -1
  80. package/dist/constants.js +26 -12
  81. package/dist/constants.js.map +1 -1
  82. package/dist/constants.mjs +16 -375
  83. package/dist/constants.mjs.map +1 -1
  84. package/dist/index-DDalBhAm.d.mts +243 -0
  85. package/dist/index.d.mts +2511 -556
  86. package/dist/index.js +15216 -10262
  87. package/dist/index.js.map +1 -1
  88. package/dist/index.mjs +4125 -7839
  89. package/dist/index.mjs.map +1 -1
  90. package/dist/passkey.d.mts +182 -0
  91. package/dist/passkey.js +914 -0
  92. package/dist/passkey.js.map +1 -0
  93. package/dist/passkey.mjs +15 -0
  94. package/dist/passkey.mjs.map +1 -0
  95. package/dist/payload.js.map +1 -1
  96. package/dist/payload.mjs +25 -244
  97. package/dist/payload.mjs.map +1 -1
  98. package/dist/portfolio-V347KZOL.mjs +13 -0
  99. package/dist/portfolio-V347KZOL.mjs.map +1 -0
  100. package/dist/queries/index.js +145 -12
  101. package/dist/queries/index.js.map +1 -1
  102. package/dist/queries/index.mjs +14 -1496
  103. package/dist/queries/index.mjs.map +1 -1
  104. package/dist/{types-FJL7j6gQ.d.ts → types-B7V5VNbO.d.mts} +6 -2
  105. package/dist/{types-ChIsqCiw.d.mts → types-DP2CQT8p.d.mts} +12 -1
  106. package/dist/types.d.mts +16 -0
  107. package/dist/types.js.map +1 -1
  108. package/dist/utils.js +25 -11
  109. package/dist/utils.js.map +1 -1
  110. package/dist/utils.mjs +19 -371
  111. package/dist/utils.mjs.map +1 -1
  112. package/dist/wormhole.js.map +1 -1
  113. package/dist/wormhole.mjs +25 -397
  114. package/dist/wormhole.mjs.map +1 -1
  115. package/package.json +28 -3
  116. package/scripts/patch-noble-curves.js +78 -0
  117. package/dist/chains/aptos/index.d.ts +0 -145
  118. package/dist/chains/evm/index.d.ts +0 -5
  119. package/dist/chains/solana/index.d.ts +0 -116
  120. package/dist/chains/starknet/index.d.ts +0 -172
  121. package/dist/chains/sui/index.d.ts +0 -182
  122. package/dist/constants.d.ts +0 -150
  123. package/dist/index-0NXfbk0z.d.ts +0 -637
  124. package/dist/index-D0dLVjTA.d.mts +0 -637
  125. package/dist/index.d.ts +0 -3123
  126. package/dist/payload.d.ts +0 -125
  127. package/dist/queries/index.d.ts +0 -148
  128. package/dist/types-ChIsqCiw.d.ts +0 -565
  129. package/dist/types-FJL7j6gQ.d.mts +0 -172
  130. package/dist/types.d.ts +0 -407
  131. package/dist/utils.d.ts +0 -81
  132. package/dist/wormhole.d.ts +0 -167
@@ -0,0 +1,565 @@
1
+ import {
2
+ computeKeyHash
3
+ } from "./chunk-NUWSMJFJ.mjs";
4
+
5
+ // src/core/WalletManager.ts
6
+ import { ethers } from "ethers";
7
+ var PROXY_BYTECODE_PREFIX = "0x3d602d80600a3d3981f3363d3d373d3d3d363d73";
8
+ var PROXY_BYTECODE_SUFFIX = "5af43d82803e903d91602b57fd5bf3";
9
+ var WalletManager = class {
10
+ config;
11
+ addressCache = /* @__PURE__ */ new Map();
12
+ constructor(config = {}) {
13
+ this.config = {
14
+ cacheAddresses: config.cacheAddresses ?? true,
15
+ persistToStorage: config.persistToStorage ?? false,
16
+ storageKey: config.storageKey ?? "veridex_wallet_addresses"
17
+ };
18
+ if (this.config.persistToStorage && typeof window !== "undefined") {
19
+ this.loadFromStorage();
20
+ }
21
+ }
22
+ // ========================================================================
23
+ // Address Computation
24
+ // ========================================================================
25
+ /**
26
+ * Compute the deterministic vault address for an EVM chain
27
+ *
28
+ * Uses CREATE2 with EIP-1167 minimal proxy pattern:
29
+ * - Salt = keccak256(factoryAddress, ownerKeyHash)
30
+ * - InitCode = EIP-1167 proxy bytecode with implementation address
31
+ *
32
+ * @param keyHash - The owner's key hash (keccak256 of public key coordinates)
33
+ * @param factoryAddress - The vault factory contract address
34
+ * @param implementationAddress - The vault implementation contract address
35
+ * @returns The deterministic vault address
36
+ */
37
+ computeVaultAddress(keyHash, factoryAddress, implementationAddress) {
38
+ const salt = ethers.keccak256(
39
+ ethers.solidityPacked(
40
+ ["address", "bytes32"],
41
+ [factoryAddress, keyHash]
42
+ )
43
+ );
44
+ const initCode = this.buildProxyInitCode(implementationAddress);
45
+ const initCodeHash = ethers.keccak256(initCode);
46
+ const create2Data = ethers.solidityPacked(
47
+ ["bytes1", "address", "bytes32", "bytes32"],
48
+ ["0xff", factoryAddress, salt, initCodeHash]
49
+ );
50
+ const hash = ethers.keccak256(create2Data);
51
+ return ethers.getAddress("0x" + hash.slice(26));
52
+ }
53
+ /**
54
+ * Compute vault address from public key coordinates
55
+ *
56
+ * @param publicKeyX - P-256 public key X coordinate
57
+ * @param publicKeyY - P-256 public key Y coordinate
58
+ * @param factoryAddress - The vault factory contract address
59
+ * @param implementationAddress - The vault implementation contract address
60
+ * @returns The deterministic vault address
61
+ */
62
+ computeVaultAddressFromPublicKey(publicKeyX, publicKeyY, factoryAddress, implementationAddress) {
63
+ const keyHash = computeKeyHash(publicKeyX, publicKeyY);
64
+ return this.computeVaultAddress(keyHash, factoryAddress, implementationAddress);
65
+ }
66
+ /**
67
+ * Build EIP-1167 minimal proxy initcode
68
+ */
69
+ buildProxyInitCode(implementationAddress) {
70
+ const impl = implementationAddress.toLowerCase().replace("0x", "");
71
+ return PROXY_BYTECODE_PREFIX + impl + PROXY_BYTECODE_SUFFIX;
72
+ }
73
+ // ========================================================================
74
+ // Unified Identity
75
+ // ========================================================================
76
+ /**
77
+ * Get unified identity with addresses across all configured chains
78
+ *
79
+ * @param credential - The passkey credential
80
+ * @param chainConfigs - Map of chain configurations with factory/implementation addresses
81
+ * @returns Unified identity with addresses on each chain
82
+ */
83
+ async getUnifiedIdentity(credential, chainConfigs) {
84
+ const addresses = [];
85
+ for (const [wormholeChainId, config] of chainConfigs) {
86
+ const address = await this.deriveAddressForChain(
87
+ credential,
88
+ wormholeChainId,
89
+ config
90
+ );
91
+ if (address) {
92
+ addresses.push(address);
93
+ }
94
+ }
95
+ const identity = {
96
+ keyHash: credential.keyHash,
97
+ publicKeyX: credential.publicKeyX,
98
+ publicKeyY: credential.publicKeyY,
99
+ credentialId: credential.credentialId,
100
+ addresses,
101
+ createdAt: Date.now(),
102
+ updatedAt: Date.now()
103
+ };
104
+ if (this.config.cacheAddresses) {
105
+ this.addressCache.set(credential.keyHash, addresses);
106
+ }
107
+ if (this.config.persistToStorage) {
108
+ this.saveToStorage(identity);
109
+ }
110
+ return identity;
111
+ }
112
+ /**
113
+ * Derive address for a specific chain
114
+ */
115
+ async deriveAddressForChain(credential, wormholeChainId, config) {
116
+ if (config.isEvm) {
117
+ if (!config.factoryAddress || !config.implementationAddress) {
118
+ return null;
119
+ }
120
+ const address = this.computeVaultAddress(
121
+ credential.keyHash,
122
+ config.factoryAddress,
123
+ config.implementationAddress
124
+ );
125
+ return {
126
+ wormholeChainId,
127
+ chainName: config.chainName,
128
+ address,
129
+ isEvm: true,
130
+ deployed: false
131
+ // Will be checked separately
132
+ };
133
+ } else {
134
+ return this.deriveNonEvmAddress(credential, wormholeChainId, config);
135
+ }
136
+ }
137
+ /**
138
+ * Derive address for non-EVM chains
139
+ *
140
+ * Each chain has its own address format:
141
+ * - Solana: Base58 encoded public key hash
142
+ * - Aptos: 32-byte hex address
143
+ * - Sui: 32-byte hex address with 0x prefix
144
+ */
145
+ deriveNonEvmAddress(credential, wormholeChainId, _config) {
146
+ switch (wormholeChainId) {
147
+ case 1:
148
+ return {
149
+ wormholeChainId: 1,
150
+ chainName: "Solana",
151
+ address: credential.keyHash,
152
+ // PDA will be derived from this
153
+ isEvm: false,
154
+ derivationType: "pda",
155
+ deployed: false
156
+ };
157
+ case 22:
158
+ return {
159
+ wormholeChainId: 22,
160
+ chainName: "Aptos",
161
+ address: credential.keyHash,
162
+ isEvm: false,
163
+ derivationType: "resource_account",
164
+ deployed: false
165
+ };
166
+ case 21:
167
+ return {
168
+ wormholeChainId: 21,
169
+ chainName: "Sui",
170
+ address: credential.keyHash,
171
+ isEvm: false,
172
+ derivationType: "object",
173
+ deployed: false
174
+ };
175
+ default:
176
+ return null;
177
+ }
178
+ }
179
+ // ========================================================================
180
+ // Address Lookup
181
+ // ========================================================================
182
+ /**
183
+ * Get cached address for a chain
184
+ */
185
+ getAddressForChain(keyHash, wormholeChainId) {
186
+ const addresses = this.addressCache.get(keyHash);
187
+ return addresses?.find((a) => a.wormholeChainId === wormholeChainId);
188
+ }
189
+ /**
190
+ * Get all cached addresses for a key hash
191
+ */
192
+ getAddresses(keyHash) {
193
+ return this.addressCache.get(keyHash) ?? [];
194
+ }
195
+ /**
196
+ * Update deployment status for an address
197
+ */
198
+ updateDeploymentStatus(keyHash, wormholeChainId, deployed, deploymentTxHash) {
199
+ const addresses = this.addressCache.get(keyHash);
200
+ if (!addresses) return;
201
+ const address = addresses.find((a) => a.wormholeChainId === wormholeChainId);
202
+ if (address) {
203
+ address.deployed = deployed;
204
+ address.deploymentTxHash = deploymentTxHash;
205
+ }
206
+ if (this.config.persistToStorage) {
207
+ this.saveAddressesToStorage(keyHash, addresses);
208
+ }
209
+ }
210
+ // ========================================================================
211
+ // Storage
212
+ // ========================================================================
213
+ /**
214
+ * Load addresses from localStorage
215
+ */
216
+ loadFromStorage() {
217
+ if (typeof window === "undefined") return;
218
+ try {
219
+ const stored = localStorage.getItem(this.config.storageKey);
220
+ if (!stored) return;
221
+ const data = JSON.parse(stored);
222
+ for (const [keyHash, addresses] of Object.entries(data.addresses)) {
223
+ this.addressCache.set(keyHash, addresses);
224
+ }
225
+ } catch (error) {
226
+ console.warn("Failed to load wallet addresses from storage:", error);
227
+ }
228
+ }
229
+ /**
230
+ * Save identity to localStorage
231
+ */
232
+ saveToStorage(identity) {
233
+ if (typeof window === "undefined") return;
234
+ try {
235
+ const stored = localStorage.getItem(this.config.storageKey) ?? "{}";
236
+ const data = JSON.parse(stored);
237
+ if (!data.addresses) {
238
+ data.addresses = {};
239
+ }
240
+ data.addresses[identity.keyHash] = identity.addresses;
241
+ data.identities = data.identities ?? {};
242
+ data.identities[identity.keyHash] = {
243
+ keyHash: identity.keyHash,
244
+ publicKeyX: identity.publicKeyX.toString(),
245
+ publicKeyY: identity.publicKeyY.toString(),
246
+ credentialId: identity.credentialId,
247
+ createdAt: identity.createdAt,
248
+ updatedAt: identity.updatedAt
249
+ };
250
+ localStorage.setItem(this.config.storageKey, JSON.stringify(data));
251
+ } catch (error) {
252
+ console.warn("Failed to save wallet addresses to storage:", error);
253
+ }
254
+ }
255
+ /**
256
+ * Save addresses to localStorage
257
+ */
258
+ saveAddressesToStorage(keyHash, addresses) {
259
+ if (typeof window === "undefined") return;
260
+ try {
261
+ const stored = localStorage.getItem(this.config.storageKey) ?? "{}";
262
+ const data = JSON.parse(stored);
263
+ if (!data.addresses) {
264
+ data.addresses = {};
265
+ }
266
+ data.addresses[keyHash] = addresses;
267
+ localStorage.setItem(this.config.storageKey, JSON.stringify(data));
268
+ } catch (error) {
269
+ console.warn("Failed to save wallet addresses to storage:", error);
270
+ }
271
+ }
272
+ /**
273
+ * Clear all cached data
274
+ */
275
+ clearCache() {
276
+ this.addressCache.clear();
277
+ if (this.config.persistToStorage && typeof window !== "undefined") {
278
+ localStorage.removeItem(this.config.storageKey);
279
+ }
280
+ }
281
+ /**
282
+ * Load identity from storage
283
+ */
284
+ loadIdentityFromStorage(keyHash) {
285
+ if (typeof window === "undefined") return null;
286
+ try {
287
+ const stored = localStorage.getItem(this.config.storageKey);
288
+ if (!stored) return null;
289
+ const data = JSON.parse(stored);
290
+ const storedIdentity = data.identities?.[keyHash];
291
+ const addresses = data.addresses?.[keyHash];
292
+ if (!storedIdentity || !addresses) return null;
293
+ return {
294
+ keyHash: storedIdentity.keyHash,
295
+ publicKeyX: BigInt(storedIdentity.publicKeyX),
296
+ publicKeyY: BigInt(storedIdentity.publicKeyY),
297
+ credentialId: storedIdentity.credentialId,
298
+ addresses,
299
+ createdAt: storedIdentity.createdAt,
300
+ updatedAt: storedIdentity.updatedAt
301
+ };
302
+ } catch (error) {
303
+ console.warn("Failed to load identity from storage:", error);
304
+ return null;
305
+ }
306
+ }
307
+ };
308
+
309
+ // src/constants/tokens.ts
310
+ var NATIVE_TOKEN_ADDRESS = "native";
311
+ var EVM_ZERO_ADDRESS = "0x0000000000000000000000000000000000000000";
312
+ var BASE_SEPOLIA_TOKENS = {
313
+ wormholeChainId: 10004,
314
+ chainName: "Base Sepolia",
315
+ nativeToken: {
316
+ symbol: "ETH",
317
+ name: "Ether",
318
+ address: NATIVE_TOKEN_ADDRESS,
319
+ decimals: 18,
320
+ isNative: true
321
+ },
322
+ tokens: [
323
+ {
324
+ symbol: "USDC",
325
+ name: "USD Coin (Test)",
326
+ address: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
327
+ // Circle test USDC
328
+ decimals: 6,
329
+ isNative: false
330
+ },
331
+ {
332
+ symbol: "WETH",
333
+ name: "Wrapped Ether",
334
+ address: "0x4200000000000000000000000000000000000006",
335
+ decimals: 18,
336
+ isNative: false
337
+ }
338
+ ]
339
+ };
340
+ var OPTIMISM_SEPOLIA_TOKENS = {
341
+ wormholeChainId: 10005,
342
+ chainName: "Optimism Sepolia",
343
+ nativeToken: {
344
+ symbol: "ETH",
345
+ name: "Ether",
346
+ address: NATIVE_TOKEN_ADDRESS,
347
+ decimals: 18,
348
+ isNative: true
349
+ },
350
+ tokens: [
351
+ {
352
+ symbol: "USDC",
353
+ name: "USD Coin (Test)",
354
+ address: "0x5fd84259d66Cd46123540766Be93DFE6D43130D7",
355
+ // Test USDC
356
+ decimals: 6,
357
+ isNative: false
358
+ },
359
+ {
360
+ symbol: "WETH",
361
+ name: "Wrapped Ether",
362
+ address: "0x4200000000000000000000000000000000000006",
363
+ decimals: 18,
364
+ isNative: false
365
+ },
366
+ {
367
+ symbol: "WETH.base",
368
+ name: "Wrapped WETH (Base via Wormhole)",
369
+ address: "0xD408f6498f48aE11BcAb518dA39cF7940eE3271d",
370
+ // Wormhole-wrapped Base WETH
371
+ decimals: 18,
372
+ isNative: false
373
+ }
374
+ ]
375
+ };
376
+ var ARBITRUM_SEPOLIA_TOKENS = {
377
+ wormholeChainId: 10003,
378
+ chainName: "Arbitrum Sepolia",
379
+ nativeToken: {
380
+ symbol: "ETH",
381
+ name: "Ether",
382
+ address: NATIVE_TOKEN_ADDRESS,
383
+ decimals: 18,
384
+ isNative: true
385
+ },
386
+ tokens: [
387
+ {
388
+ symbol: "USDC",
389
+ name: "USD Coin (Test)",
390
+ address: "0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d",
391
+ // Circle USDC Arbitrum Sepolia
392
+ decimals: 6,
393
+ isNative: false
394
+ },
395
+ {
396
+ symbol: "WETH",
397
+ name: "Wrapped Ether",
398
+ address: "0x980B62Da83eFf3D4576C647993b0c1D7faf17c73",
399
+ decimals: 18,
400
+ isNative: false
401
+ }
402
+ ]
403
+ };
404
+ var ETHEREUM_SEPOLIA_TOKENS = {
405
+ wormholeChainId: 10002,
406
+ chainName: "Ethereum Sepolia",
407
+ nativeToken: {
408
+ symbol: "ETH",
409
+ name: "Ether",
410
+ address: NATIVE_TOKEN_ADDRESS,
411
+ decimals: 18,
412
+ isNative: true
413
+ },
414
+ tokens: [
415
+ {
416
+ symbol: "USDC",
417
+ name: "USD Coin (Test)",
418
+ address: "0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238",
419
+ // Circle USDC Sepolia
420
+ decimals: 6,
421
+ isNative: false
422
+ },
423
+ {
424
+ symbol: "WETH",
425
+ name: "Wrapped Ether",
426
+ address: "0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9",
427
+ // WETH Sepolia
428
+ decimals: 18,
429
+ isNative: false
430
+ },
431
+ {
432
+ symbol: "LINK",
433
+ name: "Chainlink Token",
434
+ address: "0x779877A7B0D9E8603169DdbD7836e478b4624789",
435
+ // LINK Sepolia
436
+ decimals: 18,
437
+ isNative: false
438
+ }
439
+ ]
440
+ };
441
+ var MONAD_TESTNET_TOKENS = {
442
+ wormholeChainId: 10048,
443
+ chainName: "Monad Testnet",
444
+ nativeToken: {
445
+ symbol: "MON",
446
+ name: "Monad",
447
+ decimals: 18,
448
+ address: NATIVE_TOKEN_ADDRESS,
449
+ isNative: true
450
+ },
451
+ tokens: [
452
+ {
453
+ symbol: "USDC",
454
+ name: "USD Coin",
455
+ decimals: 6,
456
+ address: "0x754704Bc059F8C67012fEd69BC8A327a5aafb603",
457
+ isNative: false
458
+ },
459
+ {
460
+ symbol: "AUSD",
461
+ name: "Agora Dollar",
462
+ decimals: 18,
463
+ address: "0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a",
464
+ isNative: false
465
+ },
466
+ {
467
+ symbol: "WMON",
468
+ name: "Wrapped MON",
469
+ decimals: 18,
470
+ address: "0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A",
471
+ isNative: false
472
+ }
473
+ ]
474
+ };
475
+ var AVALANCHE_FUJI_TOKENS = {
476
+ wormholeChainId: 6,
477
+ chainName: "Avalanche Fuji",
478
+ nativeToken: {
479
+ symbol: "AVAX",
480
+ name: "Avalanche",
481
+ address: NATIVE_TOKEN_ADDRESS,
482
+ decimals: 18,
483
+ isNative: true
484
+ },
485
+ tokens: [
486
+ {
487
+ symbol: "USDC",
488
+ name: "USD Coin (Test)",
489
+ address: "0x5425890298aed601595a70AB815c96711a31Bc65",
490
+ // Circle USDC Fuji
491
+ decimals: 6,
492
+ isNative: false
493
+ },
494
+ {
495
+ symbol: "USDT",
496
+ name: "Tether USD (Test)",
497
+ address: "0xAb231A5744C8E6c45481754928cCfFFFd4aa0732",
498
+ // USDT Fuji
499
+ decimals: 6,
500
+ isNative: false
501
+ },
502
+ {
503
+ symbol: "WAVAX",
504
+ name: "Wrapped AVAX",
505
+ address: "0xd00ae08403B9bbb9124bB305C09058E32C39A48c",
506
+ // WAVAX Fuji
507
+ decimals: 18,
508
+ isNative: false
509
+ }
510
+ ]
511
+ };
512
+ var TOKEN_REGISTRY = {
513
+ 10004: BASE_SEPOLIA_TOKENS,
514
+ 10005: OPTIMISM_SEPOLIA_TOKENS,
515
+ 10003: ARBITRUM_SEPOLIA_TOKENS,
516
+ 10002: ETHEREUM_SEPOLIA_TOKENS,
517
+ 10048: MONAD_TESTNET_TOKENS,
518
+ 6: AVALANCHE_FUJI_TOKENS
519
+ };
520
+ function getTokenList(wormholeChainId) {
521
+ return TOKEN_REGISTRY[wormholeChainId] ?? null;
522
+ }
523
+ function getAllTokens(wormholeChainId) {
524
+ const list = getTokenList(wormholeChainId);
525
+ if (!list) return [];
526
+ return [list.nativeToken, ...list.tokens];
527
+ }
528
+ function getTokenBySymbol(wormholeChainId, symbol) {
529
+ const tokens = getAllTokens(wormholeChainId);
530
+ return tokens.find((t) => t.symbol.toLowerCase() === symbol.toLowerCase()) ?? null;
531
+ }
532
+ function getTokenByAddress(wormholeChainId, address) {
533
+ const tokens = getAllTokens(wormholeChainId);
534
+ const normalizedAddress = address.toLowerCase();
535
+ return tokens.find((t) => t.address.toLowerCase() === normalizedAddress) ?? null;
536
+ }
537
+ function isNativeToken(address) {
538
+ return address.toLowerCase() === NATIVE_TOKEN_ADDRESS || address === EVM_ZERO_ADDRESS;
539
+ }
540
+ function getSupportedChainIds() {
541
+ return Object.keys(TOKEN_REGISTRY).map(Number);
542
+ }
543
+ function getChainName(wormholeChainId) {
544
+ return TOKEN_REGISTRY[wormholeChainId]?.chainName ?? null;
545
+ }
546
+
547
+ export {
548
+ WalletManager,
549
+ NATIVE_TOKEN_ADDRESS,
550
+ EVM_ZERO_ADDRESS,
551
+ BASE_SEPOLIA_TOKENS,
552
+ OPTIMISM_SEPOLIA_TOKENS,
553
+ ARBITRUM_SEPOLIA_TOKENS,
554
+ ETHEREUM_SEPOLIA_TOKENS,
555
+ MONAD_TESTNET_TOKENS,
556
+ TOKEN_REGISTRY,
557
+ getTokenList,
558
+ getAllTokens,
559
+ getTokenBySymbol,
560
+ getTokenByAddress,
561
+ isNativeToken,
562
+ getSupportedChainIds,
563
+ getChainName
564
+ };
565
+ //# sourceMappingURL=chunk-PDHZ5X5O.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/core/WalletManager.ts","../src/constants/tokens.ts"],"sourcesContent":["/**\n * Veridex Protocol SDK - Wallet Manager\n * \n * Manages deterministic wallet addresses across multiple chains.\n * Vault addresses are computed using CREATE2 on EVM chains and chain-specific\n * derivation on non-EVM chains, all based on the user's passkey public key.\n */\n\nimport { ethers } from 'ethers';\nimport type { \n PasskeyCredential,\n UnifiedIdentity,\n ChainAddress,\n WalletManagerConfig,\n} from './types.js';\nimport { computeKeyHash } from '../utils.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * EIP-1167 minimal proxy bytecode prefix (before implementation address)\n * 3d602d80600a3d3981f3363d3d373d3d3d363d73\n */\nconst PROXY_BYTECODE_PREFIX = '0x3d602d80600a3d3981f3363d3d373d3d3d363d73';\n\n/**\n * EIP-1167 minimal proxy bytecode suffix (after implementation address)\n * 5af43d82803e903d91602b57fd5bf3\n */\nconst PROXY_BYTECODE_SUFFIX = '5af43d82803e903d91602b57fd5bf3';\n\n// ============================================================================\n// WalletManager Class\n// ============================================================================\n\n/**\n * Manages wallet address derivation and storage for Veridex Protocol\n * \n * @example\n * ```typescript\n * const manager = new WalletManager();\n * \n * // Compute vault address for a credential\n * const address = await manager.computeVaultAddress(\n * credential.keyHash,\n * factoryAddress,\n * implementationAddress\n * );\n * \n * // Get unified identity with addresses on all chains\n * const identity = await manager.getUnifiedIdentity(credential, chainConfigs);\n * ```\n */\nexport class WalletManager {\n private config: WalletManagerConfig;\n private addressCache: Map<string, ChainAddress[]> = new Map();\n\n constructor(config: WalletManagerConfig = {}) {\n this.config = {\n cacheAddresses: config.cacheAddresses ?? true,\n persistToStorage: config.persistToStorage ?? false,\n storageKey: config.storageKey ?? 'veridex_wallet_addresses',\n };\n\n // Load cached addresses from storage if enabled\n if (this.config.persistToStorage && typeof window !== 'undefined') {\n this.loadFromStorage();\n }\n }\n\n // ========================================================================\n // Address Computation\n // ========================================================================\n\n /**\n * Compute the deterministic vault address for an EVM chain\n * \n * Uses CREATE2 with EIP-1167 minimal proxy pattern:\n * - Salt = keccak256(factoryAddress, ownerKeyHash)\n * - InitCode = EIP-1167 proxy bytecode with implementation address\n * \n * @param keyHash - The owner's key hash (keccak256 of public key coordinates)\n * @param factoryAddress - The vault factory contract address\n * @param implementationAddress - The vault implementation contract address\n * @returns The deterministic vault address\n */\n computeVaultAddress(\n keyHash: string,\n factoryAddress: string,\n implementationAddress: string\n ): string {\n // Compute salt: keccak256(abi.encodePacked(factory, keyHash))\n const salt = ethers.keccak256(\n ethers.solidityPacked(\n ['address', 'bytes32'],\n [factoryAddress, keyHash]\n )\n );\n\n // Build EIP-1167 initcode\n const initCode = this.buildProxyInitCode(implementationAddress);\n const initCodeHash = ethers.keccak256(initCode);\n\n // CREATE2 address computation:\n // address = keccak256(0xff ++ factory ++ salt ++ initCodeHash)[12:]\n const create2Data = ethers.solidityPacked(\n ['bytes1', 'address', 'bytes32', 'bytes32'],\n ['0xff', factoryAddress, salt, initCodeHash]\n );\n\n const hash = ethers.keccak256(create2Data);\n // Take last 20 bytes as address\n return ethers.getAddress('0x' + hash.slice(26));\n }\n\n /**\n * Compute vault address from public key coordinates\n * \n * @param publicKeyX - P-256 public key X coordinate\n * @param publicKeyY - P-256 public key Y coordinate\n * @param factoryAddress - The vault factory contract address\n * @param implementationAddress - The vault implementation contract address\n * @returns The deterministic vault address\n */\n computeVaultAddressFromPublicKey(\n publicKeyX: bigint,\n publicKeyY: bigint,\n factoryAddress: string,\n implementationAddress: string\n ): string {\n const keyHash = computeKeyHash(publicKeyX, publicKeyY);\n return this.computeVaultAddress(keyHash, factoryAddress, implementationAddress);\n }\n\n /**\n * Build EIP-1167 minimal proxy initcode\n */\n private buildProxyInitCode(implementationAddress: string): string {\n // Remove 0x prefix if present and lowercase\n const impl = implementationAddress.toLowerCase().replace('0x', '');\n \n // EIP-1167 bytecode format\n return PROXY_BYTECODE_PREFIX + impl + PROXY_BYTECODE_SUFFIX;\n }\n\n // ========================================================================\n // Unified Identity\n // ========================================================================\n\n /**\n * Get unified identity with addresses across all configured chains\n * \n * @param credential - The passkey credential\n * @param chainConfigs - Map of chain configurations with factory/implementation addresses\n * @returns Unified identity with addresses on each chain\n */\n async getUnifiedIdentity(\n credential: PasskeyCredential,\n chainConfigs: Map<number, ChainAddressConfig>\n ): Promise<UnifiedIdentity> {\n const addresses: ChainAddress[] = [];\n\n for (const [wormholeChainId, config] of chainConfigs) {\n const address = await this.deriveAddressForChain(\n credential,\n wormholeChainId,\n config\n );\n \n if (address) {\n addresses.push(address);\n }\n }\n\n const identity: UnifiedIdentity = {\n keyHash: credential.keyHash,\n publicKeyX: credential.publicKeyX,\n publicKeyY: credential.publicKeyY,\n credentialId: credential.credentialId,\n addresses,\n createdAt: Date.now(),\n updatedAt: Date.now(),\n };\n\n // Cache the identity\n if (this.config.cacheAddresses) {\n this.addressCache.set(credential.keyHash, addresses);\n }\n\n // Persist to storage if enabled\n if (this.config.persistToStorage) {\n this.saveToStorage(identity);\n }\n\n return identity;\n }\n\n /**\n * Derive address for a specific chain\n */\n private async deriveAddressForChain(\n credential: PasskeyCredential,\n wormholeChainId: number,\n config: ChainAddressConfig\n ): Promise<ChainAddress | null> {\n if (config.isEvm) {\n // EVM chains use CREATE2\n if (!config.factoryAddress || !config.implementationAddress) {\n return null;\n }\n\n const address = this.computeVaultAddress(\n credential.keyHash,\n config.factoryAddress,\n config.implementationAddress\n );\n\n return {\n wormholeChainId,\n chainName: config.chainName,\n address,\n isEvm: true,\n deployed: false, // Will be checked separately\n };\n } else {\n // Non-EVM chains have chain-specific address derivation\n return this.deriveNonEvmAddress(credential, wormholeChainId, config);\n }\n }\n\n /**\n * Derive address for non-EVM chains\n * \n * Each chain has its own address format:\n * - Solana: Base58 encoded public key hash\n * - Aptos: 32-byte hex address\n * - Sui: 32-byte hex address with 0x prefix\n */\n private deriveNonEvmAddress(\n credential: PasskeyCredential,\n wormholeChainId: number,\n _config: ChainAddressConfig\n ): ChainAddress | null {\n switch (wormholeChainId) {\n case 1: // Solana\n // Solana uses the key hash directly as a seed for PDA derivation\n // The actual address depends on the program ID\n return {\n wormholeChainId: 1,\n chainName: 'Solana',\n address: credential.keyHash, // PDA will be derived from this\n isEvm: false,\n derivationType: 'pda',\n deployed: false,\n };\n\n case 22: // Aptos\n // Aptos uses the key hash as the resource account address\n return {\n wormholeChainId: 22,\n chainName: 'Aptos',\n address: credential.keyHash,\n isEvm: false,\n derivationType: 'resource_account',\n deployed: false,\n };\n\n case 21: // Sui\n // Sui uses the key hash with 0x prefix\n return {\n wormholeChainId: 21,\n chainName: 'Sui',\n address: credential.keyHash,\n isEvm: false,\n derivationType: 'object',\n deployed: false,\n };\n\n default:\n // Unknown chain\n return null;\n }\n }\n\n // ========================================================================\n // Address Lookup\n // ========================================================================\n\n /**\n * Get cached address for a chain\n */\n getAddressForChain(keyHash: string, wormholeChainId: number): ChainAddress | undefined {\n const addresses = this.addressCache.get(keyHash);\n return addresses?.find(a => a.wormholeChainId === wormholeChainId);\n }\n\n /**\n * Get all cached addresses for a key hash\n */\n getAddresses(keyHash: string): ChainAddress[] {\n return this.addressCache.get(keyHash) ?? [];\n }\n\n /**\n * Update deployment status for an address\n */\n updateDeploymentStatus(\n keyHash: string,\n wormholeChainId: number,\n deployed: boolean,\n deploymentTxHash?: string\n ): void {\n const addresses = this.addressCache.get(keyHash);\n if (!addresses) return;\n\n const address = addresses.find(a => a.wormholeChainId === wormholeChainId);\n if (address) {\n address.deployed = deployed;\n address.deploymentTxHash = deploymentTxHash;\n }\n\n // Persist update if enabled\n if (this.config.persistToStorage) {\n this.saveAddressesToStorage(keyHash, addresses);\n }\n }\n\n // ========================================================================\n // Storage\n // ========================================================================\n\n /**\n * Load addresses from localStorage\n */\n private loadFromStorage(): void {\n if (typeof window === 'undefined') return;\n\n try {\n const stored = localStorage.getItem(this.config.storageKey!);\n if (!stored) return;\n\n const data = JSON.parse(stored) as StoredWalletData;\n \n for (const [keyHash, addresses] of Object.entries(data.addresses)) {\n this.addressCache.set(keyHash, addresses);\n }\n } catch (error) {\n console.warn('Failed to load wallet addresses from storage:', error);\n }\n }\n\n /**\n * Save identity to localStorage\n */\n private saveToStorage(identity: UnifiedIdentity): void {\n if (typeof window === 'undefined') return;\n\n try {\n const stored = localStorage.getItem(this.config.storageKey!) ?? '{}';\n const data = JSON.parse(stored) as StoredWalletData;\n\n if (!data.addresses) {\n data.addresses = {};\n }\n\n // Store identity with serialized bigints\n data.addresses[identity.keyHash] = identity.addresses;\n data.identities = data.identities ?? {};\n data.identities[identity.keyHash] = {\n keyHash: identity.keyHash,\n publicKeyX: identity.publicKeyX.toString(),\n publicKeyY: identity.publicKeyY.toString(),\n credentialId: identity.credentialId,\n createdAt: identity.createdAt,\n updatedAt: identity.updatedAt,\n };\n\n localStorage.setItem(this.config.storageKey!, JSON.stringify(data));\n } catch (error) {\n console.warn('Failed to save wallet addresses to storage:', error);\n }\n }\n\n /**\n * Save addresses to localStorage\n */\n private saveAddressesToStorage(keyHash: string, addresses: ChainAddress[]): void {\n if (typeof window === 'undefined') return;\n\n try {\n const stored = localStorage.getItem(this.config.storageKey!) ?? '{}';\n const data = JSON.parse(stored) as StoredWalletData;\n\n if (!data.addresses) {\n data.addresses = {};\n }\n\n data.addresses[keyHash] = addresses;\n localStorage.setItem(this.config.storageKey!, JSON.stringify(data));\n } catch (error) {\n console.warn('Failed to save wallet addresses to storage:', error);\n }\n }\n\n /**\n * Clear all cached data\n */\n clearCache(): void {\n this.addressCache.clear();\n \n if (this.config.persistToStorage && typeof window !== 'undefined') {\n localStorage.removeItem(this.config.storageKey!);\n }\n }\n\n /**\n * Load identity from storage\n */\n loadIdentityFromStorage(keyHash: string): UnifiedIdentity | null {\n if (typeof window === 'undefined') return null;\n\n try {\n const stored = localStorage.getItem(this.config.storageKey!);\n if (!stored) return null;\n\n const data = JSON.parse(stored) as StoredWalletData;\n const storedIdentity = data.identities?.[keyHash];\n const addresses = data.addresses?.[keyHash];\n\n if (!storedIdentity || !addresses) return null;\n\n return {\n keyHash: storedIdentity.keyHash,\n publicKeyX: BigInt(storedIdentity.publicKeyX),\n publicKeyY: BigInt(storedIdentity.publicKeyY),\n credentialId: storedIdentity.credentialId,\n addresses,\n createdAt: storedIdentity.createdAt,\n updatedAt: storedIdentity.updatedAt,\n };\n } catch (error) {\n console.warn('Failed to load identity from storage:', error);\n return null;\n }\n }\n}\n\n// ============================================================================\n// Helper Types (Internal)\n// ============================================================================\n\ninterface ChainAddressConfig {\n chainName: string;\n isEvm: boolean;\n factoryAddress?: string;\n implementationAddress?: string;\n}\n\ninterface StoredWalletData {\n addresses: Record<string, ChainAddress[]>;\n identities?: Record<string, {\n keyHash: string;\n publicKeyX: string;\n publicKeyY: string;\n credentialId: string;\n createdAt: number;\n updatedAt: number;\n }>;\n}\n\n// Export the helper type for external use\nexport type { ChainAddressConfig };\n","/**\n * Veridex Protocol SDK - Token Constants\n * \n * Known tokens per chain for balance fetching and transfers\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TokenInfo {\n /** Token symbol (e.g., 'USDC', 'ETH') */\n symbol: string;\n /** Token name (e.g., 'USD Coin') */\n name: string;\n /** Token address (use 'native' for native token) */\n address: string;\n /** Number of decimals */\n decimals: number;\n /** Optional logo URL */\n logoUrl?: string;\n /** Whether this is the native token */\n isNative: boolean;\n /** Wormhole-wrapped token address on other chains (by wormhole chain ID) */\n wrappedAddresses?: Record<number, string>;\n}\n\nexport interface ChainTokenList {\n /** Wormhole chain ID */\n wormholeChainId: number;\n /** Chain name */\n chainName: string;\n /** Native token info */\n nativeToken: TokenInfo;\n /** ERC20/SPL/etc tokens */\n tokens: TokenInfo[];\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Native token address constant\n */\nexport const NATIVE_TOKEN_ADDRESS = 'native';\n\n/**\n * Zero address for EVM chains\n */\nexport const EVM_ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\n// ============================================================================\n// Base Sepolia (Hub Chain) - Wormhole Chain ID 10004\n// ============================================================================\n\nexport const BASE_SEPOLIA_TOKENS: ChainTokenList = {\n wormholeChainId: 10004,\n chainName: 'Base Sepolia',\n nativeToken: {\n symbol: 'ETH',\n name: 'Ether',\n address: NATIVE_TOKEN_ADDRESS,\n decimals: 18,\n isNative: true,\n },\n tokens: [\n {\n symbol: 'USDC',\n name: 'USD Coin (Test)',\n address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Circle test USDC\n decimals: 6,\n isNative: false,\n },\n {\n symbol: 'WETH',\n name: 'Wrapped Ether',\n address: '0x4200000000000000000000000000000000000006',\n decimals: 18,\n isNative: false,\n },\n ],\n};\n\n// ============================================================================\n// Optimism Sepolia (Spoke Chain) - Wormhole Chain ID 10005\n// ============================================================================\n\nexport const OPTIMISM_SEPOLIA_TOKENS: ChainTokenList = {\n wormholeChainId: 10005,\n chainName: 'Optimism Sepolia',\n nativeToken: {\n symbol: 'ETH',\n name: 'Ether',\n address: NATIVE_TOKEN_ADDRESS,\n decimals: 18,\n isNative: true,\n },\n tokens: [\n {\n symbol: 'USDC',\n name: 'USD Coin (Test)',\n address: '0x5fd84259d66Cd46123540766Be93DFE6D43130D7', // Test USDC\n decimals: 6,\n isNative: false,\n },\n {\n symbol: 'WETH',\n name: 'Wrapped Ether',\n address: '0x4200000000000000000000000000000000000006',\n decimals: 18,\n isNative: false,\n },\n {\n symbol: 'WETH.base',\n name: 'Wrapped WETH (Base via Wormhole)',\n address: '0xD408f6498f48aE11BcAb518dA39cF7940eE3271d', // Wormhole-wrapped Base WETH\n decimals: 18,\n isNative: false,\n },\n ],\n};\n\n// ============================================================================\n// Arbitrum Sepolia (Spoke Chain) - Wormhole Chain ID 10003\n// ============================================================================\n\nexport const ARBITRUM_SEPOLIA_TOKENS: ChainTokenList = {\n wormholeChainId: 10003,\n chainName: 'Arbitrum Sepolia',\n nativeToken: {\n symbol: 'ETH',\n name: 'Ether',\n address: NATIVE_TOKEN_ADDRESS,\n decimals: 18,\n isNative: true,\n },\n tokens: [\n {\n symbol: 'USDC',\n name: 'USD Coin (Test)',\n address: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d', // Circle USDC Arbitrum Sepolia\n decimals: 6,\n isNative: false,\n },\n {\n symbol: 'WETH',\n name: 'Wrapped Ether',\n address: '0x980B62Da83eFf3D4576C647993b0c1D7faf17c73',\n decimals: 18,\n isNative: false,\n },\n ],\n};\n\n// ============================================================================\n// Ethereum Sepolia (Spoke Chain) - Wormhole Chain ID 10002\n// ============================================================================\n\nexport const ETHEREUM_SEPOLIA_TOKENS: ChainTokenList = {\n wormholeChainId: 10002,\n chainName: 'Ethereum Sepolia',\n nativeToken: {\n symbol: 'ETH',\n name: 'Ether',\n address: NATIVE_TOKEN_ADDRESS,\n decimals: 18,\n isNative: true,\n },\n tokens: [\n {\n symbol: 'USDC',\n name: 'USD Coin (Test)',\n address: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238', // Circle USDC Sepolia\n decimals: 6,\n isNative: false,\n },\n {\n symbol: 'WETH',\n name: 'Wrapped Ether',\n address: '0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9', // WETH Sepolia\n decimals: 18,\n isNative: false,\n },\n {\n symbol: 'LINK',\n name: 'Chainlink Token',\n address: '0x779877A7B0D9E8603169DdbD7836e478b4624789', // LINK Sepolia\n decimals: 18,\n isNative: false,\n },\n ],\n};\n\n// ============================================================================\n// Monad Testnet (Spoke Chain) - Wormhole Chain ID 10048\n// ============================================================================\n\nexport const MONAD_TESTNET_TOKENS: ChainTokenList = {\n wormholeChainId: 10048,\n chainName: 'Monad Testnet',\n nativeToken: {\n symbol: 'MON',\n name: 'Monad',\n decimals: 18,\n address: NATIVE_TOKEN_ADDRESS,\n isNative: true,\n },\n tokens: [\n {\n symbol: 'USDC',\n name: 'USD Coin',\n decimals: 6,\n address: '0x754704Bc059F8C67012fEd69BC8A327a5aafb603',\n isNative: false,\n },\n {\n symbol: 'AUSD',\n name: 'Agora Dollar',\n decimals: 18,\n address: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a',\n isNative: false,\n },\n {\n symbol: 'WMON',\n name: 'Wrapped MON',\n decimals: 18,\n address: '0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A',\n isNative: false,\n },\n ],\n};\n\n// ============================================================================\n// Avalanche Fuji (Spoke/Hub Chain) - Wormhole Chain ID 6\n// ============================================================================\n\nexport const AVALANCHE_FUJI_TOKENS: ChainTokenList = {\n wormholeChainId: 6,\n chainName: 'Avalanche Fuji',\n nativeToken: {\n symbol: 'AVAX',\n name: 'Avalanche',\n address: NATIVE_TOKEN_ADDRESS,\n decimals: 18,\n isNative: true,\n },\n tokens: [\n {\n symbol: 'USDC',\n name: 'USD Coin (Test)',\n address: '0x5425890298aed601595a70AB815c96711a31Bc65', // Circle USDC Fuji\n decimals: 6,\n isNative: false,\n },\n {\n symbol: 'USDT',\n name: 'Tether USD (Test)',\n address: '0xAb231A5744C8E6c45481754928cCfFFFd4aa0732', // USDT Fuji\n decimals: 6,\n isNative: false,\n },\n {\n symbol: 'WAVAX',\n name: 'Wrapped AVAX',\n address: '0xd00ae08403B9bbb9124bB305C09058E32C39A48c', // WAVAX Fuji\n decimals: 18,\n isNative: false,\n },\n ],\n};\n\n// ============================================================================\n// Token Registry\n// ============================================================================\n\n/**\n * All token lists indexed by Wormhole chain ID\n */\nexport const TOKEN_REGISTRY: Record<number, ChainTokenList> = {\n 10004: BASE_SEPOLIA_TOKENS,\n 10005: OPTIMISM_SEPOLIA_TOKENS,\n 10003: ARBITRUM_SEPOLIA_TOKENS,\n 10002: ETHEREUM_SEPOLIA_TOKENS,\n 10048: MONAD_TESTNET_TOKENS,\n 6: AVALANCHE_FUJI_TOKENS,\n};\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get token list for a chain\n */\nexport function getTokenList(wormholeChainId: number): ChainTokenList | null {\n return TOKEN_REGISTRY[wormholeChainId] ?? null;\n}\n\n/**\n * Get all tokens for a chain (native + ERC20)\n */\nexport function getAllTokens(wormholeChainId: number): TokenInfo[] {\n const list = getTokenList(wormholeChainId);\n if (!list) return [];\n return [list.nativeToken, ...list.tokens];\n}\n\n/**\n * Get token info by symbol\n */\nexport function getTokenBySymbol(wormholeChainId: number, symbol: string): TokenInfo | null {\n const tokens = getAllTokens(wormholeChainId);\n return tokens.find(t => t.symbol.toLowerCase() === symbol.toLowerCase()) ?? null;\n}\n\n/**\n * Get token info by address\n */\nexport function getTokenByAddress(wormholeChainId: number, address: string): TokenInfo | null {\n const tokens = getAllTokens(wormholeChainId);\n const normalizedAddress = address.toLowerCase();\n return tokens.find(t => t.address.toLowerCase() === normalizedAddress) ?? null;\n}\n\n/**\n * Check if an address is the native token\n */\nexport function isNativeToken(address: string): boolean {\n return address.toLowerCase() === NATIVE_TOKEN_ADDRESS ||\n address === EVM_ZERO_ADDRESS;\n}\n\n/**\n * Get supported chain IDs\n */\nexport function getSupportedChainIds(): number[] {\n return Object.keys(TOKEN_REGISTRY).map(Number);\n}\n\n/**\n * Get chain name by Wormhole chain ID\n */\nexport function getChainName(wormholeChainId: number): string | null {\n return TOKEN_REGISTRY[wormholeChainId]?.chainName ?? null;\n}\n"],"mappings":"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","names":[]}