moltspay 0.9.6 → 1.0.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 +110 -48
  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 +229 -48
  11. package/dist/cli/index.js.map +1 -1
  12. package/dist/cli/index.mjs +229 -48
  13. package/dist/cli/index.mjs.map +1 -1
  14. package/dist/client/index.d.mts +11 -1
  15. package/dist/client/index.d.ts +11 -1
  16. package/dist/client/index.js +87 -7
  17. package/dist/client/index.js.map +1 -1
  18. package/dist/client/index.mjs +87 -7
  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 +191 -33
  25. package/dist/index.js.map +1 -1
  26. package/dist/index.mjs +191 -33
  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 +1 -1
  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",
@@ -31742,10 +31820,14 @@ var MoltsPayClient = class {
31742
31820
  throw new Error("Client not initialized. Run: npx moltspay init");
31743
31821
  }
31744
31822
  console.log(`[MoltsPay] Requesting service: ${service}`);
31823
+ const requestBody = { service, params };
31824
+ if (options.chain) {
31825
+ requestBody.chain = options.chain;
31826
+ }
31745
31827
  const initialRes = await fetch(`${serverUrl}/execute`, {
31746
31828
  method: "POST",
31747
31829
  headers: { "Content-Type": "application/json" },
31748
- body: JSON.stringify({ service, params })
31830
+ body: JSON.stringify(requestBody)
31749
31831
  });
