arc402-cli 0.9.19 → 0.10.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 (359) 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 +45 -14
  5. package/dist/abis.js.map +1 -1
  6. package/dist/bundler.d.ts +1 -1
  7. package/dist/bundler.d.ts.map +1 -1
  8. package/dist/bundler.js +61 -27
  9. package/dist/bundler.js.map +1 -1
  10. package/dist/client.d.ts +1 -1
  11. package/dist/client.d.ts.map +1 -1
  12. package/dist/client.js +9 -5
  13. package/dist/client.js.map +1 -1
  14. package/dist/coinbase-smart-wallet.js +4 -1
  15. package/dist/coinbase-smart-wallet.js.map +1 -1
  16. package/dist/commands/accept.js +28 -25
  17. package/dist/commands/accept.js.map +1 -1
  18. package/dist/commands/agent-handshake.js +18 -15
  19. package/dist/commands/agent-handshake.js.map +1 -1
  20. package/dist/commands/agent.js +104 -98
  21. package/dist/commands/agent.js.map +1 -1
  22. package/dist/commands/agreements.js +98 -62
  23. package/dist/commands/agreements.js.map +1 -1
  24. package/dist/commands/arbitrator.js +81 -45
  25. package/dist/commands/arbitrator.js.map +1 -1
  26. package/dist/commands/arena-handshake.d.ts.map +1 -1
  27. package/dist/commands/arena-handshake.js +35 -53
  28. package/dist/commands/arena-handshake.js.map +1 -1
  29. package/dist/commands/arena.js +18 -12
  30. package/dist/commands/arena.js.map +1 -1
  31. package/dist/commands/backup.js +36 -30
  32. package/dist/commands/backup.js.map +1 -1
  33. package/dist/commands/cancel.js +18 -15
  34. package/dist/commands/cancel.js.map +1 -1
  35. package/dist/commands/channel.js +81 -45
  36. package/dist/commands/channel.js.map +1 -1
  37. package/dist/commands/coldstart.js +34 -31
  38. package/dist/commands/coldstart.js.map +1 -1
  39. package/dist/commands/compute.d.ts +14 -0
  40. package/dist/commands/compute.d.ts.map +1 -0
  41. package/dist/commands/compute.js +466 -0
  42. package/dist/commands/compute.js.map +1 -0
  43. package/dist/commands/config.js +30 -24
  44. package/dist/commands/config.js.map +1 -1
  45. package/dist/commands/contract-interaction.js +15 -12
  46. package/dist/commands/contract-interaction.js.map +1 -1
  47. package/dist/commands/daemon.d.ts.map +1 -1
  48. package/dist/commands/daemon.js +135 -98
  49. package/dist/commands/daemon.js.map +1 -1
  50. package/dist/commands/deliver.js +76 -37
  51. package/dist/commands/deliver.js.map +1 -1
  52. package/dist/commands/discover.js +27 -24
  53. package/dist/commands/discover.js.map +1 -1
  54. package/dist/commands/dispute.js +110 -104
  55. package/dist/commands/dispute.js.map +1 -1
  56. package/dist/commands/doctor.js +55 -16
  57. package/dist/commands/doctor.js.map +1 -1
  58. package/dist/commands/endpoint.js +95 -56
  59. package/dist/commands/endpoint.js.map +1 -1
  60. package/dist/commands/feed.js +18 -11
  61. package/dist/commands/feed.js.map +1 -1
  62. package/dist/commands/hire.js +40 -37
  63. package/dist/commands/hire.js.map +1 -1
  64. package/dist/commands/migrate.js +33 -30
  65. package/dist/commands/migrate.js.map +1 -1
  66. package/dist/commands/negotiate.d.ts.map +1 -1
  67. package/dist/commands/negotiate.js +36 -34
  68. package/dist/commands/negotiate.js.map +1 -1
  69. package/dist/commands/openshell.js +104 -68
  70. package/dist/commands/openshell.js.map +1 -1
  71. package/dist/commands/owner.js +20 -17
  72. package/dist/commands/owner.js.map +1 -1
  73. package/dist/commands/policy.js +43 -41
  74. package/dist/commands/policy.js.map +1 -1
  75. package/dist/commands/relay.d.ts.map +1 -1
  76. package/dist/commands/relay.js +51 -18
  77. package/dist/commands/relay.js.map +1 -1
  78. package/dist/commands/remediate.js +23 -20
  79. package/dist/commands/remediate.js.map +1 -1
  80. package/dist/commands/reputation.js +27 -25
  81. package/dist/commands/reputation.js.map +1 -1
  82. package/dist/commands/setup.js +104 -65
  83. package/dist/commands/setup.js.map +1 -1
  84. package/dist/commands/trust.js +20 -17
  85. package/dist/commands/trust.js.map +1 -1
  86. package/dist/commands/verify.js +21 -18
  87. package/dist/commands/verify.js.map +1 -1
  88. package/dist/commands/wallet.d.ts.map +1 -1
  89. package/dist/commands/wallet.js +645 -679
  90. package/dist/commands/wallet.js.map +1 -1
  91. package/dist/commands/watch.js +36 -33
  92. package/dist/commands/watch.js.map +1 -1
  93. package/dist/commands/watchtower.js +73 -37
  94. package/dist/commands/watchtower.js.map +1 -1
  95. package/dist/commands/workroom.d.ts.map +1 -1
  96. package/dist/commands/workroom.js +282 -143
  97. package/dist/commands/workroom.js.map +1 -1
  98. package/dist/config.d.ts +3 -0
  99. package/dist/config.d.ts.map +1 -1
  100. package/dist/config.js +71 -22
  101. package/dist/config.js.map +1 -1
  102. package/dist/daemon/compute-metering.d.ts +61 -0
  103. package/dist/daemon/compute-metering.d.ts.map +1 -0
  104. package/dist/daemon/compute-metering.js +299 -0
  105. package/dist/daemon/compute-metering.js.map +1 -0
  106. package/dist/daemon/compute-session.d.ts +100 -0
  107. package/dist/daemon/compute-session.d.ts.map +1 -0
  108. package/dist/daemon/compute-session.js +231 -0
  109. package/dist/daemon/compute-session.js.map +1 -0
  110. package/dist/daemon/config.d.ts +19 -1
  111. package/dist/daemon/config.d.ts.map +1 -1
  112. package/dist/daemon/config.js +90 -16
  113. package/dist/daemon/config.js.map +1 -1
  114. package/dist/daemon/credentials.d.ts +24 -0
  115. package/dist/daemon/credentials.d.ts.map +1 -0
  116. package/dist/daemon/credentials.js +80 -0
  117. package/dist/daemon/credentials.js.map +1 -0
  118. package/dist/daemon/delivery-client.d.ts +35 -0
  119. package/dist/daemon/delivery-client.d.ts.map +1 -0
  120. package/dist/daemon/delivery-client.js +231 -0
  121. package/dist/daemon/delivery-client.js.map +1 -0
  122. package/dist/daemon/file-delivery.d.ts +98 -0
  123. package/dist/daemon/file-delivery.d.ts.map +1 -0
  124. package/dist/daemon/file-delivery.js +461 -0
  125. package/dist/daemon/file-delivery.js.map +1 -0
  126. package/dist/daemon/hire-listener.d.ts +3 -3
  127. package/dist/daemon/hire-listener.d.ts.map +1 -1
  128. package/dist/daemon/hire-listener.js +47 -13
  129. package/dist/daemon/hire-listener.js.map +1 -1
  130. package/dist/daemon/index.d.ts +2 -1
  131. package/dist/daemon/index.d.ts.map +1 -1
  132. package/dist/daemon/index.js +526 -53
  133. package/dist/daemon/index.js.map +1 -1
  134. package/dist/daemon/job-lifecycle.d.ts +1 -1
  135. package/dist/daemon/job-lifecycle.d.ts.map +1 -1
  136. package/dist/daemon/job-lifecycle.js +51 -11
  137. package/dist/daemon/job-lifecycle.js.map +1 -1
  138. package/dist/daemon/notify.d.ts +1 -1
  139. package/dist/daemon/notify.d.ts.map +1 -1
  140. package/dist/daemon/notify.js +53 -19
  141. package/dist/daemon/notify.js.map +1 -1
  142. package/dist/daemon/token-metering.js +47 -8
  143. package/dist/daemon/token-metering.js.map +1 -1
  144. package/dist/daemon/userops.d.ts +2 -2
  145. package/dist/daemon/userops.d.ts.map +1 -1
  146. package/dist/daemon/userops.js +27 -23
  147. package/dist/daemon/userops.js.map +1 -1
  148. package/dist/daemon/wallet-monitor.d.ts +1 -1
  149. package/dist/daemon/wallet-monitor.d.ts.map +1 -1
  150. package/dist/daemon/wallet-monitor.js +12 -8
  151. package/dist/daemon/wallet-monitor.js.map +1 -1
  152. package/dist/daemon/worker-executor.d.ts +71 -0
  153. package/dist/daemon/worker-executor.d.ts.map +1 -0
  154. package/dist/daemon/worker-executor.js +382 -0
  155. package/dist/daemon/worker-executor.js.map +1 -0
  156. package/dist/drain-v4.js +64 -26
  157. package/dist/drain-v4.js.map +1 -1
  158. package/dist/endpoint-config.js +63 -20
  159. package/dist/endpoint-config.js.map +1 -1
  160. package/dist/endpoint-notify.d.ts.map +1 -1
  161. package/dist/endpoint-notify.js +49 -15
  162. package/dist/endpoint-notify.js.map +1 -1
  163. package/dist/index.js +50 -18
  164. package/dist/index.js.map +1 -1
  165. package/dist/openshell-runtime.d.ts.map +1 -1
  166. package/dist/openshell-runtime.js +82 -38
  167. package/dist/openshell-runtime.js.map +1 -1
  168. package/dist/program.d.ts.map +1 -1
  169. package/dist/program.js +85 -78
  170. package/dist/program.js.map +1 -1
  171. package/dist/repl.js +31 -25
  172. package/dist/repl.js.map +1 -1
  173. package/dist/signing.js +6 -3
  174. package/dist/signing.js.map +1 -1
  175. package/dist/telegram-notify.js +40 -3
  176. package/dist/telegram-notify.js.map +1 -1
  177. package/dist/tui/App.d.ts.map +1 -1
  178. package/dist/tui/App.js +56 -89
  179. package/dist/tui/App.js.map +1 -1
  180. package/dist/tui/Footer.js +7 -4
  181. package/dist/tui/Footer.js.map +1 -1
  182. package/dist/tui/Header.d.ts +1 -1
  183. package/dist/tui/Header.d.ts.map +1 -1
  184. package/dist/tui/Header.js +14 -9
  185. package/dist/tui/Header.js.map +1 -1
  186. package/dist/tui/InputLine.d.ts +2 -1
  187. package/dist/tui/InputLine.d.ts.map +1 -1
  188. package/dist/tui/InputLine.js +47 -97
  189. package/dist/tui/InputLine.js.map +1 -1
  190. package/dist/tui/Viewport.d.ts +1 -2
  191. package/dist/tui/Viewport.d.ts.map +1 -1
  192. package/dist/tui/Viewport.js +26 -6
  193. package/dist/tui/Viewport.js.map +1 -1
  194. package/dist/tui/WalletConnectPairing.js +19 -16
  195. package/dist/tui/WalletConnectPairing.js.map +1 -1
  196. package/dist/tui/components/Button.js +9 -6
  197. package/dist/tui/components/Button.js.map +1 -1
  198. package/dist/tui/components/CeremonyView.js +8 -5
  199. package/dist/tui/components/CeremonyView.js.map +1 -1
  200. package/dist/tui/components/CompletionDropdown.js +9 -6
  201. package/dist/tui/components/CompletionDropdown.js.map +1 -1
  202. package/dist/tui/components/ConfirmPrompt.js +8 -5
  203. package/dist/tui/components/ConfirmPrompt.js.map +1 -1
  204. package/dist/tui/components/CustomTextInput.js +14 -11
  205. package/dist/tui/components/CustomTextInput.js.map +1 -1
  206. package/dist/tui/components/InteractiveTable.js +12 -9
  207. package/dist/tui/components/InteractiveTable.js.map +1 -1
  208. package/dist/tui/components/StepSpinner.js +13 -10
  209. package/dist/tui/components/StepSpinner.js.map +1 -1
  210. package/dist/tui/components/Toast.js +12 -8
  211. package/dist/tui/components/Toast.js.map +1 -1
  212. package/dist/tui/index.d.ts.map +1 -1
  213. package/dist/tui/index.js +21 -28
  214. package/dist/tui/index.js.map +1 -1
  215. package/dist/tui/useChat.js +19 -13
  216. package/dist/tui/useChat.js.map +1 -1
  217. package/dist/tui/useCommand.d.ts +2 -3
  218. package/dist/tui/useCommand.d.ts.map +1 -1
  219. package/dist/tui/useCommand.js +24 -100
  220. package/dist/tui/useCommand.js.map +1 -1
  221. package/dist/tui/useNotifications.js +8 -5
  222. package/dist/tui/useNotifications.js.map +1 -1
  223. package/dist/tui/useScroll.d.ts.map +1 -1
  224. package/dist/tui/useScroll.js +12 -15
  225. package/dist/tui/useScroll.js.map +1 -1
  226. package/dist/ui/banner.d.ts +0 -12
  227. package/dist/ui/banner.d.ts.map +1 -1
  228. package/dist/ui/banner.js +19 -35
  229. package/dist/ui/banner.js.map +1 -1
  230. package/dist/ui/colors.js +19 -13
  231. package/dist/ui/colors.js.map +1 -1
  232. package/dist/ui/format.js +14 -6
  233. package/dist/ui/format.js.map +1 -1
  234. package/dist/ui/qr-render.js +11 -4
  235. package/dist/ui/qr-render.js.map +1 -1
  236. package/dist/ui/rpc-fallback.js +11 -6
  237. package/dist/ui/rpc-fallback.js.map +1 -1
  238. package/dist/ui/spinner.js +12 -6
  239. package/dist/ui/spinner.js.map +1 -1
  240. package/dist/ui/tree.js +6 -3
  241. package/dist/ui/tree.js.map +1 -1
  242. package/dist/utils/format.js +41 -27
  243. package/dist/utils/format.js.map +1 -1
  244. package/dist/utils/hash.js +42 -4
  245. package/dist/utils/hash.js.map +1 -1
  246. package/dist/utils/time.js +6 -2
  247. package/dist/utils/time.js.map +1 -1
  248. package/dist/wallet-router.d.ts +1 -1
  249. package/dist/wallet-router.d.ts.map +1 -1
  250. package/dist/wallet-router.js +19 -12
  251. package/dist/wallet-router.js.map +1 -1
  252. package/dist/walletconnect-session.d.ts +1 -1
  253. package/dist/walletconnect-session.d.ts.map +1 -1
  254. package/dist/walletconnect-session.js +11 -6
  255. package/dist/walletconnect-session.js.map +1 -1
  256. package/dist/walletconnect.d.ts +5 -6
  257. package/dist/walletconnect.d.ts.map +1 -1
  258. package/dist/walletconnect.js +35 -32
  259. package/dist/walletconnect.js.map +1 -1
  260. package/package.json +11 -10
  261. package/INK6-UX-SPEC.md +0 -446
  262. package/MIGRATION-SPEC.md +0 -108
  263. package/TUI-SPEC.md +0 -214
  264. package/scripts/authorize-machine-key.ts +0 -43
  265. package/scripts/drain-wallet.ts +0 -149
  266. package/scripts/execute-spend-only.ts +0 -81
  267. package/scripts/register-agent-userop.ts +0 -186
  268. package/src/abis.ts +0 -187
  269. package/src/bundler.ts +0 -235
  270. package/src/client.ts +0 -36
  271. package/src/coinbase-smart-wallet.ts +0 -51
  272. package/src/commands/accept.ts +0 -64
  273. package/src/commands/agent-handshake.ts +0 -72
  274. package/src/commands/agent.ts +0 -691
  275. package/src/commands/agreements.ts +0 -350
  276. package/src/commands/arbitrator.ts +0 -180
  277. package/src/commands/arena-handshake.ts +0 -274
  278. package/src/commands/arena.ts +0 -122
  279. package/src/commands/backup.ts +0 -117
  280. package/src/commands/cancel.ts +0 -35
  281. package/src/commands/channel.ts +0 -218
  282. package/src/commands/coldstart.ts +0 -165
  283. package/src/commands/config.ts +0 -68
  284. package/src/commands/contract-interaction.ts +0 -166
  285. package/src/commands/daemon.ts +0 -1054
  286. package/src/commands/deliver.ts +0 -148
  287. package/src/commands/discover.ts +0 -350
  288. package/src/commands/dispute.ts +0 -375
  289. package/src/commands/doctor.ts +0 -172
  290. package/src/commands/endpoint.ts +0 -620
  291. package/src/commands/feed.ts +0 -229
  292. package/src/commands/hire.ts +0 -245
  293. package/src/commands/migrate.ts +0 -177
  294. package/src/commands/negotiate.ts +0 -272
  295. package/src/commands/openshell.ts +0 -1055
  296. package/src/commands/owner.ts +0 -35
  297. package/src/commands/policy.ts +0 -263
  298. package/src/commands/relay.ts +0 -277
  299. package/src/commands/remediate.ts +0 -24
  300. package/src/commands/reputation.ts +0 -79
  301. package/src/commands/setup.ts +0 -343
  302. package/src/commands/trust.ts +0 -27
  303. package/src/commands/verify.ts +0 -91
  304. package/src/commands/wallet.ts +0 -3548
  305. package/src/commands/watch.ts +0 -220
  306. package/src/commands/watchtower.ts +0 -248
  307. package/src/commands/workroom.ts +0 -963
  308. package/src/config.ts +0 -220
  309. package/src/daemon/config.ts +0 -344
  310. package/src/daemon/hire-listener.ts +0 -226
  311. package/src/daemon/index.ts +0 -1089
  312. package/src/daemon/job-lifecycle.ts +0 -215
  313. package/src/daemon/notify.ts +0 -297
  314. package/src/daemon/token-metering.ts +0 -183
  315. package/src/daemon/userops.ts +0 -119
  316. package/src/daemon/wallet-monitor.ts +0 -90
  317. package/src/drain-v4.ts +0 -159
  318. package/src/endpoint-config.ts +0 -83
  319. package/src/endpoint-notify.ts +0 -134
  320. package/src/index.ts +0 -74
  321. package/src/openshell-runtime.ts +0 -281
  322. package/src/program.ts +0 -88
  323. package/src/repl.ts +0 -178
  324. package/src/signing.ts +0 -28
  325. package/src/telegram-notify.ts +0 -88
  326. package/src/tui/App.tsx +0 -263
  327. package/src/tui/Footer.tsx +0 -18
  328. package/src/tui/Header.tsx +0 -45
  329. package/src/tui/InputLine.tsx +0 -243
  330. package/src/tui/Viewport.tsx +0 -51
  331. package/src/tui/WalletConnectPairing.tsx +0 -114
  332. package/src/tui/components/Button.tsx +0 -38
  333. package/src/tui/components/CeremonyView.tsx +0 -39
  334. package/src/tui/components/CompletionDropdown.tsx +0 -56
  335. package/src/tui/components/ConfirmPrompt.tsx +0 -36
  336. package/src/tui/components/CustomTextInput.tsx +0 -132
  337. package/src/tui/components/InteractiveTable.tsx +0 -106
  338. package/src/tui/components/StepSpinner.tsx +0 -84
  339. package/src/tui/components/Toast.tsx +0 -59
  340. package/src/tui/index.tsx +0 -90
  341. package/src/tui/useChat.ts +0 -103
  342. package/src/tui/useCommand.ts +0 -238
  343. package/src/tui/useNotifications.ts +0 -28
  344. package/src/tui/useScroll.ts +0 -69
  345. package/src/ui/banner.ts +0 -78
  346. package/src/ui/colors.ts +0 -30
  347. package/src/ui/format.ts +0 -78
  348. package/src/ui/qr-render.ts +0 -92
  349. package/src/ui/rpc-fallback.ts +0 -59
  350. package/src/ui/spinner.ts +0 -56
  351. package/src/ui/tree.ts +0 -16
  352. package/src/utils/format.ts +0 -48
  353. package/src/utils/hash.ts +0 -5
  354. package/src/utils/time.ts +0 -15
  355. package/src/wallet-router.ts +0 -178
  356. package/src/walletconnect-session.ts +0 -27
  357. package/src/walletconnect.ts +0 -309
  358. package/test/time.test.js +0 -11
  359. package/tsconfig.json +0 -33
