arc402-cli 1.0.0-rc.1 → 1.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 (257) hide show
  1. package/README.md +43 -2
  2. package/dist/abis.d.ts +1 -0
  3. package/dist/abis.d.ts.map +1 -1
  4. package/dist/abis.js +29 -1
  5. package/dist/abis.js.map +1 -1
  6. package/dist/commands/backup.d.ts +3 -0
  7. package/dist/commands/backup.d.ts.map +1 -0
  8. package/dist/commands/backup.js +106 -0
  9. package/dist/commands/backup.js.map +1 -0
  10. package/dist/commands/compute.d.ts +14 -0
  11. package/dist/commands/compute.d.ts.map +1 -0
  12. package/dist/commands/compute.js +466 -0
  13. package/dist/commands/compute.js.map +1 -0
  14. package/dist/commands/config.d.ts.map +1 -1
  15. package/dist/commands/config.js +11 -1
  16. package/dist/commands/config.js.map +1 -1
  17. package/dist/commands/daemon.d.ts.map +1 -1
  18. package/dist/commands/daemon.js +67 -0
  19. package/dist/commands/daemon.js.map +1 -1
  20. package/dist/commands/discover.d.ts.map +1 -1
  21. package/dist/commands/discover.js +60 -15
  22. package/dist/commands/discover.js.map +1 -1
  23. package/dist/commands/doctor.d.ts +3 -0
  24. package/dist/commands/doctor.d.ts.map +1 -0
  25. package/dist/commands/doctor.js +205 -0
  26. package/dist/commands/doctor.js.map +1 -0
  27. package/dist/commands/tunnel.d.ts +3 -0
  28. package/dist/commands/tunnel.d.ts.map +1 -0
  29. package/dist/commands/tunnel.js +281 -0
  30. package/dist/commands/tunnel.js.map +1 -0
  31. package/dist/commands/wallet.d.ts.map +1 -1
  32. package/dist/commands/wallet.js +299 -65
  33. package/dist/commands/wallet.js.map +1 -1
  34. package/dist/commands/watch.d.ts.map +1 -1
  35. package/dist/commands/watch.js +146 -9
  36. package/dist/commands/watch.js.map +1 -1
  37. package/dist/commands/workroom.d.ts.map +1 -1
  38. package/dist/commands/workroom.js +112 -6
  39. package/dist/commands/workroom.js.map +1 -1
  40. package/dist/config.d.ts +13 -0
  41. package/dist/config.d.ts.map +1 -1
  42. package/dist/config.js +41 -4
  43. package/dist/config.js.map +1 -1
  44. package/dist/daemon/compute-metering.d.ts +61 -0
  45. package/dist/daemon/compute-metering.d.ts.map +1 -0
  46. package/dist/daemon/compute-metering.js +299 -0
  47. package/dist/daemon/compute-metering.js.map +1 -0
  48. package/dist/daemon/compute-session.d.ts +100 -0
  49. package/dist/daemon/compute-session.d.ts.map +1 -0
  50. package/dist/daemon/compute-session.js +231 -0
  51. package/dist/daemon/compute-session.js.map +1 -0
  52. package/dist/daemon/config.d.ts +33 -1
  53. package/dist/daemon/config.d.ts.map +1 -1
  54. package/dist/daemon/config.js +69 -0
  55. package/dist/daemon/config.js.map +1 -1
  56. package/dist/daemon/credentials.d.ts +24 -0
  57. package/dist/daemon/credentials.d.ts.map +1 -0
  58. package/dist/daemon/credentials.js +80 -0
  59. package/dist/daemon/credentials.js.map +1 -0
  60. package/dist/daemon/delivery-client.d.ts +35 -0
  61. package/dist/daemon/delivery-client.d.ts.map +1 -0
  62. package/dist/daemon/delivery-client.js +231 -0
  63. package/dist/daemon/delivery-client.js.map +1 -0
  64. package/dist/daemon/file-delivery.d.ts +98 -0
  65. package/dist/daemon/file-delivery.d.ts.map +1 -0
  66. package/dist/daemon/file-delivery.js +461 -0
  67. package/dist/daemon/file-delivery.js.map +1 -0
  68. package/dist/daemon/index.d.ts +1 -0
  69. package/dist/daemon/index.d.ts.map +1 -1
  70. package/dist/daemon/index.js +793 -227
  71. package/dist/daemon/index.js.map +1 -1
  72. package/dist/daemon/notify.d.ts +35 -6
  73. package/dist/daemon/notify.d.ts.map +1 -1
  74. package/dist/daemon/notify.js +176 -48
  75. package/dist/daemon/notify.js.map +1 -1
  76. package/dist/daemon/worker-executor.d.ts +71 -0
  77. package/dist/daemon/worker-executor.d.ts.map +1 -0
  78. package/dist/daemon/worker-executor.js +382 -0
  79. package/dist/daemon/worker-executor.js.map +1 -0
  80. package/dist/drain-v4.js +2 -2
  81. package/dist/drain-v4.js.map +1 -1
  82. package/dist/endpoint-notify.d.ts +9 -1
  83. package/dist/endpoint-notify.d.ts.map +1 -1
  84. package/dist/endpoint-notify.js +116 -3
  85. package/dist/endpoint-notify.js.map +1 -1
  86. package/dist/index.js +81 -1
  87. package/dist/index.js.map +1 -1
  88. package/dist/program.d.ts.map +1 -1
  89. package/dist/program.js +8 -0
  90. package/dist/program.js.map +1 -1
  91. package/dist/repl.d.ts.map +1 -1
  92. package/dist/repl.js +69 -486
  93. package/dist/repl.js.map +1 -1
  94. package/dist/tui/App.d.ts +12 -0
  95. package/dist/tui/App.d.ts.map +1 -0
  96. package/dist/tui/App.js +154 -0
  97. package/dist/tui/App.js.map +1 -0
  98. package/dist/tui/Footer.d.ts +11 -0
  99. package/dist/tui/Footer.d.ts.map +1 -0
  100. package/dist/tui/Footer.js +13 -0
  101. package/dist/tui/Footer.js.map +1 -0
  102. package/dist/tui/Header.d.ts +14 -0
  103. package/dist/tui/Header.d.ts.map +1 -0
  104. package/dist/tui/Header.js +19 -0
  105. package/dist/tui/Header.js.map +1 -0
  106. package/dist/tui/InputLine.d.ts +11 -0
  107. package/dist/tui/InputLine.d.ts.map +1 -0
  108. package/dist/tui/InputLine.js +145 -0
  109. package/dist/tui/InputLine.js.map +1 -0
  110. package/dist/tui/Viewport.d.ts +14 -0
  111. package/dist/tui/Viewport.d.ts.map +1 -0
  112. package/dist/tui/Viewport.js +48 -0
  113. package/dist/tui/Viewport.js.map +1 -0
  114. package/dist/tui/WalletConnectPairing.d.ts +23 -0
  115. package/dist/tui/WalletConnectPairing.d.ts.map +1 -0
  116. package/dist/tui/WalletConnectPairing.js +61 -0
  117. package/dist/tui/WalletConnectPairing.js.map +1 -0
  118. package/dist/tui/components/Button.d.ts +7 -0
  119. package/dist/tui/components/Button.d.ts.map +1 -0
  120. package/dist/tui/components/Button.js +21 -0
  121. package/dist/tui/components/Button.js.map +1 -0
  122. package/dist/tui/components/CeremonyView.d.ts +13 -0
  123. package/dist/tui/components/CeremonyView.d.ts.map +1 -0
  124. package/dist/tui/components/CeremonyView.js +10 -0
  125. package/dist/tui/components/CeremonyView.js.map +1 -0
  126. package/dist/tui/components/CompletionDropdown.d.ts +7 -0
  127. package/dist/tui/components/CompletionDropdown.d.ts.map +1 -0
  128. package/dist/tui/components/CompletionDropdown.js +23 -0
  129. package/dist/tui/components/CompletionDropdown.js.map +1 -0
  130. package/dist/tui/components/ConfirmPrompt.d.ts +9 -0
  131. package/dist/tui/components/ConfirmPrompt.d.ts.map +1 -0
  132. package/dist/tui/components/ConfirmPrompt.js +10 -0
  133. package/dist/tui/components/ConfirmPrompt.js.map +1 -0
  134. package/dist/tui/components/CustomTextInput.d.ts +15 -0
  135. package/dist/tui/components/CustomTextInput.d.ts.map +1 -0
  136. package/dist/tui/components/CustomTextInput.js +99 -0
  137. package/dist/tui/components/CustomTextInput.js.map +1 -0
  138. package/dist/tui/components/InteractiveTable.d.ts +14 -0
  139. package/dist/tui/components/InteractiveTable.d.ts.map +1 -0
  140. package/dist/tui/components/InteractiveTable.js +61 -0
  141. package/dist/tui/components/InteractiveTable.js.map +1 -0
  142. package/dist/tui/components/StepSpinner.d.ts +11 -0
  143. package/dist/tui/components/StepSpinner.d.ts.map +1 -0
  144. package/dist/tui/components/StepSpinner.js +32 -0
  145. package/dist/tui/components/StepSpinner.js.map +1 -0
  146. package/dist/tui/components/Toast.d.ts +18 -0
  147. package/dist/tui/components/Toast.d.ts.map +1 -0
  148. package/dist/tui/components/Toast.js +29 -0
  149. package/dist/tui/components/Toast.js.map +1 -0
  150. package/dist/tui/index.d.ts +2 -0
  151. package/dist/tui/index.d.ts.map +1 -0
  152. package/dist/tui/index.js +55 -0
  153. package/dist/tui/index.js.map +1 -0
  154. package/dist/tui/useChat.d.ts +11 -0
  155. package/dist/tui/useChat.d.ts.map +1 -0
  156. package/dist/tui/useChat.js +91 -0
  157. package/dist/tui/useChat.js.map +1 -0
  158. package/dist/tui/useCommand.d.ts +12 -0
  159. package/dist/tui/useCommand.d.ts.map +1 -0
  160. package/dist/tui/useCommand.js +137 -0
  161. package/dist/tui/useCommand.js.map +1 -0
  162. package/dist/tui/useNotifications.d.ts +9 -0
  163. package/dist/tui/useNotifications.d.ts.map +1 -0
  164. package/dist/tui/useNotifications.js +17 -0
  165. package/dist/tui/useNotifications.js.map +1 -0
  166. package/dist/tui/useScroll.d.ts +17 -0
  167. package/dist/tui/useScroll.d.ts.map +1 -0
  168. package/dist/tui/useScroll.js +46 -0
  169. package/dist/tui/useScroll.js.map +1 -0
  170. package/dist/ui/format.d.ts.map +1 -1
  171. package/dist/ui/format.js +2 -0
  172. package/dist/ui/format.js.map +1 -1
  173. package/dist/ui/qr-render.d.ts +25 -0
  174. package/dist/ui/qr-render.d.ts.map +1 -0
  175. package/dist/ui/qr-render.js +90 -0
  176. package/dist/ui/qr-render.js.map +1 -0
  177. package/dist/ui/rpc-fallback.d.ts +11 -0
  178. package/dist/ui/rpc-fallback.d.ts.map +1 -0
  179. package/dist/ui/rpc-fallback.js +58 -0
  180. package/dist/ui/rpc-fallback.js.map +1 -0
  181. package/dist/walletconnect.d.ts +4 -0
  182. package/dist/walletconnect.d.ts.map +1 -1
  183. package/dist/walletconnect.js.map +1 -1
  184. package/package.json +11 -3
  185. package/scripts/authorize-machine-key.ts +0 -43
  186. package/scripts/drain-wallet.ts +0 -149
  187. package/scripts/execute-spend-only.ts +0 -81
  188. package/scripts/register-agent-userop.ts +0 -186
  189. package/src/abis.ts +0 -187
  190. package/src/bundler.ts +0 -235
  191. package/src/client.ts +0 -36
  192. package/src/coinbase-smart-wallet.ts +0 -51
  193. package/src/commands/accept.ts +0 -64
  194. package/src/commands/agent-handshake.ts +0 -72
  195. package/src/commands/agent.ts +0 -691
  196. package/src/commands/agreements.ts +0 -350
  197. package/src/commands/arbitrator.ts +0 -180
  198. package/src/commands/arena-handshake.ts +0 -257
  199. package/src/commands/arena.ts +0 -122
  200. package/src/commands/cancel.ts +0 -35
  201. package/src/commands/channel.ts +0 -218
  202. package/src/commands/coldstart.ts +0 -165
  203. package/src/commands/config.ts +0 -58
  204. package/src/commands/contract-interaction.ts +0 -166
  205. package/src/commands/daemon.ts +0 -978
  206. package/src/commands/deliver.ts +0 -148
  207. package/src/commands/discover.ts +0 -297
  208. package/src/commands/dispute.ts +0 -375
  209. package/src/commands/endpoint.ts +0 -620
  210. package/src/commands/feed.ts +0 -229
  211. package/src/commands/hire.ts +0 -245
  212. package/src/commands/migrate.ts +0 -177
  213. package/src/commands/negotiate.ts +0 -271
  214. package/src/commands/openshell.ts +0 -1055
  215. package/src/commands/owner.ts +0 -35
  216. package/src/commands/policy.ts +0 -263
  217. package/src/commands/relay.ts +0 -273
  218. package/src/commands/remediate.ts +0 -24
  219. package/src/commands/reputation.ts +0 -79
  220. package/src/commands/setup.ts +0 -343
  221. package/src/commands/trust.ts +0 -27
  222. package/src/commands/verify.ts +0 -91
  223. package/src/commands/wallet.ts +0 -3280
  224. package/src/commands/watch.ts +0 -23
  225. package/src/commands/watchtower.ts +0 -248
  226. package/src/commands/workroom.ts +0 -959
  227. package/src/config.ts +0 -174
  228. package/src/daemon/config.ts +0 -308
  229. package/src/daemon/hire-listener.ts +0 -226
  230. package/src/daemon/index.ts +0 -955
  231. package/src/daemon/job-lifecycle.ts +0 -215
  232. package/src/daemon/notify.ts +0 -157
  233. package/src/daemon/token-metering.ts +0 -183
  234. package/src/daemon/userops.ts +0 -119
  235. package/src/daemon/wallet-monitor.ts +0 -90
  236. package/src/drain-v4.ts +0 -159
  237. package/src/endpoint-config.ts +0 -83
  238. package/src/endpoint-notify.ts +0 -46
  239. package/src/index.ts +0 -26
  240. package/src/openshell-runtime.ts +0 -277
  241. package/src/program.ts +0 -83
  242. package/src/repl.ts +0 -680
  243. package/src/signing.ts +0 -28
  244. package/src/telegram-notify.ts +0 -88
  245. package/src/ui/banner.ts +0 -51
  246. package/src/ui/colors.ts +0 -30
  247. package/src/ui/format.ts +0 -77
  248. package/src/ui/spinner.ts +0 -56
  249. package/src/ui/tree.ts +0 -16
  250. package/src/utils/format.ts +0 -48
  251. package/src/utils/hash.ts +0 -5
  252. package/src/utils/time.ts +0 -15
  253. package/src/wallet-router.ts +0 -178
  254. package/src/walletconnect-session.ts +0 -27
  255. package/src/walletconnect.ts +0 -294
  256. package/test/time.test.js +0 -11
  257. package/tsconfig.json +0 -19
