moltspay 1.2.0 → 1.2.1

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 (54) hide show
  1. package/README.md +78 -9
  2. package/dist/cdp/index.d.mts +1 -1
  3. package/dist/cdp/index.d.ts +1 -1
  4. package/dist/cdp/index.js +16 -49
  5. package/dist/cdp/index.js.map +1 -1
  6. package/dist/cdp/index.mjs +16 -49
  7. package/dist/cdp/index.mjs.map +1 -1
  8. package/dist/chains/index.d.mts +1 -1
  9. package/dist/chains/index.d.ts +1 -1
  10. package/dist/chains/index.js +16 -49
  11. package/dist/chains/index.js.map +1 -1
  12. package/dist/chains/index.mjs +16 -49
  13. package/dist/chains/index.mjs.map +1 -1
  14. package/dist/cli/index.js +180 -111
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/cli/index.mjs +180 -111
  17. package/dist/cli/index.mjs.map +1 -1
  18. package/dist/client/index.d.mts +3 -3
  19. package/dist/client/index.d.ts +3 -3
  20. package/dist/client/index.js +32 -58
  21. package/dist/client/index.js.map +1 -1
  22. package/dist/client/index.mjs +32 -58
  23. package/dist/client/index.mjs.map +1 -1
  24. package/dist/facilitators/index.d.mts +12 -6
  25. package/dist/facilitators/index.d.ts +12 -6
  26. package/dist/facilitators/index.js +39 -33
  27. package/dist/facilitators/index.js.map +1 -1
  28. package/dist/facilitators/index.mjs +39 -33
  29. package/dist/facilitators/index.mjs.map +1 -1
  30. package/dist/{index-B3v8IWjM.d.mts → index-DgJPZMBG.d.mts} +2 -1
  31. package/dist/{index-B3v8IWjM.d.ts → index-DgJPZMBG.d.ts} +2 -1
  32. package/dist/index.d.mts +1 -1
  33. package/dist/index.d.ts +1 -1
  34. package/dist/index.js +102 -101
  35. package/dist/index.js.map +1 -1
  36. package/dist/index.mjs +102 -101
  37. package/dist/index.mjs.map +1 -1
  38. package/dist/server/index.js +70 -43
  39. package/dist/server/index.js.map +1 -1
  40. package/dist/server/index.mjs +70 -43
  41. package/dist/server/index.mjs.map +1 -1
  42. package/dist/verify/index.d.mts +1 -1
  43. package/dist/verify/index.d.ts +1 -1
  44. package/dist/verify/index.js +16 -49
  45. package/dist/verify/index.js.map +1 -1
  46. package/dist/verify/index.mjs +16 -49
  47. package/dist/verify/index.mjs.map +1 -1
  48. package/dist/wallet/index.d.mts +1 -1
  49. package/dist/wallet/index.d.ts +1 -1
  50. package/dist/wallet/index.js +16 -49
  51. package/dist/wallet/index.js.map +1 -1
  52. package/dist/wallet/index.mjs +16 -49
  53. package/dist/wallet/index.mjs.map +1 -1
  54. package/package.json +1 -1
