@ckb-firewall/cli 0.1.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +108 -0
  3. package/dist/commands/add.d.ts +13 -0
  4. package/dist/commands/add.d.ts.map +1 -0
  5. package/dist/commands/add.js +247 -0
  6. package/dist/commands/add.js.map +1 -0
  7. package/dist/commands/execute.d.ts +12 -0
  8. package/dist/commands/execute.d.ts.map +1 -0
  9. package/dist/commands/execute.js +229 -0
  10. package/dist/commands/execute.js.map +1 -0
  11. package/dist/commands/inspect.d.ts +9 -0
  12. package/dist/commands/inspect.d.ts.map +1 -0
  13. package/dist/commands/inspect.js +77 -0
  14. package/dist/commands/inspect.js.map +1 -0
  15. package/dist/commands/proposals.d.ts +4 -0
  16. package/dist/commands/proposals.d.ts.map +1 -0
  17. package/dist/commands/proposals.js +77 -0
  18. package/dist/commands/proposals.js.map +1 -0
  19. package/dist/commands/propose.d.ts +12 -0
  20. package/dist/commands/propose.d.ts.map +1 -0
  21. package/dist/commands/propose.js +240 -0
  22. package/dist/commands/propose.js.map +1 -0
  23. package/dist/commands/remove.d.ts +12 -0
  24. package/dist/commands/remove.d.ts.map +1 -0
  25. package/dist/commands/remove.js +236 -0
  26. package/dist/commands/remove.js.map +1 -0
  27. package/dist/commands/sign.d.ts +7 -0
  28. package/dist/commands/sign.d.ts.map +1 -0
  29. package/dist/commands/sign.js +178 -0
  30. package/dist/commands/sign.js.map +1 -0
  31. package/dist/commands/vote.d.ts +7 -0
  32. package/dist/commands/vote.d.ts.map +1 -0
  33. package/dist/commands/vote.js +106 -0
  34. package/dist/commands/vote.js.map +1 -0
  35. package/dist/index.d.ts +3 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +133 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/lib/blkl.d.ts +8 -0
  40. package/dist/lib/blkl.d.ts.map +1 -0
  41. package/dist/lib/blkl.js +62 -0
  42. package/dist/lib/blkl.js.map +1 -0
  43. package/dist/lib/defaults.d.ts +22 -0
  44. package/dist/lib/defaults.d.ts.map +1 -0
  45. package/dist/lib/defaults.js +28 -0
  46. package/dist/lib/defaults.js.map +1 -0
  47. package/dist/lib/hints.d.ts +7 -0
  48. package/dist/lib/hints.d.ts.map +1 -0
  49. package/dist/lib/hints.js +67 -0
  50. package/dist/lib/hints.js.map +1 -0
  51. package/dist/lib/proposals.d.ts +61 -0
  52. package/dist/lib/proposals.d.ts.map +1 -0
  53. package/dist/lib/proposals.js +89 -0
  54. package/dist/lib/proposals.js.map +1 -0
  55. package/dist/lib/rpc.d.ts +24 -0
  56. package/dist/lib/rpc.d.ts.map +1 -0
  57. package/dist/lib/rpc.js +55 -0
  58. package/dist/lib/rpc.js.map +1 -0
  59. package/dist/lib/witness.d.ts +22 -0
  60. package/dist/lib/witness.d.ts.map +1 -0
  61. package/dist/lib/witness.js +82 -0
  62. package/dist/lib/witness.js.map +1 -0
  63. package/package.json +63 -0
