moltspay 0.9.7 → 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 (43) hide show
  1. package/README.md +42 -3
  2. package/dist/cdp/index.js +1 -1
  3. package/dist/cdp/index.js.map +1 -1
  4. package/dist/cdp/index.mjs +1 -1
  5. package/dist/cdp/index.mjs.map +1 -1
  6. package/dist/chains/index.js +1 -1
  7. package/dist/chains/index.js.map +1 -1
  8. package/dist/chains/index.mjs +1 -1
  9. package/dist/chains/index.mjs.map +1 -1
  10. package/dist/cli/index.js +5028 -109
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/cli/index.mjs +5019 -96
  13. package/dist/cli/index.mjs.map +1 -1
  14. package/dist/client/index.d.mts +18 -3
  15. package/dist/client/index.d.ts +18 -3
  16. package/dist/client/index.js +89 -10
  17. package/dist/client/index.js.map +1 -1
  18. package/dist/client/index.mjs +89 -10
  19. package/dist/client/index.mjs.map +1 -1
  20. package/dist/facilitators/index.js +1 -1
  21. package/dist/facilitators/index.js.map +1 -1
  22. package/dist/facilitators/index.mjs +1 -1
  23. package/dist/facilitators/index.mjs.map +1 -1
  24. package/dist/index.js +193 -36
  25. package/dist/index.js.map +1 -1
  26. package/dist/index.mjs +193 -36
  27. package/dist/index.mjs.map +1 -1
  28. package/dist/server/index.d.mts +25 -5
  29. package/dist/server/index.d.ts +25 -5
  30. package/dist/server/index.js +104 -26
  31. package/dist/server/index.js.map +1 -1
  32. package/dist/server/index.mjs +104 -26
  33. package/dist/server/index.mjs.map +1 -1
  34. package/dist/verify/index.js +1 -1
  35. package/dist/verify/index.js.map +1 -1
  36. package/dist/verify/index.mjs +1 -1
  37. package/dist/verify/index.mjs.map +1 -1
  38. package/dist/wallet/index.js +1 -1
  39. package/dist/wallet/index.js.map +1 -1
  40. package/dist/wallet/index.mjs +1 -1
  41. package/dist/wallet/index.mjs.map +1 -1
  42. package/package.json +3 -2
  43. package/schemas/moltspay.services.schema.json +58 -2
