@1llet.xyz/erc4337-gasless-sdk 0.4.54 → 0.4.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -209,14 +209,9 @@ var init_facilitator = __esm({
209
209
  chainId: 100,
210
210
  chain: gnosis,
211
211
  usdc: "0x2a22f9c3b48403ebD92cF06fF916b322a30dB834",
212
- // EURe (or USDC on Gnosis? The user is swapping USDT -> USDC, wait. The user log says GNOSIS -> Optimism (USDT -> USDC).
213
- // For verification, we just need RPC. The 'usdc' field is for CCTP, but verify logic just needs `rpcUrl`.
214
- // I will populate others as placeholders if unknown.
215
212
  usdcName: "USDC",
216
- // Placeholder
217
213
  usdcVersion: "2",
218
214
  domain: 0,
219
- // Placeholder
220
215
  tokenMessenger: "0x0000000000000000000000000000000000000000",
221
216
  messageTransmitter: "0x0000000000000000000000000000000000000000",
222
217
  rpcUrl: "https://rpc.gnosischain.com"
@@ -228,8 +223,8 @@ var init_facilitator = __esm({
228
223
  usdcName: "USD Coin",
229
224
  usdcVersion: "2",
230
225
  domain: 3,
231
- tokenMessenger: "0x19330d10D9Cc8751218eaf51E8885D058642E08A",
232
- messageTransmitter: "0xC30362313FBBA5cf9163F0bb16a0e01f01A896ca",
226
+ tokenMessenger: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
227
+ messageTransmitter: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
233
228
  rpcUrl: "https://arb-mainnet.g.alchemy.com/v2/49fUGmuW05ynCui0VEvDN"
234
229
  },
235
230
  Polygon: {
@@ -239,10 +234,53 @@ var init_facilitator = __esm({
239
234
  usdcName: "USD Coin",
240
235
  usdcVersion: "2",
241
236
  domain: 7,
242
- // Placeholder? CCTP domain for Polygon is 7? I should check if I had it elsewhere.
243
- tokenMessenger: "0x0000000000000000000000000000000000000000",
244
- messageTransmitter: "0x0000000000000000000000000000000000000000",
237
+ tokenMessenger: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
238
+ messageTransmitter: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
245
239
  rpcUrl: "https://polygon-mainnet.g.alchemy.com/v2/49fUGmuW05ynCui0VEvDN"
240
+ },
241
+ Unichain: {
242
+ chainId: unichain.id,
243
+ chain: unichain,
244
+ usdc: "0x078D782b760474a361dDA0AF3839290b0EF57AD6",
245
+ usdcName: "USD Coin",
246
+ usdcVersion: "2",
247
+ domain: 10,
248
+ tokenMessenger: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
249
+ messageTransmitter: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
250
+ rpcUrl: unichain.rpcUrls.default.http[0]
251
+ },
252
+ Avalanche: {
253
+ chainId: avalanche.id,
254
+ chain: avalanche,
255
+ usdc: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",
256
+ usdcName: "USD Coin",
257
+ usdcVersion: "2",
258
+ domain: 1,
259
+ tokenMessenger: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
260
+ messageTransmitter: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
261
+ rpcUrl: avalanche.rpcUrls.default.http[0]
262
+ },
263
+ Worldchain: {
264
+ chainId: worldchain.id,
265
+ chain: worldchain,
266
+ usdc: "0x79A02482A880bCe3F13E09da970dC34dB4cD24D1",
267
+ usdcName: "USD Coin",
268
+ usdcVersion: "2",
269
+ domain: 13,
270
+ tokenMessenger: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
271
+ messageTransmitter: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
272
+ rpcUrl: worldchain.rpcUrls.default.http[0]
273
+ },
274
+ Monad: {
275
+ chainId: monad.id,
276
+ chain: monad,
277
+ usdc: "0x754704Bc059F8C67012fEd69BC8A327a5aafb603",
278
+ usdcName: "USD Coin",
279
+ usdcVersion: "2",
280
+ domain: 15,
281
+ tokenMessenger: "0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d",
282
+ messageTransmitter: "0x81D40F21F12A8F0E3252Bccb954D722d4c464B64",
283
+ rpcUrl: monad.rpcUrls.default.http[0]
246
284
  }
247
285
  };
248
286
  }
@@ -1031,7 +1069,8 @@ var BASE = {
1031
1069
  name: "USDC",
1032
1070
  decimals: 6,
1033
1071
  address: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
1034
- coingeckoId: "usd-coin"
1072
+ coingeckoId: "usd-coin",
1073
+ supportsStargate: true
1035
1074
  },
1036
1075
  {
1037
1076
  name: "ETH",
@@ -1074,6 +1113,9 @@ var BASE = {
1074
1113
  }
1075
1114
  ],
1076
1115
  needMemo: false
1116
+ },
1117
+ stargateInformation: {
1118
+ support: true
1077
1119
  }
1078
1120
  }
1079
1121
  };