@@ -1,23 +0,0 @@
1
- import { Command } from "commander";
2
- import { c } from "../ui/colors";
3
- import { loadConfig } from "../config";
4
-
5
- export function registerWatchCommand(program: Command): void {
6
- program
7
- .command("watch")
8
- .description("Watch wallet activity in real-time")
9
- .action(async () => {
10
- const config = loadConfig();
11
- const wallet = config.walletContractAddress ?? "(no wallet)";
12
- const shortWallet = wallet.length > 10
13
- ? `${wallet.slice(0, 6)}...${wallet.slice(-4)}`
14
- : wallet;
15
- const line = "─".repeat(20);
16
-
17
- console.log(`${c.mark} ARC-402 Watching ${c.white(shortWallet)} ${c.dim(line)}`);
18
- console.log(`${c.dim("···")} ${c.dim("waiting")}`);
19
-
20
- // Keep process alive
21
- process.stdin.resume();
22
- });
23
- }
@@ -1,248 +0,0 @@
1
- import { Command } from "commander";
2
- import * as fs from "fs";
3
- import * as path from "path";
4
- import * as os from "os";
5
- import { loadConfig } from "../config";
6
- import { requireSigner, getClient } from "../client";
7
- import { WatchtowerClient, ChannelClient } from "@arc402/sdk";
8
- import { c } from '../ui/colors';
9
- import { startSpinner } from '../ui/spinner';
10
- import { renderTree } from '../ui/tree';
11
- import { formatAddress } from '../ui/format';
12
-
13
- const CHANNEL_STATES_DIR = path.join(os.homedir(), ".arc402", "channel-states");
14
-
15
- function loadStateFile(filePath: string): { [key: string]: unknown; cumulativePayment: bigint; sequenceNumber: number } {
16
- const raw = fs.readFileSync(filePath, "utf-8");
17
- const obj = JSON.parse(raw) as Record<string, unknown>;
18
- return {
19
- ...obj,
20
- cumulativePayment: BigInt(obj.cumulativePayment as string),
21
- sequenceNumber: Number(obj.sequenceNumber),
22
- };
23
- }
24
-
25
- export function registerWatchtowerCommands(program: Command): void {
26
- const wt = program
27
- .command("watchtower")
28
- .description("Watchtower management — register, status, and monitor channels for bad-faith closes");
29
-
30
- // ─── register ──────────────────────────────────────────────────────────────
31
-
32
- wt.command("register")
33
- .description("Register this node as a watchtower in the on-chain WatchtowerRegistry")
34
- .requiredOption("--name <name>", "Watchtower display name")
35
- .option("--description <desc>", "Short description", "ARC-402 watchtower node")
36
- .option("--capabilities <caps>", "Comma-separated capability tags", "challenge")
37
- .option("--json", "JSON output")
38
- .action(async (opts) => {
39
- const config = loadConfig();
40
- if (!config.watchtowerRegistryAddress) throw new Error("watchtowerRegistryAddress missing in config");
41
- if (!config.serviceAgreementAddress) throw new Error("serviceAgreementAddress missing in config");
42
- const { signer } = await requireSigner(config);
43
- const client = new WatchtowerClient(
44
- config.watchtowerRegistryAddress,
45
- config.serviceAgreementAddress,
46
- signer
47
- );
48
- const capabilities = opts.capabilities
49
- .split(",")
50
- .map((s: string) => s.trim())
51
- .filter(Boolean);
52
- const regSpinner = startSpinner('Registering watchtower…');
53
- const result = await client.registerWatchtower({
54
- name: opts.name,
55
- description: opts.description,
56
- capabilities,
57
- });
58
- if (opts.json || program.opts().json) {
59
- regSpinner.stop();
60
- console.log(JSON.stringify(result));
61
- } else {
62
- regSpinner.succeed(c.success + c.white(' Registered as watchtower'));
63
- renderTree([
64
- { label: 'Name', value: opts.name },
65
- { label: 'Tx', value: result.txHash, last: true },
66
- ]);
67
- }
68
- });
69
-
70
- // ─── status ────────────────────────────────────────────────────────────────
71
-
72
- wt.command("status [address]")
73
- .description("Check watchtower registration status (defaults to your own address)")
74
- .option("--json", "JSON output")
75
- .action(async (address, opts) => {
76
- const config = loadConfig();
77
- if (!config.watchtowerRegistryAddress) throw new Error("watchtowerRegistryAddress missing in config");
78
- if (!config.serviceAgreementAddress) throw new Error("serviceAgreementAddress missing in config");
79
- const { provider, address: myAddress } = await getClient(config);
80
- const client = new WatchtowerClient(
81
- config.watchtowerRegistryAddress,
82
- config.serviceAgreementAddress,
83
- provider
84
- );
85
- const target = address ?? myAddress;
86
- if (!target) {
87
- console.error("No address provided and no private key configured");
88
- process.exit(1);
89
- }
90
- const status = await client.getWatchtowerStatus(target);
91
- if (opts.json || program.opts().json) {
92
- console.log(JSON.stringify(status, null, 2));
93
- } else {
94
- console.log('\n ' + c.mark + c.white(' Watchtower — ' + formatAddress(status.addr)));
95
- const statusItems: { label: string; value: string; last?: boolean }[] = [
96
- { label: 'Name', value: status.name },
97
- { label: 'Description', value: status.description },
98
- { label: 'Capabilities', value: status.capabilities.join(', ') || '(none)' },
99
- { label: 'Active', value: String(status.active) },
100
- ];
101
- if (status.registeredAt) {
102
- statusItems.push({ label: 'Registered', value: new Date(status.registeredAt * 1000).toISOString(), last: true });
103
- } else {
104
- statusItems[statusItems.length - 1].last = true;
105
- }
106
- renderTree(statusItems);
107
- }
108
- });
109
-
110
- // ─── watch ─────────────────────────────────────────────────────────────────
111
-
112
- wt.command("watch <channelId>")
113
- .description("Monitor a session channel for bad-faith closes and auto-submit a challenge")
114
- .option(
115
- "--state <path>",
116
- "Path to latest signed state JSON (defaults to ~/.arc402/channel-states/<channelId>.json)"
117
- )
118
- .option("--interval <ms>", "Polling interval in milliseconds", "12000")
119
- .option("--json", "JSON output")
120
- .action(async (channelId, opts) => {
121
- const config = loadConfig();
122
- if (!config.serviceAgreementAddress) throw new Error("serviceAgreementAddress missing in config");
123
- if (!config.watchtowerRegistryAddress) throw new Error("watchtowerRegistryAddress missing in config");
124
- const { signer, address } = await requireSigner(config);
125
-
126
- const watchtowerClient = new WatchtowerClient(
127
- config.watchtowerRegistryAddress,
128
- config.serviceAgreementAddress,
129
- signer
130
- );
131
- const channelClient = new ChannelClient(config.serviceAgreementAddress, signer);
132
-
133
- const statePath = opts.state ?? path.join(CHANNEL_STATES_DIR, `${channelId}.json`);
134
- if (!fs.existsSync(statePath)) {
135
- console.error(`No state file at ${statePath}`);
136
- console.error(`Store state first: arc402 channel store-state ${channelId} <state.json>`);
137
- process.exit(1);
138
- }
139
- const state = loadStateFile(statePath);
140
- const interval = Math.max(1000, Number(opts.interval));
141
-
142
- if (!opts.json) {
143
- console.log(`watching: ${channelId}`);
144
- console.log(` stored seq: ${state.sequenceNumber}`);
145
- console.log(` poll interval: ${interval}ms`);
146
- console.log(` press Ctrl+C to stop`);
147
- }
148
-
149
- let challenged = false;
150
-
151
- const poll = async () => {
152
- if (challenged) return;
153
- try {
154
- const ch = await channelClient.getChannelStatus(channelId);
155
-
156
- if (ch.status === "SETTLED") {
157
- if (!opts.json) {
158
- console.log(`[${new Date().toISOString()}] channel settled — stopping watch`);
159
- }
160
- return;
161
- }
162
-
163
- if (ch.status === "CLOSING" || ch.status === "CHALLENGED") {
164
- if (ch.lastSequenceNumber < (state.sequenceNumber as number)) {
165
- if (!opts.json) {
166
- console.log(
167
- `[${new Date().toISOString()}] stale close detected ` +
168
- `(on-chain seq=${ch.lastSequenceNumber}, stored seq=${state.sequenceNumber}) — challenging...`
169
- );
170
- }
171
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
172
- const result = await watchtowerClient.submitChallenge(channelId, state as any, address);
173
- challenged = true;
174
- if (opts.json) {
175
- console.log(JSON.stringify({ event: "challenge_submitted", channelId, txHash: result.txHash }));
176
- } else {
177
- console.log(' ' + c.success + c.white(' Challenge submitted — tx ' + result.txHash.slice(0, 12) + '...'));
178
- }
179
- return;
180
- } else {
181
- if (!opts.json) {
182
- console.log(
183
- `[${new Date().toISOString()}] channel closing with seq=${ch.lastSequenceNumber} — no challenge needed`
184
- );
185
- }
186
- }
187
- }
188
- } catch (err) {
189
- if (!opts.json) {
190
- console.error(`[${new Date().toISOString()}] poll error: ${err}`);
191
- }
192
- }
193
- setTimeout(poll, interval);
194
- };
195
-
196
- poll();
197
- });
198
-
199
- // ─── authorize ─────────────────────────────────────────────────────────────
200
-
201
- wt.command("authorize <channelId> <watchtower>")
202
- .description("Authorize a watchtower address to challenge on your behalf for a channel")
203
- .option("--json", "JSON output")
204
- .action(async (channelId, watchtower, opts) => {
205
- const config = loadConfig();
206
- if (!config.serviceAgreementAddress) throw new Error("serviceAgreementAddress missing in config");
207
- if (!config.watchtowerRegistryAddress) throw new Error("watchtowerRegistryAddress missing in config");
208
- const { signer } = await requireSigner(config);
209
- const client = new WatchtowerClient(
210
- config.watchtowerRegistryAddress,
211
- config.serviceAgreementAddress,
212
- signer
213
- );
214
- const authSpinner = startSpinner('Authorizing watchtower…');
215
- const result = await client.authorizeWatchtower(channelId, watchtower);
216
- if (opts.json || program.opts().json) {
217
- authSpinner.stop();
218
- console.log(JSON.stringify(result));
219
- } else {
220
- authSpinner.succeed(c.success + c.white(' Authorized: ' + formatAddress(watchtower)));
221
- }
222
- });
223
-
224
- // ─── revoke ────────────────────────────────────────────────────────────────
225
-
226
- wt.command("revoke <channelId> <watchtower>")
227
- .description("Revoke a watchtower's authorization for a channel")
228
- .option("--json", "JSON output")
229
- .action(async (channelId, watchtower, opts) => {
230
- const config = loadConfig();
231
- if (!config.serviceAgreementAddress) throw new Error("serviceAgreementAddress missing in config");
232
- if (!config.watchtowerRegistryAddress) throw new Error("watchtowerRegistryAddress missing in config");
233
- const { signer } = await requireSigner(config);
234
- const client = new WatchtowerClient(
235
- config.watchtowerRegistryAddress,
236
- config.serviceAgreementAddress,
237
- signer
238
- );
239
- const revokeSpinner = startSpinner('Revoking watchtower…');
240
- const result = await client.revokeWatchtower(channelId, watchtower);
241
- if (opts.json || program.opts().json) {
242
- revokeSpinner.stop();
243
- console.log(JSON.stringify(result));
244
- } else {
245
- revokeSpinner.succeed(c.success + c.white(' Revoked: ' + formatAddress(watchtower)));
246
- }
247
- });
248
- }