@hpp-io/x402-mcp-bridge 0.0.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.
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Safe v1.4.1 helpers — minimal viem-based reimplementation of the bits
3
+ * of @safe-global/protocol-kit we use, to keep this CLI dependency-free
4
+ * beyond viem.
5
+ *
6
+ * What we need:
7
+ * - deploySafe(owner, threshold) via canonical ProxyFactory
8
+ * - execSafeTx(to, data, ownerSigner) 1-of-1 path
9
+ * - read helpers (nonce, isModuleEnabled)
10
+ *
11
+ * The canonical addresses are present on every chain that hosts Safe
12
+ * v1.4.1 (verified for HPP Sepolia + Mainnet on 2026-04-30).
13
+ */
14
+ import { createPublicClient, createWalletClient, encodeFunctionData, http, defineChain, } from "viem";
15
+ import { privateKeyToAccount } from "viem/accounts";
16
+ export const SAFE_V141 = {
17
+ singleton: "0x41675C099F32341bf84BFc5382aF534df5C7461a",
18
+ proxyFactory: "0x4e1DCf7AD4e460CfD30791CCC4F9c8a4f820ec67",
19
+ fallbackHandler: "0xfd0732Dc9E303f09fCEf3a7388Ad10A83459Ec99",
20
+ };
21
+ const SAFE_SETUP_ABI = [
22
+ {
23
+ type: "function",
24
+ name: "setup",
25
+ inputs: [
26
+ { name: "_owners", type: "address[]" },
27
+ { name: "_threshold", type: "uint256" },
28
+ { name: "to", type: "address" },
29
+ { name: "data", type: "bytes" },
30
+ { name: "fallbackHandler", type: "address" },
31
+ { name: "paymentToken", type: "address" },
32
+ { name: "payment", type: "uint256" },
33
+ { name: "paymentReceiver", type: "address" },
34
+ ],
35
+ outputs: [],
36
+ stateMutability: "nonpayable",
37
+ },
38
+ ];
39
+ const PROXY_FACTORY_ABI = [
40
+ {
41
+ type: "function",
42
+ name: "createProxyWithNonce",
43
+ inputs: [
44
+ { name: "_singleton", type: "address" },
45
+ { name: "initializer", type: "bytes" },
46
+ { name: "saltNonce", type: "uint256" },
47
+ ],
48
+ outputs: [{ name: "proxy", type: "address" }],
49
+ stateMutability: "nonpayable",
50
+ },
51
+ {
52
+ type: "event",
53
+ name: "ProxyCreation",
54
+ inputs: [
55
+ { name: "proxy", type: "address", indexed: true },
56
+ { name: "singleton", type: "address", indexed: false },
57
+ ],
58
+ anonymous: false,
59
+ },
60
+ ];
61
+ const SAFE_ABI = [
62
+ {
63
+ type: "function",
64
+ name: "execTransaction",
65
+ inputs: [
66
+ { name: "to", type: "address" },
67
+ { name: "value", type: "uint256" },
68
+ { name: "data", type: "bytes" },
69
+ { name: "operation", type: "uint8" },
70
+ { name: "safeTxGas", type: "uint256" },
71
+ { name: "baseGas", type: "uint256" },
72
+ { name: "gasPrice", type: "uint256" },
73
+ { name: "gasToken", type: "address" },
74
+ { name: "refundReceiver", type: "address" },
75
+ { name: "signatures", type: "bytes" },
76
+ ],
77
+ outputs: [{ name: "", type: "bool" }],
78
+ stateMutability: "payable",
79
+ },
80
+ {
81
+ type: "function",
82
+ name: "nonce",
83
+ inputs: [],
84
+ outputs: [{ name: "", type: "uint256" }],
85
+ stateMutability: "view",
86
+ },
87
+ {
88
+ type: "function",
89
+ name: "enableModule",
90
+ inputs: [{ name: "module", type: "address" }],
91
+ outputs: [],
92
+ stateMutability: "nonpayable",
93
+ },
94
+ {
95
+ type: "function",
96
+ name: "isModuleEnabled",
97
+ inputs: [{ name: "module", type: "address" }],
98
+ outputs: [{ name: "", type: "bool" }],
99
+ stateMutability: "view",
100
+ },
101
+ ];
102
+ export function buildClients(cfg, ownerPk) {
103
+ const owner = privateKeyToAccount(ownerPk);
104
+ const chain = defineChain({
105
+ id: cfg.chainId,
106
+ name: `chain-${cfg.chainId}`,
107
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
108
+ rpcUrls: { default: { http: [cfg.rpcUrl] } },
109
+ });
110
+ const publicClient = createPublicClient({ chain, transport: http(cfg.rpcUrl) });
111
+ const walletClient = createWalletClient({
112
+ chain,
113
+ transport: http(cfg.rpcUrl),
114
+ account: owner,
115
+ });
116
+ return { owner, publicClient, walletClient };
117
+ }
118
+ /** Deploy a 1-of-1 Safe and return its address. */
119
+ export async function deploySafe(cfg, ownerPk) {
120
+ const { owner, publicClient, walletClient } = buildClients(cfg, ownerPk);
121
+ const initializer = encodeFunctionData({
122
+ abi: SAFE_SETUP_ABI,
123
+ functionName: "setup",
124
+ args: [
125
+ [owner.address],
126
+ 1n,
127
+ "0x0000000000000000000000000000000000000000",
128
+ "0x",
129
+ SAFE_V141.fallbackHandler,
130
+ "0x0000000000000000000000000000000000000000",
131
+ 0n,
132
+ "0x0000000000000000000000000000000000000000",
133
+ ],
134
+ });
135
+ const saltNonce = BigInt(Date.now());
136
+ const txHash = await walletClient.writeContract({
137
+ address: SAFE_V141.proxyFactory,
138
+ abi: PROXY_FACTORY_ABI,
139
+ functionName: "createProxyWithNonce",
140
+ args: [SAFE_V141.singleton, initializer, saltNonce],
141
+ });
142
+ const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });
143
+ // Extract Safe address from ProxyCreation event topic[1] (indexed).
144
+ const log = receipt.logs.find((l) => l.address.toLowerCase() === SAFE_V141.proxyFactory.toLowerCase() &&
145
+ l.topics[0]?.toLowerCase() ===
146
+ "0x4f51faf6c4561ff95f067657e43439f0f856d97c04d9ec9070a6199ad418e235");
147
+ if (!log || !log.topics[1])
148
+ throw new Error("ProxyCreation event missing");
149
+ const safe = (`0x${log.topics[1].slice(26)}`);
150
+ return { safe, tx: txHash };
151
+ }
152
+ /** Execute a single Safe transaction (operation = CALL, nonce auto-fetched). */
153
+ export async function execSafeTx(cfg, ownerPk, safe, to, data) {
154
+ const { owner, publicClient, walletClient } = buildClients(cfg, ownerPk);
155
+ const nonce = (await publicClient.readContract({
156
+ address: safe,
157
+ abi: SAFE_ABI,
158
+ functionName: "nonce",
159
+ }));
160
+ const params = {
161
+ to,
162
+ value: 0n,
163
+ data,
164
+ operation: 0,
165
+ safeTxGas: 0n,
166
+ baseGas: 0n,
167
+ gasPrice: 0n,
168
+ gasToken: "0x0000000000000000000000000000000000000000",
169
+ refundReceiver: "0x0000000000000000000000000000000000000000",
170
+ nonce,
171
+ };
172
+ const signature = await owner.signTypedData({
173
+ domain: { chainId: cfg.chainId, verifyingContract: safe },
174
+ types: {
175
+ SafeTx: [
176
+ { name: "to", type: "address" },
177
+ { name: "value", type: "uint256" },
178
+ { name: "data", type: "bytes" },
179
+ { name: "operation", type: "uint8" },
180
+ { name: "safeTxGas", type: "uint256" },
181
+ { name: "baseGas", type: "uint256" },
182
+ { name: "gasPrice", type: "uint256" },
183
+ { name: "gasToken", type: "address" },
184
+ { name: "refundReceiver", type: "address" },
185
+ { name: "nonce", type: "uint256" },
186
+ ],
187
+ },
188
+ primaryType: "SafeTx",
189
+ message: params,
190
+ });
191
+ const txHash = await walletClient.writeContract({
192
+ address: safe,
193
+ abi: SAFE_ABI,
194
+ functionName: "execTransaction",
195
+ args: [
196
+ params.to,
197
+ params.value,
198
+ params.data,
199
+ params.operation,
200
+ params.safeTxGas,
201
+ params.baseGas,
202
+ params.gasPrice,
203
+ params.gasToken,
204
+ params.refundReceiver,
205
+ signature,
206
+ ],
207
+ });
208
+ await publicClient.waitForTransactionReceipt({ hash: txHash });
209
+ return txHash;
210
+ }
211
+ export async function isModuleEnabled(cfg, safe, module) {
212
+ const publicClient = createPublicClient({
213
+ chain: defineChain({
214
+ id: cfg.chainId,
215
+ name: `chain-${cfg.chainId}`,
216
+ nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
217
+ rpcUrls: { default: { http: [cfg.rpcUrl] } },
218
+ }),
219
+ transport: http(cfg.rpcUrl),
220
+ });
221
+ return (await publicClient.readContract({
222
+ address: safe,
223
+ abi: SAFE_ABI,
224
+ functionName: "isModuleEnabled",
225
+ args: [module],
226
+ }));
227
+ }
228
+ export const ALLOWANCE_MODULE_ABI = [
229
+ {
230
+ type: "function",
231
+ name: "addDelegate",
232
+ inputs: [{ name: "delegate", type: "address" }],
233
+ outputs: [],
234
+ stateMutability: "nonpayable",
235
+ },
236
+ {
237
+ type: "function",
238
+ name: "setAllowance",
239
+ inputs: [
240
+ { name: "delegate", type: "address" },
241
+ { name: "token", type: "address" },
242
+ { name: "allowanceAmount", type: "uint96" },
243
+ { name: "resetTimeMin", type: "uint16" },
244
+ { name: "resetBaseMin", type: "uint32" },
245
+ ],
246
+ outputs: [],
247
+ stateMutability: "nonpayable",
248
+ },
249
+ {
250
+ type: "function",
251
+ name: "deleteAllowance",
252
+ inputs: [
253
+ { name: "delegate", type: "address" },
254
+ { name: "token", type: "address" },
255
+ ],
256
+ outputs: [],
257
+ stateMutability: "nonpayable",
258
+ },
259
+ {
260
+ type: "function",
261
+ name: "getTokenAllowance",
262
+ inputs: [
263
+ { name: "safe", type: "address" },
264
+ { name: "delegate", type: "address" },
265
+ { name: "token", type: "address" },
266
+ ],
267
+ outputs: [{ name: "", type: "uint256[5]" }],
268
+ stateMutability: "view",
269
+ },
270
+ ];
271
+ export function encodeEnableModule(module) {
272
+ return encodeFunctionData({
273
+ abi: SAFE_ABI,
274
+ functionName: "enableModule",
275
+ args: [module],
276
+ });
277
+ }
278
+ export function encodeAddDelegate(delegate) {
279
+ return encodeFunctionData({
280
+ abi: ALLOWANCE_MODULE_ABI,
281
+ functionName: "addDelegate",
282
+ args: [delegate],
283
+ });
284
+ }
285
+ export function encodeSetAllowance(delegate, token, amountAtomic, resetMinutes) {
286
+ return encodeFunctionData({
287
+ abi: ALLOWANCE_MODULE_ABI,
288
+ functionName: "setAllowance",
289
+ args: [delegate, token, amountAtomic, resetMinutes, 0],
290
+ });
291
+ }
292
+ export function encodeDeleteAllowance(delegate, token) {
293
+ return encodeFunctionData({
294
+ abi: ALLOWANCE_MODULE_ABI,
295
+ functionName: "deleteAllowance",
296
+ args: [delegate, token],
297
+ });
298
+ }
299
+ //# sourceMappingURL=safe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe.js","sourceRoot":"","sources":["../../src/cli/safe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,234 @@
1
+ /**
2
+ * hpp-x402-safe-setup — one-shot bootstrap of the user's wallet config.
3
+ *
4
+ * Composes the four steps that used to live in /tmp/safe-deploy/* into
5
+ * a single command:
6
+ *
7
+ * 1. Deploy a 1-of-1 Safe (owner = --owner-pk's account)
8
+ * 2. Generate a fresh delegate EOA (or use --delegate-pk if provided)
9
+ * 3. Fund the Safe with USDC.e (--fund-usdc) + delegate with ETH (--fund-eth)
10
+ * from the owner account
11
+ * 4. Send three Safe transactions:
12
+ * - enableModule(allowanceModule)
13
+ * - allowanceModule.addDelegate(delegate)
14
+ * - allowanceModule.setAllowance(delegate, USDCe, allowance/day, 1440, 0)
15
+ *
16
+ * Outputs a copy-pasteable env block + (optional) merges into the host
17
+ * config (Claude Desktop) via the existing install-claude-desktop helper.
18
+ *
19
+ * Usage:
20
+ * npx -y @hpp-io/x402-mcp-bridge setup \
21
+ * --owner-pk 0x... (required — Safe owner key)
22
+ * --network eip155:181228 (default: HPP Sepolia)
23
+ * --rpc https://sepolia.hpp.io (default by network)
24
+ * --usdc 0x401eCb1D... (default by network)
25
+ * --module 0x3CcE72... (default by network)
26
+ * --allowance 1 (USDC.e/day, default 1)
27
+ * --fund-usdc 5 (Safe USDC.e seed, default 5)
28
+ * --fund-eth 0.001 (delegate gas seed, default 0.001)
29
+ * --delegate-pk 0x... (optional; auto-generates if omitted)
30
+ * --resource-server-url https://... (default localhost:4021/mcp/sse)
31
+ * --install-claude (also write claude_desktop_config.json)
32
+ */
33
+ import { parseUnits, parseEther, } from "viem";
34
+ import { privateKeyToAccount, generatePrivateKey } from "viem/accounts";
35
+ import { buildClients, deploySafe, execSafeTx, encodeEnableModule, encodeAddDelegate, encodeSetAllowance, isModuleEnabled, } from "./safe.js";
36
+ // Built-in defaults per network; users can override with flags.
37
+ const DEFAULTS = {
38
+ "eip155:181228": {
39
+ rpc: "https://sepolia.hpp.io",
40
+ usdc: "0x401eCb1D350407f13ba348573E5630B83638E30D",
41
+ module: "0x3CcE72483929e0517Dafc8fD192547B3B65f9b07",
42
+ chainId: 181228,
43
+ name: "HPP Sepolia",
44
+ },
45
+ // Mainnet entry pre-wired for when AllowanceModule is deployed there.
46
+ // "eip155:190415": { ..., module: "0x..." }
47
+ };
48
+ function parseArgs(argv) {
49
+ const out = {};
50
+ for (let i = 2; i < argv.length; i++) {
51
+ const a = argv[i];
52
+ if (!a.startsWith("--"))
53
+ continue;
54
+ const k = a.slice(2);
55
+ const next = argv[i + 1];
56
+ if (!next || next.startsWith("--")) {
57
+ out[k] = true;
58
+ }
59
+ else {
60
+ out[k] = next;
61
+ i++;
62
+ }
63
+ }
64
+ return out;
65
+ }
66
+ function requireStr(a, k) {
67
+ const v = a[k];
68
+ if (typeof v !== "string" || v.length === 0) {
69
+ console.error(`missing --${k}`);
70
+ process.exit(1);
71
+ }
72
+ return v;
73
+ }
74
+ const ERC20_TRANSFER_ABI = [
75
+ {
76
+ type: "function",
77
+ name: "transfer",
78
+ inputs: [
79
+ { name: "to", type: "address" },
80
+ { name: "amount", type: "uint256" },
81
+ ],
82
+ outputs: [{ name: "", type: "bool" }],
83
+ stateMutability: "nonpayable",
84
+ },
85
+ ];
86
+ async function main() {
87
+ const args = parseArgs(process.argv);
88
+ const network = args.network || "eip155:181228";
89
+ const def = DEFAULTS[network];
90
+ if (!def) {
91
+ console.error(`unsupported network: ${network} (no default known)`);
92
+ process.exit(1);
93
+ }
94
+ const ownerPk = requireStr(args, "owner-pk");
95
+ const rpc = args.rpc || def.rpc;
96
+ const usdc = (args.usdc || def.usdc);
97
+ const module = (args.module || def.module);
98
+ const chainId = def.chainId;
99
+ const allowanceUSDC = args.allowance || "1";
100
+ const fundUSDC = args["fund-usdc"] || "5";
101
+ const fundETH = args["fund-eth"] || "0.001";
102
+ const resourceServerUrl = args["resource-server-url"] ||
103
+ "http://localhost:4021/mcp/sse";
104
+ const installClaude = args["install-claude"] === true;
105
+ let delegatePk = args["delegate-pk"];
106
+ let delegateGenerated = false;
107
+ if (!delegatePk) {
108
+ delegatePk = generatePrivateKey();
109
+ delegateGenerated = true;
110
+ }
111
+ const delegate = privateKeyToAccount(delegatePk).address;
112
+ const cfg = { rpcUrl: rpc, chainId };
113
+ console.log(`hpp-x402-safe-setup`);
114
+ console.log(` network : ${network} (${def.name})`);
115
+ console.log(` rpc : ${rpc}`);
116
+ console.log(` USDC.e : ${usdc}`);
117
+ console.log(` AllowanceModule : ${module}`);
118
+ console.log(` owner address : ${privateKeyToAccount(ownerPk).address}`);
119
+ console.log(` delegate address: ${delegate}${delegateGenerated ? " (auto-generated)" : ""}`);
120
+ console.log(` allowance : ${allowanceUSDC} USDC.e / 24h`);
121
+ console.log(` fund-usdc : ${fundUSDC} USDC.e`);
122
+ console.log(` fund-eth : ${fundETH} ETH`);
123
+ console.log("");
124
+ // ---- 1) Deploy Safe -------------------------------------------------
125
+ console.log("[1/5] Deploying Safe (1-of-1)…");
126
+ const { safe, tx: deployTx } = await deploySafe(cfg, ownerPk);
127
+ console.log(` ✓ Safe: ${safe} (tx ${deployTx})`);
128
+ // ---- 2) Fund Safe with USDC.e + delegate with ETH ------------------
129
+ const { walletClient, publicClient } = buildClients(cfg, ownerPk);
130
+ const usdcAtomic = parseUnits(fundUSDC, 6);
131
+ const ethWei = parseEther(fundETH);
132
+ console.log(`[2/5] Funding Safe with ${fundUSDC} USDC.e + delegate with ${fundETH} ETH…`);
133
+ const usdcTransferTx = await walletClient.writeContract({
134
+ address: usdc,
135
+ abi: ERC20_TRANSFER_ABI,
136
+ functionName: "transfer",
137
+ args: [safe, usdcAtomic],
138
+ });
139
+ await publicClient.waitForTransactionReceipt({ hash: usdcTransferTx });
140
+ const ethTx = await walletClient.sendTransaction({
141
+ to: delegate,
142
+ value: ethWei,
143
+ });
144
+ await publicClient.waitForTransactionReceipt({ hash: ethTx });
145
+ console.log(` ✓ Safe ← ${fundUSDC} USDC.e (tx ${usdcTransferTx})`);
146
+ console.log(` ✓ delegate ← ${fundETH} ETH (tx ${ethTx})`);
147
+ // ---- 3) enableModule(AllowanceModule) ------------------------------
148
+ if (await isModuleEnabled(cfg, safe, module)) {
149
+ console.log("[3/5] AllowanceModule already enabled — skip");
150
+ }
151
+ else {
152
+ console.log("[3/5] Enabling AllowanceModule…");
153
+ const enableTx = await execSafeTx(cfg, ownerPk, safe, safe, encodeEnableModule(module));
154
+ console.log(` ✓ enabled (Safe tx ${enableTx})`);
155
+ }
156
+ // ---- 4) addDelegate ------------------------------------------------
157
+ console.log("[4/5] Authorising delegate…");
158
+ const addDelegateTx = await execSafeTx(cfg, ownerPk, safe, module, encodeAddDelegate(delegate));
159
+ console.log(` ✓ addDelegate (Safe tx ${addDelegateTx})`);
160
+ // ---- 5) setAllowance -----------------------------------------------
161
+ const allowanceAtomic = parseUnits(allowanceUSDC, 6);
162
+ console.log(`[5/5] Setting allowance ${allowanceUSDC} USDC.e / 24h…`);
163
+ const setAllowanceTx = await execSafeTx(cfg, ownerPk, safe, module, encodeSetAllowance(delegate, usdc, allowanceAtomic, 1440));
164
+ console.log(` ✓ setAllowance (Safe tx ${setAllowanceTx})`);
165
+ // ---- Output --------------------------------------------------------
166
+ console.log("\n🎉 setup complete.\n");
167
+ console.log("Addresses:");
168
+ console.log(` Safe : ${safe}`);
169
+ console.log(` Delegate EOA : ${delegate}`);
170
+ console.log(` AllowanceModule : ${module}`);
171
+ console.log(` USDC.e : ${usdc}`);
172
+ console.log("");
173
+ if (delegateGenerated) {
174
+ console.log("⚠ Delegate private key (save securely — *not* committed):");
175
+ console.log(` ${delegatePk}`);
176
+ console.log("");
177
+ }
178
+ const envBlock = {
179
+ DELEGATE_PRIVATE_KEY: delegatePk,
180
+ SAFE_ADDRESS: safe,
181
+ ALLOWANCE_MODULE_ADDRESS: module,
182
+ USDCE_ADDRESS: usdc,
183
+ RESOURCE_SERVER_URL: resourceServerUrl,
184
+ HPP_RPC_URL: rpc,
185
+ HPP_NETWORK: network,
186
+ LOG_LEVEL: "info",
187
+ };
188
+ console.log("Paste into claude_desktop_config.json (or openclaw config.json):");
189
+ console.log(JSON.stringify({
190
+ mcpServers: {
191
+ "hpp-x402": {
192
+ command: "npx",
193
+ args: ["-y", "@hpp-io/x402-mcp-bridge"],
194
+ env: envBlock,
195
+ },
196
+ },
197
+ }, null, 2));
198
+ if (installClaude) {
199
+ console.log("\n[install-claude] Writing to Claude Desktop config…");
200
+ const { installClaudeDesktop } = await import("./install-claude.js");
201
+ try {
202
+ const r = installClaudeDesktop(envBlock, {
203
+ force: true,
204
+ });
205
+ console.log(` config: ${r.configPath}`);
206
+ if (r.backupPath)
207
+ console.log(` backup: ${r.backupPath}`);
208
+ console.log(` preserved entries: ${r.preservedEntries.length}`);
209
+ console.log(` changed: ${r.changed}`);
210
+ console.log("\n ✓ Restart Claude Desktop (cmd+Q then reopen) to load.");
211
+ }
212
+ catch (err) {
213
+ console.error(" ✗ install-claude failed:", err.message);
214
+ console.error(" Use the env block above to merge manually.");
215
+ }
216
+ }
217
+ else {
218
+ console.log("\nTo merge into Claude Desktop automatically, re-run with --install-claude.");
219
+ console.log("To start the bridge manually:");
220
+ console.log(` RESOURCE_SERVER_URL=${resourceServerUrl} \\`);
221
+ console.log(` DELEGATE_PRIVATE_KEY=${delegatePk} \\`);
222
+ console.log(` SAFE_ADDRESS=${safe} \\`);
223
+ console.log(` ALLOWANCE_MODULE_ADDRESS=${module} \\`);
224
+ console.log(` USDCE_ADDRESS=${usdc} \\`);
225
+ console.log(` HPP_RPC_URL=${rpc} \\`);
226
+ console.log(` HPP_NETWORK=${network} \\`);
227
+ console.log(` npx @hpp-io/x402-mcp-bridge`);
228
+ }
229
+ }
230
+ main().catch((err) => {
231
+ console.error("\nERROR:", err?.message ?? err);
232
+ process.exit(1);
233
+ });
234
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/cli/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Upstream MCP client. Connects to the remote x402 MCP server (the
3
+ * "seller") and wraps it with @x402/mcp's payment middleware.
4
+ *
5
+ * The middleware handles the 402 → sign → retry cycle. We hook into its
6
+ * `onPaymentRequested` callback to run autoTopup before each payment so
7
+ * the delegate EOA holds enough USDC.e to sign the EIP-3009 authorization.
8
+ */
9
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
10
+ import { wrapMCPClientWithPaymentFromConfig } from "@x402/mcp";
11
+ import type { Network } from "@x402/core/types";
12
+ import type { AutoTopup } from "./autoTopup.js";
13
+ import { RawEoaSigner } from "./signers/raw-eoa.js";
14
+ export interface UpstreamClient {
15
+ /** Standard MCP client — listTools/etc go here. */
16
+ base: Client;
17
+ /** Payment-aware wrapper — callTool goes here. */
18
+ x402: ReturnType<typeof wrapMCPClientWithPaymentFromConfig>;
19
+ /** Disconnect and free resources. */
20
+ close(): Promise<void>;
21
+ }
22
+ export interface UpstreamOptions {
23
+ url: string;
24
+ network: Network;
25
+ signer: RawEoaSigner;
26
+ autoTopup: AutoTopup;
27
+ bridgeName: string;
28
+ bridgeVersion: string;
29
+ }
30
+ export declare function connectUpstream(opts: UpstreamOptions): Promise<UpstreamClient>;
package/dist/client.js ADDED
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Upstream MCP client. Connects to the remote x402 MCP server (the
3
+ * "seller") and wraps it with @x402/mcp's payment middleware.
4
+ *
5
+ * The middleware handles the 402 → sign → retry cycle. We hook into its
6
+ * `onPaymentRequested` callback to run autoTopup before each payment so
7
+ * the delegate EOA holds enough USDC.e to sign the EIP-3009 authorization.
8
+ */
9
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
10
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
11
+ import { wrapMCPClientWithPaymentFromConfig } from "@x402/mcp";
12
+ import { ExactEvmScheme } from "@x402/evm/exact/client";
13
+ import { log } from "./log.js";
14
+ export async function connectUpstream(opts) {
15
+ const base = new Client({ name: opts.bridgeName, version: opts.bridgeVersion });
16
+ const x402 = wrapMCPClientWithPaymentFromConfig(base, {
17
+ schemes: [
18
+ {
19
+ network: opts.network,
20
+ client: new ExactEvmScheme(opts.signer.viemAccount),
21
+ },
22
+ ],
23
+ }, {
24
+ autoPayment: true,
25
+ onPaymentRequested: async ({ paymentRequired }) => {
26
+ const accept = paymentRequired.accepts?.[0];
27
+ if (!accept)
28
+ return false;
29
+ const requiredAtomic = BigInt(accept.amount ?? "0");
30
+ log.info("payment.requested", {
31
+ amount: requiredAtomic.toString(),
32
+ asset: accept.asset,
33
+ network: accept.network,
34
+ });
35
+ try {
36
+ const txHash = await opts.autoTopup.ensure(requiredAtomic);
37
+ if (txHash) {
38
+ log.info("autoTopup.executed", { txHash, requiredAtomic: requiredAtomic.toString() });
39
+ }
40
+ else {
41
+ log.debug("autoTopup.skipped — sufficient balance");
42
+ }
43
+ return true;
44
+ }
45
+ catch (err) {
46
+ log.error("autoTopup.failed", {
47
+ err: err.message,
48
+ requiredAtomic: requiredAtomic.toString(),
49
+ });
50
+ return false; // refuse payment — host will see the error
51
+ }
52
+ },
53
+ });
54
+ const transport = new SSEClientTransport(new URL(opts.url));
55
+ await base.connect(transport);
56
+ log.info("upstream.connected", { url: opts.url });
57
+ return {
58
+ base,
59
+ x402,
60
+ async close() {
61
+ await base.close().catch(() => { });
62
+ },
63
+ };
64
+ }
65
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AACnE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAC7E,OAAO,EAAE,kCAAkC,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAKxD,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAoB/B,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAqB;IACzD,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAEhF,MAAM,IAAI,GAAG,kCAAkC,CAC7C,IAAI,EACJ;QACE,OAAO,EAAE;YACP;gBACE,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,MAAM,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;aACpD;SACF;KACF,EACD;QACE,WAAW,EAAE,IAAI;QACjB,kBAAkB,EAAE,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;YAChD,MAAM,MAAM,GAAG,eAAe,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YAE1B,MAAM,cAAc,GAAG,MAAM,CAAE,MAA8B,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC;YAC7E,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE;gBAC5B,MAAM,EAAE,cAAc,CAAC,QAAQ,EAAE;gBACjC,KAAK,EAAG,MAA6B,CAAC,KAAK;gBAC3C,OAAO,EAAG,MAA+B,CAAC,OAAO;aAClD,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;gBAC3D,IAAI,MAAM,EAAE,CAAC;oBACX,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,cAAc,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;gBACxF,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;gBACtD,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE;oBAC5B,GAAG,EAAG,GAAa,CAAC,OAAO;oBAC3B,cAAc,EAAE,cAAc,CAAC,QAAQ,EAAE;iBAC1C,CAAC,CAAC;gBACH,OAAO,KAAK,CAAC,CAAC,2CAA2C;YAC3D,CAAC;QACH,CAAC;KACF,CACF,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,kBAAkB,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5D,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC9B,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAElD,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACrC,CAAC;KACF,CAAC;AACJ,CAAC"}