@jack-kernel/sdk 1.1.0 → 1.2.2

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 (50) hide show
  1. package/README.md +128 -19
  2. package/dist/cjs/index.js +83 -1
  3. package/dist/cjs/index.js.map +1 -1
  4. package/dist/cjs/lifi/chain-map.js +39 -0
  5. package/dist/cjs/lifi/chain-map.js.map +1 -0
  6. package/dist/cjs/lifi/fallback.js +135 -0
  7. package/dist/cjs/lifi/fallback.js.map +1 -0
  8. package/dist/cjs/lifi/index.js +34 -0
  9. package/dist/cjs/lifi/index.js.map +1 -0
  10. package/dist/cjs/lifi/lifi-provider.js +496 -0
  11. package/dist/cjs/lifi/lifi-provider.js.map +1 -0
  12. package/dist/cjs/lifi/token-map.js +75 -0
  13. package/dist/cjs/lifi/token-map.js.map +1 -0
  14. package/dist/cjs/lifi/types.js +3 -0
  15. package/dist/cjs/lifi/types.js.map +1 -0
  16. package/dist/cjs/lifi/utils.js +45 -0
  17. package/dist/cjs/lifi/utils.js.map +1 -0
  18. package/dist/esm/index.js +69 -1
  19. package/dist/esm/index.js.map +1 -1
  20. package/dist/esm/lifi/chain-map.js +35 -0
  21. package/dist/esm/lifi/chain-map.js.map +1 -0
  22. package/dist/esm/lifi/fallback.js +128 -0
  23. package/dist/esm/lifi/fallback.js.map +1 -0
  24. package/dist/esm/lifi/index.js +19 -0
  25. package/dist/esm/lifi/index.js.map +1 -0
  26. package/dist/esm/lifi/lifi-provider.js +492 -0
  27. package/dist/esm/lifi/lifi-provider.js.map +1 -0
  28. package/dist/esm/lifi/token-map.js +71 -0
  29. package/dist/esm/lifi/token-map.js.map +1 -0
  30. package/dist/esm/lifi/types.js +2 -0
  31. package/dist/esm/lifi/types.js.map +1 -0
  32. package/dist/esm/lifi/utils.js +41 -0
  33. package/dist/esm/lifi/utils.js.map +1 -0
  34. package/dist/types/index.d.ts +58 -1
  35. package/dist/types/index.d.ts.map +1 -1
  36. package/dist/types/lifi/chain-map.d.ts +27 -0
  37. package/dist/types/lifi/chain-map.d.ts.map +1 -0
  38. package/dist/types/lifi/fallback.d.ts +58 -0
  39. package/dist/types/lifi/fallback.d.ts.map +1 -0
  40. package/dist/types/lifi/index.d.ts +18 -0
  41. package/dist/types/lifi/index.d.ts.map +1 -0
  42. package/dist/types/lifi/lifi-provider.d.ts +133 -0
  43. package/dist/types/lifi/lifi-provider.d.ts.map +1 -0
  44. package/dist/types/lifi/token-map.d.ts +34 -0
  45. package/dist/types/lifi/token-map.d.ts.map +1 -0
  46. package/dist/types/lifi/types.d.ts +52 -0
  47. package/dist/types/lifi/types.d.ts.map +1 -0
  48. package/dist/types/lifi/utils.d.ts +29 -0
  49. package/dist/types/lifi/utils.d.ts.map +1 -0
  50. package/package.json +4 -1