package/dist/index.js ADDED
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env node
2
+ import { program } from "commander";
3
+ import cfonts from "cfonts";
4
+ import { inspectCommand, inspectDefaults } from "./commands/inspect.js";
5
+ import { addCommand, addDefaults } from "./commands/add.js";
6
+ import { removeCommand, removeDefaults } from "./commands/remove.js";
7
+ import { proposeCommand } from "./commands/propose.js";
8
+ import { proposalsCommand } from "./commands/proposals.js";
9
+ import { voteCommand } from "./commands/vote.js";
10
+ import { signCommand } from "./commands/sign.js";
11
+ import { executeCommand, executeDefaults } from "./commands/execute.js";
12
+ function printBanner() {
13
+ cfonts.say("CKB FIREWALL|CLI", {
14
+ font: "block",
15
+ align: "left",
16
+ colors: ["cyan", "white"],
17
+ background: "transparent",
18
+ letterSpacing: 1,
19
+ lineHeight: 1,
20
+ space: false,
21
+ maxLength: "0",
22
+ });
23
+ }
24
+ program
25
+ .name("ckb-firewall")
26
+ .description("Manage the CKB Transaction Firewall blacklist registry")
27
+ .version("0.1.0")
28
+ .addHelpCommand(false);
29
+ // ── inspect ──────────────────────────────────────────────────────────────────
30
+ const inspectDefs = inspectDefaults();
31
+ program
32
+ .command("inspect")
33
+ .description("Display current blacklist registry entries")
34
+ .option("--rpc-url <url>", "CKB node RPC URL", inspectDefs.rpcUrl)
35
+ .option("--registry-tx <hash>", "Registry cell tx hash", inspectDefs.registryTx)
36
+ .option("--registry-index <n>", "Registry cell output index", inspectDefs.registryIndex)
37
+ .action(async (opts) => {
38
+ await inspectCommand(opts);
39
+ });
40
+ // ── add (quick path) ──────────────────────────────────────────────────────────
41
+ const addDefs = addDefaults();
42
+ program
43
+ .command("add")
44
+ .description("Quick: add a lock-args to the blacklist with placeholder governance (testnet/dev)")
45
+ .option("--lock-args <hex>", "Lock args to blacklist (0x-prefixed hex)")
46
+ .option("--expires-at <timestamp>", "Unix timestamp when entry expires (0 = never)", addDefs.expiresAt)
47
+ .option("--rpc-url <url>", "CKB node RPC URL", addDefs.rpcUrl)
48
+ .option("--registry-tx <hash>", "Registry cell tx hash", addDefs.registryTx)
49
+ .option("--registry-index <n>", "Registry cell output index", addDefs.registryIndex)
50
+ .option("--tx-out <file>", "Write unsigned tx JSON to this file", addDefs.txOut)
51
+ .option("--sign", "Sign and submit via ckb-cli after generating the tx file")
52
+ .option("--from-account <address>", "Governance account address for ckb-cli signing", addDefs.fromAccount)
53
+ .action(async (opts) => {
54
+ await addCommand(opts);
55
+ });
56
+ // ── remove (quick path) ───────────────────────────────────────────────────────
57
+ const removeDefs = removeDefaults();
58
+ program
59
+ .command("remove")
60
+ .description("Quick: remove a lock-args from the blacklist with placeholder governance (testnet/dev)")
61
+ .option("--lock-args <hex>", "Lock args to remove (0x-prefixed hex)")
62
+ .option("--rpc-url <url>", "CKB node RPC URL", removeDefs.rpcUrl)
63
+ .option("--registry-tx <hash>", "Registry cell tx hash", removeDefs.registryTx)
64
+ .option("--registry-index <n>", "Registry cell output index", removeDefs.registryIndex)
65
+ .option("--tx-out <file>", "Write unsigned tx JSON to this file", removeDefs.txOut)
66
+ .option("--sign", "Sign and submit via ckb-cli after generating the tx file")
67
+ .option("--from-account <address>", "Governance account address for ckb-cli signing", removeDefs.fromAccount)
68
+ .action(async (opts) => {
69
+ await removeCommand(opts);
70
+ });
71
+ // ── propose ───────────────────────────────────────────────────────────────────
72
+ program
73
+ .command("propose")
74
+ .description("Create a governance proposal (full flow with 72h review + voting + signing)")
75
+ .option("--action <add|remove>", "Proposal action")
76
+ .option("--lock-args <hex>", "Lock args to add or remove")
77
+ .option("--expires-at <timestamp>", "Expiry timestamp (add only, 0 = never)")
78
+ .option("--evidence <text>", "Evidence URL, tx hash, or description")
79
+ .option("--classification <type>", "Threat classification: theft|scam|hack|sanctions|other")
80
+ .option("--severity <level>", "Severity: critical|high|medium|low")
81
+ .option("--rationale <text>", "Impact statement and rationale")
82
+ .option("--proposer <name>", "Your name or identifier")
83
+ .action(async (opts) => {
84
+ await proposeCommand(opts);
85
+ });
86
+ // ── proposals (list) ──────────────────────────────────────────────────────────
87
+ program
88
+ .command("proposals")
89
+ .description("List governance proposals and their status")
90
+ .option("--status <status>", "Filter by status: pending-review|voting|approved|executed|rejected")
91
+ .action(async (opts) => {
92
+ await proposalsCommand(opts);
93
+ });
94
+ // ── vote ──────────────────────────────────────────────────────────────────────
95
+ program
96
+ .command("vote")
97
+ .description("Record a validator vote on a governance proposal")
98
+ .option("--proposal <id>", "Proposal ID or hash")
99
+ .option("--vote <choice>", "Vote: yes|no|abstain")
100
+ .option("--validator <id>", "Your validator name or identifier")
101
+ .action(async (opts) => {
102
+ await voteCommand(opts);
103
+ });
104
+ // ── sign ──────────────────────────────────────────────────────────────────────
105
+ program
106
+ .command("sign")
107
+ .description("Sign an approved proposal as a governance signer (secp256k1)")
108
+ .option("--proposal <id>", "Proposal ID or hash")
109
+ .option("--signer-index <0-4>", "Your signer index in the governance set")
110
+ .option("--key <hex>", "32-byte private key in hex (prompted if omitted)")
111
+ .action(async (opts) => {
112
+ await signCommand(opts);
113
+ });
114
+ // ── execute ───────────────────────────────────────────────────────────────────
115
+ const execDefs = executeDefaults();
116
+ program
117
+ .command("execute")
118
+ .description("Execute an approved, signed proposal — builds and submits the governance tx")
119
+ .option("--proposal <id>", "Proposal ID or hash")
120
+ .option("--rpc-url <url>", "CKB node RPC URL", execDefs.rpcUrl)
121
+ .option("--registry-tx <hash>", "Registry cell tx hash", execDefs.registryTx)
122
+ .option("--registry-index <n>", "Registry cell output index", execDefs.registryIndex)
123
+ .option("--tx-out <file>", "Write tx JSON to this file", execDefs.txOut)
124
+ .option("--sign", "Sign and submit via ckb-cli")
125
+ .option("--from-account <address>", "Governance account for ckb-cli signing", execDefs.fromAccount)
126
+ .action(async (opts) => {
127
+ await executeCommand(opts);
128
+ });
129
+ // Show banner on bare invocation before help prints.
130
+ if (process.argv.length <= 2)
131
+ printBanner();
132
+ program.parse(process.argv);
133
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { RegistryEntry, RegistryPayload } from "@ckb-firewall/sdk";
2
+ export declare function strip0x(hex: string): string;
3
+ export declare function hexToBytes(hex: string): Uint8Array;
4
+ export declare function bytesToHex(bytes: Uint8Array): string;
5
+ export declare function encodeRegistryPayload(payload: RegistryPayload): Uint8Array;
6
+ export declare function insertSorted(entries: RegistryEntry[], newEntry: RegistryEntry): RegistryEntry[];
7
+ export declare function removeEntry(entries: RegistryEntry[], identifier: string): RegistryEntry[];
8
+ //# sourceMappingURL=blkl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blkl.d.ts","sourceRoot":"","sources":["../../src/lib/blkl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAExE,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE3C;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAOlD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,GAAG,UAAU,CAsC1E;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,aAAa,EAAE,EACxB,QAAQ,EAAE,aAAa,GACtB,aAAa,EAAE,CAMjB;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,aAAa,EAAE,EACxB,UAAU,EAAE,MAAM,GACjB,aAAa,EAAE,CAKjB"}
@@ -0,0 +1,62 @@
1
+ export function strip0x(hex) {
2
+ return hex.startsWith("0x") ? hex.slice(2) : hex;
3
+ }
4
+ export function hexToBytes(hex) {
5
+ const clean = strip0x(hex);
6
+ const out = new Uint8Array(clean.length / 2);
7
+ for (let i = 0; i < clean.length; i += 2) {
8
+ out[i / 2] = Number.parseInt(clean.slice(i, i + 2), 16);
9
+ }
10
+ return out;
11
+ }
12
+ export function bytesToHex(bytes) {
13
+ return `0x${Array.from(bytes)
14
+ .map((b) => b.toString(16).padStart(2, "0"))
15
+ .join("")}`;
16
+ }
17
+ export function encodeRegistryPayload(payload) {
18
+ const encodedEntries = payload.entries.map((e) => {
19
+ const id = hexToBytes(e.identifier);
20
+ const buf = new Uint8Array(1 + id.length + 8);
21
+ buf[0] = id.length;
22
+ buf.set(id, 1);
23
+ let exp = e.expiresAt;
24
+ for (let i = 0; i < 8; i++) {
25
+ buf[1 + id.length + i] = Number(exp & 0xffn);
26
+ exp >>= 8n;
27
+ }
28
+ return buf;
29
+ });
30
+ const totalSize = 9 + encodedEntries.reduce((acc, e) => acc + e.length, 0);
31
+ const out = new Uint8Array(totalSize);
32
+ let off = 0;
33
+ // Magic "BLKL"
34
+ out[off++] = 0x42;
35
+ out[off++] = 0x4c;
36
+ out[off++] = 0x4b;
37
+ out[off++] = 0x4c;
38
+ out[off++] = payload.version;
39
+ const count = payload.entries.length;
40
+ out[off++] = count & 0xff;
41
+ out[off++] = (count >> 8) & 0xff;
42
+ out[off++] = (count >> 16) & 0xff;
43
+ out[off++] = (count >> 24) & 0xff;
44
+ for (const e of encodedEntries) {
45
+ out.set(e, off);
46
+ off += e.length;
47
+ }
48
+ return out;
49
+ }
50
+ export function insertSorted(entries, newEntry) {
51
+ const result = [...entries];
52
+ let insertAt = result.findIndex((e) => e.identifier >= newEntry.identifier);
53
+ if (insertAt === -1)
54
+ insertAt = result.length;
55
+ result.splice(insertAt, 0, newEntry);
56
+ return result;
57
+ }
58
+ export function removeEntry(entries, identifier) {
59
+ const norm = strip0x(identifier).toLowerCase();
60
+ return entries.filter((e) => strip0x(e.identifier).toLowerCase() !== norm);
61
+ }
62
+ //# sourceMappingURL=blkl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blkl.js","sourceRoot":"","sources":["../../src/lib/blkl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ScriptLike } from "@ckb-firewall/sdk";
2
+ export declare const TESTNET_RPC_URL = "https://testnet.ckb.dev";
3
+ export declare const TESTNET_REGISTRY_SCRIPT: ScriptLike;
4
+ export declare const TESTNET_REGISTRY_CELL: {
5
+ txHash: string;
6
+ index: number;
7
+ };
8
+ export declare const TESTNET_CONTRACT_OUTPOINTS: {
9
+ firewallLock: {
10
+ txHash: string;
11
+ index: number;
12
+ };
13
+ blacklistRegistry: {
14
+ txHash: string;
15
+ index: number;
16
+ };
17
+ };
18
+ export declare const SECP256K1_DEP_GROUP: {
19
+ txHash: string;
20
+ index: number;
21
+ };
22
+ //# sourceMappingURL=defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/lib/defaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,eAAO,MAAM,eAAe,4BAA4B,CAAC;AAEzD,eAAO,MAAM,uBAAuB,EAAE,UAKrC,CAAC;AAGF,eAAO,MAAM,qBAAqB;;;CAIjC,CAAC;AAGF,eAAO,MAAM,0BAA0B;;;;;;;;;CAWtC,CAAC;AAGF,eAAO,MAAM,mBAAmB;;;CAI/B,CAAC"}
@@ -0,0 +1,28 @@
1
+ export const TESTNET_RPC_URL = "https://testnet.ckb.dev";
2
+ export const TESTNET_REGISTRY_SCRIPT = {
3
+ codeHash: "0xbbfbcf51b88c57c9c1d6414de4a7e4f9dae133625dfab71588c8bc5d05b71096",
4
+ hashType: "type",
5
+ args: "0x019bd7e06f3ecf4be0f2fcd2188b23f1b9fcc88e5d4b65a8637b17723bbda3cce80114003f54dea35bcc7a0efef541d361799f77bd1b8581",
6
+ };
7
+ // Known live registry cell outpoint on testnet (may move after governance updates).
8
+ export const TESTNET_REGISTRY_CELL = {
9
+ txHash: "0x57edc162ddd476d970b8a65558466ca11bb1762be9366fd12c76d620fe695fb7",
10
+ index: 0,
11
+ };
12
+ // Deployed contract binary cells.
13
+ export const TESTNET_CONTRACT_OUTPOINTS = {
14
+ firewallLock: {
15
+ txHash: "0x11b0397cd58dce5c2bd704108ee6e1609128c0d828a3f3360237585e82bb7aed",
16
+ index: 0,
17
+ },
18
+ blacklistRegistry: {
19
+ txHash: "0x11b0397cd58dce5c2bd704108ee6e1609128c0d828a3f3360237585e82bb7aed",
20
+ index: 1,
21
+ },
22
+ };
23
+ // secp256k1 dep group used by ckb-cli for fee-payer signing.
24
+ export const SECP256K1_DEP_GROUP = {
25
+ txHash: "0xf8de3bb47d055cdf460d93a2a6e1b05f7432f9777c8c474abf4eec1d4aee5d37",
26
+ index: 0,
27
+ };
28
+ //# sourceMappingURL=defaults.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/lib/defaults.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAEzD,MAAM,CAAC,MAAM,uBAAuB,GAAe;IACjD,QAAQ,EACN,oEAAoE;IACtE,QAAQ,EAAE,MAAM;IAChB,IAAI,EAAE,oHAAoH;CAC3H,CAAC;AAEF,oFAAoF;AACpF,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,MAAM,EACJ,oEAAoE;IACtE,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,kCAAkC;AAClC,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACxC,YAAY,EAAE;QACZ,MAAM,EACJ,oEAAoE;QACtE,KAAK,EAAE,CAAC;KACT;IACD,iBAAiB,EAAE;QACjB,MAAM,EACJ,oEAAoE;QACtE,KAAK,EAAE,CAAC;KACT;CACF,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,MAAM,EACJ,oEAAoE;IACtE,KAAK,EAAE,CAAC;CACT,CAAC"}
@@ -0,0 +1,7 @@
1
+ type HintKey = "inspect" | "add" | "remove" | "propose" | "proposals" | "vote" | "sign" | "execute";
2
+ /** Print 2 contextual hints after a command. */
3
+ export declare function printHints(command: HintKey): void;
4
+ /** Print a targeted "contribute by voting" callout (more prominent). */
5
+ export declare function printVotingCallout(openCount: number): void;
6
+ export {};
7
+ //# sourceMappingURL=hints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hints.d.ts","sourceRoot":"","sources":["../../src/lib/hints.ts"],"names":[],"mappings":"AAEA,KAAK,OAAO,GACR,SAAS,GACT,KAAK,GACL,QAAQ,GACR,SAAS,GACT,WAAW,GACX,MAAM,GACN,MAAM,GACN,SAAS,CAAC;AA+Cd,gDAAgD;AAChD,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUjD;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAU1D"}
@@ -0,0 +1,67 @@
1
+ import chalk from "chalk";
2
+ const HINTS = {
3
+ inspect: [
4
+ `Cast a vote on open proposals: ${chalk.dim("ckb-firewall vote")}`,
5
+ `Review all pending proposals: ${chalk.dim("ckb-firewall proposals --status voting")}`,
6
+ `Create a new governance proposal: ${chalk.dim("ckb-firewall propose")}`,
7
+ ],
8
+ add: [
9
+ `Track your change with a governance proposal: ${chalk.dim("ckb-firewall propose")}`,
10
+ `Verify the registry was updated: ${chalk.dim("ckb-firewall inspect")}`,
11
+ `List current blacklist entries: ${chalk.dim("ckb-firewall inspect")}`,
12
+ ],
13
+ remove: [
14
+ `Track your change with a governance proposal: ${chalk.dim("ckb-firewall propose")}`,
15
+ `Verify the registry was updated: ${chalk.dim("ckb-firewall inspect")}`,
16
+ `See all governance proposals: ${chalk.dim("ckb-firewall proposals")}`,
17
+ ],
18
+ propose: [
19
+ `Validators: help approve this proposal by voting: ${chalk.dim("ckb-firewall vote")}`,
20
+ `Share the proposal ID with your community to gather votes faster`,
21
+ `Track proposal progress: ${chalk.dim("ckb-firewall proposals")}`,
22
+ `Need 3 yes votes before signing: ${chalk.dim("ckb-firewall proposals --status voting")}`,
23
+ ],
24
+ proposals: [
25
+ `Vote on an open proposal: ${chalk.dim("ckb-firewall vote")}`,
26
+ `Submit a signature on an approved proposal: ${chalk.dim("ckb-firewall sign")}`,
27
+ `Create a new governance proposal: ${chalk.dim("ckb-firewall propose")}`,
28
+ `Execute a fully signed proposal: ${chalk.dim("ckb-firewall execute")}`,
29
+ ],
30
+ vote: [
31
+ `Encourage others to vote — 3 yes votes required to approve`,
32
+ `Check current vote tallies: ${chalk.dim("ckb-firewall proposals")}`,
33
+ `Once approved, sign the proposal: ${chalk.dim("ckb-firewall sign")}`,
34
+ ],
35
+ sign: [
36
+ `After 3 signatures, execute the proposal on-chain: ${chalk.dim("ckb-firewall execute")}`,
37
+ `View all proposals awaiting signatures: ${chalk.dim("ckb-firewall proposals --status approved")}`,
38
+ `Verify the registry state: ${chalk.dim("ckb-firewall inspect")}`,
39
+ ],
40
+ execute: [
41
+ `Verify the updated registry: ${chalk.dim("ckb-firewall inspect")}`,
42
+ `Help govern the registry — vote on open proposals: ${chalk.dim("ckb-firewall vote")}`,
43
+ `Create a new governance proposal: ${chalk.dim("ckb-firewall propose")}`,
44
+ ],
45
+ };
46
+ /** Print 2 contextual hints after a command. */
47
+ export function printHints(command) {
48
+ const pool = HINTS[command];
49
+ const chosen = pool.slice(0, 2);
50
+ if (chosen.length === 0)
51
+ return;
52
+ console.log(chalk.dim("─".repeat(52)));
53
+ console.log(chalk.dim("Tips:"));
54
+ for (const hint of chosen) {
55
+ console.log(chalk.dim(" •"), hint);
56
+ }
57
+ console.log();
58
+ }
59
+ /** Print a targeted "contribute by voting" callout (more prominent). */
60
+ export function printVotingCallout(openCount) {
61
+ if (openCount === 0)
62
+ return;
63
+ console.log(chalk.cyan("⬡"), chalk.bold(`${openCount} proposal${openCount === 1 ? "" : "s"} open for voting — your vote shapes the registry.`));
64
+ console.log(` Cast yours: ${chalk.dim("ckb-firewall vote")}`);
65
+ console.log();
66
+ }
67
+ //# sourceMappingURL=hints.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hints.js","sourceRoot":"","sources":["../../src/lib/hints.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ export type ProposalAction = "add" | "remove";
2
+ export type ProposalStatus = "pending-review" | "voting" | "approved" | "rejected" | "executed";
3
+ export type VoteChoice = "yes" | "no" | "abstain";
4
+ export type ThreatClass = "theft" | "scam" | "hack" | "sanctions" | "other";
5
+ export type Severity = "critical" | "high" | "medium" | "low";
6
+ export interface ProposalVote {
7
+ validatorId: string;
8
+ vote: VoteChoice;
9
+ timestamp: string;
10
+ }
11
+ export interface ProposalSignature {
12
+ signerIndex: number;
13
+ signature: string;
14
+ timestamp: string;
15
+ }
16
+ export interface Proposal {
17
+ id: string;
18
+ proposalIdHash: string;
19
+ action: ProposalAction;
20
+ lockArgs: string;
21
+ expiresAt: string;
22
+ evidence: string;
23
+ classification: ThreatClass;
24
+ severity: Severity;
25
+ rationale: string;
26
+ proposer: string;
27
+ submittedAt: string;
28
+ reviewWindowEndsAt: string;
29
+ status: ProposalStatus;
30
+ votes: ProposalVote[];
31
+ voteDigestHash: string;
32
+ signatures: ProposalSignature[];
33
+ txHash?: string;
34
+ }
35
+ export declare const VOTE_THRESHOLD = 3;
36
+ export declare const SIG_THRESHOLD = 3;
37
+ export declare const REVIEW_WINDOW_MS: number;
38
+ export declare function getProposalsDir(): string;
39
+ export declare function saveProposal(proposal: Proposal): void;
40
+ export declare function loadProposal(id: string): Proposal;
41
+ export declare function listProposals(): Proposal[];
42
+ declare function proposalCanonical(fields: {
43
+ action: ProposalAction;
44
+ lockArgs: string;
45
+ expiresAt: string;
46
+ evidence: string;
47
+ classification: ThreatClass;
48
+ severity: Severity;
49
+ rationale: string;
50
+ proposer: string;
51
+ submittedAt: string;
52
+ }): Uint8Array;
53
+ export declare function computeProposalIdHash(fields: Parameters<typeof proposalCanonical>[0]): string;
54
+ export declare function computeVoteDigestHash(votes: ProposalVote[]): string;
55
+ export declare function countYes(votes: ProposalVote[]): number;
56
+ export declare function isReviewWindowPassed(proposal: Proposal): boolean;
57
+ export declare function isVoteApproved(proposal: Proposal): boolean;
58
+ export declare function isReadyToExecute(proposal: Proposal): boolean;
59
+ export declare function signingMessage(proposal: Proposal): Uint8Array;
60
+ export {};
61
+ //# sourceMappingURL=proposals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposals.d.ts","sourceRoot":"","sources":["../../src/lib/proposals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { mkdirSync, writeFileSync, readFileSync, readdirSync, existsSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ import { ckbBlake2b } from "./witness.js";
5
+ import { hexToBytes, bytesToHex } from "./blkl.js";
6
+ // Threshold rules (simplified for testnet: 5 governance participants, need 3-of-5).
7
+ export const VOTE_THRESHOLD = 3;
8
+ export const SIG_THRESHOLD = 3;
9
+ export const REVIEW_WINDOW_MS = 72 * 60 * 60 * 1000; // 72 hours
10
+ export function getProposalsDir() {
11
+ const dir = join(homedir(), ".ckb-firewall", "proposals");
12
+ mkdirSync(dir, { recursive: true });
13
+ return dir;
14
+ }
15
+ function proposalPath(dir, proposalIdHash) {
16
+ return join(dir, `${proposalIdHash.slice(2, 14)}.json`);
17
+ }
18
+ export function saveProposal(proposal) {
19
+ const dir = getProposalsDir();
20
+ writeFileSync(proposalPath(dir, proposal.proposalIdHash), JSON.stringify(proposal, null, 2) + "\n", "utf8");
21
+ }
22
+ export function loadProposal(id) {
23
+ const dir = getProposalsDir();
24
+ // Accept full hash (0x...) or short display id.
25
+ const short = id.startsWith("0x") ? id.slice(2, 14) : id.slice(0, 12);
26
+ const file = join(dir, `${short}.json`);
27
+ if (!existsSync(file)) {
28
+ throw new Error(`Proposal "${id}" not found in ${dir}`);
29
+ }
30
+ return JSON.parse(readFileSync(file, "utf8"));
31
+ }
32
+ export function listProposals() {
33
+ const dir = getProposalsDir();
34
+ return readdirSync(dir)
35
+ .filter((f) => f.endsWith(".json"))
36
+ .map((f) => JSON.parse(readFileSync(join(dir, f), "utf8")))
37
+ .sort((a, b) => a.submittedAt.localeCompare(b.submittedAt));
38
+ }
39
+ // Canonical representation used as input to proposalIdHash.
40
+ function proposalCanonical(fields) {
41
+ const str = JSON.stringify({
42
+ action: fields.action,
43
+ lockArgs: fields.lockArgs.toLowerCase(),
44
+ expiresAt: fields.expiresAt,
45
+ evidence: fields.evidence,
46
+ classification: fields.classification,
47
+ severity: fields.severity,
48
+ rationale: fields.rationale,
49
+ proposer: fields.proposer,
50
+ submittedAt: fields.submittedAt,
51
+ });
52
+ return new TextEncoder().encode(str);
53
+ }
54
+ export function computeProposalIdHash(fields) {
55
+ const hash = ckbBlake2b(proposalCanonical(fields));
56
+ return bytesToHex(hash);
57
+ }
58
+ export function computeVoteDigestHash(votes) {
59
+ const str = JSON.stringify(votes
60
+ .slice()
61
+ .sort((a, b) => a.validatorId.localeCompare(b.validatorId))
62
+ .map((v) => ({ validatorId: v.validatorId, vote: v.vote, timestamp: v.timestamp })));
63
+ const hash = ckbBlake2b(new TextEncoder().encode(str));
64
+ return bytesToHex(hash);
65
+ }
66
+ export function countYes(votes) {
67
+ return votes.filter((v) => v.vote === "yes").length;
68
+ }
69
+ export function isReviewWindowPassed(proposal) {
70
+ return Date.now() >= new Date(proposal.reviewWindowEndsAt).getTime();
71
+ }
72
+ export function isVoteApproved(proposal) {
73
+ return countYes(proposal.votes) >= VOTE_THRESHOLD;
74
+ }
75
+ export function isReadyToExecute(proposal) {
76
+ return (isReviewWindowPassed(proposal) &&
77
+ isVoteApproved(proposal) &&
78
+ proposal.signatures.length >= SIG_THRESHOLD);
79
+ }
80
+ // The message each governance signer signs (domain-separated, 64 bytes input).
81
+ export function signingMessage(proposal) {
82
+ const proposalBytes = hexToBytes(proposal.proposalIdHash);
83
+ const voteBytes = hexToBytes(proposal.voteDigestHash);
84
+ const combined = new Uint8Array(proposalBytes.length + voteBytes.length);
85
+ combined.set(proposalBytes, 0);
86
+ combined.set(voteBytes, proposalBytes.length);
87
+ return ckbBlake2b(combined);
88
+ }
89
+ //# sourceMappingURL=proposals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposals.js","sourceRoot":"","sources":["../../src/lib/proposals.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { ScriptLike } from "@ckb-firewall/sdk";
2
+ export interface LiveCell {
3
+ txHash: string;
4
+ index: number;
5
+ capacity: string;
6
+ data: string;
7
+ lock: {
8
+ code_hash: string;
9
+ hash_type: string;
10
+ args: string;
11
+ };
12
+ type: {
13
+ code_hash: string;
14
+ hash_type: string;
15
+ args: string;
16
+ } | null;
17
+ }
18
+ export declare function getLiveCell(rpcUrl: string, txHash: string, index: number): Promise<LiveCell>;
19
+ export declare function findLiveRegistryCell(rpcUrl: string, registryScript: ScriptLike): Promise<{
20
+ txHash: string;
21
+ index: number;
22
+ data: string;
23
+ }>;
24
+ //# sourceMappingURL=rpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.d.ts","sourceRoot":"","sources":["../../src/lib/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA0BpD,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,IAAI,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACrE;AAED,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,QAAQ,CAAC,CA+BnB;AAGD,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,UAAU,GACzB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CA2B1D"}
@@ -0,0 +1,55 @@
1
+ async function call(url, method, params) {
2
+ const res = await fetch(url, {
3
+ method: "POST",
4
+ headers: { "Content-Type": "application/json" },
5
+ body: JSON.stringify({ jsonrpc: "2.0", method, params, id: 1 }),
6
+ });
7
+ const json = (await res.json());
8
+ if (json.error)
9
+ throw new Error(`RPC ${method}: ${json.error.message}`);
10
+ if (json.result === undefined)
11
+ throw new Error(`RPC ${method} returned no result`);
12
+ return json.result;
13
+ }
14
+ export async function getLiveCell(rpcUrl, txHash, index) {
15
+ const result = await call(rpcUrl, "get_live_cell", [
16
+ { tx_hash: txHash, index: `0x${index.toString(16)}` },
17
+ true,
18
+ ]);
19
+ if (result.status !== "live") {
20
+ throw new Error(`Cell ${txHash}:${index} is not live (status: ${result.status}). ` +
21
+ "The registry cell may have moved after a governance update — pass --registry-tx and --registry-index.");
22
+ }
23
+ return {
24
+ txHash,
25
+ index,
26
+ capacity: result.cell.output.capacity,
27
+ data: result.cell.data.content,
28
+ lock: result.cell.output.lock,
29
+ type: result.cell.output.type ?? null,
30
+ };
31
+ }
32
+ // Finds the live registry cell by querying the indexer (requires CKB node with indexer enabled).
33
+ export async function findLiveRegistryCell(rpcUrl, registryScript) {
34
+ const result = await call(rpcUrl, "get_cells", [
35
+ {
36
+ script: {
37
+ code_hash: registryScript.codeHash,
38
+ hash_type: registryScript.hashType,
39
+ args: registryScript.args,
40
+ },
41
+ script_type: "type",
42
+ },
43
+ "asc",
44
+ "0x1",
45
+ ]);
46
+ const cell = result.objects[0];
47
+ if (!cell)
48
+ throw new Error("No live registry cell found for the registry script.");
49
+ return {
50
+ txHash: cell.out_point.tx_hash,
51
+ index: Number.parseInt(cell.out_point.index, 16),
52
+ data: cell.output_data,
53
+ };
54
+ }
55
+ //# sourceMappingURL=rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/lib/rpc.ts"],"names":[],"mappings":"AASA,KAAK,UAAU,IAAI,CACjB,GAAW,EACX,MAAc,EACd,MAAiB;IAEjB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;KAChE,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAmB,CAAC;IAClD,IAAI,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,OAAO,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IACxE,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAC3B,MAAM,IAAI,KAAK,CAAC,OAAO,MAAM,qBAAqB,CAAC,CAAC;IACtD,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAWD,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAc,EACd,MAAc,EACd,KAAa;IAEb,MAAM,MAAM,GAAG,MAAM,IAAI,CAUtB,MAAM,EAAE,eAAe,EAAE;QAC1B,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE;QACrD,IAAI;KACL,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,QAAQ,MAAM,IAAI,KAAK,yBAAyB,MAAM,CAAC,MAAM,KAAK;YAChE,uGAAuG,CAC1G,CAAC;IACJ,CAAC;IAED,OAAO;QACL,MAAM;QACN,KAAK;QACL,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ;QACrC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;QAC9B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;QAC7B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI;KACtC,CAAC;AACJ,CAAC;AAED,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAc,EACd,cAA0B;IAE1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAKtB,MAAM,EAAE,WAAW,EAAE;QACtB;YACE,MAAM,EAAE;gBACN,SAAS,EAAE,cAAc,CAAC,QAAQ;gBAClC,SAAS,EAAE,cAAc,CAAC,QAAQ;gBAClC,IAAI,EAAE,cAAc,CAAC,IAAI;aAC1B;YACD,WAAW,EAAE,MAAM;SACpB;QACD,KAAK;QACL,KAAK;KACN,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC/B,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAEnF,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO;QAC9B,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC;QAChD,IAAI,EAAE,IAAI,CAAC,WAAW;KACvB,CAAC;AACJ,CAAC"}