@chest-gate/cli 0.1.0

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 (51) hide show
  1. package/README.md +55 -0
  2. package/dist/chest_splitter_idl.json +482 -0
  3. package/dist/commands/app.d.ts +3 -0
  4. package/dist/commands/app.d.ts.map +1 -0
  5. package/dist/commands/app.js +42 -0
  6. package/dist/commands/app.js.map +1 -0
  7. package/dist/commands/deploy.d.ts +3 -0
  8. package/dist/commands/deploy.d.ts.map +1 -0
  9. package/dist/commands/deploy.js +285 -0
  10. package/dist/commands/deploy.js.map +1 -0
  11. package/dist/commands/gate.d.ts +3 -0
  12. package/dist/commands/gate.d.ts.map +1 -0
  13. package/dist/commands/gate.js +114 -0
  14. package/dist/commands/gate.js.map +1 -0
  15. package/dist/commands/init.d.ts +3 -0
  16. package/dist/commands/init.d.ts.map +1 -0
  17. package/dist/commands/init.js +153 -0
  18. package/dist/commands/init.js.map +1 -0
  19. package/dist/commands/keypair.d.ts +3 -0
  20. package/dist/commands/keypair.d.ts.map +1 -0
  21. package/dist/commands/keypair.js +38 -0
  22. package/dist/commands/keypair.js.map +1 -0
  23. package/dist/commands/split.d.ts +3 -0
  24. package/dist/commands/split.d.ts.map +1 -0
  25. package/dist/commands/split.js +98 -0
  26. package/dist/commands/split.js.map +1 -0
  27. package/dist/commands/status.d.ts +3 -0
  28. package/dist/commands/status.d.ts.map +1 -0
  29. package/dist/commands/status.js +37 -0
  30. package/dist/commands/status.js.map +1 -0
  31. package/dist/config.d.ts +43 -0
  32. package/dist/config.d.ts.map +1 -0
  33. package/dist/config.js +114 -0
  34. package/dist/config.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +23 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/keypair.d.ts +9 -0
  40. package/dist/keypair.d.ts.map +1 -0
  41. package/dist/keypair.js +50 -0
  42. package/dist/keypair.js.map +1 -0
  43. package/dist/manifest.d.ts +69 -0
  44. package/dist/manifest.d.ts.map +1 -0
  45. package/dist/manifest.js +171 -0
  46. package/dist/manifest.js.map +1 -0
  47. package/dist/splitter-init.d.ts +32 -0
  48. package/dist/splitter-init.d.ts.map +1 -0
  49. package/dist/splitter-init.js +99 -0
  50. package/dist/splitter-init.js.map +1 -0
  51. package/package.json +58 -0