@@ -14,8 +14,8 @@ var BaseFacilitator = class {
14
14
  import { readFileSync, existsSync } from "fs";
15
15
  import * as path from "path";
16
16
  var X402_VERSION = 2;
17
- var CDP_MAINNET_URL = "https://api.cdp.coinbase.com/platform/v2/x402";
18
- var CDP_TESTNET_URL = "https://www.x402.org/facilitator";
17
+ var CDP_URL = "https://api.cdp.coinbase.com/platform/v2/x402";
18
+ var TESTNET_CHAIN_IDS = [84532];
19
19
  function loadEnvFile() {
20
20
  const envPaths = [
21
21
  path.join(process.cwd(), ".env"),
@@ -50,31 +50,33 @@ var CDPFacilitator = class extends BaseFacilitator {
50
50
  displayName = "Coinbase CDP";
51
51
  supportedNetworks;
52
52
  endpoint;
53
- useMainnet;
54
53
  apiKeyId;
55
54
  apiKeySecret;
56
55
  constructor(config = {}) {
57
56
  super();
58
57
  loadEnvFile();
59
- this.useMainnet = config.useMainnet ?? process.env.USE_MAINNET?.toLowerCase() === "true";
60
58
  this.apiKeyId = config.apiKeyId || process.env.CDP_API_KEY_ID;
61
59
  this.apiKeySecret = config.apiKeySecret || process.env.CDP_API_KEY_SECRET;
62
- this.endpoint = this.useMainnet ? CDP_MAINNET_URL : CDP_TESTNET_URL;
63
- this.supportedNetworks = this.useMainnet ? ["eip155:8453", "eip155:137"] : ["eip155:8453", "eip155:84532", "eip155:137"];
64
- if (this.useMainnet && (!this.apiKeyId || !this.apiKeySecret)) {
65
- console.warn("[CDPFacilitator] WARNING: Mainnet mode but missing CDP credentials!");
66
- console.warn("[CDPFacilitator] Set CDP_API_KEY_ID and CDP_API_KEY_SECRET");
60
+ this.endpoint = CDP_URL;
61
+ this.supportedNetworks = [
62
+ "eip155:8453",
63
+ // Base mainnet
64
+ "eip155:137",
65
+ // Polygon mainnet
66
+ "eip155:84532"
67
+ // Base Sepolia (testnet)
68
+ ];
69
+ if (!this.apiKeyId || !this.apiKeySecret) {
70
+ console.warn("[CDPFacilitator] WARNING: Missing CDP credentials!");
71
+ console.warn("[CDPFacilitator] Set CDP_API_KEY_ID and CDP_API_KEY_SECRET in ~/.moltspay/.env");
67
72
  }
68
73
  }
69
74
  /**
70
75
  * Get auth headers for CDP API requests
71
76
  */
72
77
  async getAuthHeaders(method, urlPath, body) {
73
- if (!this.useMainnet) {
74
- return {};
75
- }
76
78
  if (!this.apiKeyId || !this.apiKeySecret) {
77
- throw new Error("CDP credentials required for mainnet");
79
+ throw new Error("CDP credentials required. Set CDP_API_KEY_ID and CDP_API_KEY_SECRET");
78
80
  }
79
81
  try {
80
82
  const { getAuthHeaders } = await import("@coinbase/cdp-sdk/auth");
@@ -126,23 +128,23 @@ var CDPFacilitator = class extends BaseFacilitator {
126
128
  paymentPayload,
127
129
  paymentRequirements: requirements
128
130
  };
131
+ console.log("[CDP Verify] Payload:", JSON.stringify(paymentPayload, null, 2));
132
+ const authHeaders = await this.getAuthHeaders(
133
+ "POST",
134
+ "/platform/v2/x402/verify",
135
+ requestBody
136
+ );
129
137
  const headers = {
130
- "Content-Type": "application/json"
138
+ "Content-Type": "application/json",
139
+ ...authHeaders
131
140
  };
132
- if (this.useMainnet) {
133
- const authHeaders = await this.getAuthHeaders(
134
- "POST",
135
- "/platform/v2/x402/verify",
136
- requestBody
137
- );
138
- Object.assign(headers, authHeaders);
139
- }
140
141
  const response = await fetch(`${this.endpoint}/verify`, {
141
142
  method: "POST",
142
143
  headers,
143
144
  body: JSON.stringify(requestBody)
144
145
  });
145
146
  const result = await response.json();
147
+ console.log("[CDP Verify] Response:", response.status, JSON.stringify(result));
146
148
  if (!response.ok || !result.isValid) {
147
149
  return {
148
150
  valid: false,
@@ -168,17 +170,15 @@ var CDPFacilitator = class extends BaseFacilitator {
168
170
  paymentPayload,
169
171
  paymentRequirements: requirements
170
172
  };
173
+ const authHeaders = await this.getAuthHeaders(
174
+ "POST",
175
+ "/platform/v2/x402/settle",
176
+ requestBody
177
+ );
171
178
  const headers = {
172
- "Content-Type": "application/json"
179
+ "Content-Type": "application/json",
180
+ ...authHeaders
173
181
  };
174
- if (this.useMainnet) {
175
- const authHeaders = await this.getAuthHeaders(
176
- "POST",
177
- "/platform/v2/x402/settle",
178
- requestBody
179
- );
180
- Object.assign(headers, authHeaders);
181
- }
182
182
  const response = await fetch(`${this.endpoint}/settle`, {
183
183
  method: "POST",
184
184
  headers,
@@ -213,13 +213,19 @@ var CDPFacilitator = class extends BaseFacilitator {
213
213
  freeQuota: 1e3
214
214
  };
215
215
  }
216
+ /**
217
+ * Check if a chain ID is testnet
218
+ */
219
+ static isTestnet(chainId) {
220
+ return TESTNET_CHAIN_IDS.includes(chainId);
221
+ }
216
222
  /**
217
223
  * Get configuration summary (for logging)
218
224
  */
219
225
  getConfigSummary() {
220
- const mode = this.useMainnet ? "mainnet" : "testnet";
221
226
  const hasCredentials = !!(this.apiKeyId && this.apiKeySecret);
222
- return `CDP Facilitator (${mode}, credentials: ${hasCredentials ? "yes" : "no"})`;
227
+ const networks = this.supportedNetworks.join(", ");
228
+ return `CDP Facilitator (networks: ${networks}, credentials: ${hasCredentials ? "yes" : "no"})`;
223
229
  }
224
230
  };
225
231
 
@@ -473,9 +479,27 @@ var CHAIN_TO_NETWORK = {
473
479
  "polygon": "eip155:137"
474
480
  };
475
481
  var TOKEN_DOMAINS = {
476
- USDC: { name: "USD Coin", version: "2" },
477
- USDT: { name: "Tether USD", version: "2" }
482
+ // Base mainnet
483
+ "eip155:8453": {
484
+ USDC: { name: "USD Coin", version: "2" },
485
+ USDT: { name: "Tether USD", version: "2" }
486
+ },
487
+ // Base Sepolia testnet - USDC uses 'USDC' not 'USD Coin'
488
+ "eip155:84532": {
489
+ USDC: { name: "USDC", version: "2" },
490
+ USDT: { name: "USDC", version: "2" }
491
+ // Same contract as USDC on testnet
492
+ },
493
+ // Polygon mainnet
494
+ "eip155:137": {
495
+ USDC: { name: "USD Coin", version: "2" },
496
+ USDT: { name: "(PoS) Tether USD", version: "2" }
497
+ }
478
498
  };
499
+ function getTokenDomain(network, token) {
500
+ const networkDomains = TOKEN_DOMAINS[network] || TOKEN_DOMAINS["eip155:8453"];
501
+ return networkDomains[token] || { name: "USD Coin", version: "2" };
502
+ }
479
503
  function getAcceptedCurrencies(config) {
480
504
  return config.acceptedCurrencies ?? [config.currency];
481
505
  }
@@ -569,11 +593,14 @@ var MoltsPayServer = class {
569
593
  getProviderChains() {
570
594
  const provider = this.manifest.provider;
571
595
  if (provider.chains && provider.chains.length > 0) {
572
- return provider.chains.map((c) => ({
573
- network: c.network || CHAIN_TO_NETWORK[c.chain] || "eip155:8453",
574
- wallet: c.wallet || provider.wallet,
575
- tokens: c.tokens || ["USDC"]
576
- }));
596
+ return provider.chains.map((c) => {
597
+ const chainName = typeof c === "string" ? c : c.chain;
598
+ return {
599
+ network: CHAIN_TO_NETWORK[chainName] || "eip155:8453",
600
+ wallet: (typeof c === "object" ? c.wallet : null) || provider.wallet,
601
+ tokens: (typeof c === "object" ? c.tokens : null) || ["USDC"]
602
+ };
603
+ });
577
604
  }
578
605
  const chain = provider.chain || "base";
579
606
  const network = CHAIN_TO_NETWORK[chain] || this.networkId;
@@ -783,7 +810,7 @@ var MoltsPayServer = class {
783
810
  const paymentNetwork = payment.accepted?.network || payment.network || this.networkId;
784
811
  const paymentWallet = this.getWalletForNetwork(paymentNetwork);
785
812
  const requirements = this.buildPaymentRequirements(skill.config, paymentNetwork, paymentWallet, paymentToken);
786
- console.log(`[MoltsPay] Verifying payment...`);
813
+ console.log(`[MoltsPay] Verifying payment on ${paymentNetwork}...`);
787
814
  const verifyResult = await this.registry.verify(payment, requirements);
788
815
  if (!verifyResult.valid) {
789
816
  return this.sendJson(res, 402, {
@@ -909,7 +936,7 @@ var MoltsPayServer = class {
909
936
  const selectedToken = token && acceptedTokens.includes(token) ? token : acceptedTokens[0];
910
937
  const tokenAddresses = TOKEN_ADDRESSES[selectedNetwork] || {};
911
938
  const tokenAddress = tokenAddresses[selectedToken];
912
- const tokenDomain = TOKEN_DOMAINS[selectedToken] || TOKEN_DOMAINS.USDC;
939
+ const tokenDomain = getTokenDomain(selectedNetwork, selectedToken);
913
940
  return {
914
941
  scheme: "exact",
915
942
  network: selectedNetwork,
@@ -1154,7 +1181,7 @@ var MoltsPayServer = class {
1154
1181
  const selectedToken = token && acceptedTokens.includes(token) ? token : acceptedTokens[0];
1155
1182
  const tokenAddresses = TOKEN_ADDRESSES[networkId] || TOKEN_ADDRESSES[this.networkId] || {};
1156
1183
  const tokenAddress = tokenAddresses[selectedToken];
1157
- const tokenDomain = TOKEN_DOMAINS[selectedToken] || TOKEN_DOMAINS.USDC;
1184
+ const tokenDomain = getTokenDomain(networkId, selectedToken);
1158
1185
  return {
1159
1186
  scheme: "exact",
1160
1187
  network: networkId,