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
@@ -48,8 +48,8 @@ var BaseFacilitator = class {
48
48
  var import_fs = require("fs");
49
49
  var path = __toESM(require("path"));
50
50
  var X402_VERSION = 2;
51
- var CDP_MAINNET_URL = "https://api.cdp.coinbase.com/platform/v2/x402";
52
- var CDP_TESTNET_URL = "https://www.x402.org/facilitator";
51
+ var CDP_URL = "https://api.cdp.coinbase.com/platform/v2/x402";
52
+ var TESTNET_CHAIN_IDS = [84532];
53
53
  function loadEnvFile() {
54
54
  const envPaths = [
55
55
  path.join(process.cwd(), ".env"),
@@ -84,31 +84,33 @@ var CDPFacilitator = class extends BaseFacilitator {
84
84
  displayName = "Coinbase CDP";
85
85
  supportedNetworks;
86
86
  endpoint;
87
- useMainnet;
88
87
  apiKeyId;
89
88
  apiKeySecret;
90
89
  constructor(config = {}) {
91
90
  super();
92
91
  loadEnvFile();
93
- this.useMainnet = config.useMainnet ?? process.env.USE_MAINNET?.toLowerCase() === "true";
94
92
  this.apiKeyId = config.apiKeyId || process.env.CDP_API_KEY_ID;
95
93
  this.apiKeySecret = config.apiKeySecret || process.env.CDP_API_KEY_SECRET;
96
- this.endpoint = this.useMainnet ? CDP_MAINNET_URL : CDP_TESTNET_URL;
97
- this.supportedNetworks = this.useMainnet ? ["eip155:8453", "eip155:137"] : ["eip155:8453", "eip155:84532", "eip155:137"];
98
- if (this.useMainnet && (!this.apiKeyId || !this.apiKeySecret)) {
99
- console.warn("[CDPFacilitator] WARNING: Mainnet mode but missing CDP credentials!");
100
- console.warn("[CDPFacilitator] Set CDP_API_KEY_ID and CDP_API_KEY_SECRET");
94
+ this.endpoint = CDP_URL;
95
+ this.supportedNetworks = [
96
+ "eip155:8453",
97
+ // Base mainnet
98
+ "eip155:137",
99
+ // Polygon mainnet
100
+ "eip155:84532"
101
+ // Base Sepolia (testnet)
102
+ ];
103
+ if (!this.apiKeyId || !this.apiKeySecret) {
104
+ console.warn("[CDPFacilitator] WARNING: Missing CDP credentials!");
105
+ console.warn("[CDPFacilitator] Set CDP_API_KEY_ID and CDP_API_KEY_SECRET in ~/.moltspay/.env");
101
106
  }
102
107
  }
103
108
  /**
104
109
  * Get auth headers for CDP API requests
105
110
  */
106
111
  async getAuthHeaders(method, urlPath, body) {
107
- if (!this.useMainnet) {
108
- return {};
109
- }
110
112
  if (!this.apiKeyId || !this.apiKeySecret) {
111
- throw new Error("CDP credentials required for mainnet");
113
+ throw new Error("CDP credentials required. Set CDP_API_KEY_ID and CDP_API_KEY_SECRET");
112
114
  }
113
115
  try {
114
116
  const { getAuthHeaders } = await import("@coinbase/cdp-sdk/auth");
@@ -160,23 +162,23 @@ var CDPFacilitator = class extends BaseFacilitator {
160
162
  paymentPayload,
161
163
  paymentRequirements: requirements
162
164
  };
165
+ console.log("[CDP Verify] Payload:", JSON.stringify(paymentPayload, null, 2));
166
+ const authHeaders = await this.getAuthHeaders(
167
+ "POST",
168
+ "/platform/v2/x402/verify",
169
+ requestBody
170
+ );
163
171
  const headers = {
164
- "Content-Type": "application/json"
172
+ "Content-Type": "application/json",
173
+ ...authHeaders
165
174
  };
166
- if (this.useMainnet) {
167
- const authHeaders = await this.getAuthHeaders(
168
- "POST",
169
- "/platform/v2/x402/verify",
170
- requestBody
171
- );
172
- Object.assign(headers, authHeaders);
173
- }
174
175
  const response = await fetch(`${this.endpoint}/verify`, {
175
176
  method: "POST",
176
177
  headers,
177
178
  body: JSON.stringify(requestBody)
178
179
  });
179
180
  const result = await response.json();
181
+ console.log("[CDP Verify] Response:", response.status, JSON.stringify(result));
180
182
  if (!response.ok || !result.isValid) {
181
183
  return {
182
184
  valid: false,
@@ -202,17 +204,15 @@ var CDPFacilitator = class extends BaseFacilitator {
202
204
  paymentPayload,
203
205
  paymentRequirements: requirements
204
206
  };
207
+ const authHeaders = await this.getAuthHeaders(
208
+ "POST",
209
+ "/platform/v2/x402/settle",
210
+ requestBody
211
+ );
205
212
  const headers = {
206
- "Content-Type": "application/json"
213
+ "Content-Type": "application/json",
214
+ ...authHeaders
207
215
  };
208
- if (this.useMainnet) {
209
- const authHeaders = await this.getAuthHeaders(
210
- "POST",
211
- "/platform/v2/x402/settle",
212
- requestBody
213
- );
214
- Object.assign(headers, authHeaders);
215
- }
216
216
  const response = await fetch(`${this.endpoint}/settle`, {
217
217
  method: "POST",
218
218
  headers,
@@ -247,13 +247,19 @@ var CDPFacilitator = class extends BaseFacilitator {
247
247
  freeQuota: 1e3
248
248
  };
249
249
  }
250
+ /**
251
+ * Check if a chain ID is testnet
252
+ */
253
+ static isTestnet(chainId) {
254
+ return TESTNET_CHAIN_IDS.includes(chainId);
255
+ }
250
256
  /**
251
257
  * Get configuration summary (for logging)
252
258
  */
253
259
  getConfigSummary() {
254
- const mode = this.useMainnet ? "mainnet" : "testnet";
255
260
  const hasCredentials = !!(this.apiKeyId && this.apiKeySecret);
256
- return `CDP Facilitator (${mode}, credentials: ${hasCredentials ? "yes" : "no"})`;
261
+ const networks = this.supportedNetworks.join(", ");
262
+ return `CDP Facilitator (networks: ${networks}, credentials: ${hasCredentials ? "yes" : "no"})`;
257
263
  }
258
264
  };
259
265
 
@@ -507,9 +513,27 @@ var CHAIN_TO_NETWORK = {
507
513
  "polygon": "eip155:137"
508
514
  };
509
515
  var TOKEN_DOMAINS = {
510
- USDC: { name: "USD Coin", version: "2" },
511
- USDT: { name: "Tether USD", version: "2" }
516
+ // Base mainnet
517
+ "eip155:8453": {
518
+ USDC: { name: "USD Coin", version: "2" },
519
+ USDT: { name: "Tether USD", version: "2" }
520
+ },
521
+ // Base Sepolia testnet - USDC uses 'USDC' not 'USD Coin'
522
+ "eip155:84532": {
523
+ USDC: { name: "USDC", version: "2" },
524
+ USDT: { name: "USDC", version: "2" }
525
+ // Same contract as USDC on testnet
526
+ },
527
+ // Polygon mainnet
528
+ "eip155:137": {
529
+ USDC: { name: "USD Coin", version: "2" },
530
+ USDT: { name: "(PoS) Tether USD", version: "2" }
531
+ }
512
532
  };
533
+ function getTokenDomain(network, token) {
534
+ const networkDomains = TOKEN_DOMAINS[network] || TOKEN_DOMAINS["eip155:8453"];
535
+ return networkDomains[token] || { name: "USD Coin", version: "2" };
536
+ }
513
537
  function getAcceptedCurrencies(config) {
514
538
  return config.acceptedCurrencies ?? [config.currency];
515
539
  }
@@ -603,11 +627,14 @@ var MoltsPayServer = class {
603
627
  getProviderChains() {
604
628
  const provider = this.manifest.provider;
605
629
  if (provider.chains && provider.chains.length > 0) {
606
- return provider.chains.map((c) => ({
607
- network: c.network || CHAIN_TO_NETWORK[c.chain] || "eip155:8453",
608
- wallet: c.wallet || provider.wallet,
609
- tokens: c.tokens || ["USDC"]
610
- }));
630
+ return provider.chains.map((c) => {
631
+ const chainName = typeof c === "string" ? c : c.chain;
632
+ return {
633
+ network: CHAIN_TO_NETWORK[chainName] || "eip155:8453",
634
+ wallet: (typeof c === "object" ? c.wallet : null) || provider.wallet,
635
+ tokens: (typeof c === "object" ? c.tokens : null) || ["USDC"]
636
+ };
637
+ });
611
638
  }
612
639
  const chain = provider.chain || "base";
613
640
  const network = CHAIN_TO_NETWORK[chain] || this.networkId;
@@ -817,7 +844,7 @@ var MoltsPayServer = class {
817
844
  const paymentNetwork = payment.accepted?.network || payment.network || this.networkId;
818
845
  const paymentWallet = this.getWalletForNetwork(paymentNetwork);
819
846
  const requirements = this.buildPaymentRequirements(skill.config, paymentNetwork, paymentWallet, paymentToken);
820
- console.log(`[MoltsPay] Verifying payment...`);
847
+ console.log(`[MoltsPay] Verifying payment on ${paymentNetwork}...`);
821
848
  const verifyResult = await this.registry.verify(payment, requirements);
822
849
  if (!verifyResult.valid) {
823
850
  return this.sendJson(res, 402, {
@@ -943,7 +970,7 @@ var MoltsPayServer = class {
943
970
  const selectedToken = token && acceptedTokens.includes(token) ? token : acceptedTokens[0];
944
971
  const tokenAddresses = TOKEN_ADDRESSES[selectedNetwork] || {};
945
972
  const tokenAddress = tokenAddresses[selectedToken];
946
- const tokenDomain = TOKEN_DOMAINS[selectedToken] || TOKEN_DOMAINS.USDC;
973
+ const tokenDomain = getTokenDomain(selectedNetwork, selectedToken);
947
974
  return {
948
975
  scheme: "exact",
949
976
  network: selectedNetwork,
@@ -1188,7 +1215,7 @@ var MoltsPayServer = class {
1188
1215
  const selectedToken = token && acceptedTokens.includes(token) ? token : acceptedTokens[0];
1189
1216
  const tokenAddresses = TOKEN_ADDRESSES[networkId] || TOKEN_ADDRESSES[this.networkId] || {};
1190
1217
  const tokenAddress = tokenAddresses[selectedToken];
1191
- const tokenDomain = TOKEN_DOMAINS[selectedToken] || TOKEN_DOMAINS.USDC;
1218
+ const tokenDomain = getTokenDomain(networkId, selectedToken);
1192
1219
  return {
1193
1220
  scheme: "exact",
1194
1221
  network: networkId,