@@ -0,0 +1,285 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { readFile } from "node:fs/promises";
4
+ import { Keypair } from "@solana/web3.js";
5
+ import { signDeployMessage } from "@chest-gate/proxy";
6
+ import { loadConfig, normalizeNetwork } from "../config.js";
7
+ import { ensureKeypair } from "../keypair.js";
8
+ import { initializeSplit } from "../splitter-init.js";
9
+ /**
10
+ * Load the deployer wallet's secret key bytes. Required to sign the deploy
11
+ * request, proves control of the deployer wallet (which owns the slug).
12
+ *
13
+ * The deployer can be different from the payout wallet: teams often sign with
14
+ * a hot operational key but route revenue to a cold treasury.
15
+ *
16
+ * Priority:
17
+ * 1. --wallet-key <path>, path to Solana keypair JSON (array of 64 bytes)
18
+ * 2. CHEST_WALLET_KEY env, inline JSON array of 64 bytes
19
+ * 3. CHEST_WALLET_KEY_PATH, path to keypair JSON (env fallback)
20
+ */
21
+ /**
22
+ * Resolve the deployer secret key, in priority order:
23
+ * 1. CHEST_WALLET_KEY env (inline 64-byte JSON array, for CI)
24
+ * 2. --wallet-key <path> or CHEST_WALLET_KEY_PATH (raw Solana keypair JSON)
25
+ * 3. ~/.chest/wallet.json, the local wallet auto-created by `chest init`,
26
+ * `chest gate`, or `chest keypair`. This is what most users will hit.
27
+ */
28
+ async function loadDeployerSecretKey(optsPath) {
29
+ const inline = process.env.CHEST_WALLET_KEY;
30
+ if (inline) {
31
+ try {
32
+ return new Uint8Array(JSON.parse(inline));
33
+ }
34
+ catch {
35
+ throw new Error("CHEST_WALLET_KEY must be a JSON array of 64 bytes");
36
+ }
37
+ }
38
+ const path = optsPath || process.env.CHEST_WALLET_KEY_PATH;
39
+ if (path) {
40
+ const raw = await readFile(path.replace(/^~/, process.env.HOME || ""), "utf-8");
41
+ return new Uint8Array(JSON.parse(raw));
42
+ }
43
+ // Default: fall back to the local wallet at ~/.chest/wallet.json. This is
44
+ // the wallet `chest init`, `chest gate`, and `chest keypair` already use.
45
+ // ensureKeypair() returns the raw 64-byte secret key regardless of whether
46
+ // the on-disk format is a flat array or the BIP-39-wrapped object.
47
+ const local = await ensureKeypair();
48
+ return local.keypair;
49
+ }
50
+ /**
51
+ * Derive the slug the same way the server does when requestedSlug is omitted.
52
+ * Must stay byte-identical with packages/server/src/index.ts so the signature
53
+ * over `slug` matches the server's slug derivation.
54
+ */
55
+ function deriveSlug(requestedSlug, upstream) {
56
+ const slug = requestedSlug || upstream
57
+ .replace(/https?:\/\//, "")
58
+ .replace(/[^a-z0-9]/gi, "-")
59
+ .replace(/-+/g, "-")
60
+ .replace(/^-|-$/g, "")
61
+ .substring(0, 32);
62
+ return slug.toLowerCase();
63
+ }
64
+ const DEFAULT_SERVER = process.env.CHEST_SERVER || "https://gate.chest.sh";
65
+ // Default devnet USDC mint, override with CHEST_USDC_MINT env var
66
+ const DEVNET_USDC_MINT = "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU";
67
+ const MAINNET_USDC_MINT = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
68
+ function getUsdcMint(network) {
69
+ if (process.env.CHEST_USDC_MINT)
70
+ return process.env.CHEST_USDC_MINT;
71
+ if (network.includes("mainnet"))
72
+ return MAINNET_USDC_MINT;
73
+ return DEVNET_USDC_MINT;
74
+ }
75
+ export const deployCommand = new Command("deploy")
76
+ .description("Deploy your x402 proxy to Chest cloud, get a live URL")
77
+ .option("--upstream <url>", "Your production API URL (e.g. https://myapi.vercel.app)")
78
+ .option("-p, --price <amount>", "Price per request in USD (e.g. 0.01)")
79
+ .option("-w, --payout-wallet <address>", "Payout wallet address, receives USDC from paying agents")
80
+ .option("--deployer <address>", "Deployer wallet address, signs deploy requests and owns the slug. Defaults to --payout-wallet.")
81
+ .option("--wallet-key <path>", "Path to Solana keypair JSON for the deployer wallet (used to sign deploys). " +
82
+ "Fallback: CHEST_WALLET_KEY_PATH env or CHEST_WALLET_KEY inline JSON array.")
83
+ .option("--freebie <count>", "Number of free requests per IP before requiring payment. Defaults to chest.config.yaml `freebie:` or 0.")
84
+ .option("--network <network>", "Solana network (devnet, mainnet). Defaults to chest.config.yaml `network:` or devnet.")
85
+ .option("--slug <slug>", "Custom slug for your URL (auto-generated if omitted)")
86
+ .option("--session <duration>", "Session duration after payment (seconds, or e.g. 5m, 1h). Defaults to chest.config.yaml `session:` or 5m.")
87
+ .option("--server <url>", "Chest cloud server URL", DEFAULT_SERVER)
88
+ .option("--config <path>", "Path to chest.config.yaml")
89
+ .action(async (opts) => {
90
+ console.log(chalk.bold("\n ⚡ Chest Deploy\n"));
91
+ // Try loading from config file. Pass --session through so the YAML value
92
+ // wins when the flag wasn't explicitly overridden (commander always
93
+ // populates the default, so we can't distinguish "user typed --session
94
+ // 300" from "user passed nothing"; the YAML value should win in that case).
95
+ const config = await loadConfig({
96
+ wrap: opts.upstream,
97
+ wallet: opts.payoutWallet,
98
+ price: opts.price,
99
+ freebie: opts.freebie,
100
+ network: opts.network,
101
+ session: opts.session,
102
+ config: opts.config,
103
+ });
104
+ const upstream = opts.upstream || config.upstream;
105
+ const wallet = opts.payoutWallet || config.wallet;
106
+ const price = opts.price || String(config.defaultPrice);
107
+ const network = normalizeNetwork(opts.network || config.network || "devnet");
108
+ if (!upstream) {
109
+ console.error(chalk.red(" Error: --upstream is required (your production API URL)"));
110
+ process.exit(1);
111
+ }
112
+ if (!wallet) {
113
+ console.error(chalk.red(" Error: --payout-wallet is required (your Solana wallet address)"));
114
+ process.exit(1);
115
+ }
116
+ const server = opts.server;
117
+ console.log(chalk.gray(" Deploying to Chest cloud...\n"));
118
+ console.log(chalk.gray(" Upstream: ") + chalk.white(upstream));
119
+ console.log(chalk.gray(" Price: ") + chalk.white(`$${price} per request`));
120
+ console.log(chalk.gray(" Wallet: ") + chalk.cyan(wallet));
121
+ console.log(chalk.gray(" Network: ") + chalk.white(network));
122
+ console.log(chalk.gray(" Freebie: ") + chalk.white(`${config.freebie} per IP`));
123
+ console.log(chalk.gray(" Server: ") + chalk.gray(server));
124
+ // If split config is present, initialize the on-chain split program
125
+ let splitFields = {};
126
+ if (config.split) {
127
+ console.log();
128
+ console.log(chalk.gray(" Split enabled, initialising on-chain revenue share...\n"));
129
+ console.log(chalk.gray(" Referrer commission: ") +
130
+ chalk.white(`${config.split.referrerBps / 100}%`));
131
+ console.log(chalk.gray(" Protocol fee: ") +
132
+ chalk.white(`${config.split.protocolBps / 100}%`));
133
+ let feePayer;
134
+ try {
135
+ feePayer = await ensureKeypair();
136
+ }
137
+ catch (err) {
138
+ console.error(chalk.red(`\n Error loading fee-payer keypair: ${err.message}`));
139
+ process.exit(1);
140
+ }
141
+ const slug = opts.slug ||
142
+ upstream
143
+ .replace(/https?:\/\//, "")
144
+ .replace(/[^a-z0-9]/gi, "-")
145
+ .replace(/-+/g, "-")
146
+ .replace(/^-|-$/g, "")
147
+ .substring(0, 32);
148
+ const usdcMint = getUsdcMint(network);
149
+ console.log(chalk.gray(`\n Fee payer: `) + chalk.cyan(feePayer.address));
150
+ console.log(chalk.gray(` USDC mint: `) + chalk.gray(usdcMint));
151
+ console.log(chalk.gray(` Slug: `) + chalk.white(slug));
152
+ console.log();
153
+ console.log(chalk.gray(" Sending initialize_split transaction..."));
154
+ try {
155
+ const splitResult = await initializeSplit({
156
+ feePayerKeypair: feePayer.keypair,
157
+ merchantWallet: wallet,
158
+ usdcMintAddress: usdcMint,
159
+ slug,
160
+ referrerBps: config.split.referrerBps,
161
+ network,
162
+ });
163
+ console.log(chalk.green(" ✓ Split initialised on-chain"));
164
+ console.log(chalk.gray(" Split config PDA: ") +
165
+ chalk.cyan(splitResult.splitConfigPda));
166
+ console.log(chalk.gray(" Vault PDA: ") +
167
+ chalk.cyan(splitResult.vaultPda));
168
+ console.log(chalk.gray(" Tx: ") +
169
+ chalk.gray(splitResult.txSignature));
170
+ splitFields = {
171
+ vaultPda: splitResult.vaultPda,
172
+ splitConfigPda: splitResult.splitConfigPda,
173
+ merchantTokenAccount: splitResult.merchantTokenAccount,
174
+ protocolTokenAccount: splitResult.protocolTokenAccount,
175
+ referrerBps: config.split.referrerBps,
176
+ protocolBps: config.split.protocolBps,
177
+ };
178
+ }
179
+ catch (err) {
180
+ console.error(chalk.red(`\n Error initialising split: ${err.message}`));
181
+ process.exit(1);
182
+ }
183
+ }
184
+ console.log();
185
+ // Sign the deploy payload with the deployer wallet's secret key. The server
186
+ // verifies this signature to prove the caller controls the deployer wallet,
187
+ // and ties slug ownership to it.
188
+ let deployerSecret;
189
+ try {
190
+ deployerSecret = await loadDeployerSecretKey(opts.walletKey);
191
+ }
192
+ catch (err) {
193
+ console.error(chalk.red(` Error: ${err.message}`));
194
+ process.exit(1);
195
+ }
196
+ // Derive deployer pubkey from the loaded secret key.
197
+ const deployerFromKey = Keypair.fromSecretKey(deployerSecret).publicKey.toBase58();
198
+ // If --deployer was supplied, it must match the loaded key.
199
+ const deployer = opts.deployer || deployerFromKey;
200
+ if (deployer !== deployerFromKey) {
201
+ console.error(chalk.red(` Error: --deployer (${deployer}) doesn't match the loaded keypair (${deployerFromKey}).`));
202
+ console.error(chalk.gray(" The signer must be the deployer. Either omit --deployer or load the matching keypair."));
203
+ process.exit(1);
204
+ }
205
+ if (deployer !== wallet) {
206
+ console.log(chalk.gray(" Deployer: ") + chalk.cyan(deployer) + chalk.gray(" (signer + slug owner)"));
207
+ console.log(chalk.gray(" Payout: ") + chalk.cyan(wallet) + chalk.gray(" (receives USDC)"));
208
+ }
209
+ const slug = deriveSlug(opts.slug, upstream);
210
+ const priceMicros = Math.round(parseFloat(price) * 1_000_000);
211
+ // Carry per-route price overrides (chest.config.yaml `routes:`) into the
212
+ // signed deploy as v2. Empty list → v1 message format unchanged.
213
+ const routePrices = config.routes && config.routes.length > 0
214
+ ? config.routes.map((r) => ({
215
+ path: r.path,
216
+ priceMicros: Math.round(r.price * 1_000_000),
217
+ }))
218
+ : undefined;
219
+ const deploySig = signDeployMessage({ deployer, payoutWallet: wallet, slug, upstream, priceMicros, network, routePrices }, deployerSecret);
220
+ try {
221
+ const response = await fetch(`${server}/api/gates`, {
222
+ method: "POST",
223
+ headers: {
224
+ "Content-Type": "application/json",
225
+ "X-Deploy-Sig": deploySig,
226
+ },
227
+ body: JSON.stringify({
228
+ upstream,
229
+ wallet,
230
+ deployer,
231
+ slug,
232
+ price,
233
+ freebie: config.freebie,
234
+ network,
235
+ sessionDuration: config.session,
236
+ routePrices,
237
+ ...splitFields,
238
+ }),
239
+ });
240
+ if (response.status === 401) {
241
+ const errBody = await response.json();
242
+ console.error(chalk.red(` Error: ${errBody.error || "Unauthorized"}`));
243
+ if (errBody.hint)
244
+ console.error(chalk.gray(` ${errBody.hint}`));
245
+ process.exit(1);
246
+ }
247
+ if (response.status === 403) {
248
+ const errBody = await response.json();
249
+ console.error(chalk.red(` Error: ${errBody.error || "Forbidden"}`));
250
+ if (errBody.ownedBy)
251
+ console.error(chalk.gray(` Slug "${errBody.slug}" is owned by ${errBody.ownedBy}`));
252
+ process.exit(1);
253
+ }
254
+ if (!response.ok) {
255
+ const errBody = await response.json();
256
+ console.error(chalk.red(` Error: ${errBody.error || response.statusText}`));
257
+ process.exit(1);
258
+ }
259
+ const result = await response.json();
260
+ console.log(chalk.green(" ✓ Deployed!\n"));
261
+ console.log(chalk.gray(" ─────────────────────────────────────────"));
262
+ console.log(chalk.gray(" Live URL: ") + chalk.bold.cyan(result.url));
263
+ console.log(chalk.gray(" Slug: ") + chalk.white(result.slug));
264
+ console.log(chalk.gray(" Upstream: ") + chalk.white(result.upstream));
265
+ console.log(chalk.gray(" Price: ") + chalk.white(`$${result.price}`));
266
+ console.log(chalk.gray(" ─────────────────────────────────────────\n"));
267
+ console.log(chalk.gray(" Agents can now pay and access your API at:"));
268
+ console.log(chalk.white(` ${result.url}\n`));
269
+ if (config.split) {
270
+ console.log(chalk.gray(" Agents earn commission by sending X-Referrer-Wallet header."));
271
+ console.log(chalk.gray(" Commission rates visible at:"));
272
+ console.log(chalk.white(` ${result.url}.well-known/chest.json\n`));
273
+ }
274
+ console.log(chalk.gray(" View stats:"));
275
+ console.log(chalk.gray(` ${server}/api/gates/${result.slug}/stats\n`));
276
+ }
277
+ catch (err) {
278
+ console.error(chalk.red(` Error: Could not connect to ${server}`));
279
+ console.error(chalk.gray(` ${err.message}\n`));
280
+ console.log(chalk.gray(" Is the Chest cloud server running? For local testing:"));
281
+ console.log(chalk.gray(" cd packages/server && npm run dev\n"));
282
+ process.exit(1);
283
+ }
284
+ });
285
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const gateCommand: Command;
3
+ //# sourceMappingURL=gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.d.ts","sourceRoot":"","sources":["../../src/commands/gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,WAAW,SAgIpB,CAAC"}
@@ -0,0 +1,114 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { createProxy } from "@chest-gate/proxy";
4
+ import { loadConfig } from "../config.js";
5
+ import { ensureKeypair } from "../keypair.js";
6
+ export const gateCommand = new Command("gate")
7
+ .description("Start the x402 payment proxy in front of your API")
8
+ .option("-p, --price <amount>", "Price per request in USD (e.g. 0.01)")
9
+ .option("-w, --payout-wallet <address>", "Payout wallet, Solana address that receives USDC from paying agents")
10
+ .option("--wrap <url>", "Upstream API URL to proxy (e.g. localhost:3000)")
11
+ .option("--port <port>", "Port to run the proxy on. Defaults to chest.config.yaml `port:` or 4020.")
12
+ .option("--freebie <count>", "Number of free requests per IP before requiring payment. Defaults to chest.config.yaml `freebie:` or 0.")
13
+ .option("--network <network>", "Solana network (devnet, mainnet, or full CAIP-2). Defaults to chest.config.yaml `network:` or devnet.")
14
+ .option("--session <duration>", "Session duration after payment (seconds, or e.g. 5m, 1h; 0 to disable). Defaults to chest.config.yaml `session:` or 5m.")
15
+ .option("--config <path>", "Path to chest.config.yaml")
16
+ .option("--dashboard", "Launch local dashboard alongside proxy")
17
+ .action(async (opts) => {
18
+ console.log(chalk.bold("\n ⚡ Chest Gate\n"));
19
+ // Load config from file or flags
20
+ const config = await loadConfig(opts);
21
+ if (!config.wallet) {
22
+ console.error(chalk.red(" Error: --payout-wallet is required (your Solana address to receive USDC)"));
23
+ process.exit(1);
24
+ }
25
+ if (!config.upstream) {
26
+ console.error(chalk.red(" Error: --wrap is required (upstream API URL, e.g. localhost:3000)"));
27
+ process.exit(1);
28
+ }
29
+ // Ensure fee-payer keypair exists
30
+ const feePayer = await ensureKeypair();
31
+ // Clear config display
32
+ console.log(chalk.white(" Config"));
33
+ console.log(chalk.gray(" ─────────────────────────────────────────"));
34
+ console.log(chalk.gray(" Upstream: ") + chalk.white(config.upstream));
35
+ console.log(chalk.gray(" Network: ") + chalk.white(config.network));
36
+ console.log(chalk.gray(" Price: ") + chalk.white(`$${config.defaultPrice} per request`));
37
+ console.log(chalk.gray(" Freebie: ") + chalk.white(`${config.freebie} requests per IP`));
38
+ const sessionLabel = config.session > 0 ? `${Math.round(config.session / 60)} min after payment` : "disabled";
39
+ console.log(chalk.gray(" Session: ") + chalk.white(sessionLabel));
40
+ if (config.routes.length > 0) {
41
+ console.log(chalk.gray(" Routes: ") + chalk.white(`${config.routes.length} custom routes`));
42
+ for (const route of config.routes) {
43
+ const priceLabel = route.price === 0 ? "free" : `$${route.price}`;
44
+ console.log(chalk.gray(" ") + chalk.gray(`${route.path} → ${priceLabel}`));
45
+ }
46
+ }
47
+ console.log();
48
+ // Wallet addresses, prominent and clear
49
+ console.log(chalk.white(" Wallets"));
50
+ console.log(chalk.gray(" ─────────────────────────────────────────"));
51
+ console.log(chalk.gray(" Payment wallet: ") + chalk.cyan(config.wallet));
52
+ console.log(chalk.gray(" ") + chalk.gray("(your wallet, payments go here)"));
53
+ console.log(chalk.gray(" Fee payer: ") + chalk.yellow(feePayer.address));
54
+ console.log(chalk.gray(" ") + chalk.gray("(pays tx fees ~$0.00025 each)"));
55
+ console.log(chalk.gray(" Keypair: ") + chalk.gray(feePayer.path));
56
+ console.log();
57
+ // Fund warning
58
+ if (config.network.includes("devnet")) {
59
+ console.log(chalk.yellow(" ⚠ Fund fee-payer with devnet SOL:"));
60
+ console.log(chalk.gray(` solana airdrop 2 ${feePayer.address} --url devnet`));
61
+ console.log(chalk.gray(` or visit https://faucet.solana.com`));
62
+ }
63
+ else {
64
+ console.log(chalk.yellow(" ⚠ Fund fee-payer with SOL for transaction fees:"));
65
+ console.log(chalk.gray(` Send ~0.01 SOL to ${feePayer.address}`));
66
+ }
67
+ console.log();
68
+ // Start the proxy
69
+ let proxy;
70
+ try {
71
+ proxy = await createProxy({
72
+ name: config.name,
73
+ upstream: config.upstream,
74
+ wallet: config.wallet,
75
+ network: config.network,
76
+ port: config.port,
77
+ freebie: config.freebie,
78
+ defaultPrice: config.defaultPrice,
79
+ routes: config.routes,
80
+ feePayerKeypair: feePayer.keypair,
81
+ sessionDuration: config.session,
82
+ split: config.split?.splitConfigPda ? {
83
+ referrerBps: config.split.referrerBps,
84
+ protocolBps: config.split.protocolBps,
85
+ splitConfigPda: config.split.splitConfigPda,
86
+ protocolWallet: config.split.protocolWallet,
87
+ merchantTokenAccount: config.split.merchantTokenAccount,
88
+ protocolTokenAccount: config.split.protocolTokenAccount,
89
+ allowUnsignedReferrers: config.split.allowUnsignedReferrers,
90
+ } : undefined,
91
+ });
92
+ }
93
+ catch (err) {
94
+ console.error(chalk.red(` Error: ${err.message}`));
95
+ process.exit(1);
96
+ }
97
+ console.log(chalk.gray(" ─────────────────────────────────────────"));
98
+ console.log(chalk.green(" ✓ Proxy running at ") +
99
+ chalk.bold.white(`http://localhost:${config.port}`));
100
+ console.log(chalk.gray(` → Forwarding paid requests to ${config.upstream}`));
101
+ console.log();
102
+ console.log(chalk.gray(" Endpoints:"));
103
+ console.log(chalk.gray(` Health: http://localhost:${config.port}/__chest/health`));
104
+ console.log(chalk.gray(` Stats: http://localhost:${config.port}/__chest/stats`));
105
+ console.log();
106
+ console.log(chalk.gray(" Press Ctrl+C to stop\n"));
107
+ // Graceful shutdown
108
+ process.on("SIGINT", () => {
109
+ console.log(chalk.gray("\n Shutting down...\n"));
110
+ proxy.close();
111
+ process.exit(0);
112
+ });
113
+ });
114
+ //# sourceMappingURL=gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate.js","sourceRoot":"","sources":["../../src/commands/gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,mDAAmD,CAAC;KAChE,MAAM,CAAC,sBAAsB,EAAE,sCAAsC,CAAC;KACtE,MAAM,CAAC,+BAA+B,EAAE,qEAAqE,CAAC;KAC9G,MAAM,CAAC,cAAc,EAAE,iDAAiD,CAAC;KACzE,MAAM,CAAC,eAAe,EAAE,0EAA0E,CAAC;KACnG,MAAM,CACL,mBAAmB,EACnB,yGAAyG,CAC1G;KACA,MAAM,CACL,qBAAqB,EACrB,uGAAuG,CACxG;KACA,MAAM,CACL,sBAAsB,EACtB,yHAAyH,CAC1H;KACA,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,CAAC;KACtD,MAAM,CAAC,aAAa,EAAE,wCAAwC,CAAC;KAC/D,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;IACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE9C,iCAAiC;IACjC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IAEtC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4EAA4E,CAAC,CAAC,CAAC;QACvG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC,CAAC;QAChG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,kCAAkC;IAClC,MAAM,QAAQ,GAAG,MAAM,aAAa,EAAE,CAAC;IAEvC,uBAAuB;IACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,YAAY,cAAc,CAAC,CAAC,CAAC;IACnG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC;IACjG,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,GAAG,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,UAAU,CAAC;IAC9G,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC;IAC1E,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,gBAAgB,CAAC,CAAC,CAAC;QACrG,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YAClE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,MAAM,UAAU,EAAE,CAAC,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,wCAAwC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC,CAAC;IAC9F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAC5F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1E,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,eAAe;IACf,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,qCAAqC,CAAC,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,QAAQ,CAAC,OAAO,eAAe,CAAC,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mDAAmD,CAAC,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yBAAyB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAEd,kBAAkB;IAClB,IAAI,KAAK,CAAC;IACV,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,WAAW,CAAC;YACxB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,eAAe,EAAE,QAAQ,CAAC,OAAO;YACjC,eAAe,EAAE,MAAM,CAAC,OAAO;YAC/B,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC;gBACpC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;gBACrC,WAAW,EAAE,MAAM,CAAC,KAAK,CAAC,WAAW;gBACrC,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,cAAc;gBAC3C,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,cAAe;gBAC5C,oBAAoB,EAAE,MAAM,CAAC,KAAK,CAAC,oBAAqB;gBACxD,oBAAoB,EAAE,MAAM,CAAC,KAAK,CAAC,oBAAqB;gBACxD,sBAAsB,EAAE,MAAM,CAAC,KAAK,CAAC,sBAAsB;aAC5D,CAAC,CAAC,CAAC,SAAS;SACd,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAa,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,oBAAoB,MAAM,CAAC,IAAI,EAAE,CAAC,CACpD,CAAC;IACF,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,qCAAqC,MAAM,CAAC,QAAQ,EAAE,CAAC,CACnE,CAAC;IACF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC;IACvF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iCAAiC,MAAM,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC;IACtF,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,CAAC;IAEpD,oBAAoB;IACpB,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAClD,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const initCommand: Command;
3
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA0BpC,eAAO,MAAM,WAAW,SA4JpB,CAAC"}
@@ -0,0 +1,153 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { writeFile } from "node:fs/promises";
4
+ import { existsSync } from "node:fs";
5
+ import { createInterface } from "node:readline/promises";
6
+ import { stdin, stdout } from "node:process";
7
+ import { stringify as stringifyYaml } from "yaml";
8
+ import { ensureKeypair } from "../keypair.js";
9
+ /**
10
+ * Parse a session duration string into seconds.
11
+ * Accepts plain numbers ("300") or suffixed forms ("5m", "1h", "30s").
12
+ * Falls back to 300 (5 minutes) on bad input.
13
+ */
14
+ function parseDuration(input) {
15
+ const s = input.trim().toLowerCase();
16
+ const match = s.match(/^(\d+(?:\.\d+)?)\s*(s|sec|secs|m|min|mins|h|hr|hrs)?$/);
17
+ if (!match)
18
+ return 300;
19
+ const n = parseFloat(match[1]);
20
+ if (!Number.isFinite(n) || n < 0)
21
+ return 300;
22
+ const unit = match[2] ?? "s";
23
+ if (unit.startsWith("h"))
24
+ return Math.round(n * 3600);
25
+ if (unit.startsWith("m") && unit !== "ms")
26
+ return Math.round(n * 60);
27
+ return Math.round(n);
28
+ }
29
+ export const initCommand = new Command("init")
30
+ .description("Create a chest.config.yaml interactively")
31
+ .option("-o, --output <path>", "Output file path", "chest.config.yaml")
32
+ .option("-y, --yes", "Accept defaults without prompting")
33
+ .action(async (opts) => {
34
+ console.log(chalk.bold("\n ⚡ Chest Init\n"));
35
+ const outputPath = opts.output;
36
+ if (existsSync(outputPath) && !opts.yes) {
37
+ const rl = createInterface({ input: stdin, output: stdout });
38
+ const answer = await rl.question(chalk.yellow(` ${outputPath} already exists. Overwrite? (y/N) `));
39
+ rl.close();
40
+ if (answer.toLowerCase() !== "y") {
41
+ console.log(chalk.gray("\n Cancelled.\n"));
42
+ return;
43
+ }
44
+ }
45
+ const rl = createInterface({ input: stdin, output: stdout });
46
+ const ask = async (question, defaultVal) => {
47
+ const answer = await rl.question(chalk.gray(` ${question}`) + chalk.gray(` (${defaultVal}) `));
48
+ return answer.trim() || defaultVal;
49
+ };
50
+ console.log(chalk.gray(" Answer a few questions to generate your config.\n"));
51
+ // Questions
52
+ const name = await ask("Project name?", "My API");
53
+ const upstream = await ask("Upstream API URL?", "http://localhost:3000");
54
+ const wallet = await ask("Payout wallet (Solana address that receives USDC)?", "");
55
+ const network = await ask("Network?", "devnet");
56
+ const price = await ask("Default price per request (USD)?", "0.01");
57
+ const freebie = await ask("Free requests per IP before charging?", "10");
58
+ const sessionRaw = await ask("Session duration after payment? (seconds, or e.g. 5m, 1h)", "5m");
59
+ const session = parseDuration(sessionRaw);
60
+ const port = await ask("Proxy port?", "4020");
61
+ // Routes
62
+ console.log();
63
+ console.log(chalk.gray(" Add custom route pricing? (Enter blank path to finish)"));
64
+ const routes = [];
65
+ let addingRoutes = true;
66
+ while (addingRoutes) {
67
+ const routePath = await ask("Route path (e.g. POST /api/generate)?", "");
68
+ if (!routePath) {
69
+ addingRoutes = false;
70
+ break;
71
+ }
72
+ const routePrice = await ask(`Price for ${routePath}?`, price);
73
+ routes.push({ path: routePath, price: `$${routePrice.replace(/^\$/, "")}` });
74
+ }
75
+ // Splits
76
+ console.log();
77
+ console.log(chalk.gray(" Revenue splits let agents/MCPs that route traffic to your API earn a commission."));
78
+ console.log(chalk.gray(" Splits are enforced on-chain (extra setup tx on first deploy). Skip if unsure."));
79
+ const splitAnswer = await ask("Enable revenue splits? (y/N)", "n");
80
+ let referrerPercent;
81
+ if (splitAnswer.trim().toLowerCase().startsWith("y")) {
82
+ const referrerRaw = await ask("Referrer commission %?", "10");
83
+ const parsed = parseFloat(referrerRaw);
84
+ referrerPercent = Number.isFinite(parsed) && parsed >= 0 ? parsed : 10;
85
+ }
86
+ rl.close();
87
+ // Build config
88
+ const config = {
89
+ name,
90
+ upstream,
91
+ payoutWallet: wallet || "YOUR_SOLANA_WALLET_ADDRESS",
92
+ network,
93
+ port: parseInt(port, 10),
94
+ freebie: parseInt(freebie, 10),
95
+ price: `$${price.replace(/^\$/, "")}`,
96
+ session,
97
+ };
98
+ if (routes.length > 0) {
99
+ config.routes = routes;
100
+ }
101
+ // Only the merchant-controlled fields go in the YAML at init time. The
102
+ // protocol % is hardcoded in the program; on-chain PDAs are populated
103
+ // automatically by `chest deploy` after the splitter init transaction.
104
+ if (referrerPercent !== undefined) {
105
+ config.split = { referrer: referrerPercent };
106
+ }
107
+ // Write
108
+ const splitNote = referrerPercent !== undefined
109
+ ? "# Revenue split, only active after `chest deploy` (on-chain).\n"
110
+ : "";
111
+ const rawYaml = stringifyYaml(config, { lineWidth: 0 });
112
+ const yamlBody = splitNote
113
+ ? rawYaml.replace(/^split:/m, `${splitNote}split:`)
114
+ : rawYaml;
115
+ const yamlContent = `# Chest Gate Configuration, generated ${new Date().toISOString().split("T")[0]}\n` +
116
+ "#\n" +
117
+ "# payoutWallet receives USDC. Deployer is your local key at\n" +
118
+ "# ~/.chest/wallet.json (see: chest keypair). They can differ.\n\n" +
119
+ yamlBody;
120
+ await writeFile(outputPath, yamlContent);
121
+ console.log();
122
+ console.log(chalk.green(` ✓ Created ${outputPath}`));
123
+ console.log();
124
+ console.log(chalk.gray(" Prefer a browser? Deploy without the CLI at:"));
125
+ console.log(chalk.cyan(" https://chest.sh/dashboard/gates/new"));
126
+ console.log(chalk.gray(" Sign in with email or connect Phantom, no local wallet needed."));
127
+ console.log();
128
+ // Ensure keypair exists
129
+ const feePayer = await ensureKeypair();
130
+ if (feePayer.created) {
131
+ console.log(chalk.bgYellow.black(" ⚠ NEW WALLET CREATED, BACK IT UP "));
132
+ console.log();
133
+ console.log(chalk.yellow(" A new Solana wallet was generated for you and saved to:"));
134
+ console.log(chalk.white(` ${feePayer.path}`));
135
+ console.log();
136
+ console.log(chalk.yellow(" Address: ") + chalk.cyan(feePayer.address));
137
+ console.log();
138
+ console.log(chalk.yellow(" This wallet owns your slug on Chest. If you lose this file,"));
139
+ console.log(chalk.yellow(" you lose access to deploys under this slug, and any SOL it holds."));
140
+ console.log();
141
+ console.log(chalk.yellow(" Reveal the seed phrase (copy it somewhere safe):"));
142
+ console.log(chalk.white(" chest-gate keypair --show-mnemonic"));
143
+ console.log();
144
+ }
145
+ console.log(chalk.gray(" Next steps:"));
146
+ console.log(chalk.gray(` 1. Edit ${outputPath} if needed`));
147
+ if (wallet === "" || wallet === "YOUR_SOLANA_WALLET_ADDRESS") {
148
+ console.log(chalk.yellow(` 2. Set payoutWallet in ${outputPath}`));
149
+ }
150
+ console.log(chalk.gray(` ${wallet ? "2" : "3"}. Run: `) + chalk.white("chest-gate gate"));
151
+ console.log();
152
+ });
153
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const keypairCommand: Command;
3
+ //# sourceMappingURL=keypair.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keypair.d.ts","sourceRoot":"","sources":["../../src/commands/keypair.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,eAAO,MAAM,cAAc,SA6CvB,CAAC"}