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.
- package/README.md +42 -3
- package/dist/cdp/index.js +1 -1
- package/dist/cdp/index.js.map +1 -1
- package/dist/cdp/index.mjs +1 -1
- package/dist/cdp/index.mjs.map +1 -1
- package/dist/chains/index.js +1 -1
- package/dist/chains/index.js.map +1 -1
- package/dist/chains/index.mjs +1 -1
- package/dist/chains/index.mjs.map +1 -1
- package/dist/cli/index.js +5028 -109
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +5019 -96
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/index.d.mts +18 -3
- package/dist/client/index.d.ts +18 -3
- package/dist/client/index.js +89 -10
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +89 -10
- package/dist/client/index.mjs.map +1 -1
- package/dist/facilitators/index.js +1 -1
- package/dist/facilitators/index.js.map +1 -1
- package/dist/facilitators/index.mjs +1 -1
- package/dist/facilitators/index.mjs.map +1 -1
- package/dist/index.js +193 -36
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +193 -36
- package/dist/index.mjs.map +1 -1
- package/dist/server/index.d.mts +25 -5
- package/dist/server/index.d.ts +25 -5
- package/dist/server/index.js +104 -26
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +104 -26
- package/dist/server/index.mjs.map +1 -1
- package/dist/verify/index.js +1 -1
- package/dist/verify/index.js.map +1 -1
- package/dist/verify/index.mjs +1 -1
- package/dist/verify/index.mjs.map +1 -1
- package/dist/wallet/index.js +1 -1
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +1 -1
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +3 -2
- 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
|
-
|
|
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
|
|
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
|
|
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 (
|
|
31219
|
-
|
|
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
|
-
*
|
|
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[
|
|
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:
|
|
31307
|
+
network: selectedNetwork,
|
|
31238
31308
|
asset: tokenAddress,
|
|
31239
31309
|
amount: amountInUnits,
|
|
31240
|
-
payTo:
|
|
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
|
|
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
|
-
|
|
31359
|
-
|
|
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:
|
|
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
|
|
31724
|
-
|
|
31725
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
|
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(`
|
|
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(
|
|
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
|