@sequence0/blockclaw 2.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 (190) hide show
  1. package/README.md +97 -0
  2. package/dist/agent/binary.d.ts +15 -0
  3. package/dist/agent/binary.d.ts.map +1 -0
  4. package/dist/agent/binary.js +172 -0
  5. package/dist/agent/binary.js.map +1 -0
  6. package/dist/agent/chains.d.ts +26 -0
  7. package/dist/agent/chains.d.ts.map +1 -0
  8. package/dist/agent/chains.js +123 -0
  9. package/dist/agent/chains.js.map +1 -0
  10. package/dist/agent/client.d.ts +484 -0
  11. package/dist/agent/client.d.ts.map +1 -0
  12. package/dist/agent/client.js +448 -0
  13. package/dist/agent/client.js.map +1 -0
  14. package/dist/agent/config.d.ts +75 -0
  15. package/dist/agent/config.d.ts.map +1 -0
  16. package/dist/agent/config.js +133 -0
  17. package/dist/agent/config.js.map +1 -0
  18. package/dist/agent/process.d.ts +36 -0
  19. package/dist/agent/process.d.ts.map +1 -0
  20. package/dist/agent/process.js +208 -0
  21. package/dist/agent/process.js.map +1 -0
  22. package/dist/agent/wallet.d.ts +43 -0
  23. package/dist/agent/wallet.d.ts.map +1 -0
  24. package/dist/agent/wallet.js +146 -0
  25. package/dist/agent/wallet.js.map +1 -0
  26. package/dist/ai/brain.d.ts +21 -0
  27. package/dist/ai/brain.d.ts.map +1 -0
  28. package/dist/ai/brain.js +117 -0
  29. package/dist/ai/brain.js.map +1 -0
  30. package/dist/ai/prompts.d.ts +15 -0
  31. package/dist/ai/prompts.d.ts.map +1 -0
  32. package/dist/ai/prompts.js +67 -0
  33. package/dist/ai/prompts.js.map +1 -0
  34. package/dist/ai/rules.d.ts +19 -0
  35. package/dist/ai/rules.d.ts.map +1 -0
  36. package/dist/ai/rules.js +143 -0
  37. package/dist/ai/rules.js.map +1 -0
  38. package/dist/core/detector.d.ts +16 -0
  39. package/dist/core/detector.d.ts.map +1 -0
  40. package/dist/core/detector.js +90 -0
  41. package/dist/core/detector.js.map +1 -0
  42. package/dist/core/healer.d.ts +62 -0
  43. package/dist/core/healer.d.ts.map +1 -0
  44. package/dist/core/healer.js +355 -0
  45. package/dist/core/healer.js.map +1 -0
  46. package/dist/core/heartbeat.d.ts +67 -0
  47. package/dist/core/heartbeat.d.ts.map +1 -0
  48. package/dist/core/heartbeat.js +426 -0
  49. package/dist/core/heartbeat.js.map +1 -0
  50. package/dist/core/memory.d.ts +57 -0
  51. package/dist/core/memory.d.ts.map +1 -0
  52. package/dist/core/memory.js +149 -0
  53. package/dist/core/memory.js.map +1 -0
  54. package/dist/core/updater.d.ts +16 -0
  55. package/dist/core/updater.d.ts.map +1 -0
  56. package/dist/core/updater.js +107 -0
  57. package/dist/core/updater.js.map +1 -0
  58. package/dist/index.d.ts +3 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +97 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/interface/commands/ask.d.ts +3 -0
  63. package/dist/interface/commands/ask.d.ts.map +1 -0
  64. package/dist/interface/commands/ask.js +39 -0
  65. package/dist/interface/commands/ask.js.map +1 -0
  66. package/dist/interface/commands/backup.d.ts +3 -0
  67. package/dist/interface/commands/backup.d.ts.map +1 -0
  68. package/dist/interface/commands/backup.js +576 -0
  69. package/dist/interface/commands/backup.js.map +1 -0
  70. package/dist/interface/commands/config.d.ts +3 -0
  71. package/dist/interface/commands/config.d.ts.map +1 -0
  72. package/dist/interface/commands/config.js +107 -0
  73. package/dist/interface/commands/config.js.map +1 -0
  74. package/dist/interface/commands/daemon.d.ts +3 -0
  75. package/dist/interface/commands/daemon.d.ts.map +1 -0
  76. package/dist/interface/commands/daemon.js +162 -0
  77. package/dist/interface/commands/daemon.js.map +1 -0
  78. package/dist/interface/commands/doctor.d.ts +3 -0
  79. package/dist/interface/commands/doctor.d.ts.map +1 -0
  80. package/dist/interface/commands/doctor.js +143 -0
  81. package/dist/interface/commands/doctor.js.map +1 -0
  82. package/dist/interface/commands/earnings.d.ts +3 -0
  83. package/dist/interface/commands/earnings.d.ts.map +1 -0
  84. package/dist/interface/commands/earnings.js +165 -0
  85. package/dist/interface/commands/earnings.js.map +1 -0
  86. package/dist/interface/commands/health.d.ts +3 -0
  87. package/dist/interface/commands/health.d.ts.map +1 -0
  88. package/dist/interface/commands/health.js +48 -0
  89. package/dist/interface/commands/health.js.map +1 -0
  90. package/dist/interface/commands/history.d.ts +3 -0
  91. package/dist/interface/commands/history.d.ts.map +1 -0
  92. package/dist/interface/commands/history.js +113 -0
  93. package/dist/interface/commands/history.js.map +1 -0
  94. package/dist/interface/commands/info.d.ts +3 -0
  95. package/dist/interface/commands/info.d.ts.map +1 -0
  96. package/dist/interface/commands/info.js +82 -0
  97. package/dist/interface/commands/info.js.map +1 -0
  98. package/dist/interface/commands/logs.d.ts +3 -0
  99. package/dist/interface/commands/logs.d.ts.map +1 -0
  100. package/dist/interface/commands/logs.js +98 -0
  101. package/dist/interface/commands/logs.js.map +1 -0
  102. package/dist/interface/commands/menu.d.ts +4 -0
  103. package/dist/interface/commands/menu.d.ts.map +1 -0
  104. package/dist/interface/commands/menu.js +156 -0
  105. package/dist/interface/commands/menu.js.map +1 -0
  106. package/dist/interface/commands/receive.d.ts +3 -0
  107. package/dist/interface/commands/receive.d.ts.map +1 -0
  108. package/dist/interface/commands/receive.js +81 -0
  109. package/dist/interface/commands/receive.js.map +1 -0
  110. package/dist/interface/commands/register.d.ts +3 -0
  111. package/dist/interface/commands/register.d.ts.map +1 -0
  112. package/dist/interface/commands/register.js +231 -0
  113. package/dist/interface/commands/register.js.map +1 -0
  114. package/dist/interface/commands/restart.d.ts +3 -0
  115. package/dist/interface/commands/restart.d.ts.map +1 -0
  116. package/dist/interface/commands/restart.js +154 -0
  117. package/dist/interface/commands/restart.js.map +1 -0
  118. package/dist/interface/commands/send.d.ts +3 -0
  119. package/dist/interface/commands/send.d.ts.map +1 -0
  120. package/dist/interface/commands/send.js +108 -0
  121. package/dist/interface/commands/send.js.map +1 -0
  122. package/dist/interface/commands/service.d.ts +3 -0
  123. package/dist/interface/commands/service.d.ts.map +1 -0
  124. package/dist/interface/commands/service.js +474 -0
  125. package/dist/interface/commands/service.js.map +1 -0
  126. package/dist/interface/commands/setup.d.ts +5 -0
  127. package/dist/interface/commands/setup.d.ts.map +1 -0
  128. package/dist/interface/commands/setup.js +410 -0
  129. package/dist/interface/commands/setup.js.map +1 -0
  130. package/dist/interface/commands/start.d.ts +3 -0
  131. package/dist/interface/commands/start.d.ts.map +1 -0
  132. package/dist/interface/commands/start.js +171 -0
  133. package/dist/interface/commands/start.js.map +1 -0
  134. package/dist/interface/commands/status.d.ts +3 -0
  135. package/dist/interface/commands/status.d.ts.map +1 -0
  136. package/dist/interface/commands/status.js +77 -0
  137. package/dist/interface/commands/status.js.map +1 -0
  138. package/dist/interface/commands/stop.d.ts +3 -0
  139. package/dist/interface/commands/stop.d.ts.map +1 -0
  140. package/dist/interface/commands/stop.js +62 -0
  141. package/dist/interface/commands/stop.js.map +1 -0
  142. package/dist/interface/commands/update.d.ts +3 -0
  143. package/dist/interface/commands/update.d.ts.map +1 -0
  144. package/dist/interface/commands/update.js +53 -0
  145. package/dist/interface/commands/update.js.map +1 -0
  146. package/dist/interface/commands/wallet.d.ts +3 -0
  147. package/dist/interface/commands/wallet.d.ts.map +1 -0
  148. package/dist/interface/commands/wallet.js +446 -0
  149. package/dist/interface/commands/wallet.js.map +1 -0
  150. package/dist/interface/commands/webhook.d.ts +3 -0
  151. package/dist/interface/commands/webhook.d.ts.map +1 -0
  152. package/dist/interface/commands/webhook.js +99 -0
  153. package/dist/interface/commands/webhook.js.map +1 -0
  154. package/dist/interface/commands/withdraw.d.ts +3 -0
  155. package/dist/interface/commands/withdraw.d.ts.map +1 -0
  156. package/dist/interface/commands/withdraw.js +261 -0
  157. package/dist/interface/commands/withdraw.js.map +1 -0
  158. package/dist/interface/interactive.d.ts +43 -0
  159. package/dist/interface/interactive.d.ts.map +1 -0
  160. package/dist/interface/interactive.js +276 -0
  161. package/dist/interface/interactive.js.map +1 -0
  162. package/dist/interface/logo.d.ts +2 -0
  163. package/dist/interface/logo.d.ts.map +1 -0
  164. package/dist/interface/logo.js +21 -0
  165. package/dist/interface/logo.js.map +1 -0
  166. package/dist/interface/webhooks.d.ts +19 -0
  167. package/dist/interface/webhooks.d.ts.map +1 -0
  168. package/dist/interface/webhooks.js +172 -0
  169. package/dist/interface/webhooks.js.map +1 -0
  170. package/dist/utils/format.d.ts +19 -0
  171. package/dist/utils/format.d.ts.map +1 -0
  172. package/dist/utils/format.js +107 -0
  173. package/dist/utils/format.js.map +1 -0
  174. package/dist/utils/logger.d.ts +20 -0
  175. package/dist/utils/logger.d.ts.map +1 -0
  176. package/dist/utils/logger.js +47 -0
  177. package/dist/utils/logger.js.map +1 -0
  178. package/dist/utils/paths.d.ts +35 -0
  179. package/dist/utils/paths.d.ts.map +1 -0
  180. package/dist/utils/paths.js +45 -0
  181. package/dist/utils/paths.js.map +1 -0
  182. package/dist/utils/platform.d.ts +26 -0
  183. package/dist/utils/platform.d.ts.map +1 -0
  184. package/dist/utils/platform.js +72 -0
  185. package/dist/utils/platform.js.map +1 -0
  186. package/dist/version.d.ts +3 -0
  187. package/dist/version.d.ts.map +1 -0
  188. package/dist/version.js +3 -0
  189. package/dist/version.js.map +1 -0
  190. package/package.json +67 -0