@@ -1,218 +0,0 @@
1
- import { Command } from "commander";
2
- import { loadConfig } from "../config.js";
3
- import { requireSigner, getClient } from "../client.js";
4
- import { ChannelClient } from "@arc402/sdk";
5
- import type { ChannelState } from "@arc402/sdk";
6
- import * as fs from "fs";
7
- import * as path from "path";
8
- import * as os from "os";
9
- import { c } from '../ui/colors.js';
10
- import { startSpinner } from '../ui/spinner.js';
11
- import { renderTree } from '../ui/tree.js';
12
- import { formatAddress } from '../ui/format.js';
13
-
14
- const CHANNEL_STATES_DIR = path.join(os.homedir(), ".arc402", "channel-states");
15
-
16
- function loadStateFile(path: string): ChannelState {
17
- const raw = fs.readFileSync(path, "utf-8");
18
- const obj = JSON.parse(raw);
19
- return {
20
- ...obj,
21
- cumulativePayment: BigInt(obj.cumulativePayment),
22
- } as ChannelState;
23
- }
24
-
25
- export function registerChannelCommands(program: Command): void {
26
- const channel = program.command("channel").description("Session channel management — open, close, challenge, reclaim");
27
-
28
- channel.command("open <provider>")
29
- .description("Open a session channel with a provider")
30
- .requiredOption("--token <address>", "Token address (0x0 for ETH)")
31
- .requiredOption("--max <amount>", "Max deposit amount in wei")
32
- .requiredOption("--rate <amount>", "Expected rate per call in wei (informational)")
33
- .requiredOption("--deadline <timestamp>", "Channel expiry unix timestamp")
34
- .option("--json", "JSON output")
35
- .action(async (provider, opts) => {
36
- const config = loadConfig();
37
- if (!config.serviceAgreementAddress) throw new Error("serviceAgreementAddress missing in config");
38
- const { signer } = await requireSigner(config);
39
- const client = new ChannelClient(config.serviceAgreementAddress, signer);
40
- const spinner = startSpinner('Opening session channel…');
41
- const result = await client.openSessionChannel(
42
- provider,
43
- opts.token,
44
- BigInt(opts.max),
45
- BigInt(opts.rate),
46
- Number(opts.deadline)
47
- );
48
- if (opts.json || program.opts().json) {
49
- spinner.stop();
50
- console.log(JSON.stringify(result, null, 2));
51
- } else {
52
- spinner.succeed(' Opened — channel ' + result.channelId);
53
- renderTree([
54
- { label: 'Channel', value: result.channelId },
55
- { label: 'Tx', value: result.txHash, last: true },
56
- ]);
57
- }
58
- });
59
-
60
- channel.command("status <channelId>")
61
- .description("Get channel status")
62
- .option("--json", "JSON output")
63
- .action(async (channelId, opts) => {
64
- const config = loadConfig();
65
- if (!config.serviceAgreementAddress) throw new Error("serviceAgreementAddress missing in config");
66
- const { provider } = await getClient(config);
67
- const client = new ChannelClient(config.serviceAgreementAddress, provider);
68
- const ch = await client.getChannelStatus(channelId);
69
- if (opts.json || program.opts().json) {
70
- console.log(JSON.stringify(ch, (_k, v) => typeof v === "bigint" ? v.toString() : v, 2));
71
- } else {
72
- console.log('\n ' + c.mark + c.white(` Channel ${channelId}`));
73
- renderTree([
74
- { label: 'Status', value: ch.status },
75
- { label: 'Client', value: formatAddress(ch.client) },
76
- { label: 'Provider', value: formatAddress(ch.provider) },
77
- { label: 'Deposit', value: ch.depositAmount.toString() },
78
- { label: 'Settled', value: ch.settledAmount.toString() },
79
- { label: 'Seq', value: ch.lastSequenceNumber.toString(), last: true },
80
- ]);
81
- }
82
- });
83
-
84
- channel.command("list <wallet>")
85
- .description("List open channels for a wallet (client or provider)")
86
- .option("--json", "JSON output")
87
- .action(async (wallet, opts) => {
88
- const config = loadConfig();
89
- if (!config.serviceAgreementAddress) throw new Error("serviceAgreementAddress missing in config");
90
- const { provider } = await getClient(config);
91
- const client = new ChannelClient(config.serviceAgreementAddress, provider);
92
- const channels = await client.getOpenChannels(wallet);
93
- if (opts.json || program.opts().json) {
94
- console.log(JSON.stringify(channels, (_k, v) => typeof v === "bigint" ? v.toString() : v, 2));
95
- } else {
96
- if (channels.length === 0) {
97
- console.log("no open channels");
98
- } else {
99
- for (const ch of channels) {
100
- console.log(` ${ch.status} deposit=${ch.depositAmount} seq=${ch.lastSequenceNumber} deadline=${ch.deadline}`);
101
- }
102
- }
103
- }
104
- });
105
-
106
- channel.command("close <channelId>")
107
- .description("Close a channel cooperatively with signed final state")
108
- .requiredOption("--state <path>", "Path to signed state JSON file")
109
- .option("--json", "JSON output")
110
- .action(async (channelId, opts) => {
111
- const config = loadConfig();
112
- if (!config.serviceAgreementAddress) throw new Error("serviceAgreementAddress missing in config");
113
- const { signer } = await requireSigner(config);
114
- const client = new ChannelClient(config.serviceAgreementAddress, signer);
115
- const state = loadStateFile(opts.state);
116
- const result = await client.closeChannel(channelId, state);
117
- if (opts.json || program.opts().json) {
118
- console.log(JSON.stringify(result, null, 2));
119
- } else {
120
- console.log(' ' + c.success + c.white(` Close submitted — ${result.txHash}`));
121
- console.log(' ' + c.dim('Challenge window open (24h)'));
122
- }
123
- });
124
-
125
- channel.command("challenge <channelId>")
126
- .description("Challenge a stale close with a higher sequence state")
127
- .requiredOption("--state <path>", "Path to signed state JSON file with higher sequenceNumber")
128
- .option("--json", "JSON output")
129
- .action(async (channelId, opts) => {
130
- const config = loadConfig();
131
- if (!config.serviceAgreementAddress) throw new Error("serviceAgreementAddress missing in config");
132
- const { signer } = await requireSigner(config);
133
- const client = new ChannelClient(config.serviceAgreementAddress, signer);
134
- const state = loadStateFile(opts.state);
135
- const result = await client.challengeChannel(channelId, state);
136
- if (opts.json || program.opts().json) {
137
- console.log(JSON.stringify(result, null, 2));
138
- } else {
139
- console.log(' ' + c.success + c.white(` Challenge submitted — ${result.txHash}`));
140
- }
141
- });
142
-
143
- channel.command("finalise <channelId>")
144
- .description("Finalise a close after the challenge window expires")
145
- .option("--json", "JSON output")
146
- .action(async (channelId, opts) => {
147
- const config = loadConfig();
148
- if (!config.serviceAgreementAddress) throw new Error("serviceAgreementAddress missing in config");
149
- const { signer } = await requireSigner(config);
150
- const client = new ChannelClient(config.serviceAgreementAddress, signer);
151
- const result = await client.finaliseChallenge(channelId);
152
- if (opts.json || program.opts().json) {
153
- console.log(JSON.stringify(result, null, 2));
154
- } else {
155
- console.log(' ' + c.success + c.white(` Finalised — ${result.txHash}`));
156
- }
157
- });
158
-
159
- channel.command("reclaim <channelId>")
160
- .description("Client: reclaim deposit from expired channel")
161
- .option("--json", "JSON output")
162
- .action(async (channelId, opts) => {
163
- const config = loadConfig();
164
- if (!config.serviceAgreementAddress) throw new Error("serviceAgreementAddress missing in config");
165
- const { signer } = await requireSigner(config);
166
- const client = new ChannelClient(config.serviceAgreementAddress, signer);
167
- const result = await client.reclaimExpiredChannel(channelId);
168
- if (opts.json || program.opts().json) {
169
- console.log(JSON.stringify(result, null, 2));
170
- } else {
171
- console.log(' ' + c.success + c.white(` Reclaimed — ${result.txHash}`));
172
- }
173
- });
174
-
175
- channel.command("store-state <channelId> <statePath>")
176
- .description(
177
- "Save a signed channel state to local storage (~/.arc402/channel-states/<channelId>.json) " +
178
- "for the `arc402 daemon channel-watch` to use when auto-challenging stale closes."
179
- )
180
- .option("--json", "JSON output")
181
- .action((channelId, statePath, opts) => {
182
- let raw: string;
183
- try {
184
- raw = fs.readFileSync(statePath, "utf-8");
185
- } catch (err) {
186
- console.error(`Cannot read state file: ${statePath}\n${err}`);
187
- process.exit(1);
188
- }
189
-
190
- let state: Record<string, unknown>;
191
- try {
192
- state = JSON.parse(raw) as Record<string, unknown>;
193
- } catch {
194
- console.error("State file is not valid JSON.");
195
- process.exit(1);
196
- }
197
-
198
- const required = ["sequenceNumber", "cumulativePayment", "callCount", "token", "timestamp", "clientSig", "providerSig"];
199
- for (const field of required) {
200
- if (!(field in state)) {
201
- console.error(`State file missing required field: ${field}`);
202
- process.exit(1);
203
- }
204
- }
205
-
206
- fs.mkdirSync(CHANNEL_STATES_DIR, { recursive: true, mode: 0o700 });
207
- const dest = path.join(CHANNEL_STATES_DIR, `${channelId}.json`);
208
- const stored = { ...state, channelId };
209
- fs.writeFileSync(dest, JSON.stringify(stored, null, 2), { mode: 0o600 });
210
-
211
- if (opts.json || program.opts().json) {
212
- console.log(JSON.stringify({ stored: true, channelId, path: dest }));
213
- } else {
214
- console.log(' ' + c.success + c.white(` State stored — ${dest}`));
215
- console.log(' ' + c.dim(`seq: ${state.sequenceNumber}`));
216
- }
217
- });
218
- }
@@ -1,165 +0,0 @@
1
- import { Command } from "commander";
2
- import { ethers } from "ethers";
3
- import { loadConfig } from "../config.js";
4
- import { getClient, requireSigner } from "../client.js";
5
- import { c } from '../ui/colors.js';
6
- import { startSpinner } from '../ui/spinner.js';
7
- import { renderTree } from '../ui/tree.js';
8
-
9
- const VOUCHING_REGISTRY_ABI = [
10
- "function vouch(address newAgent, uint256 stakeAmount) external payable",
11
- "function getVouchedBoost(address agent) external view returns (uint256)",
12
- "function getVoucher(address agent) external view returns (address)",
13
- ] as const;
14
-
15
- const TRUST_REGISTRY_BOND_ABI = [
16
- "function postBond() external payable",
17
- "function claimBond() external",
18
- "function getBondInfo(address agent) external view returns (uint256 amount, uint256 postedAt, bool active)",
19
- ] as const;
20
-
21
- const BOND_DEFAULT_AMOUNT = ethers.parseEther("0.01");
22
- const BOND_LOCK_SECONDS = 90 * 24 * 60 * 60; // 90 days
23
-
24
- export function registerColdStartCommands(program: Command): void {
25
- // ─── vouch ─────────────────────────────────────────────────────────────────
26
-
27
- program
28
- .command("vouch <address>")
29
- .description("Stake-backed introduction for a new agent (cold start boost)")
30
- .option("--stake <wei>", "Amount to stake in wei (default: 0)")
31
- .option("--signer <key>", "Private key override (hex, 0x-prefixed)")
32
- .option("--json")
33
- .action(async (address, opts) => {
34
- const config = loadConfig();
35
- if (!config.vouchingRegistryAddress) {
36
- console.error("vouchingRegistryAddress not configured. Run `arc402 config set vouchingRegistryAddress <address>`.");
37
- process.exit(1);
38
- }
39
-
40
- let { signer, provider } = await requireSigner(config);
41
- if (opts.signer) {
42
- signer = new ethers.Wallet(opts.signer, provider);
43
- }
44
-
45
- const stakeAmount = opts.stake ? BigInt(opts.stake) : 0n;
46
- const contract = new ethers.Contract(config.vouchingRegistryAddress, VOUCHING_REGISTRY_ABI, signer);
47
-
48
- const spinner = startSpinner(`Vouching for ${address}…`);
49
- const tx = await contract.vouch(address, stakeAmount);
50
- const receipt = await tx.wait();
51
-
52
- const boost = await contract.getVouchedBoost(address);
53
-
54
- const payload = {
55
- newAgent: address,
56
- stakeAmount: stakeAmount.toString(),
57
- boostGranted: boost.toString(),
58
- txHash: receipt.hash,
59
- };
60
- if (opts.json) { spinner.stop(); return console.log(JSON.stringify(payload, null, 2)); }
61
- spinner.succeed(` Vouched — ${address}`);
62
- renderTree([
63
- { label: 'New Agent', value: address },
64
- { label: 'Stake', value: stakeAmount > 0n ? `${ethers.formatEther(stakeAmount)} ETH` : '0' },
65
- { label: 'Boost', value: `+${boost} trust points` },
66
- { label: 'Tx', value: receipt.hash, last: true },
67
- ]);
68
- });
69
-
70
- // ─── bond ──────────────────────────────────────────────────────────────────
71
-
72
- const bond = program
73
- .command("bond")
74
- .description("Bonded-entry cold start: post 0.01 ETH bond for trust boost, or claim after 90 days")
75
- .option("--amount <wei>", `Bond amount in wei (default: ${BOND_DEFAULT_AMOUNT})`)
76
- .option("--claim", "Claim bond after 90-day lock period")
77
- .option("--json")
78
- .action(async (opts) => {
79
- const config = loadConfig();
80
- if (!config.trustRegistryAddress) {
81
- console.error("trustRegistryAddress not configured.");
82
- process.exit(1);
83
- }
84
- const { signer } = await requireSigner(config);
85
- const contract = new ethers.Contract(config.trustRegistryAddress, TRUST_REGISTRY_BOND_ABI, signer);
86
-
87
- if (opts.claim) {
88
- const tx = await contract.claimBond();
89
- const receipt = await tx.wait();
90
- const payload = { claimed: true, txHash: receipt.hash };
91
- if (opts.json) return console.log(JSON.stringify(payload, null, 2));
92
- console.log(`bond claimed`);
93
- console.log(` tx: ${receipt.hash}`);
94
- return;
95
- }
96
-
97
- const amount = opts.amount ? BigInt(opts.amount) : BOND_DEFAULT_AMOUNT;
98
- const bondSpinner = startSpinner('Posting bond…');
99
- const tx = await contract.postBond({ value: amount });
100
- const receipt = await tx.wait();
101
-
102
- const payload = { bonded: true, amount: amount.toString(), txHash: receipt.hash };
103
- if (opts.json) { bondSpinner.stop(); return console.log(JSON.stringify(payload, null, 2)); }
104
- bondSpinner.succeed(` Bond posted — ${ethers.formatEther(amount)} ETH`);
105
- renderTree([
106
- { label: 'Amount', value: `${ethers.formatEther(amount)} ETH` },
107
- { label: 'Tx', value: receipt.hash },
108
- { label: 'Note', value: 'Claimable after 90 days of clean operation', last: true },
109
- ]);
110
- });
111
-
112
- // arc402 bond status <address>
113
- bond
114
- .command("status <address>")
115
- .description("Show active bond and time remaining for an address")
116
- .option("--json")
117
- .action(async (address, opts) => {
118
- const config = loadConfig();
119
- if (!config.trustRegistryAddress) {
120
- console.error("trustRegistryAddress not configured.");
121
- process.exit(1);
122
- }
123
- const { provider } = await getClient(config);
124
- const contract = new ethers.Contract(config.trustRegistryAddress, TRUST_REGISTRY_BOND_ABI, provider);
125
-
126
- let amount: bigint, postedAt: bigint, active: boolean;
127
- try {
128
- const result = await contract.getBondInfo(address);
129
- amount = result.amount;
130
- postedAt = result.postedAt;
131
- active = result.active;
132
- } catch {
133
- const payload = { address, bonded: false };
134
- if (opts.json) return console.log(JSON.stringify(payload, null, 2));
135
- console.log('\n ' + c.mark + c.white(` Bond Status — ${address}`));
136
- renderTree([{ label: 'Status', value: 'No active bond', last: true }]);
137
- return;
138
- }
139
-
140
- const now = Math.floor(Date.now() / 1000);
141
- const claimableAt = Number(postedAt) + BOND_LOCK_SECONDS;
142
- const secondsRemaining = Math.max(0, claimableAt - now);
143
- const daysRemaining = Math.ceil(secondsRemaining / 86400);
144
-
145
- const payload = {
146
- address,
147
- bonded: active,
148
- amount: amount.toString(),
149
- postedAt: new Date(Number(postedAt) * 1000).toISOString(),
150
- claimableAt: new Date(claimableAt * 1000).toISOString(),
151
- daysRemaining,
152
- };
153
- if (opts.json) return console.log(JSON.stringify(payload, null, 2));
154
- console.log('\n ' + c.mark + c.white(` Bond Status — ${address}`));
155
- if (!active) {
156
- renderTree([{ label: 'Status', value: 'No active bond', last: true }]);
157
- return;
158
- }
159
- renderTree([
160
- { label: 'Amount', value: `${ethers.formatEther(amount)} ETH` },
161
- { label: 'Posted', value: new Date(Number(postedAt) * 1000).toISOString() },
162
- { label: 'Claimable', value: daysRemaining > 0 ? `in ${daysRemaining} days` : 'now', last: true },
163
- ]);
164
- });
165
- }
@@ -1,68 +0,0 @@
1
- import { Command } from "commander";
2
- import prompts from "prompts";
3
- import chalk from "chalk";
4
- import { Arc402Config, NETWORK_DEFAULTS, configExists, loadConfig, saveConfig, getSubdomainApi, getWcProjectId } from "../config.js";
5
- import { c } from '../ui/colors.js';
6
-
7
- export function registerConfigCommands(program: Command): void {
8
- const config = program.command("config").description("Manage ARC-402 CLI configuration");
9
- config.command("init").description("Interactive setup for ~/.arc402/config.json").action(async () => {
10
- const existing: Partial<Arc402Config> = configExists() ? loadConfig() : {};
11
- const answers = await prompts([
12
- { type: "select", name: "network", message: "Network", choices: [{ title: "Base Mainnet", value: "base-mainnet" }, { title: "Base Sepolia (testnet)", value: "base-sepolia" }], initial: existing.network === "base-sepolia" ? 1 : 0 },
13
- ]);
14
-
15
- if (!answers.network) { console.log(chalk.red("✗ Setup cancelled")); return; }
16
-
17
- const defaults = NETWORK_DEFAULTS[answers.network] ?? {};
18
- const cfg: Arc402Config = {
19
- network: answers.network,
20
- walletConnectProjectId: getWcProjectId(),
21
- rpcUrl: defaults.rpcUrl ?? "https://mainnet.base.org",
22
- trustRegistryAddress: defaults.trustRegistryAddress ?? "",
23
- agentRegistryAddress: defaults.agentRegistryV2Address ?? defaults.agentRegistryAddress,
24
- serviceAgreementAddress: defaults.serviceAgreementAddress,
25
- reputationOracleAddress: defaults.reputationOracleAddress,
26
- sponsorshipAttestationAddress: defaults.sponsorshipAttestationAddress,
27
- capabilityRegistryAddress: defaults.capabilityRegistryAddress,
28
- governanceAddress: defaults.governanceAddress,
29
- ...(existing.privateKey ? { privateKey: existing.privateKey } : {}),
30
- ...(existing.subdomainApi ? { subdomainApi: existing.subdomainApi } : {}),
31
- ...(existing.telegramBotToken ? { telegramBotToken: existing.telegramBotToken } : {}),
32
- ...(existing.telegramChatId ? { telegramChatId: existing.telegramChatId } : {}),
33
- ...(existing.telegramThreadId ? { telegramThreadId: existing.telegramThreadId } : {}),
34
- ...(existing.walletContractAddress ? { walletContractAddress: existing.walletContractAddress } : {}),
35
- };
36
- saveConfig(cfg);
37
-
38
- console.log();
39
- console.log(' ' + c.success + c.white(' Config saved'));
40
- console.log();
41
- console.log(chalk.dim(" Network ") + chalk.white(answers.network === "base-mainnet" ? "Base Mainnet" : "Base Sepolia"));
42
- console.log(chalk.dim(" RPC ") + chalk.white(cfg.rpcUrl!));
43
- console.log(chalk.dim(" Contracts ") + chalk.white("All protocol addresses loaded"));
44
- console.log();
45
- console.log(chalk.dim(" Next: ") + chalk.white("arc402 wallet deploy"));
46
- console.log();
47
- });
48
- config.command("show").description("Print current config").action(() => {
49
- const cfg = loadConfig();
50
- console.log(JSON.stringify({ ...cfg, privateKey: cfg.privateKey ? "***" : undefined, subdomainApi: getSubdomainApi(cfg) }, null, 2));
51
- });
52
- config.command("set <key> <value>").description("Set a config value: arc402 config set <key> <value>").action((key: string, value: string) => {
53
- const BLOCKED_KEYS = ["privateKey", "guardianPrivateKey", "cdpPrivateKey", "machineKey"];
54
- const ALLOWED_KEYS = ["network", "rpcUrl", "walletContractAddress", "ownerAddress", "walletConnectProjectId", "subdomainApi", "telegramBotToken", "telegramChatId", "telegramThreadId", "handshakeAddress", "policyEngineAddress", "agentRegistryAddress", "agentRegistryV2Address", "trustRegistryAddress", "walletFactoryAddress", "serviceAgreementAddress"];
55
- if (BLOCKED_KEYS.includes(key)) {
56
- console.error(chalk.red("Cannot set sensitive keys via config set. Edit ~/.arc402/config.json directly."));
57
- process.exit(1);
58
- }
59
- if (!ALLOWED_KEYS.includes(key)) {
60
- console.error(chalk.red(`Unknown config key: ${key}. Allowed keys: ${ALLOWED_KEYS.join(", ")}`));
61
- process.exit(1);
62
- }
63
- const cfg = loadConfig();
64
- (cfg as unknown as Record<string, unknown>)[key] = value;
65
- saveConfig(cfg);
66
- console.log(' ' + c.success + c.white(` ${key} = ${value}`));
67
- });
68
- }
@@ -1,166 +0,0 @@
1
- import { Command } from "commander";
2
- import { ethers } from "ethers";
3
- import { loadConfig } from "../config.js";
4
- import { requireSigner } from "../client.js";
5
- import { ContractInteractionClient, IntentPayload } from "@arc402/sdk";
6
-
7
- export function registerContractInteractionCommands(program: Command): void {
8
- const contract = program.command("contract").description("Direct contract interaction via ARC402Wallet");
9
-
10
- contract
11
- .command("call <target> <method> [args...]")
12
- .description("Build, attest, and optionally execute an arbitrary contract call")
13
- .option("--abi <json>", "ABI fragment array as JSON string, e.g. '[\"function swap(...)\"]'")
14
- .option("--value <wei>", "ETH value to send with the call (in wei)", "0")
15
- .option("--min-return <value>", "Minimum return value for slippage guard", "0")
16
- .option("--approval-token <address>", "ERC-20 token to approve before call", ethers.ZeroAddress)
17
- .option("--approval-amount <value>", "Max ERC-20 approval for this call (in token units)", "0")
18
- .option("--with-agreement <id>", "Execute under ServiceAgreement escrow (requires walletContractAddress in config)")
19
- .option("--attest", "Create intent attestation before executing (requires intentAttestationAddress in config)")
20
- .option("--dry-run", "Build and print the encoded payload without executing")
21
- .option("--json", "Output as JSON")
22
- .action(async (target: string, method: string, rawArgs: string[], opts) => {
23
- const config = loadConfig();
24
- const { signer, address } = await requireSigner(config);
25
-
26
- // Parse ABI — accept a JSON array of ABI fragments, or construct a minimal one
27
- let abi: string[];
28
- if (opts.abi) {
29
- try {
30
- abi = JSON.parse(opts.abi) as string[];
31
- } catch {
32
- console.error("--abi must be a valid JSON array of ABI fragments");
33
- process.exit(1);
34
- }
35
- } else {
36
- // Construct a minimal ABI fragment for the method with inferred arg types
37
- const argTypes = rawArgs.map(() => "bytes32").join(", ");
38
- abi = [`function ${method}(${argTypes})`];
39
- }
40
-
41
- // Parse args — attempt JSON parsing for each arg (handles numbers, arrays, objects)
42
- const parsedArgs = rawArgs.map((a) => {
43
- try {
44
- return JSON.parse(a);
45
- } catch {
46
- return a;
47
- }
48
- });
49
-
50
- const intentAttestationAddress = config.intentAttestationAddress;
51
- if (!intentAttestationAddress) {
52
- console.error("intentAttestationAddress missing in config");
53
- process.exit(1);
54
- }
55
-
56
- const client = new ContractInteractionClient(intentAttestationAddress, signer, address);
57
-
58
- let payload: IntentPayload;
59
- try {
60
- payload = client.buildContractCall(target, abi, method, parsedArgs, {
61
- value: BigInt(opts.value),
62
- minReturnValue: BigInt(opts.minReturn),
63
- maxApprovalAmount: BigInt(opts.approvalAmount),
64
- approvalToken: opts.approvalToken,
65
- });
66
- } catch (err) {
67
- console.error(`Failed to encode call: ${err instanceof Error ? err.message : String(err)}`);
68
- process.exit(1);
69
- }
70
-
71
- if (opts.dryRun || (!opts.withAgreement && !opts.attest)) {
72
- if (opts.json) {
73
- console.log(JSON.stringify({
74
- target: payload.target,
75
- data: payload.data,
76
- value: payload.value.toString(),
77
- minReturnValue: payload.minReturnValue.toString(),
78
- maxApprovalAmount: payload.maxApprovalAmount.toString(),
79
- approvalToken: payload.approvalToken,
80
- }, null, 2));
81
- } else {
82
- console.log(`target: ${payload.target}`);
83
- console.log(`method: ${method}`);
84
- console.log(`calldata: ${payload.data}`);
85
- console.log(`value: ${payload.value} wei`);
86
- console.log(`minReturnValue: ${payload.minReturnValue}`);
87
- console.log(`approvalToken: ${payload.approvalToken}`);
88
- console.log(`maxApprovalAmount:${payload.maxApprovalAmount}`);
89
- }
90
- return;
91
- }
92
-
93
- // Attest intent before execution if requested
94
- let attestationId: string | undefined;
95
- if (opts.attest) {
96
- console.log("Creating intent attestation…");
97
- try {
98
- const attestation = await client.signAndAttestContractCall(payload, signer);
99
- attestationId = attestation.attestationId;
100
- console.log(`attestationId: ${attestationId}`);
101
- } catch (err) {
102
- console.error(`Attestation failed: ${err instanceof Error ? err.message : String(err)}`);
103
- process.exit(1);
104
- }
105
- }
106
-
107
- // Execute under agreement escrow
108
- if (opts.withAgreement !== undefined) {
109
- if (!config.walletContractAddress) {
110
- console.error("walletContractAddress missing in config — required for --with-agreement");
111
- process.exit(1);
112
- }
113
-
114
- console.log(`Executing contract call under agreement ${opts.withAgreement}…`);
115
- try {
116
- const tx = await client.executeWithEscrow(config.walletContractAddress, payload, signer);
117
- const receipt = await tx.wait();
118
-
119
- if (opts.json) {
120
- console.log(JSON.stringify({
121
- txHash: receipt!.hash,
122
- status: receipt!.status === 1 ? "success" : "reverted",
123
- blockNumber: receipt!.blockNumber,
124
- ...(attestationId ? { attestationId } : {}),
125
- }, null, 2));
126
- } else {
127
- console.log(`tx: ${receipt!.hash}`);
128
- console.log(`block: ${receipt!.blockNumber}`);
129
- console.log(`status: ${receipt!.status === 1 ? "success" : "reverted"}`);
130
- if (attestationId) console.log(`attestationId: ${attestationId}`);
131
- }
132
- } catch (err) {
133
- console.error(`Execution failed: ${err instanceof Error ? err.message : String(err)}`);
134
- process.exit(1);
135
- }
136
- }
137
- });
138
-
139
- contract
140
- .command("verify <txHash>")
141
- .description("Verify the result of a previously submitted contract call")
142
- .option("--expected <hex>", "Expected return data (hex) to verify against")
143
- .option("--json")
144
- .action(async (txHash: string, opts) => {
145
- const config = loadConfig();
146
- const { signer, address } = await requireSigner(config);
147
-
148
- const intentAttestationAddress = config.intentAttestationAddress;
149
- if (!intentAttestationAddress) {
150
- console.error("intentAttestationAddress missing in config");
151
- process.exit(1);
152
- }
153
-
154
- const client = new ContractInteractionClient(intentAttestationAddress, signer, address);
155
- const result = await client.verifyContractCallResult(txHash, opts.expected);
156
-
157
- if (opts.json) {
158
- console.log(JSON.stringify(result, null, 2));
159
- } else {
160
- console.log(`txHash: ${result.txHash}`);
161
- console.log(`success: ${result.success}`);
162
- if (result.blockNumber !== undefined) console.log(`blockNumber: ${result.blockNumber}`);
163
- if (result.returnData) console.log(`returnData: ${result.returnData}`);
164
- }
165
- });
166
- }