arc402-cli 1.0.0-rc.1 → 1.0.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 (253) hide show
  1. package/README.md +41 -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/wallet.d.ts.map +1 -1
  28. package/dist/commands/wallet.js +299 -65
  29. package/dist/commands/wallet.js.map +1 -1
  30. package/dist/commands/watch.d.ts.map +1 -1
  31. package/dist/commands/watch.js +146 -9
  32. package/dist/commands/watch.js.map +1 -1
  33. package/dist/commands/workroom.d.ts.map +1 -1
  34. package/dist/commands/workroom.js +112 -6
  35. package/dist/commands/workroom.js.map +1 -1
  36. package/dist/config.d.ts +12 -0
  37. package/dist/config.d.ts.map +1 -1
  38. package/dist/config.js +41 -4
  39. package/dist/config.js.map +1 -1
  40. package/dist/daemon/compute-metering.d.ts +61 -0
  41. package/dist/daemon/compute-metering.d.ts.map +1 -0
  42. package/dist/daemon/compute-metering.js +299 -0
  43. package/dist/daemon/compute-metering.js.map +1 -0
  44. package/dist/daemon/compute-session.d.ts +100 -0
  45. package/dist/daemon/compute-session.d.ts.map +1 -0
  46. package/dist/daemon/compute-session.js +231 -0
  47. package/dist/daemon/compute-session.js.map +1 -0
  48. package/dist/daemon/config.d.ts +33 -1
  49. package/dist/daemon/config.d.ts.map +1 -1
  50. package/dist/daemon/config.js +69 -0
  51. package/dist/daemon/config.js.map +1 -1
  52. package/dist/daemon/credentials.d.ts +24 -0
  53. package/dist/daemon/credentials.d.ts.map +1 -0
  54. package/dist/daemon/credentials.js +80 -0
  55. package/dist/daemon/credentials.js.map +1 -0
  56. package/dist/daemon/delivery-client.d.ts +35 -0
  57. package/dist/daemon/delivery-client.d.ts.map +1 -0
  58. package/dist/daemon/delivery-client.js +231 -0
  59. package/dist/daemon/delivery-client.js.map +1 -0
  60. package/dist/daemon/file-delivery.d.ts +98 -0
  61. package/dist/daemon/file-delivery.d.ts.map +1 -0
  62. package/dist/daemon/file-delivery.js +461 -0
  63. package/dist/daemon/file-delivery.js.map +1 -0
  64. package/dist/daemon/index.d.ts +1 -0
  65. package/dist/daemon/index.d.ts.map +1 -1
  66. package/dist/daemon/index.js +793 -227
  67. package/dist/daemon/index.js.map +1 -1
  68. package/dist/daemon/notify.d.ts +35 -6
  69. package/dist/daemon/notify.d.ts.map +1 -1
  70. package/dist/daemon/notify.js +176 -48
  71. package/dist/daemon/notify.js.map +1 -1
  72. package/dist/daemon/worker-executor.d.ts +71 -0
  73. package/dist/daemon/worker-executor.d.ts.map +1 -0
  74. package/dist/daemon/worker-executor.js +382 -0
  75. package/dist/daemon/worker-executor.js.map +1 -0
  76. package/dist/drain-v4.js +2 -2
  77. package/dist/drain-v4.js.map +1 -1
  78. package/dist/endpoint-notify.d.ts +9 -1
  79. package/dist/endpoint-notify.d.ts.map +1 -1
  80. package/dist/endpoint-notify.js +116 -3
  81. package/dist/endpoint-notify.js.map +1 -1
  82. package/dist/index.js +81 -1
  83. package/dist/index.js.map +1 -1
  84. package/dist/program.d.ts.map +1 -1
  85. package/dist/program.js +6 -0
  86. package/dist/program.js.map +1 -1
  87. package/dist/repl.d.ts.map +1 -1
  88. package/dist/repl.js +69 -486
  89. package/dist/repl.js.map +1 -1
  90. package/dist/tui/App.d.ts +12 -0
  91. package/dist/tui/App.d.ts.map +1 -0
  92. package/dist/tui/App.js +154 -0
  93. package/dist/tui/App.js.map +1 -0
  94. package/dist/tui/Footer.d.ts +11 -0
  95. package/dist/tui/Footer.d.ts.map +1 -0
  96. package/dist/tui/Footer.js +13 -0
  97. package/dist/tui/Footer.js.map +1 -0
  98. package/dist/tui/Header.d.ts +14 -0
  99. package/dist/tui/Header.d.ts.map +1 -0
  100. package/dist/tui/Header.js +19 -0
  101. package/dist/tui/Header.js.map +1 -0
  102. package/dist/tui/InputLine.d.ts +11 -0
  103. package/dist/tui/InputLine.d.ts.map +1 -0
  104. package/dist/tui/InputLine.js +145 -0
  105. package/dist/tui/InputLine.js.map +1 -0
  106. package/dist/tui/Viewport.d.ts +14 -0
  107. package/dist/tui/Viewport.d.ts.map +1 -0
  108. package/dist/tui/Viewport.js +48 -0
  109. package/dist/tui/Viewport.js.map +1 -0
  110. package/dist/tui/WalletConnectPairing.d.ts +23 -0
  111. package/dist/tui/WalletConnectPairing.d.ts.map +1 -0
  112. package/dist/tui/WalletConnectPairing.js +61 -0
  113. package/dist/tui/WalletConnectPairing.js.map +1 -0
  114. package/dist/tui/components/Button.d.ts +7 -0
  115. package/dist/tui/components/Button.d.ts.map +1 -0
  116. package/dist/tui/components/Button.js +21 -0
  117. package/dist/tui/components/Button.js.map +1 -0
  118. package/dist/tui/components/CeremonyView.d.ts +13 -0
  119. package/dist/tui/components/CeremonyView.d.ts.map +1 -0
  120. package/dist/tui/components/CeremonyView.js +10 -0
  121. package/dist/tui/components/CeremonyView.js.map +1 -0
  122. package/dist/tui/components/CompletionDropdown.d.ts +7 -0
  123. package/dist/tui/components/CompletionDropdown.d.ts.map +1 -0
  124. package/dist/tui/components/CompletionDropdown.js +23 -0
  125. package/dist/tui/components/CompletionDropdown.js.map +1 -0
  126. package/dist/tui/components/ConfirmPrompt.d.ts +9 -0
  127. package/dist/tui/components/ConfirmPrompt.d.ts.map +1 -0
  128. package/dist/tui/components/ConfirmPrompt.js +10 -0
  129. package/dist/tui/components/ConfirmPrompt.js.map +1 -0
  130. package/dist/tui/components/CustomTextInput.d.ts +15 -0
  131. package/dist/tui/components/CustomTextInput.d.ts.map +1 -0
  132. package/dist/tui/components/CustomTextInput.js +99 -0
  133. package/dist/tui/components/CustomTextInput.js.map +1 -0
  134. package/dist/tui/components/InteractiveTable.d.ts +14 -0
  135. package/dist/tui/components/InteractiveTable.d.ts.map +1 -0
  136. package/dist/tui/components/InteractiveTable.js +61 -0
  137. package/dist/tui/components/InteractiveTable.js.map +1 -0
  138. package/dist/tui/components/StepSpinner.d.ts +11 -0
  139. package/dist/tui/components/StepSpinner.d.ts.map +1 -0
  140. package/dist/tui/components/StepSpinner.js +32 -0
  141. package/dist/tui/components/StepSpinner.js.map +1 -0
  142. package/dist/tui/components/Toast.d.ts +18 -0
  143. package/dist/tui/components/Toast.d.ts.map +1 -0
  144. package/dist/tui/components/Toast.js +29 -0
  145. package/dist/tui/components/Toast.js.map +1 -0
  146. package/dist/tui/index.d.ts +2 -0
  147. package/dist/tui/index.d.ts.map +1 -0
  148. package/dist/tui/index.js +55 -0
  149. package/dist/tui/index.js.map +1 -0
  150. package/dist/tui/useChat.d.ts +11 -0
  151. package/dist/tui/useChat.d.ts.map +1 -0
  152. package/dist/tui/useChat.js +91 -0
  153. package/dist/tui/useChat.js.map +1 -0
  154. package/dist/tui/useCommand.d.ts +12 -0
  155. package/dist/tui/useCommand.d.ts.map +1 -0
  156. package/dist/tui/useCommand.js +137 -0
  157. package/dist/tui/useCommand.js.map +1 -0
  158. package/dist/tui/useNotifications.d.ts +9 -0
  159. package/dist/tui/useNotifications.d.ts.map +1 -0
  160. package/dist/tui/useNotifications.js +17 -0
  161. package/dist/tui/useNotifications.js.map +1 -0
  162. package/dist/tui/useScroll.d.ts +17 -0
  163. package/dist/tui/useScroll.d.ts.map +1 -0
  164. package/dist/tui/useScroll.js +46 -0
  165. package/dist/tui/useScroll.js.map +1 -0
  166. package/dist/ui/format.d.ts.map +1 -1
  167. package/dist/ui/format.js +2 -0
  168. package/dist/ui/format.js.map +1 -1
  169. package/dist/ui/qr-render.d.ts +25 -0
  170. package/dist/ui/qr-render.d.ts.map +1 -0
  171. package/dist/ui/qr-render.js +90 -0
  172. package/dist/ui/qr-render.js.map +1 -0
  173. package/dist/ui/rpc-fallback.d.ts +11 -0
  174. package/dist/ui/rpc-fallback.d.ts.map +1 -0
  175. package/dist/ui/rpc-fallback.js +58 -0
  176. package/dist/ui/rpc-fallback.js.map +1 -0
  177. package/dist/walletconnect.d.ts +4 -0
  178. package/dist/walletconnect.d.ts.map +1 -1
  179. package/dist/walletconnect.js.map +1 -1
  180. package/package.json +10 -2
  181. package/scripts/authorize-machine-key.ts +0 -43
  182. package/scripts/drain-wallet.ts +0 -149
  183. package/scripts/execute-spend-only.ts +0 -81
  184. package/scripts/register-agent-userop.ts +0 -186
  185. package/src/abis.ts +0 -187
  186. package/src/bundler.ts +0 -235
  187. package/src/client.ts +0 -36
  188. package/src/coinbase-smart-wallet.ts +0 -51
  189. package/src/commands/accept.ts +0 -64
  190. package/src/commands/agent-handshake.ts +0 -72
  191. package/src/commands/agent.ts +0 -691
  192. package/src/commands/agreements.ts +0 -350
  193. package/src/commands/arbitrator.ts +0 -180
  194. package/src/commands/arena-handshake.ts +0 -257
  195. package/src/commands/arena.ts +0 -122
  196. package/src/commands/cancel.ts +0 -35
  197. package/src/commands/channel.ts +0 -218
  198. package/src/commands/coldstart.ts +0 -165
  199. package/src/commands/config.ts +0 -58
  200. package/src/commands/contract-interaction.ts +0 -166
  201. package/src/commands/daemon.ts +0 -978
  202. package/src/commands/deliver.ts +0 -148
  203. package/src/commands/discover.ts +0 -297
  204. package/src/commands/dispute.ts +0 -375
  205. package/src/commands/endpoint.ts +0 -620
  206. package/src/commands/feed.ts +0 -229
  207. package/src/commands/hire.ts +0 -245
  208. package/src/commands/migrate.ts +0 -177
  209. package/src/commands/negotiate.ts +0 -271
  210. package/src/commands/openshell.ts +0 -1055
  211. package/src/commands/owner.ts +0 -35
  212. package/src/commands/policy.ts +0 -263
  213. package/src/commands/relay.ts +0 -273
  214. package/src/commands/remediate.ts +0 -24
  215. package/src/commands/reputation.ts +0 -79
  216. package/src/commands/setup.ts +0 -343
  217. package/src/commands/trust.ts +0 -27
  218. package/src/commands/verify.ts +0 -91
  219. package/src/commands/wallet.ts +0 -3280
  220. package/src/commands/watch.ts +0 -23
  221. package/src/commands/watchtower.ts +0 -248
  222. package/src/commands/workroom.ts +0 -959
  223. package/src/config.ts +0 -174
  224. package/src/daemon/config.ts +0 -308
  225. package/src/daemon/hire-listener.ts +0 -226
  226. package/src/daemon/index.ts +0 -955
  227. package/src/daemon/job-lifecycle.ts +0 -215
  228. package/src/daemon/notify.ts +0 -157
  229. package/src/daemon/token-metering.ts +0 -183
  230. package/src/daemon/userops.ts +0 -119
  231. package/src/daemon/wallet-monitor.ts +0 -90
  232. package/src/drain-v4.ts +0 -159
  233. package/src/endpoint-config.ts +0 -83
  234. package/src/endpoint-notify.ts +0 -46
  235. package/src/index.ts +0 -26
  236. package/src/openshell-runtime.ts +0 -277
  237. package/src/program.ts +0 -83
  238. package/src/repl.ts +0 -680
  239. package/src/signing.ts +0 -28
  240. package/src/telegram-notify.ts +0 -88
  241. package/src/ui/banner.ts +0 -51
  242. package/src/ui/colors.ts +0 -30
  243. package/src/ui/format.ts +0 -77
  244. package/src/ui/spinner.ts +0 -56
  245. package/src/ui/tree.ts +0 -16
  246. package/src/utils/format.ts +0 -48
  247. package/src/utils/hash.ts +0 -5
  248. package/src/utils/time.ts +0 -15
  249. package/src/wallet-router.ts +0 -178
  250. package/src/walletconnect-session.ts +0 -27
  251. package/src/walletconnect.ts +0 -294
  252. package/test/time.test.js +0 -11
  253. 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
- }