@@ -0,0 +1,261 @@
1
+ import pc from "picocolors";
2
+ import * as p from "@clack/prompts";
3
+ import { AgentClient, AgentClientError } from "../../agent/client.js";
4
+ import { isAgentRunning } from "../../agent/process.js";
5
+ import { readBlockclawConfig, readAgentConfig } from "../../agent/config.js";
6
+ import { logger } from "../../utils/logger.js";
7
+ import { truncate } from "../../utils/format.js";
8
+ // ---------------------------------------------------------------------------
9
+ // Network config
10
+ // ---------------------------------------------------------------------------
11
+ const FEE_COLLECTOR = {
12
+ mainnet: {
13
+ address: "0xccd70007534c33b0ab3997d81207fea5e59ca54a",
14
+ chainId: 800801,
15
+ rpcUrl: "https://rpc.sequence0.network",
16
+ explorerBase: "https://explorer.sequence0.network",
17
+ },
18
+ testnet: {
19
+ address: "0xc017d0a5da9369003095325229de1e70f0e33a1c",
20
+ chainId: 800800,
21
+ rpcUrl: "https://testnet-rpc.sequence0.network",
22
+ explorerBase: "https://testnet.explorer.sequence0.network",
23
+ },
24
+ };
25
+ const FAUCET_URL = "https://faucet.sequence0.network";
26
+ // ---------------------------------------------------------------------------
27
+ // Command registration
28
+ // ---------------------------------------------------------------------------
29
+ export function register(program) {
30
+ program
31
+ .command("withdraw")
32
+ .description("Withdraw accumulated signing fees to your node wallet")
33
+ .option("--network <network>", "Network to withdraw from (testnet or mainnet)")
34
+ .action(async (opts) => {
35
+ try {
36
+ await runWithdraw(opts);
37
+ }
38
+ catch (err) {
39
+ if (err instanceof Error && err.message === "CANCEL") {
40
+ p.cancel("Withdrawal cancelled.");
41
+ process.exit(0);
42
+ }
43
+ logger.error(`Withdrawal failed: ${err.message}`);
44
+ process.exit(1);
45
+ }
46
+ });
47
+ }
48
+ // ---------------------------------------------------------------------------
49
+ // Cancel guard
50
+ // ---------------------------------------------------------------------------
51
+ function guard(value) {
52
+ if (p.isCancel(value))
53
+ throw new Error("CANCEL");
54
+ return value;
55
+ }
56
+ // ---------------------------------------------------------------------------
57
+ // Main flow
58
+ // ---------------------------------------------------------------------------
59
+ async function runWithdraw(opts) {
60
+ const config = readBlockclawConfig();
61
+ const agentConfig = readAgentConfig();
62
+ const apiPort = config.api_port ?? agentConfig?.api_port ?? 8080;
63
+ // Step 1: Check agent is running and healthy
64
+ const proc = isAgentRunning();
65
+ if (!proc.running) {
66
+ logger.error("Your node is not running. Start it first with: blockclaw start");
67
+ process.exit(1);
68
+ }
69
+ const client = new AgentClient(`http://localhost:${apiPort}`);
70
+ const healthy = await client.isHealthy();
71
+ if (!healthy) {
72
+ logger.error("Your node is running but not responding. It may still be starting up — try again in a moment.");
73
+ process.exit(1);
74
+ }
75
+ p.intro(pc.bgCyan(pc.black(" blockclaw withdraw ")));
76
+ const network = opts.network ?? config.network ?? agentConfig?.network ?? "testnet";
77
+ const feeInfo = FEE_COLLECTOR[network];
78
+ if (!feeInfo) {
79
+ logger.error(`Unknown network: ${network}. Use 'testnet' or 'mainnet'.`);
80
+ process.exit(1);
81
+ }
82
+ // Step 2: Get agent info and pending earnings
83
+ const spin = p.spinner();
84
+ spin.start("Checking pending earnings");
85
+ let peerId;
86
+ try {
87
+ const health = await client.health();
88
+ peerId = health.peer_id;
89
+ }
90
+ catch {
91
+ spin.stop(pc.red("Could not reach your node"));
92
+ logger.error("Failed to connect to your node. Make sure it is running and healthy.");
93
+ process.exit(1);
94
+ return; // unreachable, satisfies TS
95
+ }
96
+ // Query on-chain pending earnings from FeeCollector
97
+ let pendingWei;
98
+ try {
99
+ pendingWei = await queryPendingWithdrawal(feeInfo.rpcUrl, feeInfo.address, peerId);
100
+ }
101
+ catch (err) {
102
+ spin.stop(pc.red("Could not check earnings"));
103
+ const msg = err instanceof Error ? err.message : String(err);
104
+ if (msg.includes("abort") || msg.includes("timeout")) {
105
+ logger.error(`Could not reach the ${network} network. The RPC endpoint may be temporarily unavailable.`);
106
+ }
107
+ else {
108
+ logger.error(`Failed to check your pending earnings on-chain. This may be a temporary network issue.\n Detail: ${msg}`);
109
+ }
110
+ process.exit(1);
111
+ return;
112
+ }
113
+ spin.stop("Earnings checked");
114
+ // Step 3: Check if there's anything to withdraw
115
+ const pendingBigInt = BigInt(pendingWei);
116
+ if (pendingBigInt === 0n) {
117
+ p.note([
118
+ "You have no pending earnings to withdraw right now.",
119
+ "",
120
+ `${pc.dim("Node ID:")} ${truncate(peerId, 20)}`,
121
+ `${pc.dim("Network:")} ${pc.cyan(network)}`,
122
+ "",
123
+ "Earnings accumulate as your node participates in signing sessions.",
124
+ `Run ${pc.cyan("blockclaw earnings")} to see your full activity summary.`,
125
+ ].join("\n"), "No Pending Earnings");
126
+ p.outro(pc.dim("Check back after your node has completed more signing sessions."));
127
+ return;
128
+ }
129
+ // Step 4: Show pending amount
130
+ const ethAmount = formatWei(pendingWei);
131
+ p.note([
132
+ `${pc.bold("Pending Earnings")}`,
133
+ `${"─".repeat(20)}`,
134
+ `${pc.dim("Amount:")} ${pc.green(pc.bold(ethAmount))}`,
135
+ `${pc.dim("Network:")} ${pc.cyan(network)}`,
136
+ `${pc.dim("Node ID:")} ${truncate(peerId, 20)}`,
137
+ ].join("\n"), "Withdrawal");
138
+ // Step 5: Confirm withdrawal
139
+ const confirmed = guard(await p.select({
140
+ message: `Withdraw ${pc.bold(ethAmount)} to your node's wallet?`,
141
+ options: [
142
+ { value: true, label: "Yes, withdraw now" },
143
+ { value: false, label: "No, keep accumulating" },
144
+ ],
145
+ }));
146
+ if (!confirmed) {
147
+ p.outro(pc.dim("Earnings will keep accumulating until you withdraw."));
148
+ return;
149
+ }
150
+ // Step 6: Submit withdrawal via agent
151
+ spin.start("Submitting withdrawal transaction");
152
+ try {
153
+ const result = await client.withdraw();
154
+ spin.stop(pc.green("Withdrawal submitted!"));
155
+ const txHash = result.tx_hash;
156
+ const withdrawnAmount = result.amount ? formatWei(result.amount) : ethAmount;
157
+ if (txHash) {
158
+ const shortHash = txHash.length > 14
159
+ ? `${txHash.slice(0, 6)}...${txHash.slice(-4)}`
160
+ : txHash;
161
+ p.note([
162
+ pc.green("Withdrawal submitted!"),
163
+ "",
164
+ `${pc.dim("Transaction:")} ${txHash}`,
165
+ `${pc.dim("Amount:")} ${pc.green(withdrawnAmount)}`,
166
+ `${pc.dim("Explorer:")} ${feeInfo.explorerBase}/tx/${txHash}`,
167
+ "",
168
+ pc.dim("The transaction should confirm within a few seconds."),
169
+ ].join("\n"), "Success");
170
+ }
171
+ else {
172
+ p.note([
173
+ `Withdrawal ${result.status === "pending" ? "is being processed" : result.status}.`,
174
+ "",
175
+ `${pc.dim("Amount:")} ${pc.green(withdrawnAmount)}`,
176
+ `${pc.dim("Status:")} ${result.status}`,
177
+ ].join("\n"), "Withdrawal");
178
+ }
179
+ }
180
+ catch (err) {
181
+ spin.stop(pc.red("Withdrawal failed"));
182
+ const msg = err instanceof Error ? err.message : String(err);
183
+ const status = err instanceof AgentClientError ? err.status : 0;
184
+ if (msg.includes("insufficient") || msg.includes("gas") || msg.includes("balance")) {
185
+ // Insufficient gas to send the withdrawal transaction
186
+ p.log.error("Your node doesn't have enough ETH to pay for the withdrawal transaction gas fee.");
187
+ p.log.info(`Send a small amount of ETH (0.001 is enough) to your node's wallet on the ${pc.bold("Sequence0")} chain.`);
188
+ if (network === "testnet") {
189
+ p.log.info(`Get testnet ETH at ${pc.underline(pc.cyan(FAUCET_URL))}`);
190
+ }
191
+ }
192
+ else if (status === 404 || msg.includes("not found") || msg.includes("endpoint")) {
193
+ // Agent version doesn't support /withdraw yet
194
+ p.log.warn("Your node version doesn't support withdrawals yet.");
195
+ p.log.info(`Update your node with ${pc.cyan("blockclaw update")} and try again.`);
196
+ }
197
+ else if (msg.includes("timeout") || msg.includes("abort")) {
198
+ // Transaction took too long
199
+ p.log.error("The withdrawal transaction timed out. The network may be congested.");
200
+ p.log.info("Your earnings are safe. Try again in a few minutes.");
201
+ }
202
+ else if (msg.includes("nonce") || msg.includes("replacement")) {
203
+ // Nonce conflict
204
+ p.log.error("There is already a pending transaction from your node.");
205
+ p.log.info("Wait for it to confirm, then try withdrawing again.");
206
+ }
207
+ else {
208
+ // Generic error
209
+ p.log.error(`Something went wrong: ${msg}`);
210
+ p.log.info("Your earnings are safe on-chain. You can try again later.");
211
+ }
212
+ }
213
+ p.outro(pc.dim("Done."));
214
+ }
215
+ // ---------------------------------------------------------------------------
216
+ // On-chain query helpers
217
+ // ---------------------------------------------------------------------------
218
+ /** Query pending withdrawal amount from FeeCollector contract */
219
+ async function queryPendingWithdrawal(rpcUrl, feeCollectorAddress, peerId) {
220
+ // pendingWithdrawal(bytes32 agentId) -> uint256
221
+ const selector = "0x2c46d8e8"; // keccak256("pendingWithdrawal(bytes32)")[:4]
222
+ const peerIdHex = Buffer.from(peerId).toString("hex").padEnd(64, "0");
223
+ const callData = selector + peerIdHex;
224
+ const controller = new AbortController();
225
+ const timer = setTimeout(() => controller.abort(), 10_000);
226
+ try {
227
+ const res = await fetch(rpcUrl, {
228
+ method: "POST",
229
+ headers: { "Content-Type": "application/json" },
230
+ body: JSON.stringify({
231
+ jsonrpc: "2.0",
232
+ method: "eth_call",
233
+ params: [{ to: feeCollectorAddress, data: callData }, "latest"],
234
+ id: 1,
235
+ }),
236
+ signal: controller.signal,
237
+ });
238
+ const json = await res.json();
239
+ if (json.error)
240
+ throw new Error(json.error.message);
241
+ if (!json.result || json.result === "0x")
242
+ return "0";
243
+ return BigInt(json.result).toString();
244
+ }
245
+ finally {
246
+ clearTimeout(timer);
247
+ }
248
+ }
249
+ /** Format wei to ETH string */
250
+ function formatWei(wei) {
251
+ const value = BigInt(wei);
252
+ const eth = Number(value) / 1e18;
253
+ if (eth === 0)
254
+ return "0 ETH";
255
+ if (eth < 0.000001)
256
+ return `${eth.toExponential(2)} ETH`;
257
+ if (eth < 0.001)
258
+ return `${eth.toFixed(6)} ETH`;
259
+ return `${eth.toFixed(3)} ETH`;
260
+ }
261
+ //# sourceMappingURL=withdraw.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"withdraw.js","sourceRoot":"","sources":["../../../src/interface/commands/withdraw.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Shared interactive prompt helpers using @clack/prompts.
3
+ *
4
+ * Design principles:
5
+ * - Always use selectable options — never ask the user to type/enter values
6
+ * - Only exception: wallet name and recipient address (must be typed)
7
+ * - No technical jargon — no curves, no thresholds, no peer counts
8
+ * - CLI flags bypass prompts for power users
9
+ */
10
+ import { AgentClient } from "../agent/client.js";
11
+ export interface WalletChoice {
12
+ walletId: string;
13
+ address: string;
14
+ curve: string;
15
+ }
16
+ /** Exit the process when the user cancels a prompt (Ctrl+C). */
17
+ export declare function handleCancel(): never;
18
+ /**
19
+ * Select a wallet from the agent's wallet list.
20
+ * - Hides internal "-ed" wallet pairs (shown as one universal wallet)
21
+ * - If `preselected` is provided (from a --wallet flag), skip the prompt.
22
+ * - If the agent has exactly one wallet, auto-select it.
23
+ */
24
+ export declare function selectWallet(client: AgentClient, preselected?: string): Promise<WalletChoice>;
25
+ /**
26
+ * Select a chain. Shows ALL supported chains grouped by category.
27
+ * For universal wallets, shows all chains. For single-curve wallets,
28
+ * only shows compatible chains.
29
+ */
30
+ export declare function selectChain(curve?: string, preselected?: string): Promise<string>;
31
+ /** Prompt for a recipient address with basic validation. */
32
+ export declare function inputAddress(preselected?: string): Promise<string>;
33
+ /** Prompt for an amount — offer common presets + custom input. */
34
+ export declare function inputAmount(symbol: string, preselected?: string): Promise<string>;
35
+ /** Confirm an action before proceeding. */
36
+ export declare function confirmAction(message: string): Promise<boolean>;
37
+ /** Show a spinner while performing async work. */
38
+ export declare function withSpinner<T>(message: string, fn: () => Promise<T>): Promise<T>;
39
+ /** Select network (testnet / mainnet). */
40
+ export declare function selectNetwork(preselected?: string): Promise<string>;
41
+ /** Prompt for a wallet name. */
42
+ export declare function inputWalletName(preselected?: string): Promise<string>;
43
+ //# sourceMappingURL=interactive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.d.ts","sourceRoot":"","sources":["../../src/interface/interactive.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAOjD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,gEAAgE;AAChE,wBAAgB,YAAY,IAAI,KAAK,CAGpC;AAYD;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,WAAW,EACnB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,YAAY,CAAC,CAkEvB;AAMD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,KAAK,CAAC,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAwDjB;AAMD,4DAA4D;AAC5D,wBAAsB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBxE;AAMD,kEAAkE;AAClE,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CA0CjB;AAMD,2CAA2C;AAC3C,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAGrE;AAMD,kDAAkD;AAClD,wBAAsB,WAAW,CAAC,CAAC,EACjC,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACnB,OAAO,CAAC,CAAC,CAAC,CAWZ;AAMD,0CAA0C;AAC1C,wBAAsB,aAAa,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAczE;AAMD,gCAAgC;AAChC,wBAAsB,eAAe,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB3E"}
@@ -0,0 +1,276 @@
1
+ /**
2
+ * Shared interactive prompt helpers using @clack/prompts.
3
+ *
4
+ * Design principles:
5
+ * - Always use selectable options — never ask the user to type/enter values
6
+ * - Only exception: wallet name and recipient address (must be typed)
7
+ * - No technical jargon — no curves, no thresholds, no peer counts
8
+ * - CLI flags bypass prompts for power users
9
+ */
10
+ import * as p from "@clack/prompts";
11
+ import pc from "picocolors";
12
+ import { CHAINS, getChainsForCurve } from "../agent/chains.js";
13
+ // ---------------------------------------------------------------------------
14
+ // Cancel helper
15
+ // ---------------------------------------------------------------------------
16
+ /** Exit the process when the user cancels a prompt (Ctrl+C). */
17
+ export function handleCancel() {
18
+ p.cancel("Operation cancelled.");
19
+ process.exit(0);
20
+ }
21
+ /** Guard: if the value is a cancel symbol, exit. */
22
+ function guard(value) {
23
+ if (p.isCancel(value))
24
+ handleCancel();
25
+ return value;
26
+ }
27
+ // ---------------------------------------------------------------------------
28
+ // Wallet selection
29
+ // ---------------------------------------------------------------------------
30
+ /**
31
+ * Select a wallet from the agent's wallet list.
32
+ * - Hides internal "-ed" wallet pairs (shown as one universal wallet)
33
+ * - If `preselected` is provided (from a --wallet flag), skip the prompt.
34
+ * - If the agent has exactly one wallet, auto-select it.
35
+ */
36
+ export async function selectWallet(client, preselected) {
37
+ const wallets = await client.wallets();
38
+ if (wallets.length === 0) {
39
+ p.log.error("No wallets found. Create one with: blockclaw wallet create");
40
+ process.exit(1);
41
+ }
42
+ // Flag-based bypass
43
+ if (preselected) {
44
+ const match = wallets.find((w) => w.wallet_id === preselected);
45
+ if (!match) {
46
+ p.log.error(`Wallet "${preselected}" not found.`);
47
+ process.exit(1);
48
+ }
49
+ return {
50
+ walletId: match.wallet_id,
51
+ address: match.address,
52
+ curve: match.chain ?? "secp256k1",
53
+ };
54
+ }
55
+ // Filter out "-ed" halves of universal wallet pairs
56
+ const visibleWallets = wallets.filter((w) => {
57
+ if (w.wallet_id.endsWith("-ed")) {
58
+ const baseName = w.wallet_id.slice(0, -3);
59
+ return !wallets.some((x) => x.wallet_id === baseName);
60
+ }
61
+ return true;
62
+ });
63
+ // Auto-select if only one
64
+ if (visibleWallets.length === 1) {
65
+ const w = visibleWallets[0];
66
+ p.log.info(`Using wallet: ${pc.cyan(w.wallet_id)}`);
67
+ return {
68
+ walletId: w.wallet_id,
69
+ address: w.address,
70
+ curve: w.chain ?? "secp256k1",
71
+ };
72
+ }
73
+ const selected = guard(await p.select({
74
+ message: "Select wallet",
75
+ options: visibleWallets.map((w) => {
76
+ const addr = w.address
77
+ ? `${w.address.slice(0, 6)}...${w.address.slice(-4)}`
78
+ : "creating...";
79
+ const hasEdPair = wallets.some((x) => x.wallet_id === `${w.wallet_id}-ed`);
80
+ const chainHint = hasEdPair ? "all chains" : `${getChainsForCurve(w.chain ?? "secp256k1").length} chains`;
81
+ return {
82
+ value: w.wallet_id,
83
+ label: `${w.wallet_id} ${pc.dim(addr)}`,
84
+ hint: chainHint,
85
+ };
86
+ }),
87
+ }));
88
+ const wallet = wallets.find((w) => w.wallet_id === selected);
89
+ return {
90
+ walletId: wallet.wallet_id,
91
+ address: wallet.address,
92
+ curve: wallet.chain ?? "secp256k1",
93
+ };
94
+ }
95
+ // ---------------------------------------------------------------------------
96
+ // Chain selection — grouped by category, no jargon
97
+ // ---------------------------------------------------------------------------
98
+ /**
99
+ * Select a chain. Shows ALL supported chains grouped by category.
100
+ * For universal wallets, shows all chains. For single-curve wallets,
101
+ * only shows compatible chains.
102
+ */
103
+ export async function selectChain(curve, preselected) {
104
+ // Get compatible chains — if no curve specified, show all
105
+ const chains = curve ? getChainsForCurve(curve) : CHAINS;
106
+ if (preselected) {
107
+ const match = chains.find((c) => c.id === preselected);
108
+ if (!match) {
109
+ p.log.error(`Chain "${preselected}" is not supported.`);
110
+ process.exit(1);
111
+ }
112
+ return match.id;
113
+ }
114
+ // Group chains by category for better UX
115
+ const evmL1 = chains.filter((c) => c.curve === "secp256k1" && !c.id.includes("zk") && !["arbitrum", "optimism", "base", "blast", "mode", "manta", "scroll", "linea", "bob", "taiko", "worldchain", "metis", "boba", "mantle", "zora", "opbnb", "neon-evm"].includes(c.id) && !["bitcoin", "dogecoin", "litecoin", "cosmos", "tron", "ripple"].includes(c.id));
116
+ const evmL2 = chains.filter((c) => ["arbitrum", "optimism", "base", "blast", "mode", "manta", "scroll", "linea", "zksync", "polygon-zkevm", "bob", "taiko", "worldchain", "metis", "boba", "mantle", "zora", "opbnb", "neon-evm"].includes(c.id));
117
+ const nonEvmSecp = chains.filter((c) => ["bitcoin", "dogecoin", "litecoin", "cosmos", "tron", "ripple"].includes(c.id));
118
+ const edChains = chains.filter((c) => c.curve === "ed25519");
119
+ // Build flat option list with visual separators
120
+ const options = [];
121
+ function addGroup(label, groupChains) {
122
+ if (groupChains.length === 0)
123
+ return;
124
+ options.push({
125
+ value: `__sep_${label}`,
126
+ label: `${pc.dim("─")} ${pc.bold(label)}`,
127
+ });
128
+ for (const c of groupChains) {
129
+ options.push({
130
+ value: c.id,
131
+ label: ` ${c.name}`,
132
+ hint: c.symbol,
133
+ });
134
+ }
135
+ }
136
+ addGroup("Popular", chains.filter((c) => ["ethereum", "bitcoin", "solana", "polygon", "arbitrum", "base", "bsc"].includes(c.id)));
137
+ addGroup("Layer 2", evmL2.filter((c) => !["arbitrum", "base"].includes(c.id)));
138
+ addGroup("EVM Chains", evmL1.filter((c) => !["ethereum", "polygon", "bsc"].includes(c.id)));
139
+ addGroup("Bitcoin & Others", nonEvmSecp);
140
+ addGroup("Solana Ecosystem", edChains.filter((c) => !["solana"].includes(c.id)));
141
+ const selected = guard(await p.select({
142
+ message: "Select chain",
143
+ options,
144
+ }));
145
+ // Skip separator selections
146
+ if (selected.startsWith("__sep_")) {
147
+ return selectChain(curve, preselected);
148
+ }
149
+ return selected;
150
+ }
151
+ // ---------------------------------------------------------------------------
152
+ // Address input (must be typed — no way around this)
153
+ // ---------------------------------------------------------------------------
154
+ /** Prompt for a recipient address with basic validation. */
155
+ export async function inputAddress(preselected) {
156
+ if (preselected)
157
+ return preselected;
158
+ const address = guard(await p.text({
159
+ message: "Recipient address",
160
+ placeholder: "Paste the address here",
161
+ validate(value) {
162
+ if (!value || value.trim().length === 0)
163
+ return "Address is required";
164
+ if (value.trim().length < 10)
165
+ return "Address looks too short";
166
+ return undefined;
167
+ },
168
+ }));
169
+ return address.trim();
170
+ }
171
+ // ---------------------------------------------------------------------------
172
+ // Amount selection — preset options + custom
173
+ // ---------------------------------------------------------------------------
174
+ /** Prompt for an amount — offer common presets + custom input. */
175
+ export async function inputAmount(symbol, preselected) {
176
+ if (preselected) {
177
+ const n = Number(preselected);
178
+ if (isNaN(n) || n <= 0) {
179
+ p.log.error("Amount must be a positive number.");
180
+ process.exit(1);
181
+ }
182
+ return preselected;
183
+ }
184
+ // Offer preset amounts + custom
185
+ const selected = guard(await p.select({
186
+ message: `How much ${symbol} to send?`,
187
+ options: [
188
+ { value: "0.001", label: `0.001 ${symbol}` },
189
+ { value: "0.01", label: `0.01 ${symbol}` },
190
+ { value: "0.1", label: `0.1 ${symbol}` },
191
+ { value: "1", label: `1 ${symbol}` },
192
+ { value: "10", label: `10 ${symbol}` },
193
+ { value: "custom", label: "Custom amount" },
194
+ ],
195
+ }));
196
+ if (selected === "custom") {
197
+ const amount = guard(await p.text({
198
+ message: `Enter amount (${symbol})`,
199
+ validate(value) {
200
+ if (!value || value.trim().length === 0)
201
+ return "Amount is required";
202
+ const n = Number(value);
203
+ if (isNaN(n))
204
+ return "Must be a valid number";
205
+ if (n <= 0)
206
+ return "Amount must be positive";
207
+ return undefined;
208
+ },
209
+ }));
210
+ return amount.trim();
211
+ }
212
+ return selected;
213
+ }
214
+ // ---------------------------------------------------------------------------
215
+ // Confirm
216
+ // ---------------------------------------------------------------------------
217
+ /** Confirm an action before proceeding. */
218
+ export async function confirmAction(message) {
219
+ const result = guard(await p.confirm({ message }));
220
+ return result;
221
+ }
222
+ // ---------------------------------------------------------------------------
223
+ // Spinner
224
+ // ---------------------------------------------------------------------------
225
+ /** Show a spinner while performing async work. */
226
+ export async function withSpinner(message, fn) {
227
+ const s = p.spinner();
228
+ s.start(message);
229
+ try {
230
+ const result = await fn();
231
+ s.stop(`${message} ${pc.dim("done")}`);
232
+ return result;
233
+ }
234
+ catch (err) {
235
+ s.stop(`${message} ${pc.red("failed")}`);
236
+ throw err;
237
+ }
238
+ }
239
+ // ---------------------------------------------------------------------------
240
+ // Network selection
241
+ // ---------------------------------------------------------------------------
242
+ /** Select network (testnet / mainnet). */
243
+ export async function selectNetwork(preselected) {
244
+ if (preselected)
245
+ return preselected;
246
+ const selected = guard(await p.select({
247
+ message: "Select network",
248
+ options: [
249
+ { value: "testnet", label: "Testnet", hint: "For testing" },
250
+ { value: "mainnet", label: "Mainnet", hint: "Production" },
251
+ ],
252
+ }));
253
+ return selected;
254
+ }
255
+ // ---------------------------------------------------------------------------
256
+ // Wallet name input (must be typed — it's a name)
257
+ // ---------------------------------------------------------------------------
258
+ /** Prompt for a wallet name. */
259
+ export async function inputWalletName(preselected) {
260
+ if (preselected)
261
+ return preselected;
262
+ const name = guard(await p.text({
263
+ message: "Wallet name",
264
+ placeholder: "my-wallet",
265
+ validate(value) {
266
+ if (!value || value.trim().length === 0)
267
+ return "Wallet name is required";
268
+ if (!/^[a-zA-Z0-9_-]+$/.test(value.trim())) {
269
+ return "Only letters, numbers, dashes, and underscores";
270
+ }
271
+ return undefined;
272
+ },
273
+ }));
274
+ return name.trim();
275
+ }
276
+ //# sourceMappingURL=interactive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interactive.js","sourceRoot":"","sources":["../../src/interface/interactive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function printLogo(): void;
2
+ //# sourceMappingURL=logo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo.d.ts","sourceRoot":"","sources":["../../src/interface/logo.ts"],"names":[],"mappings":"AAeA,wBAAgB,SAAS,IAAI,IAAI,CAOhC"}
@@ -0,0 +1,21 @@
1
+ import pc from "picocolors";
2
+ import { VERSION } from "../version.js";
3
+ // ---------------------------------------------------------------------------
4
+ // BlockClaw ASCII Logo
5
+ // ---------------------------------------------------------------------------
6
+ const LOGO_LINES = [
7
+ String.raw ` ____ __ __ ______ `,
8
+ String.raw ` / __ )/ /___ _____/ /__/ ____/ /__ ___ __`,
9
+ String.raw ` / __ / / __ \/ ___/ //_/ / / / __ '/ | /| / /`,
10
+ String.raw ` / /_/ / / /_/ / /__/ ,< / /___/ / /_/ /| |/ |/ / `,
11
+ String.raw `/_____/_/\____/\___/_/|_|\____/_/\__,_/ |__/|__/ `,
12
+ ];
13
+ export function printLogo() {
14
+ console.log();
15
+ for (const line of LOGO_LINES) {
16
+ console.log(pc.cyan(line));
17
+ }
18
+ console.log(pc.dim(` by Sequence0 v${VERSION}`));
19
+ console.log();
20
+ }
21
+ //# sourceMappingURL=logo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logo.js","sourceRoot":"","sources":["../../src/interface/logo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E,MAAM,UAAU,GAAG;IACjB,MAAM,CAAC,GAAG,CAAA,oDAAoD;IAC9D,MAAM,CAAC,GAAG,CAAA,oDAAoD;IAC9D,MAAM,CAAC,GAAG,CAAA,oDAAoD;IAC9D,MAAM,CAAC,GAAG,CAAA,oDAAoD;IAC9D,MAAM,CAAC,GAAG,CAAA,oDAAoD;CAC/D,CAAC;AAEF,MAAM,UAAU,SAAS;IACvB,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,6CAA6C,OAAO,EAAE,CAAC,CAAC,CAAC;IAC5E,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}