package/dist/index.js CHANGED
@@ -30438,7 +30438,7 @@ var CDPFacilitator = class extends BaseFacilitator {
30438
30438
  this.apiKeyId = config.apiKeyId || process.env.CDP_API_KEY_ID;
30439
30439
  this.apiKeySecret = config.apiKeySecret || process.env.CDP_API_KEY_SECRET;
30440
30440
  this.endpoint = this.useMainnet ? CDP_MAINNET_URL : CDP_TESTNET_URL;
30441
- this.supportedNetworks = this.useMainnet ? ["eip155:8453"] : ["eip155:8453", "eip155:84532"];
30441
+ this.supportedNetworks = this.useMainnet ? ["eip155:8453", "eip155:137"] : ["eip155:8453", "eip155:84532", "eip155:137"];
30442
30442
  if (this.useMainnet && (!this.apiKeyId || !this.apiKeySecret)) {
30443
30443
  console.warn("[CDPFacilitator] WARNING: Mainnet mode but missing CDP credentials!");
30444
30444
  console.warn("[CDPFacilitator] Set CDP_API_KEY_ID and CDP_API_KEY_SECRET");
@@ -30853,8 +30853,17 @@ var TOKEN_ADDRESSES = {
30853
30853
  USDC: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
30854
30854
  USDT: "0x036CbD53842c5426634e7929541eC2318f3dCF7e"
30855
30855
  // Same as USDC on testnet
30856
+ },
30857
+ "eip155:137": {
30858
+ USDC: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
30859
+ USDT: "0xc2132D05D31c914a87C6611C10748AEb04B58e8F"
30856
30860
  }
30857
30861
  };
30862
+ var CHAIN_TO_NETWORK = {
30863
+ "base": "eip155:8453",
30864
+ "base_sepolia": "eip155:84532",
30865
+ "polygon": "eip155:137"
30866
+ };
30858
30867
  var TOKEN_DOMAINS = {
30859
30868
  USDC: { name: "USD Coin", version: "2" },
30860
30869
  USDT: { name: "Tether USD", version: "2" }
@@ -30920,11 +30929,17 @@ var MoltsPayServer = class {
30920
30929
  };
30921
30930
  this.registry = new FacilitatorRegistry(facilitatorConfig);
30922
30931
  const primaryFacilitator = this.registry.get(facilitatorConfig.primary);
30923
- const networkName = this.useMainnet ? "Base mainnet" : "Base Sepolia (testnet)";
30924
30932
  console.log(`[MoltsPay] Loaded ${this.manifest.services.length} services from ${servicesPath}`);
30925
30933
  console.log(`[MoltsPay] Provider: ${this.manifest.provider.name}`);
30926
30934
  console.log(`[MoltsPay] Receive wallet: ${this.manifest.provider.wallet}`);
30927
- console.log(`[MoltsPay] Network: ${this.networkId} (${networkName})`);
30935
+ const chains = this.manifest.provider.chains;
30936
+ if (chains && chains.length > 0) {
30937
+ const chainNames = chains.map((c) => c.chain || c.network).join(", ");
30938
+ console.log(`[MoltsPay] Chains: ${chainNames} (multi-chain enabled)`);
30939
+ } else {
30940
+ const networkName = this.useMainnet ? "Base mainnet" : "Base Sepolia (testnet)";
30941
+ console.log(`[MoltsPay] Network: ${this.networkId} (${networkName})`);
30942
+ }
30928
30943
  console.log(`[MoltsPay] Facilitator: ${primaryFacilitator.displayName} (${facilitatorConfig.strategy || "failover"})`);
30929
30944
  console.log(`[MoltsPay] Protocol: x402 (gasless for both client AND server)`);
30930
30945
  }
@@ -30939,6 +30954,42 @@ var MoltsPayServer = class {
30939
30954
  this.skills.set(serviceId, { id: serviceId, config, handler });
30940
30955
  return this;
30941
30956
  }
30957
+ /**
30958
+ * Get all configured chains for this provider
30959
+ * Returns array of { network, wallet, tokens } for each chain
30960
+ */
30961
+ getProviderChains() {
30962
+ const provider = this.manifest.provider;
30963
+ if (provider.chains && provider.chains.length > 0) {
30964
+ return provider.chains.map((c) => ({
30965
+ network: c.network || CHAIN_TO_NETWORK[c.chain] || "eip155:8453",
30966
+ wallet: c.wallet || provider.wallet,
30967
+ tokens: c.tokens || ["USDC"]
30968
+ }));
30969
+ }
30970
+ const chain2 = provider.chain || "base";
30971
+ const network = CHAIN_TO_NETWORK[chain2] || this.networkId;
30972
+ return [{
30973
+ network,
30974
+ wallet: provider.wallet,
30975
+ tokens: ["USDC"]
30976
+ }];
30977
+ }
30978
+ /**
30979
+ * Get wallet address for a specific network
30980
+ */
30981
+ getWalletForNetwork(network) {
30982
+ const chains = this.getProviderChains();
30983
+ const chain2 = chains.find((c) => c.network === network);
30984
+ return chain2?.wallet || this.manifest.provider.wallet;
30985
+ }
30986
+ /**
30987
+ * Check if a network is accepted by this provider
30988
+ */
30989
+ isNetworkAccepted(network) {
30990
+ const chains = this.getProviderChains();
30991
+ return chains.some((c) => c.network === network);
30992
+ }
30942
30993
  /**
30943
30994
  * Start HTTP server
30944
30995
  */
@@ -31121,7 +31172,9 @@ var MoltsPayServer = class {
31121
31172
  error: `Token ${paymentToken} not accepted. Accepted: ${accepted.join(", ")}`
31122
31173
  });
31123
31174
  }
31124
- const requirements = this.buildPaymentRequirements(skill.config, paymentToken);
31175
+ const paymentNetwork = payment.accepted?.network || payment.network || this.networkId;
31176
+ const paymentWallet = this.getWalletForNetwork(paymentNetwork);
31177
+ const requirements = this.buildPaymentRequirements(skill.config, paymentNetwork, paymentWallet, paymentToken);
31125
31178
  console.log(`[MoltsPay] Verifying payment...`);
31126
31179
  const verifyResult = await this.registry.verify(payment, requirements);