@@ -1278,7 +1320,8 @@ var AVALANCHE = {
1278
1320
  name: "USDC",
1279
1321
  decimals: 6,
1280
1322
  address: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",
1281
- coingeckoId: "usd-coin"
1323
+ coingeckoId: "usd-coin",
1324
+ supportsStargate: true
1282
1325
  },
1283
1326
  {
1284
1327
  name: "AVAX",
@@ -1332,6 +1375,9 @@ var AVALANCHE = {
1332
1375
  }
1333
1376
  ],
1334
1377
  needMemo: false
1378
+ },
1379
+ stargateInformation: {
1380
+ support: true
1335
1381
  }
1336
1382
  }
1337
1383
  };
@@ -2448,11 +2494,107 @@ async function getNearSimulation(sourceChain, destChain, amount, destToken, sour
2448
2494
  }
2449
2495
  }
2450
2496
 
2497
+ // src/services/stargate.ts
2498
+ var STARGATE_API_URL = "https://stargate.finance/api/v1/quotes";
2499
+ var StargateStrategy = class {
2500
+ constructor() {
2501
+ this.name = "StargateFinance";
2502
+ }
2503
+ canHandle(context) {
2504
+ const { sourceChain, destChain, sourceToken } = context;
2505
+ if (sourceChain === "Base" && destChain === "Avalanche" && sourceToken === "USDC") {
2506
+ return true;
2507
+ }
2508
+ const sourceConfig = NETWORKS[sourceChain];
2509
+ const destConfig = NETWORKS[destChain];
2510
+ if (!sourceConfig || !destConfig) return false;
2511
+ const sourceStargate = sourceConfig.crossChainInformation.stargateInformation?.support;
2512
+ const destStargate = destConfig.crossChainInformation.stargateInformation?.support;
2513
+ if (!sourceStargate || !destStargate) return false;
2514
+ const sourceAsset = sourceConfig.assets.find((a) => a.name === (sourceToken || "USDC"));
2515
+ const destAsset = destConfig.assets.find((a) => a.name === (context.destToken || "USDC"));
2516
+ return !!(sourceAsset?.supportsStargate && destAsset?.supportsStargate);
2517
+ }
2518
+ async execute(context) {
2519
+ const { sourceChain, destChain, amount, recipient, destToken, sourceToken, senderAddress } = context;
2520
+ console.log(`[StargateStrategy] Executing ${sourceChain} -> ${destChain} for ${amount} ${sourceToken}`);
2521
+ const sourceConfig = NETWORKS[sourceChain];
2522
+ const destConfig = NETWORKS[destChain];
2523
+ if (!sourceConfig || !destConfig) {
2524
+ return { success: false, errorReason: "Invalid chain configuration" };
2525
+ }
2526
+ const sourceAsset = sourceConfig.assets.find((a) => a.name === (sourceToken || "USDC"));
2527
+ const destAsset = destConfig.assets.find((a) => a.name === (destToken || "USDC"));
2528
+ if (!sourceAsset || !destAsset) {
2529
+ return { success: false, errorReason: "Invalid asset configuration" };
2530
+ }
2531
+ const decimals = sourceAsset.decimals;
2532
+ const amountAtomic = Math.floor(parseFloat(amount) * Math.pow(10, decimals)).toString();
2533
+ const minAmountAtomic = Math.floor(parseFloat(amountAtomic) * 0.995).toString();
2534
+ const srcChainKey = sourceChain.toLowerCase();
2535
+ const dstChainKey = destChain.toLowerCase();
2536
+ const url = new URL(STARGATE_API_URL);
2537
+ url.searchParams.append("srcToken", sourceAsset.address);
2538
+ url.searchParams.append("dstToken", destAsset.address);
2539
+ url.searchParams.append("srcAddress", senderAddress || recipient);
2540
+ url.searchParams.append("dstAddress", recipient);
2541
+ url.searchParams.append("srcChainKey", srcChainKey);
2542
+ url.searchParams.append("dstChainKey", dstChainKey);
2543
+ url.searchParams.append("srcAmount", amountAtomic);
2544
+ url.searchParams.append("dstAmountMin", minAmountAtomic);
2545
+ console.log(`[StargateStrategy] Fetching quote from: ${url.toString()}`);
2546
+ try {
2547
+ const response = await fetch(url.toString());
2548
+ const data = await response.json();
2549
+ if (!response.ok) {
2550
+ console.error("[StargateStrategy] API Error:", data);
2551
+ return { success: false, errorReason: `Stargate API Error: ${JSON.stringify(data)}` };
2552
+ }
2553
+ console.log("[StargateStrategy] Quote received:", JSON.stringify(data, null, 2));
2554
+ const quotes = data.quotes || [];
2555
+ if (quotes.length === 0) {
2556
+ return { success: false, errorReason: "No routes found from Stargate API" };
2557
+ }
2558
+ const selectedQuote = quotes.find((q) => q.route === "stargate/v2/taxi") || quotes[0];
2559
+ console.log(`[StargateStrategy] Selected Route: ${selectedQuote.route}`);
2560
+ const bridgeStep = selectedQuote.steps.find((s) => s.type === "bridge");
2561
+ if (!bridgeStep || !bridgeStep.transaction) {
2562
+ return { success: false, errorReason: "No bridge transaction found in quote" };
2563
+ }
2564
+ const txData = bridgeStep.transaction;
2565
+ const approvalTx = selectedQuote.steps.find((s) => s.type === "approve")?.transaction;
2566
+ return {
2567
+ success: true,
2568
+ transactionHash: "PENDING_USER_SIGNATURE",
2569
+ netAmount: amount,
2570
+ data: {
2571
+ strategy: "Stargate",
2572
+ quote: selectedQuote,
2573
+ // Normalized Transaction Data for execution
2574
+ txTarget: txData.to,
2575
+ txData: txData.data,
2576
+ txValue: txData.value,
2577
+ // Metadata
2578
+ approvalRequired: approvalTx ? {
2579
+ target: approvalTx.to,
2580
+ data: approvalTx.data,
2581
+ value: approvalTx.value
2582
+ } : null
2583
+ }
2584
+ };
2585
+ } catch (e) {
2586
+ console.error("[StargateStrategy] Execution Error:", e);
2587
+ return { success: false, errorReason: e.message };
2588
+ }
2589
+ }
2590
+ };
2591
+
2451
2592
  // src/services/TransferManager.ts
2452
2593
  var TransferManager = class {
2453
2594
  constructor() {
2454
2595
  this.strategies = [
2455
2596
  new CCTPStrategy(),
2597
+ new StargateStrategy(),
2456
2598
  new NearStrategy()
2457
2599
  ];
2458
2600
  }
@@ -2471,6 +2613,11 @@ var TransferManager = class {
2471
2613
  };
2472
2614
  }
2473
2615
  const strategies = this.strategies;
2616
+ const stargateStrategy = strategies.find((s) => s instanceof StargateStrategy);
2617
+ if (stargateStrategy && stargateStrategy.canHandle(context)) {
2618
+ console.log(`[TransferManager] Routing to: ${stargateStrategy.name} (Stargate)`);
2619
+ return stargateStrategy.execute(context);
2620
+ }
2474
2621
  const cctpStrategy = strategies.find((s) => s instanceof CCTPStrategy);
2475
2622
  if (cctpStrategy && cctpStrategy.canHandle(context)) {
2476
2623
  console.log(`[TransferManager] Routing to: ${cctpStrategy.name} (CCTP)`);