@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.
- package/README.md +97 -0
- package/dist/agent/binary.d.ts +15 -0
- package/dist/agent/binary.d.ts.map +1 -0
- package/dist/agent/binary.js +172 -0
- package/dist/agent/binary.js.map +1 -0
- package/dist/agent/chains.d.ts +26 -0
- package/dist/agent/chains.d.ts.map +1 -0
- package/dist/agent/chains.js +123 -0
- package/dist/agent/chains.js.map +1 -0
- package/dist/agent/client.d.ts +484 -0
- package/dist/agent/client.d.ts.map +1 -0
- package/dist/agent/client.js +448 -0
- package/dist/agent/client.js.map +1 -0
- package/dist/agent/config.d.ts +75 -0
- package/dist/agent/config.d.ts.map +1 -0
- package/dist/agent/config.js +133 -0
- package/dist/agent/config.js.map +1 -0
- package/dist/agent/process.d.ts +36 -0
- package/dist/agent/process.d.ts.map +1 -0
- package/dist/agent/process.js +208 -0
- package/dist/agent/process.js.map +1 -0
- package/dist/agent/wallet.d.ts +43 -0
- package/dist/agent/wallet.d.ts.map +1 -0
- package/dist/agent/wallet.js +146 -0
- package/dist/agent/wallet.js.map +1 -0
- package/dist/ai/brain.d.ts +21 -0
- package/dist/ai/brain.d.ts.map +1 -0
- package/dist/ai/brain.js +117 -0
- package/dist/ai/brain.js.map +1 -0
- package/dist/ai/prompts.d.ts +15 -0
- package/dist/ai/prompts.d.ts.map +1 -0
- package/dist/ai/prompts.js +67 -0
- package/dist/ai/prompts.js.map +1 -0
- package/dist/ai/rules.d.ts +19 -0
- package/dist/ai/rules.d.ts.map +1 -0
- package/dist/ai/rules.js +143 -0
- package/dist/ai/rules.js.map +1 -0
- package/dist/core/detector.d.ts +16 -0
- package/dist/core/detector.d.ts.map +1 -0
- package/dist/core/detector.js +90 -0
- package/dist/core/detector.js.map +1 -0
- package/dist/core/healer.d.ts +62 -0
- package/dist/core/healer.d.ts.map +1 -0
- package/dist/core/healer.js +355 -0
- package/dist/core/healer.js.map +1 -0
- package/dist/core/heartbeat.d.ts +67 -0
- package/dist/core/heartbeat.d.ts.map +1 -0
- package/dist/core/heartbeat.js +426 -0
- package/dist/core/heartbeat.js.map +1 -0
- package/dist/core/memory.d.ts +57 -0
- package/dist/core/memory.d.ts.map +1 -0
- package/dist/core/memory.js +149 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/updater.d.ts +16 -0
- package/dist/core/updater.d.ts.map +1 -0
- package/dist/core/updater.js +107 -0
- package/dist/core/updater.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/dist/interface/commands/ask.d.ts +3 -0
- package/dist/interface/commands/ask.d.ts.map +1 -0
- package/dist/interface/commands/ask.js +39 -0
- package/dist/interface/commands/ask.js.map +1 -0
- package/dist/interface/commands/backup.d.ts +3 -0
- package/dist/interface/commands/backup.d.ts.map +1 -0
- package/dist/interface/commands/backup.js +576 -0
- package/dist/interface/commands/backup.js.map +1 -0
- package/dist/interface/commands/config.d.ts +3 -0
- package/dist/interface/commands/config.d.ts.map +1 -0
- package/dist/interface/commands/config.js +107 -0
- package/dist/interface/commands/config.js.map +1 -0
- package/dist/interface/commands/daemon.d.ts +3 -0
- package/dist/interface/commands/daemon.d.ts.map +1 -0
- package/dist/interface/commands/daemon.js +162 -0
- package/dist/interface/commands/daemon.js.map +1 -0
- package/dist/interface/commands/doctor.d.ts +3 -0
- package/dist/interface/commands/doctor.d.ts.map +1 -0
- package/dist/interface/commands/doctor.js +143 -0
- package/dist/interface/commands/doctor.js.map +1 -0
- package/dist/interface/commands/earnings.d.ts +3 -0
- package/dist/interface/commands/earnings.d.ts.map +1 -0
- package/dist/interface/commands/earnings.js +165 -0
- package/dist/interface/commands/earnings.js.map +1 -0
- package/dist/interface/commands/health.d.ts +3 -0
- package/dist/interface/commands/health.d.ts.map +1 -0
- package/dist/interface/commands/health.js +48 -0
- package/dist/interface/commands/health.js.map +1 -0
- package/dist/interface/commands/history.d.ts +3 -0
- package/dist/interface/commands/history.d.ts.map +1 -0
- package/dist/interface/commands/history.js +113 -0
- package/dist/interface/commands/history.js.map +1 -0
- package/dist/interface/commands/info.d.ts +3 -0
- package/dist/interface/commands/info.d.ts.map +1 -0
- package/dist/interface/commands/info.js +82 -0
- package/dist/interface/commands/info.js.map +1 -0
- package/dist/interface/commands/logs.d.ts +3 -0
- package/dist/interface/commands/logs.d.ts.map +1 -0
- package/dist/interface/commands/logs.js +98 -0
- package/dist/interface/commands/logs.js.map +1 -0
- package/dist/interface/commands/menu.d.ts +4 -0
- package/dist/interface/commands/menu.d.ts.map +1 -0
- package/dist/interface/commands/menu.js +156 -0
- package/dist/interface/commands/menu.js.map +1 -0
- package/dist/interface/commands/receive.d.ts +3 -0
- package/dist/interface/commands/receive.d.ts.map +1 -0
- package/dist/interface/commands/receive.js +81 -0
- package/dist/interface/commands/receive.js.map +1 -0
- package/dist/interface/commands/register.d.ts +3 -0
- package/dist/interface/commands/register.d.ts.map +1 -0
- package/dist/interface/commands/register.js +231 -0
- package/dist/interface/commands/register.js.map +1 -0
- package/dist/interface/commands/restart.d.ts +3 -0
- package/dist/interface/commands/restart.d.ts.map +1 -0
- package/dist/interface/commands/restart.js +154 -0
- package/dist/interface/commands/restart.js.map +1 -0
- package/dist/interface/commands/send.d.ts +3 -0
- package/dist/interface/commands/send.d.ts.map +1 -0
- package/dist/interface/commands/send.js +108 -0
- package/dist/interface/commands/send.js.map +1 -0
- package/dist/interface/commands/service.d.ts +3 -0
- package/dist/interface/commands/service.d.ts.map +1 -0
- package/dist/interface/commands/service.js +474 -0
- package/dist/interface/commands/service.js.map +1 -0
- package/dist/interface/commands/setup.d.ts +5 -0
- package/dist/interface/commands/setup.d.ts.map +1 -0
- package/dist/interface/commands/setup.js +410 -0
- package/dist/interface/commands/setup.js.map +1 -0
- package/dist/interface/commands/start.d.ts +3 -0
- package/dist/interface/commands/start.d.ts.map +1 -0
- package/dist/interface/commands/start.js +171 -0
- package/dist/interface/commands/start.js.map +1 -0
- package/dist/interface/commands/status.d.ts +3 -0
- package/dist/interface/commands/status.d.ts.map +1 -0
- package/dist/interface/commands/status.js +77 -0
- package/dist/interface/commands/status.js.map +1 -0
- package/dist/interface/commands/stop.d.ts +3 -0
- package/dist/interface/commands/stop.d.ts.map +1 -0
- package/dist/interface/commands/stop.js +62 -0
- package/dist/interface/commands/stop.js.map +1 -0
- package/dist/interface/commands/update.d.ts +3 -0
- package/dist/interface/commands/update.d.ts.map +1 -0
- package/dist/interface/commands/update.js +53 -0
- package/dist/interface/commands/update.js.map +1 -0
- package/dist/interface/commands/wallet.d.ts +3 -0
- package/dist/interface/commands/wallet.d.ts.map +1 -0
- package/dist/interface/commands/wallet.js +446 -0
- package/dist/interface/commands/wallet.js.map +1 -0
- package/dist/interface/commands/webhook.d.ts +3 -0
- package/dist/interface/commands/webhook.d.ts.map +1 -0
- package/dist/interface/commands/webhook.js +99 -0
- package/dist/interface/commands/webhook.js.map +1 -0
- package/dist/interface/commands/withdraw.d.ts +3 -0
- package/dist/interface/commands/withdraw.d.ts.map +1 -0
- package/dist/interface/commands/withdraw.js +261 -0
- package/dist/interface/commands/withdraw.js.map +1 -0
- package/dist/interface/interactive.d.ts +43 -0
- package/dist/interface/interactive.d.ts.map +1 -0
- package/dist/interface/interactive.js +276 -0
- package/dist/interface/interactive.js.map +1 -0
- package/dist/interface/logo.d.ts +2 -0
- package/dist/interface/logo.d.ts.map +1 -0
- package/dist/interface/logo.js +21 -0
- package/dist/interface/logo.js.map +1 -0
- package/dist/interface/webhooks.d.ts +19 -0
- package/dist/interface/webhooks.d.ts.map +1 -0
- package/dist/interface/webhooks.js +172 -0
- package/dist/interface/webhooks.js.map +1 -0
- package/dist/utils/format.d.ts +19 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +107 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paths.d.ts +35 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +45 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/platform.d.ts +26 -0
- package/dist/utils/platform.d.ts.map +1 -0
- package/dist/utils/platform.js +72 -0
- package/dist/utils/platform.js.map +1 -0
- package/dist/version.d.ts +3 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
import * as p from "@clack/prompts";
|
|
2
|
+
import pc from "picocolors";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import { resolveBinary, downloadBinary, getBinaryVersion, verifyBinary } from "../../agent/binary.js";
|
|
5
|
+
import { writeBlockclawConfig } from "../../agent/config.js";
|
|
6
|
+
import { spawnAgent, isAgentRunning, isPortAvailable, findAvailablePort } from "../../agent/process.js";
|
|
7
|
+
import { AgentClient } from "../../agent/client.js";
|
|
8
|
+
import { WalletManager } from "../../agent/wallet.js";
|
|
9
|
+
import { CHAINS } from "../../agent/chains.js";
|
|
10
|
+
import { BLOCKCLAW_CONFIG } from "../../utils/paths.js";
|
|
11
|
+
import { detectSystem } from "../../core/detector.js";
|
|
12
|
+
import { printLogo } from "../logo.js";
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
// Color theme — consistent across entire CLI
|
|
15
|
+
// ---------------------------------------------------------------------------
|
|
16
|
+
/** Green for questions/prompts */
|
|
17
|
+
const q = pc.green;
|
|
18
|
+
/** Blue for user answers/values */
|
|
19
|
+
const a = pc.blue;
|
|
20
|
+
/** Yellow for information/hints */
|
|
21
|
+
const info = pc.yellow;
|
|
22
|
+
/** Red for errors/alerts */
|
|
23
|
+
const err = pc.red;
|
|
24
|
+
/** Dim for secondary text */
|
|
25
|
+
const dim = pc.dim;
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Contract addresses per network
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
const NETWORK_CONFIG = {
|
|
30
|
+
testnet: {
|
|
31
|
+
rpcUrl: "https://testnet-rpc.sequence0.network",
|
|
32
|
+
registry: "0xb2c218e154d4374e721eab6293af3eeeaa117400",
|
|
33
|
+
walletFactory: "0x0fdb2d2147b80fd2e9ad4b8d1a70b68c1353afe3",
|
|
34
|
+
feeCollector: "0xc017d0a5da9369003095325229de1e70f0e33a1c",
|
|
35
|
+
programRegistry: "0xa03f008aff1b95f5368ef844cd56f404a824ff56",
|
|
36
|
+
delegationRegistry: "0x693ddff043fcb4ee94ef063af1784523021baf75",
|
|
37
|
+
chainId: 800800,
|
|
38
|
+
bootstrap: [
|
|
39
|
+
"/ip4/3.140.248.117/tcp/9000/p2p/12D3KooWJXt5XshR4P5BcPow2nARP2B5zDdW8pBVkK66E1FR5BzQ",
|
|
40
|
+
"/ip4/3.140.248.117/tcp/9001/p2p/12D3KooWLSUiReBaEsJ3yNbLPgQ1WgE7XGkwkYaF4QJZ1ZXJ7Ze4",
|
|
41
|
+
"/ip4/3.140.248.117/tcp/9002/p2p/12D3KooWMgwvtHcnqmffix3P6qwYc3kahjPm4Uw9VaLJHoTURTts",
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
mainnet: {
|
|
45
|
+
rpcUrl: "https://rpc.sequence0.network",
|
|
46
|
+
registry: "0xdefa5ab7ea6a87ac51628f4cde55bb4d49e62f50",
|
|
47
|
+
walletFactory: "0x05b4df6ab0684bcc82a4a92677e4b46007638604",
|
|
48
|
+
feeCollector: "0xccd70007534c33b0ab3997d81207fea5e59ca54a",
|
|
49
|
+
programRegistry: "0x108a2373da968fd19b46bd8b1b12d5158c0e8cda",
|
|
50
|
+
delegationRegistry: "0xc4014a4b489d722b34dd0ff572a9db07bf23af32",
|
|
51
|
+
chainId: 800801,
|
|
52
|
+
bootstrap: [],
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Default ports
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
const DEFAULT_P2P_PORT = 9000;
|
|
59
|
+
const DEFAULT_API_PORT = 8080;
|
|
60
|
+
// ---------------------------------------------------------------------------
|
|
61
|
+
// Public helpers
|
|
62
|
+
// ---------------------------------------------------------------------------
|
|
63
|
+
/** Returns true when no BlockClaw config exists — the user has never run setup. */
|
|
64
|
+
export function isFirstRun() {
|
|
65
|
+
return !fs.existsSync(BLOCKCLAW_CONFIG);
|
|
66
|
+
}
|
|
67
|
+
// ---------------------------------------------------------------------------
|
|
68
|
+
// Registration
|
|
69
|
+
// ---------------------------------------------------------------------------
|
|
70
|
+
export function register(program) {
|
|
71
|
+
program
|
|
72
|
+
.command("setup")
|
|
73
|
+
.description("First-time setup wizard — get your node running in minutes")
|
|
74
|
+
.option("-n, --network <network>", "Network (testnet or mainnet)")
|
|
75
|
+
.option("--skip-start", "Configure only, don't start the node")
|
|
76
|
+
.action(async (opts) => {
|
|
77
|
+
try {
|
|
78
|
+
await runSetupWizard(opts);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
if (error instanceof Error && error.message === "CANCEL") {
|
|
82
|
+
p.cancel("Setup cancelled.");
|
|
83
|
+
process.exit(0);
|
|
84
|
+
}
|
|
85
|
+
p.cancel(error instanceof Error ? error.message : String(error));
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// ---------------------------------------------------------------------------
|
|
91
|
+
// Cancel guard
|
|
92
|
+
// ---------------------------------------------------------------------------
|
|
93
|
+
function guard(value) {
|
|
94
|
+
if (p.isCancel(value))
|
|
95
|
+
throw new Error("CANCEL");
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
async function runSetupWizard(opts) {
|
|
99
|
+
// ── Welcome ──────────────────────────────────────────────────────────────
|
|
100
|
+
printLogo();
|
|
101
|
+
p.intro(pc.bgCyan(pc.black(" Setup Wizard ")));
|
|
102
|
+
p.note([
|
|
103
|
+
`${pc.bold("Welcome to Sequence0")}`,
|
|
104
|
+
"",
|
|
105
|
+
"Sequence0 is a decentralized network where node runners like you",
|
|
106
|
+
"earn passive income by helping secure transactions across 81 blockchains.",
|
|
107
|
+
"",
|
|
108
|
+
`${q("How it works:")}`,
|
|
109
|
+
` ${a("1.")} You run a node on the Sequence0 network`,
|
|
110
|
+
` ${a("2.")} Your node helps sign transactions across Ethereum, Bitcoin, Solana, and more`,
|
|
111
|
+
` ${a("3.")} You earn signing fees from every transaction your node participates in`,
|
|
112
|
+
"",
|
|
113
|
+
`${info("This wizard will set everything up in about 2 minutes.")}`,
|
|
114
|
+
].join("\n"), "Getting Started");
|
|
115
|
+
// ── Step 1: System Check ─────────────────────────────────────────────────
|
|
116
|
+
const sysSpinner = p.spinner();
|
|
117
|
+
sysSpinner.start("Checking system requirements");
|
|
118
|
+
const sysReqs = await detectSystem();
|
|
119
|
+
sysSpinner.stop("System check complete");
|
|
120
|
+
const checkLines = sysReqs.checks.map((c) => {
|
|
121
|
+
const icon = c.status === "pass"
|
|
122
|
+
? pc.green("PASS")
|
|
123
|
+
: c.status === "warn"
|
|
124
|
+
? info("WARN")
|
|
125
|
+
: err("FAIL");
|
|
126
|
+
return ` ${icon} ${pc.bold(c.name.padEnd(16))} ${c.message}`;
|
|
127
|
+
});
|
|
128
|
+
p.note(checkLines.join("\n"), "System Requirements");
|
|
129
|
+
if (!sysReqs.passed) {
|
|
130
|
+
p.log.warn(info("Some requirements were not met. Your node may not run properly."));
|
|
131
|
+
const cont = guard(await p.confirm({
|
|
132
|
+
message: q("Continue setup anyway?"),
|
|
133
|
+
initialValue: false,
|
|
134
|
+
}));
|
|
135
|
+
if (!cont)
|
|
136
|
+
throw new Error("CANCEL");
|
|
137
|
+
}
|
|
138
|
+
// ── Step 2: Network Selection ────────────────────────────────────────────
|
|
139
|
+
let network;
|
|
140
|
+
if (opts.network && (opts.network === "testnet" || opts.network === "mainnet")) {
|
|
141
|
+
network = opts.network;
|
|
142
|
+
p.log.info(`Network: ${a(network)} (from --network flag)`);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
p.log.info(info("ℹ Choose which Sequence0 network your node will join. " +
|
|
146
|
+
"Testnet is free and great for trying things out. " +
|
|
147
|
+
"Mainnet earns real signing fees but requires a small registration deposit."));
|
|
148
|
+
const selected = guard(await p.select({
|
|
149
|
+
message: q("Which Sequence0 network would you like to join?"),
|
|
150
|
+
options: [
|
|
151
|
+
{
|
|
152
|
+
value: "testnet",
|
|
153
|
+
label: a("Testnet"),
|
|
154
|
+
hint: "Free to use — perfect for getting started and testing",
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
value: "mainnet",
|
|
158
|
+
label: a("Mainnet"),
|
|
159
|
+
hint: "Earn real signing fees — requires 0.1 ETH registration",
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
initialValue: "testnet",
|
|
163
|
+
}));
|
|
164
|
+
network = selected;
|
|
165
|
+
}
|
|
166
|
+
const netCfg = NETWORK_CONFIG[network];
|
|
167
|
+
// ── Step 3: Download Node Software ────────────────────────────────────────
|
|
168
|
+
let binPath;
|
|
169
|
+
let binVersion = null;
|
|
170
|
+
const dlSpinner = p.spinner();
|
|
171
|
+
dlSpinner.start("Looking for Sequence0 node software");
|
|
172
|
+
try {
|
|
173
|
+
binPath = await resolveBinary();
|
|
174
|
+
binVersion = await getBinaryVersion(binPath);
|
|
175
|
+
dlSpinner.stop(`Node software found${binVersion ? ` (v${binVersion})` : ""}`);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
dlSpinner.message("Downloading node software — this may take a moment");
|
|
179
|
+
try {
|
|
180
|
+
binPath = await downloadBinary();
|
|
181
|
+
binVersion = await getBinaryVersion(binPath);
|
|
182
|
+
dlSpinner.stop(`Node software downloaded${binVersion ? ` (v${binVersion})` : ""}`);
|
|
183
|
+
}
|
|
184
|
+
catch (dlErr) {
|
|
185
|
+
dlSpinner.stop(err("Failed to download node software"));
|
|
186
|
+
throw new Error(`Could not download node software: ${dlErr instanceof Error ? dlErr.message : String(dlErr)}\n` +
|
|
187
|
+
` Install manually: npm install -g @sequence0/blockclaw\n` +
|
|
188
|
+
` Or: curl -fsSL https://install.sequence0.network | sh`);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Verify binary integrity
|
|
192
|
+
const verified = await verifyBinary(binPath);
|
|
193
|
+
if (!verified) {
|
|
194
|
+
p.log.warn(info("ℹ Binary checksum could not be verified. This is normal for first-time installs " +
|
|
195
|
+
"where checksums haven't been published yet."));
|
|
196
|
+
const cont = guard(await p.confirm({
|
|
197
|
+
message: q("Continue with this node software?"),
|
|
198
|
+
initialValue: true,
|
|
199
|
+
}));
|
|
200
|
+
if (!cont)
|
|
201
|
+
throw new Error("CANCEL");
|
|
202
|
+
}
|
|
203
|
+
// ── Step 4: Configure Ports ──────────────────────────────────────────────
|
|
204
|
+
const portSpinner = p.spinner();
|
|
205
|
+
portSpinner.start("Configuring network ports");
|
|
206
|
+
let p2pPort = DEFAULT_P2P_PORT;
|
|
207
|
+
let apiPort = DEFAULT_API_PORT;
|
|
208
|
+
const p2pOk = await isPortAvailable(p2pPort);
|
|
209
|
+
const apiOk = await isPortAvailable(apiPort);
|
|
210
|
+
if (!p2pOk) {
|
|
211
|
+
p2pPort = await findAvailablePort(DEFAULT_P2P_PORT + 1);
|
|
212
|
+
}
|
|
213
|
+
if (!apiOk) {
|
|
214
|
+
apiPort = await findAvailablePort(DEFAULT_API_PORT + 1);
|
|
215
|
+
}
|
|
216
|
+
portSpinner.stop("Ports configured");
|
|
217
|
+
if (!p2pOk || !apiOk) {
|
|
218
|
+
p.log.warn(info("ℹ Default ports were in use. Alternative ports have been assigned automatically."));
|
|
219
|
+
}
|
|
220
|
+
// ── Step 5: Write Config ─────────────────────────────────────────────────
|
|
221
|
+
const cfgSpinner = p.spinner();
|
|
222
|
+
cfgSpinner.start("Saving configuration");
|
|
223
|
+
const blockclawCfg = {
|
|
224
|
+
api_port: apiPort,
|
|
225
|
+
network,
|
|
226
|
+
auto_heal: true,
|
|
227
|
+
heartbeat_interval: 30,
|
|
228
|
+
max_restarts: 5,
|
|
229
|
+
restart_window: 300,
|
|
230
|
+
auto_update: false,
|
|
231
|
+
verbose: false,
|
|
232
|
+
};
|
|
233
|
+
writeBlockclawConfig(blockclawCfg);
|
|
234
|
+
cfgSpinner.stop("Configuration saved");
|
|
235
|
+
// ── Step 6: Start Node ────────────────────────────────────────────────────
|
|
236
|
+
let peerId = null;
|
|
237
|
+
let agentRunning = false;
|
|
238
|
+
let client = null;
|
|
239
|
+
if (opts.skipStart) {
|
|
240
|
+
p.log.info(info("Skipping node start (--skip-start)"));
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
const { running } = isAgentRunning();
|
|
244
|
+
if (running) {
|
|
245
|
+
p.log.info(info("Your node is already running"));
|
|
246
|
+
agentRunning = true;
|
|
247
|
+
client = new AgentClient(`http://localhost:${apiPort}`);
|
|
248
|
+
try {
|
|
249
|
+
const health = await client.health();
|
|
250
|
+
peerId = health.peer_id;
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
// Agent running but health endpoint not reachable on this port
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
const startSpinner = p.spinner();
|
|
258
|
+
startSpinner.start("Starting your node — connecting to Sequence0 network");
|
|
259
|
+
const child = spawnAgent({
|
|
260
|
+
binPath,
|
|
261
|
+
network,
|
|
262
|
+
port: p2pPort,
|
|
263
|
+
apiPort,
|
|
264
|
+
rpcUrl: netCfg.rpcUrl,
|
|
265
|
+
registry: netCfg.registry,
|
|
266
|
+
walletFactory: netCfg.walletFactory,
|
|
267
|
+
feeCollector: netCfg.feeCollector,
|
|
268
|
+
programRegistry: netCfg.programRegistry,
|
|
269
|
+
delegationRegistry: netCfg.delegationRegistry,
|
|
270
|
+
bootstrap: netCfg.bootstrap.length > 0 ? [...netCfg.bootstrap] : undefined,
|
|
271
|
+
daemon: true,
|
|
272
|
+
logLevel: "info",
|
|
273
|
+
});
|
|
274
|
+
if (!child.pid) {
|
|
275
|
+
startSpinner.stop(err("Failed to start the node"));
|
|
276
|
+
p.log.error(err("Could not start the node. Check ~/.sequence0/agent.log for details."));
|
|
277
|
+
}
|
|
278
|
+
else {
|
|
279
|
+
client = new AgentClient(`http://localhost:${apiPort}`);
|
|
280
|
+
const deadline = Date.now() + 60_000;
|
|
281
|
+
let healthy = false;
|
|
282
|
+
startSpinner.message("Connecting to Sequence0 network...");
|
|
283
|
+
while (Date.now() < deadline) {
|
|
284
|
+
healthy = await client.isHealthy();
|
|
285
|
+
if (healthy)
|
|
286
|
+
break;
|
|
287
|
+
await sleep(1500);
|
|
288
|
+
}
|
|
289
|
+
if (healthy) {
|
|
290
|
+
try {
|
|
291
|
+
const health = await client.health();
|
|
292
|
+
peerId = health.peer_id;
|
|
293
|
+
}
|
|
294
|
+
catch {
|
|
295
|
+
// ok
|
|
296
|
+
}
|
|
297
|
+
startSpinner.stop(pc.green("Connected to Sequence0 network"));
|
|
298
|
+
agentRunning = true;
|
|
299
|
+
}
|
|
300
|
+
else {
|
|
301
|
+
startSpinner.stop(info("Node started — still connecting to network"));
|
|
302
|
+
p.log.warn(info("Your node is starting up but hasn't connected to peers yet. " +
|
|
303
|
+
"This is normal on first run. Check status later with: blockclaw status"));
|
|
304
|
+
agentRunning = true;
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
// ── Step 7: Create Wallet ─────────────────────────────────────────────────
|
|
310
|
+
let walletCreated = false;
|
|
311
|
+
if (agentRunning && client) {
|
|
312
|
+
console.log();
|
|
313
|
+
p.log.info(info("ℹ A wallet lets you receive signing fees from the network. " +
|
|
314
|
+
"Your wallet works on all 81 supported blockchains — Ethereum, Bitcoin, Solana, and more. " +
|
|
315
|
+
"No private keys are stored anywhere. The signing power is split across multiple nodes on the network."));
|
|
316
|
+
const createWallet = guard(await p.confirm({
|
|
317
|
+
message: q("Would you like to create a wallet to collect your rewards?"),
|
|
318
|
+
initialValue: true,
|
|
319
|
+
}));
|
|
320
|
+
if (createWallet) {
|
|
321
|
+
const walletName = guard(await p.text({
|
|
322
|
+
message: q("Give your wallet a name"),
|
|
323
|
+
placeholder: "my-wallet",
|
|
324
|
+
initialValue: "my-wallet",
|
|
325
|
+
validate: (v) => {
|
|
326
|
+
if (!v || v.trim().length === 0)
|
|
327
|
+
return "Name is required";
|
|
328
|
+
if (v.includes(" "))
|
|
329
|
+
return "No spaces — use dashes instead";
|
|
330
|
+
if (v.endsWith("-ed"))
|
|
331
|
+
return "Name cannot end with '-ed'";
|
|
332
|
+
return undefined;
|
|
333
|
+
},
|
|
334
|
+
}));
|
|
335
|
+
// Check network connectivity before creating wallet
|
|
336
|
+
const walletSpinner = p.spinner();
|
|
337
|
+
walletSpinner.start("Connecting to Sequence0 network...");
|
|
338
|
+
let canCreate = false;
|
|
339
|
+
try {
|
|
340
|
+
const status = await client.status();
|
|
341
|
+
const peers = [status.peer_id, ...status.connected_peer_ids];
|
|
342
|
+
if (peers.length >= 2) {
|
|
343
|
+
canCreate = true;
|
|
344
|
+
walletSpinner.stop("Connected to Sequence0 network");
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
walletSpinner.stop(info("Not enough network nodes available yet"));
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
walletSpinner.stop(info("Could not check network status"));
|
|
352
|
+
}
|
|
353
|
+
if (canCreate) {
|
|
354
|
+
const totalChains = CHAINS.length;
|
|
355
|
+
const walletCreateSpinner = p.spinner();
|
|
356
|
+
walletCreateSpinner.start("Creating your wallet across the network...");
|
|
357
|
+
try {
|
|
358
|
+
const mgr = new WalletManager(client);
|
|
359
|
+
await mgr.createUniversal({ walletId: walletName });
|
|
360
|
+
walletCreateSpinner.stop(pc.green("Wallet created!"));
|
|
361
|
+
p.note([
|
|
362
|
+
` ${dim("Wallet:")} ${a(walletName)}`,
|
|
363
|
+
` ${dim("Chains:")} All ${totalChains} supported chains`,
|
|
364
|
+
"",
|
|
365
|
+
` ${dim("One wallet — Ethereum, Bitcoin, Solana, Polygon, and more.")}`,
|
|
366
|
+
].join("\n"), pc.green("Wallet Created"));
|
|
367
|
+
walletCreated = true;
|
|
368
|
+
}
|
|
369
|
+
catch (walletErr) {
|
|
370
|
+
walletCreateSpinner.stop(info("Wallet creation pending"));
|
|
371
|
+
p.log.warn(info("Wallet creation is still in progress. This can happen when the network " +
|
|
372
|
+
"is still syncing. Run ") + a("blockclaw wallet list") + info(" in a few minutes to check."));
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
else {
|
|
376
|
+
p.log.info(info("Your node needs to connect to more peers before creating a wallet. " +
|
|
377
|
+
"Run ") + a("blockclaw wallet create") + info(" once your node is fully connected."));
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
// ── Step 8: Summary ──────────────────────────────────────────────────────
|
|
382
|
+
const summaryLines = [];
|
|
383
|
+
summaryLines.push(` ${dim("Network")} ${a(network)}`);
|
|
384
|
+
summaryLines.push(` ${dim("Status")} ${agentRunning ? pc.green("Running") : info("Not started")}`);
|
|
385
|
+
if (walletCreated) {
|
|
386
|
+
summaryLines.push(` ${dim("Wallet")} ${pc.green("Created")}`);
|
|
387
|
+
}
|
|
388
|
+
summaryLines.push("");
|
|
389
|
+
if (!walletCreated) {
|
|
390
|
+
summaryLines.push(` ${pc.bold("What to do next:")}`);
|
|
391
|
+
summaryLines.push(` ${a("1.")} ${q("blockclaw wallet create")} Create a wallet for rewards`);
|
|
392
|
+
summaryLines.push(` ${a("2.")} ${q("blockclaw register")} Register your node on-chain`);
|
|
393
|
+
summaryLines.push(` ${a("3.")} ${q("blockclaw")} See all commands`);
|
|
394
|
+
}
|
|
395
|
+
else {
|
|
396
|
+
summaryLines.push(` ${pc.bold("What to do next:")}`);
|
|
397
|
+
summaryLines.push(` ${a("1.")} ${q("blockclaw register")} Register your node to start earning`);
|
|
398
|
+
summaryLines.push(` ${a("2.")} ${q("blockclaw send")} Send crypto from your wallet`);
|
|
399
|
+
summaryLines.push(` ${a("3.")} ${q("blockclaw")} See all commands`);
|
|
400
|
+
}
|
|
401
|
+
p.note(summaryLines.join("\n"), pc.green("Setup Complete"));
|
|
402
|
+
p.outro(`${pc.green("You're all set!")} Welcome to the Sequence0 network.`);
|
|
403
|
+
}
|
|
404
|
+
// ---------------------------------------------------------------------------
|
|
405
|
+
// Utility
|
|
406
|
+
// ---------------------------------------------------------------------------
|
|
407
|
+
function sleep(ms) {
|
|
408
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
409
|
+
}
|
|
410
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/interface/commands/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../src/interface/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgB/C"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import * as prompt from "@clack/prompts";
|
|
2
|
+
import { AgentClient } from "../../agent/client.js";
|
|
3
|
+
import { resolveBinary, downloadBinary, getBinaryVersion } from "../../agent/binary.js";
|
|
4
|
+
import { spawnAgent, isPortAvailable } from "../../agent/process.js";
|
|
5
|
+
import { mergeConfigs } from "../../agent/config.js";
|
|
6
|
+
import { logger } from "../../utils/logger.js";
|
|
7
|
+
import { formatDuration, createSpinner, colorStatus } from "../../utils/format.js";
|
|
8
|
+
export function register(program) {
|
|
9
|
+
program
|
|
10
|
+
.command("start")
|
|
11
|
+
.description("Start the Sequence0 node")
|
|
12
|
+
.option("-n, --network <network>", "Network to connect to (mainnet or testnet)")
|
|
13
|
+
.option("-d, --daemon", "Run as a background daemon")
|
|
14
|
+
.option("--auto-heal", "Enable heartbeat monitoring and auto-restart")
|
|
15
|
+
.option("--api-port <port>", "Agent port (legacy)", parseInt)
|
|
16
|
+
.action(async (opts) => {
|
|
17
|
+
try {
|
|
18
|
+
await startAgent(opts);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
logger.error(err instanceof Error ? err.message : String(err));
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
async function startAgent(opts) {
|
|
27
|
+
// 1. Load merged config (agent config.toml + blockclaw config.toml)
|
|
28
|
+
const config = mergeConfigs();
|
|
29
|
+
// CLI flags override config values — prompt interactively if no network specified
|
|
30
|
+
let network = opts.network ?? config.network;
|
|
31
|
+
if (!opts.network && !config.network) {
|
|
32
|
+
const choice = await prompt.select({
|
|
33
|
+
message: "Which network?",
|
|
34
|
+
options: [
|
|
35
|
+
{ value: "mainnet", label: "Mainnet (Chain ID 800801)" },
|
|
36
|
+
{ value: "testnet", label: "Testnet (Chain ID 800800)" },
|
|
37
|
+
],
|
|
38
|
+
});
|
|
39
|
+
if (prompt.isCancel(choice)) {
|
|
40
|
+
prompt.cancel("Cancelled.");
|
|
41
|
+
process.exit(0);
|
|
42
|
+
}
|
|
43
|
+
network = choice;
|
|
44
|
+
}
|
|
45
|
+
const daemon = opts.daemon ?? config.daemon;
|
|
46
|
+
const apiPort = opts.apiPort ?? config.apiPort;
|
|
47
|
+
const p2pPort = config.port;
|
|
48
|
+
logger.header(`Starting node on ${network}`);
|
|
49
|
+
// 2. Check if agent is already running
|
|
50
|
+
const client = new AgentClient(`http://localhost:${apiPort}`);
|
|
51
|
+
const alreadyHealthy = await client.isHealthy();
|
|
52
|
+
if (alreadyHealthy) {
|
|
53
|
+
try {
|
|
54
|
+
const status = await client.status();
|
|
55
|
+
logger.warn("Your node is already running.");
|
|
56
|
+
logger.kv("Node ID", status.peer_id);
|
|
57
|
+
logger.kv("Peers", status.connected_peers);
|
|
58
|
+
logger.kv("Wallets", status.wallets.length);
|
|
59
|
+
logger.kv("Uptime", formatDuration(status.uptime_seconds));
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
logger.warn("Your node is already running on this port.");
|
|
63
|
+
}
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// 3. Resolve the agent binary
|
|
67
|
+
let binPath;
|
|
68
|
+
logger.step(1, 5, "Resolving node software...");
|
|
69
|
+
try {
|
|
70
|
+
binPath = await resolveBinary();
|
|
71
|
+
}
|
|
72
|
+
catch {
|
|
73
|
+
logger.warn("Node software not found.");
|
|
74
|
+
logger.info("Downloading node software...");
|
|
75
|
+
binPath = await downloadBinary();
|
|
76
|
+
}
|
|
77
|
+
const version = await getBinaryVersion(binPath);
|
|
78
|
+
logger.kv("Binary", binPath);
|
|
79
|
+
if (version) {
|
|
80
|
+
logger.kv("Version", version);
|
|
81
|
+
}
|
|
82
|
+
// 4. Check port availability
|
|
83
|
+
logger.step(2, 5, "Checking port availability...");
|
|
84
|
+
const p2pAvailable = await isPortAvailable(p2pPort);
|
|
85
|
+
if (!p2pAvailable) {
|
|
86
|
+
logger.error(`Network port ${p2pPort} is already in use.`);
|
|
87
|
+
logger.info("Use a different port in your config or stop the program using it.");
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
logger.kv("Network Port", `${p2pPort} (available)`);
|
|
91
|
+
const apiAvailable = await isPortAvailable(apiPort);
|
|
92
|
+
if (!apiAvailable) {
|
|
93
|
+
logger.error(`Control port ${apiPort} is already in use.`);
|
|
94
|
+
logger.info("Use --api-port to specify a different port.");
|
|
95
|
+
process.exit(1);
|
|
96
|
+
}
|
|
97
|
+
logger.kv("Control Port", `${apiPort} (available)`);
|
|
98
|
+
// 5. Spawn the agent process
|
|
99
|
+
logger.step(3, 5, "Starting node...");
|
|
100
|
+
const child = spawnAgent({
|
|
101
|
+
binPath,
|
|
102
|
+
network,
|
|
103
|
+
port: p2pPort,
|
|
104
|
+
apiPort,
|
|
105
|
+
dataDir: config.dataDir,
|
|
106
|
+
rpcUrl: config.rpcUrl,
|
|
107
|
+
registry: config.registry,
|
|
108
|
+
walletFactory: config.walletFactory,
|
|
109
|
+
feeCollector: config.feeCollector,
|
|
110
|
+
programRegistry: config.programRegistry,
|
|
111
|
+
delegationRegistry: config.delegationRegistry,
|
|
112
|
+
daemon,
|
|
113
|
+
bootstrap: config.bootstrap,
|
|
114
|
+
logLevel: config.logLevel,
|
|
115
|
+
externalIp: config.externalIp,
|
|
116
|
+
noRegistry: config.noRegistry,
|
|
117
|
+
});
|
|
118
|
+
// 6. Poll health endpoint until healthy (timeout 60s)
|
|
119
|
+
logger.step(4, 5, "Connecting to the network...");
|
|
120
|
+
const spinner = createSpinner("Node starting up...");
|
|
121
|
+
const startTime = Date.now();
|
|
122
|
+
const timeoutMs = 60_000;
|
|
123
|
+
let healthy = false;
|
|
124
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
125
|
+
healthy = await client.isHealthy();
|
|
126
|
+
if (healthy)
|
|
127
|
+
break;
|
|
128
|
+
await new Promise((r) => setTimeout(r, 1000));
|
|
129
|
+
}
|
|
130
|
+
if (!healthy) {
|
|
131
|
+
spinner.stop("Node failed to start within 60 seconds");
|
|
132
|
+
logger.error("Node did not come online in time.");
|
|
133
|
+
logger.info("Check logs at ~/.sequence0/agent.log for details.");
|
|
134
|
+
process.exit(1);
|
|
135
|
+
}
|
|
136
|
+
spinner.stop("Node is online");
|
|
137
|
+
// 7. Display startup summary
|
|
138
|
+
logger.step(5, 5, "Node started successfully.");
|
|
139
|
+
logger.blank();
|
|
140
|
+
logger.separator();
|
|
141
|
+
try {
|
|
142
|
+
const status = await client.status();
|
|
143
|
+
logger.kv("Status", colorStatus("running"));
|
|
144
|
+
logger.kv("Node ID", status.peer_id);
|
|
145
|
+
logger.kv("Network", network);
|
|
146
|
+
logger.kv("Peers", status.connected_peers);
|
|
147
|
+
logger.kv("Wallets", status.wallets.length);
|
|
148
|
+
logger.kv("Control", client.isSocketConnection
|
|
149
|
+
? `Unix socket (secure)`
|
|
150
|
+
: `http://localhost:${apiPort}`);
|
|
151
|
+
if (version) {
|
|
152
|
+
logger.kv("Version", version);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
logger.kv("Status", colorStatus("running"));
|
|
157
|
+
logger.kv("Network", network);
|
|
158
|
+
logger.kv("Control", client.isSocketConnection
|
|
159
|
+
? `Unix socket (secure)`
|
|
160
|
+
: `http://localhost:${apiPort}`);
|
|
161
|
+
}
|
|
162
|
+
logger.separator();
|
|
163
|
+
// 8. Log auto-heal status
|
|
164
|
+
if (opts.autoHeal) {
|
|
165
|
+
logger.blank();
|
|
166
|
+
logger.info("Heartbeat monitoring is enabled (--auto-heal).");
|
|
167
|
+
logger.info("The node will be automatically restarted if it becomes unresponsive.");
|
|
168
|
+
}
|
|
169
|
+
logger.blank();
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=start.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../../src/interface/commands/start.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/interface/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAwF/C"}
|