@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,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 @@
|
|
|
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"}
|