caravan-x
Version:
A terminal-based utility for managing Caravan multisig wallets in regtest mode. This tool simplifies development and testing with Caravan by providing an easy-to-use interface
169 lines (168 loc) ⢠6.48 kB
JavaScript
;
/**
* Snapshot Commands for Caravan-X
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SnapshotCommands = void 0;
const prompts_1 = require("@inquirer/prompts");
const chalk_1 = __importDefault(require("chalk"));
const terminal_1 = require("../utils/terminal");
const cli_table3_1 = __importDefault(require("cli-table3"));
class SnapshotCommands {
constructor(snapshotService) {
this.snapshotService = snapshotService;
}
async showSnapshotMenu() {
(0, terminal_1.displayCommandTitle)("Blockchain Snapshots");
const action = await (0, prompts_1.select)({
message: "What would you like to do?",
choices: [
{ name: "šø Create Snapshot", value: "create" },
{ name: "š List Snapshots", value: "list" },
{ name: "ā»ļø Restore Snapshot", value: "restore" },
{ name: "š Compare Snapshots", value: "diff" },
{ name: "šļø Delete Snapshot", value: "delete" },
{ name: "š Back", value: "back" },
],
});
switch (action) {
case "create":
await this.createSnapshot();
break;
case "list":
await this.listSnapshots();
break;
case "restore":
await this.restoreSnapshot();
break;
case "diff":
await this.compareSnapshots();
break;
case "delete":
await this.deleteSnapshot();
break;
case "back":
return;
}
if (action !== "back") {
await this.showSnapshotMenu();
}
}
async createSnapshot() {
const name = await (0, prompts_1.input)({
message: "Snapshot name:",
required: true,
});
const description = await (0, prompts_1.input)({
message: "Description (optional):",
});
const snapshot = await this.snapshotService.createSnapshot({
name,
description,
});
console.log(terminal_1.colors.success(`\nā
Snapshot created: ${snapshot.name}`));
console.log(terminal_1.colors.info(`Block height: ${snapshot.blockHeight}`));
console.log(terminal_1.colors.info(`ID: ${snapshot.id}`));
}
async listSnapshots() {
const snapshots = await this.snapshotService.listSnapshots();
if (snapshots.length === 0) {
console.log(terminal_1.colors.warning("\nNo snapshots found."));
return;
}
const table = new cli_table3_1.default({
head: ["Name", "Block Height", "Created", "Wallets"],
colWidths: [25, 15, 20, 30],
});
for (const snapshot of snapshots) {
table.push([
snapshot.name,
snapshot.blockHeight,
new Date(snapshot.createdAt).toLocaleString(),
snapshot.wallets.join(", "),
]);
}
console.log("\n" + table.toString());
}
async restoreSnapshot() {
const snapshots = await this.snapshotService.listSnapshots();
if (snapshots.length === 0) {
console.log(terminal_1.colors.warning("\nNo snapshots available to restore."));
return;
}
const snapshotId = await (0, prompts_1.select)({
message: "Select snapshot to restore:",
choices: snapshots.map((s) => ({
name: `${s.name} (height: ${s.blockHeight})`,
value: s.id,
})),
});
const confirmRestore = await (0, prompts_1.confirm)({
message: "This will replace your current blockchain state. Continue?",
default: false,
});
if (confirmRestore) {
await this.snapshotService.restoreSnapshot(snapshotId, {
stopBitcoin: true,
restartBitcoin: false,
});
}
}
async compareSnapshots() {
const snapshots = await this.snapshotService.listSnapshots();
if (snapshots.length < 2) {
console.log(terminal_1.colors.warning("\nNeed at least 2 snapshots to compare."));
return;
}
const snapshot1 = await (0, prompts_1.select)({
message: "Select first snapshot:",
choices: snapshots.map((s) => ({
name: `${s.name} (height: ${s.blockHeight})`,
value: s.id,
})),
});
const snapshot2 = await (0, prompts_1.select)({
message: "Select second snapshot:",
choices: snapshots.map((s) => ({
name: `${s.name} (height: ${s.blockHeight})`,
value: s.id,
})),
});
const diff = await this.snapshotService.diffSnapshots(snapshot1, snapshot2);
console.log(chalk_1.default.bold("\nš Snapshot Comparison\n"));
console.log(`${diff.snapshot1.name} ā ${diff.snapshot2.name}`);
console.log(`Block height difference: ${diff.heightDiff}`);
console.log(`Wallets added: ${diff.walletsDiff.added.join(", ") || "none"}`);
console.log(`Wallets removed: ${diff.walletsDiff.removed.join(", ") || "none"}`);
}
async deleteSnapshot() {
const snapshots = await this.snapshotService.listSnapshots();
if (snapshots.length === 0) {
console.log(terminal_1.colors.warning("\nNo snapshots to delete."));
return;
}
const snapshotIds = await (0, prompts_1.checkbox)({
message: "Select snapshots to delete:",
choices: snapshots.map((s) => ({
name: `${s.name} (height: ${s.blockHeight})`,
value: s.id,
})),
});
if (snapshotIds.length === 0) {
return;
}
const confirmDelete = await (0, prompts_1.confirm)({
message: `Delete ${snapshotIds.length} snapshot(s)?`,
default: false,
});
if (confirmDelete) {
for (const id of snapshotIds) {
await this.snapshotService.deleteSnapshot(id);
}
}
}
}
exports.SnapshotCommands = SnapshotCommands;