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.mjs
CHANGED
|
@@ -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
|
|
18
|
-
var
|
|
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 =
|
|
63
|
-
this.supportedNetworks =
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
477
|
-
|
|
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
|
-
|
|
574
|
-
|
|
575
|
-
|
|
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 =
|
|
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 =
|
|
1184
|
+
const tokenDomain = getTokenDomain(networkId, selectedToken);
|
|
1158
1185
|
return {
|
|
1159
1186
|
scheme: "exact",
|
|
1160
1187
|
network: networkId,
|