arc402-cli 0.6.0 → 0.7.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.
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmD7D"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA6D7D"}
@@ -22,7 +22,7 @@ function registerConfigCommands(program) {
22
22
  const defaults = config_1.NETWORK_DEFAULTS[answers.network] ?? {};
23
23
  const cfg = {
24
24
  network: answers.network,
25
- walletConnectProjectId: "455e9425343b9156fce1428250c9a54a",
25
+ walletConnectProjectId: (0, config_1.getWcProjectId)(),
26
26
  rpcUrl: defaults.rpcUrl ?? "https://mainnet.base.org",
27
27
  trustRegistryAddress: defaults.trustRegistryAddress ?? "",
28
28
  agentRegistryAddress: defaults.agentRegistryV2Address ?? defaults.agentRegistryAddress,
@@ -54,6 +54,16 @@ function registerConfigCommands(program) {
54
54
  console.log(JSON.stringify({ ...cfg, privateKey: cfg.privateKey ? "***" : undefined, subdomainApi: (0, config_1.getSubdomainApi)(cfg) }, null, 2));
55
55
  });
56
56
  config.command("set <key> <value>").description("Set a config value: arc402 config set <key> <value>").action((key, value) => {
57
+ const BLOCKED_KEYS = ["privateKey", "guardianPrivateKey", "cdpPrivateKey", "machineKey"];
58
+ const ALLOWED_KEYS = ["network", "rpcUrl", "walletContractAddress", "ownerAddress", "walletConnectProjectId", "subdomainApi", "telegramBotToken", "telegramChatId", "telegramThreadId"];
59
+ if (BLOCKED_KEYS.includes(key)) {
60
+ console.error(chalk_1.default.red("Cannot set sensitive keys via config set. Edit ~/.arc402/config.json directly."));
61
+ process.exit(1);
62
+ }
63
+ if (!ALLOWED_KEYS.includes(key)) {
64
+ console.error(chalk_1.default.red(`Unknown config key: ${key}. Allowed keys: ${ALLOWED_KEYS.join(", ")}`));
65
+ process.exit(1);
66
+ }
57
67
  const cfg = (0, config_1.loadConfig)();
58
68
  cfg[key] = value;
59
69
  (0, config_1.saveConfig)(cfg);
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare function registerDoctorCommand(program: Command): void;
3
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoCpC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuI5D"}
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.registerDoctorCommand = registerDoctorCommand;
40
+ const chalk_1 = __importDefault(require("chalk"));
41
+ const fs = __importStar(require("fs"));
42
+ const path = __importStar(require("path"));
43
+ const os = __importStar(require("os"));
44
+ const child_process_1 = require("child_process");
45
+ const config_1 = require("../config");
46
+ const colors_1 = require("../ui/colors");
47
+ const ARC402_DIR = path.join(os.homedir(), ".arc402");
48
+ const CONFIG_PATH = path.join(ARC402_DIR, "config.json");
49
+ const DAEMON_PID_PATH = path.join(ARC402_DIR, "daemon.pid");
50
+ function ok(label, detail) {
51
+ process.stdout.write(" " + chalk_1.default.green("✓") + " " + chalk_1.default.white(label) + (detail ? chalk_1.default.dim(" " + detail) : "") + "\n");
52
+ }
53
+ function fail(label, detail) {
54
+ process.stdout.write(" " + chalk_1.default.red("✗") + " " + chalk_1.default.white(label) + (detail ? chalk_1.default.dim(" " + detail) : "") + "\n");
55
+ }
56
+ function warn(label, detail) {
57
+ process.stdout.write(" " + chalk_1.default.yellow("⚠") + " " + chalk_1.default.white(label) + (detail ? chalk_1.default.dim(" " + detail) : "") + "\n");
58
+ }
59
+ async function fetchJson(url, timeoutMs = 4000) {
60
+ const res = await fetch(url, { signal: AbortSignal.timeout(timeoutMs) });
61
+ return res.json();
62
+ }
63
+ function registerDoctorCommand(program) {
64
+ program
65
+ .command("doctor")
66
+ .description("Check ARC-402 environment health")
67
+ .action(async () => {
68
+ process.stdout.write("\n" + colors_1.c.cyan("◈ ") + chalk_1.default.white("arc402 doctor") + "\n\n");
69
+ // ── 1. Config exists ───────────────────────────────────────────────────
70
+ if ((0, config_1.configExists)()) {
71
+ ok("Config found", CONFIG_PATH);
72
+ }
73
+ else {
74
+ fail("Config not found", "Run: arc402 config init");
75
+ process.stdout.write("\n");
76
+ return;
77
+ }
78
+ const config = (0, config_1.loadConfig)();
79
+ // ── 2. RPC reachable ───────────────────────────────────────────────────
80
+ try {
81
+ const body = JSON.stringify({ jsonrpc: "2.0", method: "eth_blockNumber", params: [], id: 1 });
82
+ const res = await fetch(config.rpcUrl, {
83
+ method: "POST",
84
+ headers: { "Content-Type": "application/json" },
85
+ body,
86
+ signal: AbortSignal.timeout(5000),
87
+ });
88
+ const json = await res.json();
89
+ if (json.result) {
90
+ const block = parseInt(json.result, 16);
91
+ ok("RPC reachable", `block #${block.toLocaleString()}`);
92
+ }
93
+ else {
94
+ fail("RPC returned no block", config.rpcUrl);
95
+ }
96
+ }
97
+ catch (err) {
98
+ fail("RPC unreachable", config.rpcUrl + " — " + (err instanceof Error ? err.message : String(err)));
99
+ }
100
+ // ── 3. Wallet deployed ─────────────────────────────────────────────────
101
+ if (config.walletContractAddress) {
102
+ try {
103
+ const body = JSON.stringify({
104
+ jsonrpc: "2.0",
105
+ method: "eth_getCode",
106
+ params: [config.walletContractAddress, "latest"],
107
+ id: 1,
108
+ });
109
+ const res = await fetch(config.rpcUrl, {
110
+ method: "POST",
111
+ headers: { "Content-Type": "application/json" },
112
+ body,
113
+ signal: AbortSignal.timeout(5000),
114
+ });
115
+ const json = await res.json();
116
+ if (json.result && json.result !== "0x" && json.result.length > 2) {
117
+ ok("Wallet deployed", config.walletContractAddress);
118
+ }
119
+ else {
120
+ fail("Wallet not deployed", config.walletContractAddress + " — no code at address");
121
+ }
122
+ }
123
+ catch (err) {
124
+ warn("Wallet check failed", err instanceof Error ? err.message : String(err));
125
+ }
126
+ }
127
+ else {
128
+ warn("Wallet not configured", "Run: arc402 wallet deploy");
129
+ }
130
+ // ── 4. Machine key authorized ──────────────────────────────────────────
131
+ if (config.privateKey && config.walletContractAddress) {
132
+ try {
133
+ const { ethers } = await Promise.resolve().then(() => __importStar(require("ethers")));
134
+ const machineKey = new ethers.Wallet(config.privateKey);
135
+ const provider = new ethers.JsonRpcProvider(config.rpcUrl);
136
+ const iface = new ethers.Interface(["function authorizedMachineKeys(address) external view returns (bool)"]);
137
+ const data = iface.encodeFunctionData("authorizedMachineKeys", [machineKey.address]);
138
+ const result = await Promise.race([
139
+ provider.call({ to: config.walletContractAddress, data }),
140
+ new Promise((_, r) => setTimeout(() => r(new Error("timeout")), 4000)),
141
+ ]);
142
+ const authorized = iface.decodeFunctionResult("authorizedMachineKeys", result)[0];
143
+ if (authorized) {
144
+ ok("Machine key authorized", machineKey.address);
145
+ }
146
+ else {
147
+ fail("Machine key not authorized", machineKey.address + " — run: arc402 wallet onboard");
148
+ }
149
+ }
150
+ catch (err) {
151
+ warn("Machine key check failed", err instanceof Error ? err.message : String(err));
152
+ }
153
+ }
154
+ else if (!config.privateKey) {
155
+ warn("Machine key not configured", "No privateKey in config");
156
+ }
157
+ // ── 5. Daemon running ──────────────────────────────────────────────────
158
+ let daemonRunning = false;
159
+ if (fs.existsSync(DAEMON_PID_PATH)) {
160
+ try {
161
+ const pid = parseInt(fs.readFileSync(DAEMON_PID_PATH, "utf-8").trim(), 10);
162
+ // Check if process is alive
163
+ process.kill(pid, 0);
164
+ daemonRunning = true;
165
+ ok("Daemon running", `PID ${pid}`);
166
+ }
167
+ catch {
168
+ fail("Daemon PID file stale", "Run: arc402 daemon start");
169
+ }
170
+ }
171
+ else {
172
+ fail("Daemon not running", "Run: arc402 daemon start");
173
+ }
174
+ // ── 6. Docker available ────────────────────────────────────────────────
175
+ try {
176
+ const docker = (0, child_process_1.spawnSync)("docker", ["--version"], { encoding: "utf-8", timeout: 3000 });
177
+ if (docker.status === 0) {
178
+ ok("Docker available", docker.stdout.trim().split("\n")[0]);
179
+ }
180
+ else {
181
+ warn("Docker not found", "Install from https://docs.docker.com/get-docker/");
182
+ }
183
+ }
184
+ catch {
185
+ warn("Docker not found", "Install from https://docs.docker.com/get-docker/");
186
+ }
187
+ // ── 7. HTTP relay reachable (if daemon is running) ─────────────────────
188
+ if (daemonRunning) {
189
+ try {
190
+ const health = await fetchJson("http://localhost:4402/health");
191
+ if (health.status === "online") {
192
+ ok("HTTP relay reachable", "http://localhost:4402");
193
+ }
194
+ else {
195
+ warn("HTTP relay responded", JSON.stringify(health));
196
+ }
197
+ }
198
+ catch {
199
+ fail("HTTP relay not reachable", "http://localhost:4402 — daemon may still be starting");
200
+ }
201
+ }
202
+ process.stdout.write("\n");
203
+ });
204
+ }
205
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,sDAuIC;AA1KD,kDAA0B;AAC1B,uCAAyB;AACzB,2CAA6B;AAC7B,uCAAyB;AACzB,iDAA0C;AAC1C,sCAAqD;AACrD,yCAAiC;AAEjC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;AACtD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACzD,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AAE5D,SAAS,EAAE,CAAC,KAAa,EAAE,MAAe;IACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,GAAG,eAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CACrG,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,MAAe;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,GAAG,eAAK,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CACnG,CAAC;AACJ,CAAC;AAED,SAAS,IAAI,CAAC,KAAa,EAAE,MAAe;IAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,IAAI,GAAG,eAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,eAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,eAAK,CAAC,GAAG,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CACtG,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,SAAS,GAAG,IAAI;IACpD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACzE,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,SAAgB,qBAAqB,CAAC,OAAgB;IACpD,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,kCAAkC,CAAC;SAC/C,MAAM,CAAC,KAAK,IAAI,EAAE;QACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,UAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,eAAK,CAAC,KAAK,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC,CAAC;QAElF,0EAA0E;QAC1E,IAAI,IAAA,qBAAY,GAAE,EAAE,CAAC;YACnB,EAAE,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;QAClC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,kBAAkB,EAAE,yBAAyB,CAAC,CAAC;YACpD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,IAAA,mBAAU,GAAE,CAAC;QAE5B,0EAA0E;QAC1E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;YAC9F,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;gBACrC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI;gBACJ,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;aAClC,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAyB,CAAC;YACrD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;gBACxC,EAAE,CAAC,eAAe,EAAE,UAAU,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,uBAAuB,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtG,CAAC;QAED,0EAA0E;QAC1E,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;oBAC1B,OAAO,EAAE,KAAK;oBACd,MAAM,EAAE,aAAa;oBACrB,MAAM,EAAE,CAAC,MAAM,CAAC,qBAAqB,EAAE,QAAQ,CAAC;oBAChD,EAAE,EAAE,CAAC;iBACN,CAAC,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE;oBACrC,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;oBAC/C,IAAI;oBACJ,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;iBAClC,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAyB,CAAC;gBACrD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAClE,EAAE,CAAC,iBAAiB,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC;gBACtD,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,qBAAqB,EAAE,MAAM,CAAC,qBAAqB,GAAG,uBAAuB,CAAC,CAAC;gBACtF,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,qBAAqB,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,uBAAuB,EAAE,2BAA2B,CAAC,CAAC;QAC7D,CAAC;QAED,0EAA0E;QAC1E,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,qBAAqB,EAAE,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,EAAE,MAAM,EAAE,GAAG,wDAAa,QAAQ,GAAC,CAAC;gBAC1C,MAAM,UAAU,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;gBACxD,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAC3D,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,sEAAsE,CAAC,CAAC,CAAC;gBAC7G,MAAM,IAAI,GAAG,KAAK,CAAC,kBAAkB,CAAC,uBAAuB,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;gBACrF,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;oBAChC,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,qBAAqB,EAAE,IAAI,EAAE,CAAC;oBACzD,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;iBAC9E,CAAC,CAAC;gBACH,MAAM,UAAU,GAAG,KAAK,CAAC,oBAAoB,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC,CAAC,CAAY,CAAC;gBAC7F,IAAI,UAAU,EAAE,CAAC;oBACf,EAAE,CAAC,wBAAwB,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;gBACnD,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,4BAA4B,EAAE,UAAU,CAAC,OAAO,GAAG,+BAA+B,CAAC,CAAC;gBAC3F,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,0BAA0B,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;aAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YAC9B,IAAI,CAAC,4BAA4B,EAAE,yBAAyB,CAAC,CAAC;QAChE,CAAC;QAED,0EAA0E;QAC1E,IAAI,aAAa,GAAG,KAAK,CAAC;QAC1B,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC3E,4BAA4B;gBAC5B,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACrB,aAAa,GAAG,IAAI,CAAC;gBACrB,EAAE,CAAC,gBAAgB,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC;YACrC,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,uBAAuB,EAAE,0BAA0B,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,oBAAoB,EAAE,0BAA0B,CAAC,CAAC;QACzD,CAAC;QAED,0EAA0E;QAC1E,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAA,yBAAS,EAAC,QAAQ,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;YACxF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACxB,EAAE,CAAC,kBAAkB,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,kBAAkB,EAAE,kDAAkD,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,kBAAkB,EAAE,kDAAkD,CAAC,CAAC;QAC/E,CAAC;QAED,0EAA0E;QAC1E,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,8BAA8B,CAAwB,CAAC;gBACtF,IAAI,MAAM,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC/B,EAAE,CAAC,sBAAsB,EAAE,uBAAuB,CAAC,CAAC;gBACtD,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,0BAA0B,EAAE,sDAAsD,CAAC,CAAC;YAC3F,CAAC;QACH,CAAC;QAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAsiBpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+vF7D"}
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyiBpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+yF7D"}
@@ -240,12 +240,15 @@ async function runCompleteOnboardingCeremony(walletAddress, ownerAddress, config
240
240
  const guardianInput = guardianAns.guardian?.trim() ?? "";
241
241
  if (guardianInput.toLowerCase() === "g") {
242
242
  const generatedGuardian = ethers_1.ethers.Wallet.createRandom();
243
- config.guardianPrivateKey = generatedGuardian.privateKey;
243
+ // Save guardian private key to a separate restricted file, NOT config.json
244
+ const guardianKeyPath = path_1.default.join(os_1.default.homedir(), ".arc402", "guardian.key");
245
+ fs_1.default.mkdirSync(path_1.default.dirname(guardianKeyPath), { recursive: true, mode: 0o700 });
246
+ fs_1.default.writeFileSync(guardianKeyPath, generatedGuardian.privateKey + "\n", { mode: 0o400 });
247
+ // Only save address (not private key) to config
244
248
  config.guardianAddress = generatedGuardian.address;
245
249
  (0, config_1.saveConfig)(config);
246
250
  guardianAddress = generatedGuardian.address;
247
- console.log("\n " + colors_1.c.warning + " IMPORTANT: Save this guardian private key (emergency freeze key):");
248
- console.log(" " + colors_1.c.dim(generatedGuardian.privateKey));
251
+ console.log("\n " + colors_1.c.warning + " Guardian key saved to ~/.arc402/guardian.key move offline for security");
249
252
  console.log(" " + colors_1.c.dim("Address: ") + colors_1.c.white(generatedGuardian.address) + "\n");
250
253
  const guardianIface = new ethers_1.ethers.Interface(["function setGuardian(address _guardian) external"]);
251
254
  await sendTx({ to: walletAddress, data: guardianIface.encodeFunctionData("setGuardian", [guardianAddress]), value: "0x0" }, "setGuardian");
@@ -637,16 +640,40 @@ function registerWalletCommands(program) {
637
640
  console.log(colors_1.c.dim("Next: fund your wallet with ETH, then run: arc402 wallet deploy"));
638
641
  });
639
642
  // ─── import ────────────────────────────────────────────────────────────────
640
- wallet.command("import <privateKey>")
641
- .description("Import an existing private key")
643
+ wallet.command("import")
644
+ .description("Import an existing private key (use --key-file or stdin prompt)")
642
645
  .option("--network <network>", "Network (base-mainnet or base-sepolia)", "base-sepolia")
643
- .action(async (privateKey, opts) => {
646
+ .option("--key-file <path>", "Read private key from file instead of prompting")
647
+ .action(async (opts) => {
644
648
  const network = opts.network;
645
649
  const defaults = config_1.NETWORK_DEFAULTS[network];
646
650
  if (!defaults) {
647
651
  console.error(`Unknown network: ${network}. Use base-mainnet or base-sepolia.`);
648
652
  process.exit(1);
649
653
  }
654
+ let privateKey;
655
+ if (opts.keyFile) {
656
+ try {
657
+ privateKey = fs_1.default.readFileSync(opts.keyFile, "utf-8").trim();
658
+ }
659
+ catch (e) {
660
+ console.error(`Cannot read key file: ${e instanceof Error ? e.message : String(e)}`);
661
+ process.exit(1);
662
+ }
663
+ }
664
+ else {
665
+ // Interactive prompt — hidden input avoids shell history
666
+ const answer = await (0, prompts_1.default)({
667
+ type: "password",
668
+ name: "key",
669
+ message: "Paste private key (hidden):",
670
+ });
671
+ privateKey = (answer.key ?? "").trim();
672
+ if (!privateKey) {
673
+ console.error("No private key entered.");
674
+ process.exit(1);
675
+ }
676
+ }
650
677
  let imported;
651
678
  try {
652
679
  imported = new ethers_1.ethers.Wallet(privateKey);
@@ -794,8 +821,31 @@ function registerWalletCommands(program) {
794
821
  .option("--smart-wallet", "Connect via Base Smart Wallet (Coinbase Wallet SDK) instead of WalletConnect")
795
822
  .option("--hardware", "Hardware wallet mode: show raw wc: URI only (for Ledger Live, Trezor Suite, etc.)")
796
823
  .option("--sponsored", "Use CDP paymaster for gas sponsorship (requires paymasterUrl + cdpKeyName + CDP_PRIVATE_KEY env)")
824
+ .option("--dry-run", "Simulate the deployment ceremony without sending transactions")
797
825
  .action(async (opts) => {
798
826
  const config = (0, config_1.loadConfig)();
827
+ if (opts.dryRun) {
828
+ const factoryAddr = config.walletFactoryAddress ?? config_1.NETWORK_DEFAULTS[config.network]?.walletFactoryAddress ?? "(not configured)";
829
+ const chainId = config.network === "base-mainnet" ? 8453 : 84532;
830
+ console.log();
831
+ console.log(" " + colors_1.c.dim("── Dry run: wallet deploy ──────────────────────────────────────"));
832
+ console.log(" " + colors_1.c.dim("Network: ") + colors_1.c.white(config.network));
833
+ console.log(" " + colors_1.c.dim("Chain ID: ") + colors_1.c.white(String(chainId)));
834
+ console.log(" " + colors_1.c.dim("RPC: ") + colors_1.c.white(config.rpcUrl));
835
+ console.log(" " + colors_1.c.dim("WalletFactory: ") + colors_1.c.white(factoryAddr));
836
+ console.log(" " + colors_1.c.dim("Signing method: ") + colors_1.c.white(opts.smartWallet ? "Base Smart Wallet" : opts.hardware ? "Hardware (WC URI)" : "WalletConnect"));
837
+ console.log(" " + colors_1.c.dim("Sponsored: ") + colors_1.c.white(opts.sponsored ? "yes" : "no"));
838
+ console.log();
839
+ console.log(" " + colors_1.c.dim("Steps that would run:"));
840
+ console.log(" 1. Connect " + (opts.smartWallet ? "Coinbase Smart Wallet" : "WalletConnect") + " session");
841
+ console.log(" 2. Call WalletFactory.createWallet() → deploy ARC402Wallet");
842
+ console.log(" 3. Save walletContractAddress to config");
843
+ console.log(" 4. Run onboarding ceremony (PolicyEngine, machine key, agent registration)");
844
+ console.log();
845
+ console.log(" " + colors_1.c.dim("No transactions sent (--dry-run mode)."));
846
+ console.log();
847
+ return;
848
+ }
799
849
  const factoryAddress = config.walletFactoryAddress ?? config_1.NETWORK_DEFAULTS[config.network]?.walletFactoryAddress;
800
850
  if (!factoryAddress) {
801
851
  console.error("walletFactoryAddress not found in config or NETWORK_DEFAULTS. Add walletFactoryAddress to your config.");