@@ -0,0 +1,492 @@
1
+ /**
2
+ * LifiProvider — main entry point for all LI.FI operations.
3
+ *
4
+ * Handles initialization, parameter validation, SDK delegation,
5
+ * response normalization, retry logic, and fallback.
6
+ *
7
+ * @module
8
+ */
9
+ import { createConfig, getQuote, getRoutes, getStatus } from '@lifi/sdk';
10
+ import { buildFallbackQuote, buildFallbackRoute, buildFallbackStatus, deterministicId, } from './fallback.js';
11
+ import { resolveChain } from './chain-map.js';
12
+ import { resolveToken } from './token-map.js';
13
+ import { toBaseUnits, fromBaseUnits } from './utils.js';
14
+ /** Default configuration values. */
15
+ const DEFAULTS = {
16
+ integrator: 'jackkernel',
17
+ apiUrl: 'https://li.quest/v1',
18
+ chains: [42161, 10, 8453, 137],
19
+ timeout: 30_000,
20
+ maxRetries: 3,
21
+ retryDelay: 1_000,
22
+ };
23
+ /**
24
+ * LifiProvider wraps the `@lifi/sdk` to provide quote fetching, route
25
+ * discovery, status tracking, and execution capabilities for the JACK SDK.
26
+ *
27
+ * The constructor calls `createConfig` from `@lifi/sdk` with the integrator
28
+ * string "jackkernel" and any user-supplied configuration. Each public method
29
+ * validates input, delegates to the SDK with retry logic, normalizes the
30
+ * response, and falls back to the FallbackProvider on any error.
31
+ */
32
+ export class LifiProvider {
33
+ config;
34
+ /**
35
+ * Create a new LifiProvider.
36
+ *
37
+ * @param userConfig - Optional configuration overrides
38
+ * @throws If `createConfig` from `@lifi/sdk` fails
39
+ */
40
+ constructor(userConfig) {
41
+ this.config = {
42
+ integrator: userConfig?.integrator ?? DEFAULTS.integrator,
43
+ apiKey: userConfig?.apiKey,
44
+ apiUrl: userConfig?.apiUrl ?? DEFAULTS.apiUrl,
45
+ rpcUrls: userConfig?.rpcUrls ?? {},
46
+ chains: userConfig?.chains ?? [...DEFAULTS.chains],
47
+ timeout: userConfig?.timeout ?? DEFAULTS.timeout,
48
+ maxRetries: userConfig?.maxRetries ?? DEFAULTS.maxRetries,
49
+ retryDelay: userConfig?.retryDelay ?? DEFAULTS.retryDelay,
50
+ };
51
+ try {
52
+ createConfig({
53
+ integrator: this.config.integrator,
54
+ ...(this.config.apiKey ? { apiKey: this.config.apiKey } : {}),
55
+ ...(Object.keys(this.config.rpcUrls).length > 0
56
+ ? { rpcUrls: this.config.rpcUrls }
57
+ : {}),
58
+ chains: this.config.chains.map((id) => ({ id, name: String(id), network: String(id) })),
59
+ });
60
+ }
61
+ catch (error) {
62
+ const message = error instanceof Error ? error.message : String(error);
63
+ throw new Error(`LifiProvider: failed to initialize LI.FI SDK — ${message}`);
64
+ }
65
+ }
66
+ // ---------------------------------------------------------------------------
67
+ // Public API (stubs — implemented in tasks 5.2, 5.3, 5.4)
68
+ // ---------------------------------------------------------------------------
69
+ /**
70
+ * Fetch a quote for the given intent parameters.
71
+ *
72
+ * Validates params, resolves chains/tokens, calls `getQuote` from `@lifi/sdk`
73
+ * with retry, normalizes the response, and falls back on error.
74
+ *
75
+ * @param params - Intent parameters
76
+ * @returns A normalized {@link LifiQuotePayload}
77
+ */
78
+ async fetchQuote(params) {
79
+ // 1. Validate params
80
+ const invalid = this.validateParams(params);
81
+ if (invalid) {
82
+ return buildFallbackQuote(params, invalid);
83
+ }
84
+ // 2. Resolve source chain
85
+ const fromChainRes = resolveChain(params.sourceChain);
86
+ if (!fromChainRes.ok) {
87
+ return buildFallbackQuote(params, {
88
+ enabled: true,
89
+ reasonCode: 'UNSUPPORTED_CHAIN',
90
+ message: fromChainRes.reason,
91
+ });
92
+ }
93
+ const fromChainId = fromChainRes.chainId;
94
+ // 3. Resolve destination chain
95
+ const toChainRes = resolveChain(params.destinationChain);
96
+ if (!toChainRes.ok) {
97
+ return buildFallbackQuote(params, {
98
+ enabled: true,
99
+ reasonCode: 'UNSUPPORTED_CHAIN',
100
+ message: toChainRes.reason,
101
+ });
102
+ }
103
+ const toChainId = toChainRes.chainId;
104
+ // 4. Resolve source token
105
+ const fromTokenRes = resolveToken(fromChainId, params.tokenIn);
106
+ if (!fromTokenRes.ok) {
107
+ return buildFallbackQuote(params, {
108
+ enabled: true,
109
+ reasonCode: 'UNSUPPORTED_TOKEN',
110
+ message: fromTokenRes.reason,
111
+ });
112
+ }
113
+ const fromToken = fromTokenRes.token;
114
+ // 5. Resolve destination token
115
+ const toTokenRes = resolveToken(toChainId, params.tokenOut);
116
+ if (!toTokenRes.ok) {
117
+ return buildFallbackQuote(params, {
118
+ enabled: true,
119
+ reasonCode: 'UNSUPPORTED_TOKEN',
120
+ message: toTokenRes.reason,
121
+ });
122
+ }
123
+ const toToken = toTokenRes.token;
124
+ // 6. Convert amountIn to base units
125
+ const fromAmount = toBaseUnits(params.amountIn, fromToken.decimals);
126
+ try {
127
+ // 7. Call getQuote from @lifi/sdk with retry
128
+ const data = await this.executeWithRetry(() => getQuote({
129
+ fromChain: fromChainId,
130
+ toChain: toChainId,
131
+ fromToken: fromToken.address,
132
+ toToken: toToken.address,
133
+ fromAmount: fromAmount,
134
+ fromAddress: '0x0000000000000000000000000000000000000000',
135
+ }));
136
+ // 8. If data is empty/null, return fallback
137
+ if (!data) {
138
+ return buildFallbackQuote(params, {
139
+ enabled: true,
140
+ reasonCode: 'LIFI_EMPTY_RESPONSE',
141
+ message: 'LI.FI returned an empty response',
142
+ });
143
+ }
144
+ // 9. Normalize the response
145
+ const amountOut = data.estimate?.toAmount
146
+ ? fromBaseUnits(data.estimate.toAmount, toToken.decimals)
147
+ : params.amountIn;
148
+ const routeId = data.id ?? deterministicId(JSON.stringify(data));
149
+ const estimatedGasUsd = data.estimate?.gasCosts?.[0]?.amountUSD ?? undefined;
150
+ return {
151
+ provider: 'lifi',
152
+ routeId,
153
+ timestamp: Date.now(),
154
+ quote: {
155
+ amountIn: params.amountIn,
156
+ amountOut,
157
+ minAmountOut: params.minAmountOut,
158
+ fromChainId,
159
+ toChainId,
160
+ fromToken: params.tokenIn,
161
+ toToken: params.tokenOut,
162
+ estimatedGasUsd,
163
+ },
164
+ raw: data,
165
+ };
166
+ }
167
+ catch (error) {
168
+ // 10. Catch errors and return fallback with mapped reason code
169
+ const reasonCode = this.mapErrorToReasonCode(error);
170
+ const message = error instanceof Error ? error.message : 'LI.FI quote request failed';
171
+ return buildFallbackQuote(params, {
172
+ enabled: true,
173
+ reasonCode,
174
+ message,
175
+ });
176
+ }
177
+ }
178
+ /**
179
+ * Fetch the best route for the given intent parameters.
180
+ *
181
+ * Validates params, resolves chains/tokens, calls `getRoutes` from `@lifi/sdk`
182
+ * with retry, selects the best route by output amount, normalizes, and falls
183
+ * back on error.
184
+ *
185
+ * @param params - Intent parameters
186
+ * @returns A normalized {@link LifiRoutePayload}
187
+ */
188
+ async fetchRoute(params) {
189
+ // 1. Validate params
190
+ const invalid = this.validateParams(params);
191
+ if (invalid) {
192
+ return buildFallbackRoute(params, invalid);
193
+ }
194
+ // 2. Resolve source chain
195
+ const fromChainRes = resolveChain(params.sourceChain);
196
+ if (!fromChainRes.ok) {
197
+ return buildFallbackRoute(params, {
198
+ enabled: true,
199
+ reasonCode: 'UNSUPPORTED_CHAIN',
200
+ message: fromChainRes.reason,
201
+ });
202
+ }
203
+ const fromChainId = fromChainRes.chainId;
204
+ // 3. Resolve destination chain
205
+ const toChainRes = resolveChain(params.destinationChain);
206
+ if (!toChainRes.ok) {
207
+ return buildFallbackRoute(params, {
208
+ enabled: true,
209
+ reasonCode: 'UNSUPPORTED_CHAIN',
210
+ message: toChainRes.reason,
211
+ });
212
+ }
213
+ const toChainId = toChainRes.chainId;
214
+ // 4. Resolve source token
215
+ const fromTokenRes = resolveToken(fromChainId, params.tokenIn);
216
+ if (!fromTokenRes.ok) {
217
+ return buildFallbackRoute(params, {
218
+ enabled: true,
219
+ reasonCode: 'UNSUPPORTED_TOKEN',
220
+ message: fromTokenRes.reason,
221
+ });
222
+ }
223
+ const fromToken = fromTokenRes.token;
224
+ // 5. Resolve destination token
225
+ const toTokenRes = resolveToken(toChainId, params.tokenOut);
226
+ if (!toTokenRes.ok) {
227
+ return buildFallbackRoute(params, {
228
+ enabled: true,
229
+ reasonCode: 'UNSUPPORTED_TOKEN',
230
+ message: toTokenRes.reason,
231
+ });
232
+ }
233
+ const toToken = toTokenRes.token;
234
+ // 6. Convert amountIn to base units
235
+ const fromAmount = toBaseUnits(params.amountIn, fromToken.decimals);
236
+ try {
237
+ // 7. Call getRoutes from @lifi/sdk with retry
238
+ const data = await this.executeWithRetry(() => getRoutes({
239
+ fromChainId,
240
+ toChainId,
241
+ fromTokenAddress: fromToken.address,
242
+ toTokenAddress: toToken.address,
243
+ fromAmount: fromAmount,
244
+ }));
245
+ // 8. If no routes returned, return fallback
246
+ if (!data.routes || data.routes.length === 0) {
247
+ return buildFallbackRoute(params, {
248
+ enabled: true,
249
+ reasonCode: 'LIFI_EMPTY_RESPONSE',
250
+ message: 'LI.FI returned no routes',
251
+ });
252
+ }
253
+ // 9. Select the best route by highest toAmount
254
+ const bestRoute = data.routes.reduce((best, route) => BigInt(route.toAmount ?? '0') > BigInt(best.toAmount ?? '0')
255
+ ? route
256
+ : best);
257
+ // 10. Compute estimated duration as sum of step durations
258
+ const steps = bestRoute.steps;
259
+ const estimatedDuration = Array.isArray(steps)
260
+ ? steps.reduce((sum, step) => {
261
+ const estimate = step.estimate;
262
+ if (typeof estimate === 'object' && estimate !== null) {
263
+ return sum + Number(estimate.executionDuration ?? 0);
264
+ }
265
+ return sum;
266
+ }, 0)
267
+ : undefined;
268
+ // 11. Normalize the response into a LifiRoutePayload
269
+ const routeId = bestRoute.id != null
270
+ ? String(bestRoute.id)
271
+ : deterministicId(JSON.stringify(bestRoute));
272
+ return {
273
+ provider: 'lifi',
274
+ routeId,
275
+ timestamp: Date.now(),
276
+ route: {
277
+ fromChainId,
278
+ toChainId,
279
+ fromToken: params.tokenIn,
280
+ toToken: params.tokenOut,
281
+ steps: steps,
282
+ tags: bestRoute.tags,
283
+ estimatedDuration,
284
+ },
285
+ raw: bestRoute,
286
+ };
287
+ }
288
+ catch (error) {
289
+ // 12. Catch errors and return fallback with mapped reason code
290
+ const reasonCode = this.mapErrorToReasonCode(error);
291
+ const message = error instanceof Error ? error.message : 'LI.FI route request failed';
292
+ return buildFallbackRoute(params, {
293
+ enabled: true,
294
+ reasonCode,
295
+ message,
296
+ });
297
+ }
298
+ }
299
+ /**
300
+ * Check the status of a LI.FI transaction.
301
+ *
302
+ * 1. Checks for missing txHash — returns fallback with 'MISSING_TX_HASH'
303
+ * 2. Calls `getStatus` from `@lifi/sdk` with retry
304
+ * 3. If data is empty/null, returns fallback with 'LIFI_EMPTY_RESPONSE'
305
+ * 4. Normalizes the response into a LifiStatusPayload
306
+ * 5. Catches errors and returns fallback with mapped reason code
307
+ *
308
+ * @param txHash - Transaction hash to query
309
+ * @returns A normalized {@link LifiStatusPayload}
310
+ */
311
+ async fetchStatus(txHash) {
312
+ // 1. Check for missing txHash
313
+ if (!txHash) {
314
+ return buildFallbackStatus(txHash, {
315
+ enabled: true,
316
+ reasonCode: 'MISSING_TX_HASH',
317
+ message: 'Transaction hash is required',
318
+ });
319
+ }
320
+ try {
321
+ // 2. Call getStatus from @lifi/sdk with retry
322
+ const data = await this.executeWithRetry(() => getStatus({ txHash }));
323
+ // 3. If data is empty/null, return fallback
324
+ if (!data) {
325
+ return buildFallbackStatus(txHash, {
326
+ enabled: true,
327
+ reasonCode: 'LIFI_EMPTY_RESPONSE',
328
+ message: 'LI.FI returned an empty status response',
329
+ });
330
+ }
331
+ // 4. Normalize the response into a LifiStatusPayload
332
+ const statusData = data;
333
+ return {
334
+ provider: 'lifi',
335
+ timestamp: Date.now(),
336
+ status: {
337
+ state: statusData.status ?? 'UNKNOWN',
338
+ substatus: statusData.substatus,
339
+ txHash,
340
+ },
341
+ raw: data,
342
+ };
343
+ }
344
+ catch (error) {
345
+ // 5. Catch errors and return fallback with mapped reason code
346
+ const reasonCode = this.mapErrorToReasonCode(error);
347
+ const message = error instanceof Error
348
+ ? error.message
349
+ : 'LI.FI status request failed';
350
+ return buildFallbackStatus(txHash, {
351
+ enabled: true,
352
+ reasonCode,
353
+ message,
354
+ });
355
+ }
356
+ }
357
+ // ---------------------------------------------------------------------------
358
+ // Private helpers
359
+ // ---------------------------------------------------------------------------
360
+ /**
361
+ * Execute a function with exponential backoff retry logic.
362
+ *
363
+ * Retries on rate-limit (429) and server errors (5xx). Non-retryable errors
364
+ * are re-thrown immediately.
365
+ *
366
+ * @param fn - Async function to execute
367
+ * @returns The result of `fn`
368
+ * @throws The last error if all retries are exhausted
369
+ */
370
+ async executeWithRetry(fn) {
371
+ let delay = this.config.retryDelay;
372
+ for (let attempt = 0; attempt <= this.config.maxRetries; attempt++) {
373
+ try {
374
+ return await fn();
375
+ }
376
+ catch (error) {
377
+ if (!this.isRetryable(error) || attempt === this.config.maxRetries) {
378
+ throw error;
379
+ }
380
+ await this.sleep(delay);
381
+ delay *= 2; // exponential backoff
382
+ }
383
+ }
384
+ // Unreachable in practice, but satisfies the compiler
385
+ throw new Error('Retry exhausted');
386
+ }
387
+ /**
388
+ * Determine whether an error is retryable.
389
+ *
390
+ * Retryable errors:
391
+ * - HTTP 429 (rate limited)
392
+ * - HTTP 5xx (server errors)
393
+ * - Network errors (TypeError, or message containing 'network' / 'fetch')
394
+ *
395
+ * @param error - The caught error
396
+ * @returns `true` if the request should be retried
397
+ */
398
+ isRetryable(error) {
399
+ // Check for HTTP status codes on the error object
400
+ if (error !== null && typeof error === 'object') {
401
+ const statusCode = error['status'] ??
402
+ error['statusCode'];
403
+ if (typeof statusCode === 'number') {
404
+ if (statusCode === 429)
405
+ return true;
406
+ if (statusCode >= 500)
407
+ return true;
408
+ // Non-retryable client errors (4xx except 429)
409
+ return false;
410
+ }
411
+ }
412
+ // Network errors
413
+ if (error instanceof TypeError)
414
+ return true;
415
+ if (error instanceof Error) {
416
+ const msg = error.message.toLowerCase();
417
+ if (msg.includes('network') || msg.includes('fetch'))
418
+ return true;
419
+ }
420
+ return false;
421
+ }
422
+ /**
423
+ * Sleep for the given number of milliseconds.
424
+ *
425
+ * @param ms - Duration in milliseconds
426
+ */
427
+ sleep(ms) {
428
+ return new Promise((resolve) => setTimeout(resolve, ms));
429
+ }
430
+ /**
431
+ * Validate that all required IntentParams fields are present and valid.
432
+ *
433
+ * @param params - Intent parameters to validate
434
+ * @returns A {@link LifiFallback} if validation fails, or `null` if valid
435
+ */
436
+ validateParams(params) {
437
+ const requiredFields = [
438
+ 'sourceChain',
439
+ 'destinationChain',
440
+ 'tokenIn',
441
+ 'tokenOut',
442
+ 'amountIn',
443
+ ];
444
+ for (const field of requiredFields) {
445
+ const value = params[field];
446
+ if (value === undefined || value === null || value === '') {
447
+ return {
448
+ enabled: true,
449
+ reasonCode: 'MISSING_PARAMS',
450
+ message: `Missing required parameter: ${field}`,
451
+ };
452
+ }
453
+ }
454
+ // Validate amountIn is a valid positive number
455
+ const amount = Number(params.amountIn);
456
+ if (!Number.isFinite(amount) || amount <= 0) {
457
+ return {
458
+ enabled: true,
459
+ reasonCode: 'INVALID_AMOUNT',
460
+ message: `Invalid amount: "${params.amountIn}" must be a positive number`,
461
+ };
462
+ }
463
+ return null;
464
+ }
465
+ /**
466
+ * Map an error to a LI.FI reason code based on HTTP status codes.
467
+ *
468
+ * - 400 or 422 → 'LIFI_BAD_REQUEST'
469
+ * - 429 → 'LIFI_RATE_LIMITED'
470
+ * - >= 500 → 'LIFI_SERVER_ERROR'
471
+ * - Otherwise → 'LIFI_UNAVAILABLE'
472
+ *
473
+ * @param error - The caught error
474
+ * @returns The appropriate {@link LifiReasonCode}
475
+ */
476
+ mapErrorToReasonCode(error) {
477
+ if (error !== null && typeof error === 'object') {
478
+ const statusCode = error['status'] ??
479
+ error['statusCode'];
480
+ if (typeof statusCode === 'number') {
481
+ if (statusCode === 400 || statusCode === 422)
482
+ return 'LIFI_BAD_REQUEST';
483
+ if (statusCode === 429)
484
+ return 'LIFI_RATE_LIMITED';
485
+ if (statusCode >= 500)
486
+ return 'LIFI_SERVER_ERROR';
487
+ }
488
+ }
489
+ return 'LIFI_UNAVAILABLE';
490
+ }
491
+ }
492
+ //# sourceMappingURL=lifi-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lifi-provider.js","sourceRoot":"","sources":["../../../src/lifi/lifi-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * TokenMap — pure mapping module for token symbol → address resolution.
3
+ *
4
+ * Lookups are case-insensitive via `symbol.toUpperCase()`.
5
+ */
6
+ /** Default token mappings per chain ID. Keyed by chain ID → uppercase symbol → TokenInfo. */
7
+ const TOKEN_MAP = {
8
+ // Arbitrum
9
+ 42161: {
10
+ USDC: { address: '0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8', decimals: 6 },
11
+ WETH: { address: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1', decimals: 18 },
12
+ ETH: { address: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE', decimals: 18 },
13
+ },
14
+ // Optimism
15
+ 10: {
16
+ USDC: { address: '0x7F5c764cBc14f9669B88837ca1490cCa17c31607', decimals: 6 },
17
+ WETH: { address: '0x4200000000000000000000000000000000000006', decimals: 18 },
18
+ ETH: { address: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE', decimals: 18 },
19
+ },
20
+ // Base
21
+ 8453: {
22
+ USDC: { address: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', decimals: 6 },
23
+ WETH: { address: '0x4200000000000000000000000000000000000006', decimals: 18 },
24
+ ETH: { address: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE', decimals: 18 },
25
+ },
26
+ // Polygon
27
+ 137: {
28
+ USDC: { address: '0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174', decimals: 6 },
29
+ WETH: { address: '0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619', decimals: 18 },
30
+ ETH: { address: '0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE', decimals: 18 },
31
+ },
32
+ };
33
+ /**
34
+ * Resolve a token symbol on a given chain to its on-chain address and decimal count.
35
+ *
36
+ * @param chainId - Numeric chain ID (e.g. 42161 for Arbitrum)
37
+ * @param symbol - Token symbol (case-insensitive), e.g. "usdc", "WETH"
38
+ * @returns A discriminated union: `{ ok: true, token }` on success,
39
+ * `{ ok: false, reason }` when the token is not supported on the chain.
40
+ */
41
+ export function resolveToken(chainId, symbol) {
42
+ const chainTokens = TOKEN_MAP[chainId];
43
+ if (chainTokens === undefined) {
44
+ return { ok: false, reason: `Unsupported chain ID: ${chainId}` };
45
+ }
46
+ const token = chainTokens[symbol.toUpperCase()];
47
+ if (token !== undefined) {
48
+ return { ok: true, token };
49
+ }
50
+ return { ok: false, reason: `Unsupported token "${symbol}" on chain ${chainId}` };
51
+ }
52
+ /**
53
+ * Return a copy of the token mappings for a given chain.
54
+ *
55
+ * @param chainId - Numeric chain ID
56
+ * @returns A new `Record<string, TokenInfo>` with all supported token entries for the chain,
57
+ * or an empty object if the chain is not supported.
58
+ */
59
+ export function getSupportedTokens(chainId) {
60
+ const chainTokens = TOKEN_MAP[chainId];
61
+ if (chainTokens === undefined) {
62
+ return {};
63
+ }
64
+ // Return a shallow copy so callers cannot mutate the internal map
65
+ const copy = {};
66
+ for (const [symbol, info] of Object.entries(chainTokens)) {
67
+ copy[symbol] = { ...info };
68
+ }
69
+ return copy;
70
+ }
71
+ //# sourceMappingURL=token-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-map.js","sourceRoot":"","sources":["../../../src/lifi/token-map.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,6FAA6F;AAC7F,MAAM,SAAS,GAA8C;IAC3D,WAAW;IACX,KAAK,EAAE;QACL,IAAI,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,CAAC,EAAE;QAC5E,IAAI,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC7E,GAAG,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,EAAE,EAAE;KAC7E;IACD,WAAW;IACX,EAAE,EAAE;QACF,IAAI,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,CAAC,EAAE;QAC5E,IAAI,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC7E,GAAG,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,EAAE,EAAE;KAC7E;IACD,OAAO;IACP,IAAI,EAAE;QACJ,IAAI,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,CAAC,EAAE;QAC5E,IAAI,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC7E,GAAG,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,EAAE,EAAE;KAC7E;IACD,UAAU;IACV,GAAG,EAAE;QACH,IAAI,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,CAAC,EAAE;QAC5E,IAAI,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC7E,GAAG,EAAE,EAAE,OAAO,EAAE,4CAA4C,EAAE,QAAQ,EAAE,EAAE,EAAE;KAC7E;CACF,CAAC;AAEF;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,MAAc;IAC1D,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,yBAAyB,OAAO,EAAE,EAAE,CAAC;IACnE,CAAC;IACD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAChD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,sBAAsB,MAAM,cAAc,OAAO,EAAE,EAAE,CAAC;AACpF,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAe;IAChD,MAAM,WAAW,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,kEAAkE;IAClE,MAAM,IAAI,GAA8B,EAAE,CAAC;IAC3C,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAC7B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lifi/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Unit conversion utilities for converting between human-readable token amounts
3
+ * and base unit (wei-like) representations.
4
+ *
5
+ * Ported from apps/dashboard/src/lib/lifi.ts for reuse across the SDK.
6
+ */
7
+ /**
8
+ * Converts a human-readable token amount to its base unit representation.
9
+ *
10
+ * For example, converting "1.5" USDC (6 decimals) produces "1500000",
11
+ * and converting "1.5" ETH (18 decimals) produces "1500000000000000000".
12
+ *
13
+ * @param amount - The human-readable amount as a string (e.g. "1.5", "100", "0.001")
14
+ * @param decimals - The number of decimal places for the token
15
+ * @returns The amount in base units as a string with no decimal point
16
+ */
17
+ export function toBaseUnits(amount, decimals) {
18
+ const [whole = '0', fraction = ''] = amount.split('.');
19
+ const normalizedFraction = fraction.padEnd(decimals, '0').slice(0, decimals);
20
+ const base = `${whole}${normalizedFraction}`.replace(/^0+(?=\d)/, '');
21
+ return base.length ? base : '0';
22
+ }
23
+ /**
24
+ * Converts a base unit amount back to a human-readable representation.
25
+ *
26
+ * For example, converting "1500000" with 6 decimals produces "1.5",
27
+ * and converting "1500000000000000000" with 18 decimals produces "1.5".
28
+ *
29
+ * @param amount - The base unit amount as a string (e.g. "1500000", "1000000000000000000")
30
+ * @param decimals - The number of decimal places for the token
31
+ * @returns The human-readable amount as a string with trailing zeros removed
32
+ */
33
+ export function fromBaseUnits(amount, decimals) {
34
+ if (!amount || amount === '0')
35
+ return '0';
36
+ const padded = amount.padStart(decimals + 1, '0');
37
+ const whole = padded.slice(0, -decimals) || '0';
38
+ const fraction = padded.slice(-decimals).replace(/0+$/, '');
39
+ return fraction ? `${whole}.${fraction}` : whole;
40
+ }
41
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/lifi/utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,QAAgB;IAC1D,MAAM,CAAC,KAAK,GAAG,GAAG,EAAE,QAAQ,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC7E,MAAM,IAAI,GAAG,GAAG,KAAK,GAAG,kBAAkB,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACtE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;AAClC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,QAAgB;IAC5D,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;IAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5D,OAAO,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;AACnD,CAAC"}