31127
31180
  if (!verifyResult.valid) {
@@ -31176,15 +31229,29 @@ var MoltsPayServer = class {
31176
31229
  }
31177
31230
  /**
31178
31231
  * Return 402 with x402 payment requirements (v2 format)
31179
- * Includes requirements for all accepted currencies
31232
+ * Includes requirements for all chains and all accepted currencies
31180
31233
  */
31181
31234
  sendPaymentRequired(config, res) {
31182
31235
  const acceptedTokens = getAcceptedCurrencies(config);
31183
- const accepts = acceptedTokens.map((token) => this.buildPaymentRequirements(config, token));
31236
+ const providerChains = this.getProviderChains();
31237
+ const accepts = [];
31238
+ for (const chainConfig of providerChains) {
31239
+ for (const token of acceptedTokens) {
31240
+ if (chainConfig.tokens.includes(token)) {
31241
+ accepts.push(this.buildPaymentRequirements(config, chainConfig.network, chainConfig.wallet, token));
31242
+ }
31243
+ }
31244
+ }
31245
+ const acceptedChains = providerChains.map((c) => {
31246
+ if (c.network === "eip155:8453") return "base";
31247
+ if (c.network === "eip155:137") return "polygon";
31248
+ return c.network;
31249
+ });
31184
31250
  const paymentRequired = {
31185
31251
  x402Version: X402_VERSION2,
31186
31252
  accepts,
31187
31253
  acceptedCurrencies: acceptedTokens,
31254
+ acceptedChains,
31188
31255
  resource: {
31189
31256
  url: `/execute?service=${config.id}`,
31190
31257
  description: `${config.name} - $${config.price} ${config.currency}`,
@@ -31200,6 +31267,7 @@ var MoltsPayServer = class {
31200
31267
  error: "Payment required",
31201
31268
  message: `Service requires $${config.price} ${config.currency}`,
31202
31269
  acceptedCurrencies: acceptedTokens,
31270
+ acceptedChains,
31203
31271
  x402: paymentRequired
31204
31272
  }, null, 2));
31205
31273
  }
@@ -31211,46 +31279,50 @@ var MoltsPayServer = class {
31211
31279
  return { valid: false, error: `Unsupported x402 version: ${payment.x402Version}` };
31212
31280
  }
31213
31281
  const scheme = payment.accepted?.scheme || payment.scheme;
31214
- const network = payment.accepted?.network || payment.network;
31282
+ const network = payment.accepted?.network || payment.network || this.networkId;
31215
31283
  if (scheme !== "exact") {
31216
31284
  return { valid: false, error: `Unsupported scheme: ${scheme}` };
31217
31285
  }
31218
- if (network !== this.networkId) {
31219
- return { valid: false, error: `Network mismatch: expected ${this.networkId}, got ${network}` };
31286
+ if (!this.isNetworkAccepted(network)) {
31287
+ const acceptedChains = this.getProviderChains().map((c) => c.network).join(", ");
31288
+ return { valid: false, error: `Network not accepted: ${network}. Accepted: ${acceptedChains}` };
31220
31289
  }
31221
31290
  return { valid: true };
31222
31291
  }
31223
31292
  /**
31224
31293
  * Build payment requirements for facilitator
31225
- * Returns requirements for the primary currency (USDC by default)
31226
- * Server accepts any of the acceptedCurrencies
31294
+ * Now supports multi-chain: takes network and wallet as parameters
31227
31295
  */
31228
- buildPaymentRequirements(config, token) {
31296
+ buildPaymentRequirements(config, network, wallet, token) {
31229
31297
  const amountInUnits = Math.floor(config.price * 1e6).toString();
31230
31298
  const acceptedTokens = getAcceptedCurrencies(config);
31299
+ const selectedNetwork = network || this.networkId;
31300
+ const selectedWallet = wallet || this.manifest.provider.wallet;
31231
31301
  const selectedToken = token && acceptedTokens.includes(token) ? token : acceptedTokens[0];
31232
- const tokenAddresses = TOKEN_ADDRESSES[this.networkId] || {};
31302
+ const tokenAddresses = TOKEN_ADDRESSES[selectedNetwork] || {};
31233
31303
  const tokenAddress = tokenAddresses[selectedToken];
31234
31304
  const tokenDomain = TOKEN_DOMAINS[selectedToken] || TOKEN_DOMAINS.USDC;
31235
31305
  return {
31236
31306
  scheme: "exact",
31237
- network: this.networkId,
31307
+ network: selectedNetwork,
31238
31308
  asset: tokenAddress,
31239
31309
  amount: amountInUnits,
31240
- payTo: this.manifest.provider.wallet,
31310
+ payTo: selectedWallet,
31241
31311
  maxTimeoutSeconds: 300,
31242
31312
  extra: tokenDomain
31243
31313
  };
31244
31314
  }
31245
31315
  /**
31246
31316
  * Detect which token is being used in the payment
31317
+ * Checks across all supported networks
31247
31318
  */
31248
31319
  detectPaymentToken(payment) {
31249
31320
  const asset = payment.accepted?.asset || payment.payload?.asset;
31250
31321
  if (!asset) return void 0;
31251
- const tokenAddresses = TOKEN_ADDRESSES[this.networkId] || {};
31322
+ const paymentNetwork = payment.accepted?.network || payment.network || this.networkId;
31323
+ const tokenAddresses = TOKEN_ADDRESSES[paymentNetwork] || {};
31252
31324
  for (const [symbol, address] of Object.entries(tokenAddresses)) {
31253
- if (address.toLowerCase() === asset.toLowerCase()) {
31325
+ if (address && address.toLowerCase() === asset.toLowerCase()) {
31254
31326
  return symbol;
31255
31327
  }
31256
31328
  }
@@ -31325,6 +31397,10 @@ var MoltsPayServer = class {
31325
31397
  if (isNaN(amountNum) || amountNum <= 0) {
31326
31398
  return this.sendJson(res, 400, { error: "Invalid amount" });
31327
31399
  }
31400
+ const supportedChains = ["base", "polygon", "base_sepolia"];
31401
+ if (chain2 && !supportedChains.includes(chain2)) {
31402
+ return this.sendJson(res, 400, { error: `Unsupported chain: ${chain2}. Supported: ${supportedChains.join(", ")}` });
31403
+ }
31328
31404
  const proxyConfig = {
31329
31405
  id: serviceId || "proxy",
31330
31406
  name: description || "Proxy Payment",
@@ -31336,9 +31412,9 @@ var MoltsPayServer = class {
31336
31412
  input: {},
31337
31413
  output: {}
31338
31414
  };
31339
- const requirements = this.buildProxyPaymentRequirements(proxyConfig, wallet);
31415
+ const requirements = this.buildProxyPaymentRequirements(proxyConfig, wallet, currency, chain2);
31340
31416
  if (!paymentHeader) {
31341
- return this.sendProxyPaymentRequired(proxyConfig, wallet, memo, res);
31417
+ return this.sendProxyPaymentRequired(proxyConfig, wallet, memo, chain2, res);
31342
31418
  }
31343
31419
  let payment;
31344
31420
  try {
@@ -31355,8 +31431,9 @@ var MoltsPayServer = class {
31355
31431
  if (scheme !== "exact") {
31356
31432
  return this.sendJson(res, 402, { error: `Unsupported scheme: ${scheme}` });
31357
31433
  }
31358
- if (network !== this.networkId) {
31359
- return this.sendJson(res, 402, { error: `Network mismatch: expected ${this.networkId}, got ${network}` });
31434
+ const expectedNetwork = chain2 ? CHAIN_TO_NETWORK[chain2] || this.networkId : this.networkId;
31435
+ if (network !== expectedNetwork) {
31436
+ return this.sendJson(res, 402, { error: `Network mismatch: expected ${expectedNetwork}, got ${network}` });
31360
31437
  }
31361
31438
  console.log(`[MoltsPay] /proxy: Verifying payment for ${wallet}...`);
31362
31439
  const verifyResult = await this.registry.verify(payment, requirements);
@@ -31462,16 +31539,17 @@ var MoltsPayServer = class {
31462
31539
  /**
31463
31540
  * Build payment requirements for proxy endpoint (uses provided wallet)
31464
31541
  */
31465
- buildProxyPaymentRequirements(config, wallet, token) {
31542
+ buildProxyPaymentRequirements(config, wallet, token, chain2) {
31466
31543
  const amountInUnits = Math.floor(config.price * 1e6).toString();
31467
31544
  const acceptedTokens = getAcceptedCurrencies(config);
31545
+ const networkId = chain2 ? CHAIN_TO_NETWORK[chain2] || this.networkId : this.networkId;
31468
31546
  const selectedToken = token && acceptedTokens.includes(token) ? token : acceptedTokens[0];
31469
- const tokenAddresses = TOKEN_ADDRESSES[this.networkId] || {};
31547
+ const tokenAddresses = TOKEN_ADDRESSES[networkId] || TOKEN_ADDRESSES[this.networkId] || {};
31470
31548
  const tokenAddress = tokenAddresses[selectedToken];
31471
31549
  const tokenDomain = TOKEN_DOMAINS[selectedToken] || TOKEN_DOMAINS.USDC;
31472
31550
  return {
31473
31551
  scheme: "exact",
31474
- network: this.networkId,
31552
+ network: networkId,
31475
31553
  asset: tokenAddress,
31476
31554
  amount: amountInUnits,
31477
31555
  payTo: wallet,
@@ -31483,8 +31561,8 @@ var MoltsPayServer = class {
31483
31561
  /**
31484
31562
  * Return 402 with x402 payment requirements for proxy endpoint
31485
31563
  */
31486
- sendProxyPaymentRequired(config, wallet, memo, res) {
31487
- const requirements = this.buildProxyPaymentRequirements(config, wallet);
31564
+ sendProxyPaymentRequired(config, wallet, memo, chain2, res) {
31565
+ const requirements = this.buildProxyPaymentRequirements(config, wallet, config.currency, chain2);
31488
31566
  const paymentRequired = {
31489
31567
  x402Version: X402_VERSION2,
31490
31568
  accepts: [requirements],
@@ -31544,7 +31622,7 @@ var CHAINS = {
31544
31622
  polygon: {
31545
31623
  name: "Polygon",
31546
31624
  chainId: 137,
31547
- rpc: "https://polygon-rpc.com",
31625
+ rpc: "https://polygon-bor-rpc.publicnode.com",
31548
31626
  tokens: {
31549
31627
  USDC: {
31550
31628
  address: "0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359",
@@ -31720,11 +31798,20 @@ var MoltsPayClient = class {
31720
31798
  * Get services from a provider
31721
31799
  */
31722
31800
  async getServices(serverUrl) {
31723
- const res = await fetch(`${serverUrl}/services`);
31724
- if (!res.ok) {
31725
- throw new Error(`Failed to get services: ${res.statusText}`);
31801
+ const normalizedUrl = serverUrl.replace(/\/(services|api\/services|registry\/services)\/?$/, "");
31802
+ const endpoints = ["/services", "/api/services", "/registry/services"];
31803
+ for (const endpoint of endpoints) {
31804
+ try {
31805
+ const res = await fetch(`${normalizedUrl}${endpoint}`);
31806
+ if (!res.ok) continue;
31807
+ const contentType = res.headers.get("content-type") || "";
31808
+ if (!contentType.includes("application/json")) continue;
31809
+ return await res.json();
31810
+ } catch {
31811
+ continue;
31812
+ }
31726
31813
  }
31727
- return res.json();
31814
+ throw new Error(`Failed to get services: no valid endpoint found at ${normalizedUrl}`);
31728
31815
  }
31729
31816
  /**
31730
31817
  * Pay for a service and get the result (x402 protocol)
@@ -31742,10 +31829,14 @@ var MoltsPayClient = class {
31742
31829
  throw new Error("Client not initialized. Run: npx moltspay init");
31743
31830
  }
31744
31831
  console.log(`[MoltsPay] Requesting service: ${service}`);
31832
+ const requestBody = { service, params };
31833
+ if (options.chain) {
31834
+ requestBody.chain = options.chain;
31835
+ }
31745
31836
  const initialRes = await fetch(`${serverUrl}/execute`, {
31746
31837
  method: "POST",
31747
31838
  headers: { "Content-Type": "application/json" },
31748
- body: JSON.stringify({ service, params })
31839
+ body: JSON.stringify(requestBody)
31749
31840
  });
31750
31841
  if (initialRes.status !== 402) {
31751
31842
  const data = await initialRes.json();
@@ -31772,11 +31863,41 @@ var MoltsPayClient = class {
31772
31863
  } catch {
31773
31864
  throw new Error("Invalid x-payment-required header");
31774
31865
  }
31775
- const chain2 = getChain(this.config.chain);
31866
+ const networkToChainName = (network2) => {
31867
+ const match = network2.match(/^eip155:(\d+)$/);
31868
+ if (!match) return null;
31869
+ const chainId = parseInt(match[1]);
31870
+ if (chainId === 8453) return "base";
31871
+ if (chainId === 137) return "polygon";
31872
+ if (chainId === 84532) return "base_sepolia";
31873
+ return null;
31874
+ };
31875
+ const serverChains = requirements.map((r) => networkToChainName(r.network)).filter((c) => c !== null);
31876
+ let chainName;
31877
+ const userSpecifiedChain = options.chain;
31878
+ if (userSpecifiedChain) {
31879
+ if (!serverChains.includes(userSpecifiedChain)) {
31880
+ throw new Error(
31881
+ `Server doesn't accept '${userSpecifiedChain}'.
31882
+ Server accepts: ${serverChains.join(", ")}`
31883
+ );
31884
+ }
31885
+ chainName = userSpecifiedChain;
31886
+ } else {
31887
+ if (serverChains.length === 1 && serverChains[0] === "base") {
31888
+ chainName = "base";
31889
+ } else {
31890
+ throw new Error(
31891
+ `Server accepts: ${serverChains.join(", ")}
31892
+ Please specify: --chain base or --chain polygon`
31893
+ );
31894
+ }
31895
+ }
31896
+ const chain2 = getChain(chainName);
31776
31897
  const network = `eip155:${chain2.chainId}`;
31777
31898
  const req = requirements.find((r) => r.scheme === "exact" && r.network === network);
31778
31899
  if (!req) {
31779
- throw new Error(`No matching payment option for ${network}`);
31900
+ throw new Error(`Failed to find payment requirement for ${chainName}`);
31780
31901
  }
31781
31902
  const amountRaw = req.amount || req.maxAmountRequired;
31782
31903
  if (!amountRaw) {
@@ -31829,13 +31950,17 @@ var MoltsPayClient = class {
31829
31950
  };
31830
31951
  const paymentHeader = Buffer.from(JSON.stringify(payload)).toString("base64");
31831
31952
  console.log(`[MoltsPay] Sending request with payment...`);
31953
+ const paidRequestBody = { service, params };
31954
+ if (options.chain) {
31955
+ paidRequestBody.chain = options.chain;
31956
+ }
31832
31957
  const paidRes = await fetch(`${serverUrl}/execute`, {
31833
31958
  method: "POST",
31834
31959
  headers: {
31835
31960
  "Content-Type": "application/json",
31836
31961
  [PAYMENT_HEADER2]: paymentHeader
31837
31962
  },
31838
- body: JSON.stringify({ service, params })
31963
+ body: JSON.stringify(paidRequestBody)
31839
31964
  });
31840
31965
  const result = await paidRes.json();
31841
31966
  if (!paidRes.ok) {
@@ -32004,7 +32129,7 @@ var MoltsPayClient = class {
32004
32129
  return { address: wallet.address, configDir };
32005
32130
  }
32006
32131
  /**
32007
- * Get wallet balance (USDC, USDT, and native token)
32132
+ * Get wallet balance (USDC, USDT, and native token) on default chain
32008
32133
  */
32009
32134
  async getBalance() {
32010
32135
  if (!this.wallet) {
@@ -32029,6 +32154,38 @@ var MoltsPayClient = class {
32029
32154
  native: parseFloat(import_ethers.ethers.formatEther(nativeBalance))
32030
32155
  };
32031
32156
  }
32157
+ /**
32158
+ * Get wallet balances on all supported chains (Base + Polygon)
32159
+ */
32160
+ async getAllBalances() {
32161
+ if (!this.wallet) {
32162
+ throw new Error("Client not initialized");
32163
+ }
32164
+ const supportedChains = ["base", "polygon"];
32165
+ const tokenAbi = ["function balanceOf(address) view returns (uint256)"];
32166
+ const results = {};
32167
+ await Promise.all(
32168
+ supportedChains.map(async (chainName) => {
32169
+ try {
32170
+ const chain2 = getChain(chainName);
32171
+ const provider = new import_ethers.ethers.JsonRpcProvider(chain2.rpc);
32172
+ const [nativeBalance, usdcBalance, usdtBalance] = await Promise.all([
32173
+ provider.getBalance(this.wallet.address),
32174
+ new import_ethers.ethers.Contract(chain2.tokens.USDC.address, tokenAbi, provider).balanceOf(this.wallet.address),
32175
+ new import_ethers.ethers.Contract(chain2.tokens.USDT.address, tokenAbi, provider).balanceOf(this.wallet.address)
32176
+ ]);
32177
+ results[chainName] = {
32178
+ usdc: parseFloat(import_ethers.ethers.formatUnits(usdcBalance, chain2.tokens.USDC.decimals)),
32179
+ usdt: parseFloat(import_ethers.ethers.formatUnits(usdtBalance, chain2.tokens.USDT.decimals)),
32180
+ native: parseFloat(import_ethers.ethers.formatEther(nativeBalance))
32181
+ };
32182
+ } catch (err) {
32183
+ results[chainName] = { usdc: 0, usdt: 0, native: 0 };
32184
+ }
32185
+ })
32186
+ );
32187
+ return results;
32188
+ }
32032
32189
  };
32033
32190
 
32034
32191
  // src/wallet/index.ts