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.
- package/README.md +78 -9
- package/dist/cdp/index.d.mts +1 -1
- package/dist/cdp/index.d.ts +1 -1
- package/dist/cdp/index.js +16 -49
- package/dist/cdp/index.js.map +1 -1
- package/dist/cdp/index.mjs +16 -49
- package/dist/cdp/index.mjs.map +1 -1
- package/dist/chains/index.d.mts +1 -1
- package/dist/chains/index.d.ts +1 -1
- package/dist/chains/index.js +16 -49
- package/dist/chains/index.js.map +1 -1
- package/dist/chains/index.mjs +16 -49
- package/dist/chains/index.mjs.map +1 -1
- package/dist/cli/index.js +180 -111
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/index.mjs +180 -111
- package/dist/cli/index.mjs.map +1 -1
- package/dist/client/index.d.mts +3 -3
- package/dist/client/index.d.ts +3 -3
- package/dist/client/index.js +32 -58
- package/dist/client/index.js.map +1 -1
- package/dist/client/index.mjs +32 -58
- package/dist/client/index.mjs.map +1 -1
- package/dist/facilitators/index.d.mts +12 -6
- package/dist/facilitators/index.d.ts +12 -6
- package/dist/facilitators/index.js +39 -33
- package/dist/facilitators/index.js.map +1 -1
- package/dist/facilitators/index.mjs +39 -33
- package/dist/facilitators/index.mjs.map +1 -1
- package/dist/{index-B3v8IWjM.d.mts → index-DgJPZMBG.d.mts} +2 -1
- package/dist/{index-B3v8IWjM.d.ts → index-DgJPZMBG.d.ts} +2 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +102 -101
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +102 -101
- package/dist/index.mjs.map +1 -1
- package/dist/server/index.js +70 -43
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +70 -43
- package/dist/server/index.mjs.map +1 -1
- package/dist/verify/index.d.mts +1 -1
- package/dist/verify/index.d.ts +1 -1
- package/dist/verify/index.js +16 -49
- package/dist/verify/index.js.map +1 -1
- package/dist/verify/index.mjs +16 -49
- package/dist/verify/index.mjs.map +1 -1
- package/dist/wallet/index.d.mts +1 -1
- package/dist/wallet/index.d.ts +1 -1
- package/dist/wallet/index.js +16 -49
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/index.mjs +16 -49
- package/dist/wallet/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/server/index.js
CHANGED
|
@@ -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
|
|
52
|
-
var
|
|
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 =
|
|
97
|
-
this.supportedNetworks =
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
511
|
-
|
|
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
|
-
|
|
608
|
-
|
|
609
|
-
|
|
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 =
|
|
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 =
|
|
1218
|
+
const tokenDomain = getTokenDomain(networkId, selectedToken);
|
|
1192
1219
|
return {
|
|
1193
1220
|
scheme: "exact",
|
|
1194
1221
|
network: networkId,
|