31750
31832
  if (initialRes.status !== 402) {
31751
31833
  const data = await initialRes.json();
@@ -31772,11 +31854,41 @@ var MoltsPayClient = class {
31772
31854
  } catch {
31773
31855
  throw new Error("Invalid x-payment-required header");
31774
31856
  }
31775
- const chain2 = getChain(this.config.chain);
31857
+ const networkToChainName = (network2) => {
31858
+ const match = network2.match(/^eip155:(\d+)$/);
31859
+ if (!match) return null;
31860
+ const chainId = parseInt(match[1]);
31861
+ if (chainId === 8453) return "base";
31862
+ if (chainId === 137) return "polygon";
31863
+ if (chainId === 84532) return "base_sepolia";
31864
+ return null;
31865
+ };
31866
+ const serverChains = requirements.map((r) => networkToChainName(r.network)).filter((c) => c !== null);
31867
+ let chainName;
31868
+ const userSpecifiedChain = options.chain;
31869
+ if (userSpecifiedChain) {
31870
+ if (!serverChains.includes(userSpecifiedChain)) {
31871
+ throw new Error(
31872
+ `Server doesn't accept '${userSpecifiedChain}'.
31873
+ Server accepts: ${serverChains.join(", ")}`
31874
+ );
31875
+ }
31876
+ chainName = userSpecifiedChain;
31877
+ } else {
31878
+ if (serverChains.length === 1 && serverChains[0] === "base") {
31879
+ chainName = "base";
31880
+ } else {
31881
+ throw new Error(
31882
+ `Server accepts: ${serverChains.join(", ")}
31883
+ Please specify: --chain base or --chain polygon`
31884
+ );
31885
+ }
31886
+ }
31887
+ const chain2 = getChain(chainName);
31776
31888
  const network = `eip155:${chain2.chainId}`;
31777
31889
  const req = requirements.find((r) => r.scheme === "exact" && r.network === network);
31778
31890
  if (!req) {
31779
- throw new Error(`No matching payment option for ${network}`);
31891
+ throw new Error(`Failed to find payment requirement for ${chainName}`);
31780
31892
  }
31781
31893
  const amountRaw = req.amount || req.maxAmountRequired;
31782
31894
  if (!amountRaw) {
@@ -31795,7 +31907,17 @@ var MoltsPayClient = class {
31795
31907
  throw new Error(`Insufficient balance: need $${amount}, have ${balances.usdc} USDC / ${balances.usdt} USDT`);
31796
31908
  }
31797
31909
  }
31798
- console.log(`[MoltsPay] Signing payment: $${amount} ${token} (gasless)`);
31910
+ if (token === "USDT") {
31911
+ const balances = await this.getBalance();
31912
+ if (balances.native < 1e-4) {
31913
+ throw new Error(
31914
+ `USDT requires ETH for gas (~$0.01 on Base). Your ETH balance: ${balances.native.toFixed(6)} ETH. Please add a small amount of ETH to your wallet, or use USDC (gasless).`
31915
+ );
31916
+ }
31917
+ console.log(`[MoltsPay] \u26A0\uFE0F USDT requires gas (~$0.01). Proceeding with payment...`);
31918
+ } else {
31919
+ console.log(`[MoltsPay] Signing payment: $${amount} ${token} (gasless)`);
31920
+ }
31799
31921
  const payTo = req.payTo || req.resource;
31800
31922
  if (!payTo) {
31801
31923
  throw new Error("Missing payTo address in payment requirements");
@@ -31819,13 +31941,17 @@ var MoltsPayClient = class {
31819
31941
  };
31820
31942
  const paymentHeader = Buffer.from(JSON.stringify(payload)).toString("base64");
31821
31943
  console.log(`[MoltsPay] Sending request with payment...`);
31944
+ const paidRequestBody = { service, params };
31945
+ if (options.chain) {
31946
+ paidRequestBody.chain = options.chain;
31947
+ }
31822
31948
  const paidRes = await fetch(`${serverUrl}/execute`, {
31823
31949
  method: "POST",
31824
31950
  headers: {
31825
31951
  "Content-Type": "application/json",
31826
31952
  [PAYMENT_HEADER2]: paymentHeader
31827
31953
  },
31828
- body: JSON.stringify({ service, params })
31954
+ body: JSON.stringify(paidRequestBody)
31829
31955
  });
31830
31956
  const result = await paidRes.json();
31831
31957
  if (!paidRes.ok) {
@@ -31994,7 +32120,7 @@ var MoltsPayClient = class {
31994
32120
  return { address: wallet.address, configDir };
31995
32121
  }
31996
32122
  /**
31997
- * Get wallet balance (USDC, USDT, and native token)
32123
+ * Get wallet balance (USDC, USDT, and native token) on default chain
31998
32124
  */
31999
32125
  async getBalance() {
32000
32126
  if (!this.wallet) {
@@ -32019,6 +32145,38 @@ var MoltsPayClient = class {
32019
32145
  native: parseFloat(import_ethers.ethers.formatEther(nativeBalance))
32020
32146
  };
32021
32147
  }
32148
+ /**
32149
+ * Get wallet balances on all supported chains (Base + Polygon)
32150
+ */
32151
+ async getAllBalances() {
32152
+ if (!this.wallet) {
32153
+ throw new Error("Client not initialized");
32154
+ }
32155
+ const supportedChains = ["base", "polygon"];
32156
+ const tokenAbi = ["function balanceOf(address) view returns (uint256)"];
32157
+ const results = {};
32158
+ await Promise.all(
32159
+ supportedChains.map(async (chainName) => {
32160
+ try {
32161
+ const chain2 = getChain(chainName);
32162
+ const provider = new import_ethers.ethers.JsonRpcProvider(chain2.rpc);
32163
+ const [nativeBalance, usdcBalance, usdtBalance] = await Promise.all([
32164
+ provider.getBalance(this.wallet.address),
32165
+ new import_ethers.ethers.Contract(chain2.tokens.USDC.address, tokenAbi, provider).balanceOf(this.wallet.address),
32166
+ new import_ethers.ethers.Contract(chain2.tokens.USDT.address, tokenAbi, provider).balanceOf(this.wallet.address)
32167
+ ]);
32168
+ results[chainName] = {
32169
+ usdc: parseFloat(import_ethers.ethers.formatUnits(usdcBalance, chain2.tokens.USDC.decimals)),
32170
+ usdt: parseFloat(import_ethers.ethers.formatUnits(usdtBalance, chain2.tokens.USDT.decimals)),
32171
+ native: parseFloat(import_ethers.ethers.formatEther(nativeBalance))
32172
+ };
32173
+ } catch (err) {
32174
+ results[chainName] = { usdc: 0, usdt: 0, native: 0 };
32175
+ }
32176
+ })
32177
+ );
32178
+ return results;
32179
+ }
32022
32180
  };
32023
32181
 
32024
32182
  // src/wallet/index.ts