@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.d.mts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +159 -12
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +159 -12
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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: "
|
|
232
|
-
messageTransmitter: "
|
|
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
|
-
|
|
243
|
-
|
|
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)`);
|