@gzeoneth/gov-tracker 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.
- package/LICENSE +191 -0
- package/README.md +201 -0
- package/dist/abis.d.ts +79 -0
- package/dist/abis.d.ts.map +1 -0
- package/dist/abis.js +159 -0
- package/dist/abis.js.map +1 -0
- package/dist/cli/lib/cli.d.ts +92 -0
- package/dist/cli/lib/cli.d.ts.map +1 -0
- package/dist/cli/lib/cli.js +562 -0
- package/dist/cli/lib/cli.js.map +1 -0
- package/dist/cli/lib/election-check.d.ts +46 -0
- package/dist/cli/lib/election-check.d.ts.map +1 -0
- package/dist/cli/lib/election-check.js +136 -0
- package/dist/cli/lib/election-check.js.map +1 -0
- package/dist/cli/lib/json-state.d.ts +100 -0
- package/dist/cli/lib/json-state.d.ts.map +1 -0
- package/dist/cli/lib/json-state.js +225 -0
- package/dist/cli/lib/json-state.js.map +1 -0
- package/dist/cli/monitor.d.ts +3 -0
- package/dist/cli/monitor.d.ts.map +1 -0
- package/dist/cli/monitor.js +442 -0
- package/dist/cli/monitor.js.map +1 -0
- package/dist/constants.d.ts +235 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +293 -0
- package/dist/constants.js.map +1 -0
- package/dist/discovery/governor-discovery.d.ts +84 -0
- package/dist/discovery/governor-discovery.d.ts.map +1 -0
- package/dist/discovery/governor-discovery.js +310 -0
- package/dist/discovery/governor-discovery.js.map +1 -0
- package/dist/discovery/security-council.d.ts +68 -0
- package/dist/discovery/security-council.d.ts.map +1 -0
- package/dist/discovery/security-council.js +181 -0
- package/dist/discovery/security-council.js.map +1 -0
- package/dist/discovery/timelock-discovery.d.ts +99 -0
- package/dist/discovery/timelock-discovery.d.ts.map +1 -0
- package/dist/discovery/timelock-discovery.js +322 -0
- package/dist/discovery/timelock-discovery.js.map +1 -0
- package/dist/election.d.ts +172 -0
- package/dist/election.d.ts.map +1 -0
- package/dist/election.js +464 -0
- package/dist/election.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +164 -0
- package/dist/index.js.map +1 -0
- package/dist/stages/base.d.ts +127 -0
- package/dist/stages/base.d.ts.map +1 -0
- package/dist/stages/base.js +280 -0
- package/dist/stages/base.js.map +1 -0
- package/dist/stages/l2-to-l1-message.d.ts +108 -0
- package/dist/stages/l2-to-l1-message.d.ts.map +1 -0
- package/dist/stages/l2-to-l1-message.js +422 -0
- package/dist/stages/l2-to-l1-message.js.map +1 -0
- package/dist/stages/proposal-created.d.ts +20 -0
- package/dist/stages/proposal-created.d.ts.map +1 -0
- package/dist/stages/proposal-created.js +62 -0
- package/dist/stages/proposal-created.js.map +1 -0
- package/dist/stages/proposal-queued.d.ts +39 -0
- package/dist/stages/proposal-queued.d.ts.map +1 -0
- package/dist/stages/proposal-queued.js +131 -0
- package/dist/stages/proposal-queued.js.map +1 -0
- package/dist/stages/retryables.d.ts +79 -0
- package/dist/stages/retryables.d.ts.map +1 -0
- package/dist/stages/retryables.js +307 -0
- package/dist/stages/retryables.js.map +1 -0
- package/dist/stages/stage-builder.d.ts +46 -0
- package/dist/stages/stage-builder.d.ts.map +1 -0
- package/dist/stages/stage-builder.js +87 -0
- package/dist/stages/stage-builder.js.map +1 -0
- package/dist/stages/timelock.d.ts +100 -0
- package/dist/stages/timelock.d.ts.map +1 -0
- package/dist/stages/timelock.js +552 -0
- package/dist/stages/timelock.js.map +1 -0
- package/dist/stages/voting.d.ts +18 -0
- package/dist/stages/voting.d.ts.map +1 -0
- package/dist/stages/voting.js +109 -0
- package/dist/stages/voting.js.map +1 -0
- package/dist/tracker/context.d.ts +111 -0
- package/dist/tracker/context.d.ts.map +1 -0
- package/dist/tracker/context.js +264 -0
- package/dist/tracker/context.js.map +1 -0
- package/dist/tracker/discovery.d.ts +89 -0
- package/dist/tracker/discovery.d.ts.map +1 -0
- package/dist/tracker/discovery.js +228 -0
- package/dist/tracker/discovery.js.map +1 -0
- package/dist/tracker/execute.d.ts +44 -0
- package/dist/tracker/execute.d.ts.map +1 -0
- package/dist/tracker/execute.js +126 -0
- package/dist/tracker/execute.js.map +1 -0
- package/dist/tracker/index.d.ts +18 -0
- package/dist/tracker/index.d.ts.map +1 -0
- package/dist/tracker/index.js +70 -0
- package/dist/tracker/index.js.map +1 -0
- package/dist/tracker/pipeline.d.ts +47 -0
- package/dist/tracker/pipeline.d.ts.map +1 -0
- package/dist/tracker/pipeline.js +299 -0
- package/dist/tracker/pipeline.js.map +1 -0
- package/dist/tracker/query.d.ts +45 -0
- package/dist/tracker/query.d.ts.map +1 -0
- package/dist/tracker/query.js +159 -0
- package/dist/tracker/query.js.map +1 -0
- package/dist/tracker/state.d.ts +104 -0
- package/dist/tracker/state.d.ts.map +1 -0
- package/dist/tracker/state.js +287 -0
- package/dist/tracker/state.js.map +1 -0
- package/dist/tracker.d.ts +261 -0
- package/dist/tracker.d.ts.map +1 -0
- package/dist/tracker.js +556 -0
- package/dist/tracker.js.map +1 -0
- package/dist/types/config.d.ts +81 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/core.d.ts +51 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +6 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/cross-chain.d.ts +80 -0
- package/dist/types/cross-chain.d.ts.map +1 -0
- package/dist/types/cross-chain.js +6 -0
- package/dist/types/cross-chain.js.map +1 -0
- package/dist/types/election.d.ts +59 -0
- package/dist/types/election.d.ts.map +1 -0
- package/dist/types/election.js +6 -0
- package/dist/types/election.js.map +1 -0
- package/dist/types/governor.d.ts +71 -0
- package/dist/types/governor.d.ts.map +1 -0
- package/dist/types/governor.js +6 -0
- package/dist/types/governor.js.map +1 -0
- package/dist/types/index.d.ts +22 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/stages.d.ts +189 -0
- package/dist/types/stages.d.ts.map +1 -0
- package/dist/types/stages.js +23 -0
- package/dist/types/stages.js.map +1 -0
- package/dist/types/timelock.d.ts +108 -0
- package/dist/types/timelock.d.ts.map +1 -0
- package/dist/types/timelock.js +6 -0
- package/dist/types/timelock.js.map +1 -0
- package/dist/types/tracking.d.ts +180 -0
- package/dist/types/tracking.d.ts.map +1 -0
- package/dist/types/tracking.js +6 -0
- package/dist/types/tracking.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/chain.d.ts +18 -0
- package/dist/utils/chain.d.ts.map +1 -0
- package/dist/utils/chain.js +34 -0
- package/dist/utils/chain.js.map +1 -0
- package/dist/utils/log-filters.d.ts +67 -0
- package/dist/utils/log-filters.d.ts.map +1 -0
- package/dist/utils/log-filters.js +116 -0
- package/dist/utils/log-filters.js.map +1 -0
- package/dist/utils/log-search.d.ts +76 -0
- package/dist/utils/log-search.d.ts.map +1 -0
- package/dist/utils/log-search.js +142 -0
- package/dist/utils/log-search.js.map +1 -0
- package/dist/utils/logger.d.ts +41 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +50 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/operation-id.d.ts +48 -0
- package/dist/utils/operation-id.d.ts.map +1 -0
- package/dist/utils/operation-id.js +102 -0
- package/dist/utils/operation-id.js.map +1 -0
- package/dist/utils/rpc-utils.d.ts +30 -0
- package/dist/utils/rpc-utils.d.ts.map +1 -0
- package/dist/utils/rpc-utils.js +99 -0
- package/dist/utils/rpc-utils.js.map +1 -0
- package/dist/utils/salt-computation.d.ts +78 -0
- package/dist/utils/salt-computation.d.ts.map +1 -0
- package/dist/utils/salt-computation.js +132 -0
- package/dist/utils/salt-computation.js.map +1 -0
- package/dist/utils/salt-resolver.d.ts +63 -0
- package/dist/utils/salt-resolver.d.ts.map +1 -0
- package/dist/utils/salt-resolver.js +144 -0
- package/dist/utils/salt-resolver.js.map +1 -0
- package/dist/utils/scoped-logger.d.ts +43 -0
- package/dist/utils/scoped-logger.d.ts.map +1 -0
- package/dist/utils/scoped-logger.js +72 -0
- package/dist/utils/scoped-logger.js.map +1 -0
- package/dist/utils/stage-helpers.d.ts +51 -0
- package/dist/utils/stage-helpers.d.ts.map +1 -0
- package/dist/utils/stage-helpers.js +143 -0
- package/dist/utils/stage-helpers.js.map +1 -0
- package/dist/utils/stage-metadata.d.ts +62 -0
- package/dist/utils/stage-metadata.d.ts.map +1 -0
- package/dist/utils/stage-metadata.js +140 -0
- package/dist/utils/stage-metadata.js.map +1 -0
- package/dist/utils/timing.d.ts +115 -0
- package/dist/utils/timing.d.ts.map +1 -0
- package/dist/utils/timing.js +303 -0
- package/dist/utils/timing.js.map +1 -0
- package/dist/utils/urls.d.ts +20 -0
- package/dist/utils/urls.d.ts.map +1 -0
- package/dist/utils/urls.js +51 -0
- package/dist/utils/urls.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,442 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
36
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
+
};
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
/**
|
|
41
|
+
* Monitor CLI - Example SDK Usage
|
|
42
|
+
*
|
|
43
|
+
* NOTE: This is a CLI application that demonstrates SDK usage, not library code.
|
|
44
|
+
* It serves as both a reference implementation and a production-ready tool.
|
|
45
|
+
* Developers should treat this as an application of the SDK, not as part of the SDK API.
|
|
46
|
+
*
|
|
47
|
+
* Demonstrates how to use the governance tracking SDK for:
|
|
48
|
+
* - Discovering proposals and timelock operations
|
|
49
|
+
* - Tracking lifecycle stages
|
|
50
|
+
* - Preparing and executing transactions
|
|
51
|
+
*
|
|
52
|
+
* Usage: npx @gzeoneth/gov-tracker [run|track|election|status] [options]
|
|
53
|
+
*/
|
|
54
|
+
const dotenv = __importStar(require("dotenv"));
|
|
55
|
+
dotenv.config();
|
|
56
|
+
const os = __importStar(require("os"));
|
|
57
|
+
const path = __importStar(require("path"));
|
|
58
|
+
const fs = __importStar(require("fs"));
|
|
59
|
+
const debug_1 = __importDefault(require("debug"));
|
|
60
|
+
const commander_1 = require("commander");
|
|
61
|
+
const index_1 = require("../index");
|
|
62
|
+
const json_state_1 = require("./lib/json-state");
|
|
63
|
+
const election_check_1 = require("./lib/election-check");
|
|
64
|
+
const cli_1 = require("./lib/cli");
|
|
65
|
+
/**
|
|
66
|
+
* Get the platform-specific application data directory
|
|
67
|
+
* - Windows: %APPDATA%\gov-tracker
|
|
68
|
+
* - macOS: ~/Library/Application Support/gov-tracker
|
|
69
|
+
* - Linux: ~/.config/gov-tracker (follows XDG Base Directory specification)
|
|
70
|
+
*/
|
|
71
|
+
function getAppDataDir() {
|
|
72
|
+
const homeDir = os.homedir();
|
|
73
|
+
const platform = os.platform();
|
|
74
|
+
let baseDir;
|
|
75
|
+
if (platform === "win32") {
|
|
76
|
+
// Windows: Use APPDATA or fallback to %USERPROFILE%\AppData\Roaming
|
|
77
|
+
baseDir = process.env.APPDATA || path.join(homeDir, "AppData", "Roaming");
|
|
78
|
+
}
|
|
79
|
+
else if (platform === "darwin") {
|
|
80
|
+
// macOS: Use Application Support directory
|
|
81
|
+
baseDir = path.join(homeDir, "Library", "Application Support");
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Linux and others: Use XDG_CONFIG_HOME or fallback to ~/.config
|
|
85
|
+
baseDir = process.env.XDG_CONFIG_HOME || path.join(homeDir, ".config");
|
|
86
|
+
}
|
|
87
|
+
return path.join(baseDir, "gov-tracker");
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Get the default cache path and ensure the directory exists
|
|
91
|
+
*/
|
|
92
|
+
function getDefaultCachePath() {
|
|
93
|
+
const appDataDir = getAppDataDir();
|
|
94
|
+
// Create directory if it doesn't exist (synchronously at startup)
|
|
95
|
+
try {
|
|
96
|
+
if (!fs.existsSync(appDataDir)) {
|
|
97
|
+
fs.mkdirSync(appDataDir, { recursive: true });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
catch (_error) {
|
|
101
|
+
// If we can't create the directory, fall back to current directory
|
|
102
|
+
console.warn(`Warning: Could not create app data directory ${appDataDir}, using ./gov-tracker-cache.json`);
|
|
103
|
+
return "./gov-tracker-cache.json";
|
|
104
|
+
}
|
|
105
|
+
return path.join(appDataDir, "gov-tracker-cache.json");
|
|
106
|
+
}
|
|
107
|
+
// Default cache path in OS-specific application data directory
|
|
108
|
+
const DEFAULT_CACHE_PATH = getDefaultCachePath();
|
|
109
|
+
function createProgressCallback() {
|
|
110
|
+
return (progress) => {
|
|
111
|
+
const { stage, currentIndex, totalStages } = progress;
|
|
112
|
+
if (stage.status === "NOT_STARTED")
|
|
113
|
+
return;
|
|
114
|
+
console.log(` [${currentIndex + 1}/${totalStages}] ${(0, index_1.formatStageTitle)(stage.type)} (${stage.chain}): ${stage.status}`);
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
const program = new commander_1.Command()
|
|
118
|
+
.name("monitor")
|
|
119
|
+
.description("Monitor Arbitrum governance proposals")
|
|
120
|
+
.version("0.1.0");
|
|
121
|
+
// ============================================================================
|
|
122
|
+
// Run Command
|
|
123
|
+
// ============================================================================
|
|
124
|
+
const runCmd = program
|
|
125
|
+
.command("run")
|
|
126
|
+
.description("Discover, track, and optionally prepare/execute");
|
|
127
|
+
(0, cli_1.addOptions)(runCmd, cli_1.rpcOptions);
|
|
128
|
+
runCmd
|
|
129
|
+
.option("--cache <path>", "Cache file", DEFAULT_CACHE_PATH)
|
|
130
|
+
.option("--start-block <block>", "Start block for discovery (skips cache)")
|
|
131
|
+
.option("--block-lag <blocks>", `Blocks behind tip (default: ${cli_1.DEFAULT_BLOCK_LAG})`, String(cli_1.DEFAULT_BLOCK_LAG))
|
|
132
|
+
.option("--max-age-days <days>", "Max age for re-tracking incomplete proposals (default: 60)", "60")
|
|
133
|
+
.option("--prepare", "Prepare transactions for ready stages (dry-run)")
|
|
134
|
+
.option("--write", "Execute prepared transactions (requires --private-key)")
|
|
135
|
+
.addOption(new commander_1.Option("--private-key <key>", "Private key for execution").env("PRIVATE_KEY"))
|
|
136
|
+
.option("--force", "Force prepare even for completed stages (historical validation)")
|
|
137
|
+
.option("--prepare-pending", "Prepare pending stages (waiting for delays)")
|
|
138
|
+
.option("--loop", "Run in continuous loop")
|
|
139
|
+
.option("--interval <seconds>", "Loop interval in seconds", "60")
|
|
140
|
+
.addOption(new commander_1.Option("--health-check-url <url>", "Health check URL to ping").env("HEALTH_CHECK_URL"))
|
|
141
|
+
.option("--json-output <path>", "Write JSON state for dashboard integration")
|
|
142
|
+
.option("--election", "Also check for Security Council elections each cycle")
|
|
143
|
+
.option("--concurrency <n>", "Number of concurrent tracking operations", "1")
|
|
144
|
+
.option("--l1-chunk-size <size>", `L1 chunk size for log searches (default: ${index_1.CHUNK_SIZES.L1})`, String(index_1.CHUNK_SIZES.L1))
|
|
145
|
+
.option("--l2-chunk-size <size>", `L2 chunk size for log searches (default: ${index_1.CHUNK_SIZES.L2})`, String(index_1.CHUNK_SIZES.L2))
|
|
146
|
+
.option("--verbose", "Enable verbose logging")
|
|
147
|
+
.action(async (opts) => {
|
|
148
|
+
if (opts.verbose)
|
|
149
|
+
debug_1.default.enable("gov-tracker:*");
|
|
150
|
+
(0, cli_1.requirePrivateKeyForWrite)(opts);
|
|
151
|
+
const providers = (0, cli_1.createProvidersFromOptions)(opts);
|
|
152
|
+
const l1ChunkSize = parseInt(opts.l1ChunkSize, 10);
|
|
153
|
+
const l2ChunkSize = parseInt(opts.l2ChunkSize, 10);
|
|
154
|
+
const chunkingConfig = {
|
|
155
|
+
l1ChunkSize,
|
|
156
|
+
l2ChunkSize,
|
|
157
|
+
novaChunkSize: l2ChunkSize,
|
|
158
|
+
delayBetweenChunks: index_1.CHUNK_SIZES.DELAY_MS,
|
|
159
|
+
};
|
|
160
|
+
const tracker = (0, index_1.createTracker)({
|
|
161
|
+
...providers,
|
|
162
|
+
cachePath: opts.cache,
|
|
163
|
+
chunkingConfig,
|
|
164
|
+
onProgress: createProgressCallback(),
|
|
165
|
+
});
|
|
166
|
+
const signer = opts.write ? (0, cli_1.createSigner)(opts.privateKey) : null;
|
|
167
|
+
const startBlock = opts.startBlock ? parseInt(opts.startBlock, 10) : undefined;
|
|
168
|
+
const blockLag = parseInt(opts.blockLag, 10);
|
|
169
|
+
const maxAgeDays = parseInt(opts.maxAgeDays, 10);
|
|
170
|
+
const intervalMs = parseInt(opts.interval, 10) * 1000;
|
|
171
|
+
const concurrency = parseInt(opts.concurrency, 10);
|
|
172
|
+
if (opts.verbose) {
|
|
173
|
+
if (startBlock !== undefined)
|
|
174
|
+
console.log(`Starting discovery from block ${startBlock}`);
|
|
175
|
+
console.log(`Block lag: ${blockLag} blocks behind tip`);
|
|
176
|
+
console.log(`Max age for re-tracking: ${maxAgeDays} days`);
|
|
177
|
+
console.log(`Max consecutive errors before skip: ${cli_1.MAX_CONSECUTIVE_ERRORS}`);
|
|
178
|
+
if (concurrency > 1)
|
|
179
|
+
console.log(`Concurrency: ${concurrency}`);
|
|
180
|
+
}
|
|
181
|
+
if (signer)
|
|
182
|
+
console.log(`Executing with: ${signer.address}`);
|
|
183
|
+
// Track whether this is the first cycle (for startBlock override)
|
|
184
|
+
let isFirstCycle = true;
|
|
185
|
+
async function runCycle() {
|
|
186
|
+
console.log("Discovering proposals and operations...\n");
|
|
187
|
+
let electionsSkipped = 0;
|
|
188
|
+
// Only use startBlock on the first cycle; subsequent cycles resume from watermarks
|
|
189
|
+
const cycleStartBlock = isFirstCycle ? startBlock : undefined;
|
|
190
|
+
isFirstCycle = false;
|
|
191
|
+
const { result, proposals, timelockOps } = await (0, cli_1.runMonitorCycle)(tracker, providers.l2Provider, {
|
|
192
|
+
prepare: opts.prepare || opts.write || opts.force || opts.preparePending,
|
|
193
|
+
force: opts.force,
|
|
194
|
+
preparePending: opts.preparePending,
|
|
195
|
+
startBlock: cycleStartBlock,
|
|
196
|
+
blockLag,
|
|
197
|
+
maxAgeDays,
|
|
198
|
+
concurrency,
|
|
199
|
+
onTrack: async (r) => {
|
|
200
|
+
// Skip showing complete elections
|
|
201
|
+
if (r.result?.isElection && r.result?.isComplete) {
|
|
202
|
+
electionsSkipped++;
|
|
203
|
+
return {};
|
|
204
|
+
}
|
|
205
|
+
if (r.result) {
|
|
206
|
+
console.log(`\n[${r.key}]`);
|
|
207
|
+
console.log((0, cli_1.formatTrackingResult)(r.result));
|
|
208
|
+
}
|
|
209
|
+
else if (r.error) {
|
|
210
|
+
console.log(`\n[${r.key}] ERROR: ${r.error}`);
|
|
211
|
+
}
|
|
212
|
+
if (r.prepared) {
|
|
213
|
+
console.log(`\n[PREPARED] ${r.key}`);
|
|
214
|
+
console.log((0, cli_1.formatDryRun)(r.prepared));
|
|
215
|
+
if (signer) {
|
|
216
|
+
const execResult = await (0, cli_1.executeTransaction)(r.prepared, signer, providers);
|
|
217
|
+
if (!execResult.success) {
|
|
218
|
+
console.error(` Execution failed: ${execResult.error}`);
|
|
219
|
+
return {};
|
|
220
|
+
}
|
|
221
|
+
console.log(` Executed! Re-tracking to find next stages...`);
|
|
222
|
+
return { shouldRetrack: true };
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return {};
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
const stats = await tracker.getStats();
|
|
229
|
+
console.log(`\nFound ${proposals.length} new proposals, ${timelockOps.length} new ops | ` +
|
|
230
|
+
`Incomplete: ${stats.proposals.active} proposals, ${stats.timelocks.active} timelocks | ` +
|
|
231
|
+
`Tracked: ${result.tracked}, Prepared: ${result.prepared}` +
|
|
232
|
+
(electionsSkipped > 0 ? ` (${electionsSkipped} elections skipped)` : ""));
|
|
233
|
+
if (opts.jsonOutput) {
|
|
234
|
+
const checkpoints = await tracker.getAllCheckpoints();
|
|
235
|
+
(0, json_state_1.writeDashboardState)((0, json_state_1.buildDashboardState)(checkpoints), opts.jsonOutput);
|
|
236
|
+
if (opts.verbose)
|
|
237
|
+
console.log(`JSON state written to ${opts.jsonOutput}`);
|
|
238
|
+
}
|
|
239
|
+
if (opts.election) {
|
|
240
|
+
try {
|
|
241
|
+
const electionResult = await (0, election_check_1.checkAndExecuteElection)(providers, signer, {
|
|
242
|
+
write: opts.write,
|
|
243
|
+
verbose: opts.verbose,
|
|
244
|
+
});
|
|
245
|
+
for (const error of electionResult.errors) {
|
|
246
|
+
console.error(`[ELECTION] ${error}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
console.error(`[ELECTION] Check failed: ${error.message}`);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
if (opts.loop) {
|
|
255
|
+
console.log(`Running in loop mode, checking every ${opts.interval} seconds...`);
|
|
256
|
+
if (opts.healthCheckUrl)
|
|
257
|
+
console.log(`Health check URL: ${opts.healthCheckUrl}`);
|
|
258
|
+
if (opts.jsonOutput)
|
|
259
|
+
console.log(`JSON output: ${opts.jsonOutput}`);
|
|
260
|
+
if (opts.election)
|
|
261
|
+
console.log(`Election checking: enabled`);
|
|
262
|
+
}
|
|
263
|
+
await (0, cli_1.runWithLoop)(runCycle, {
|
|
264
|
+
loop: opts.loop,
|
|
265
|
+
intervalMs,
|
|
266
|
+
healthCheckUrl: opts.healthCheckUrl,
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
// ============================================================================
|
|
270
|
+
// Track Command
|
|
271
|
+
// ============================================================================
|
|
272
|
+
const trackCmd = program.command("track").description("Track a specific proposal or operation");
|
|
273
|
+
(0, cli_1.addOptions)(trackCmd, cli_1.rpcOptions);
|
|
274
|
+
trackCmd
|
|
275
|
+
.option("--tx <hash>", "Transaction hash")
|
|
276
|
+
.option("--prepare", "Prepare transactions for ready stages (dry-run)")
|
|
277
|
+
.option("--write", "Execute prepared transactions (requires --private-key)")
|
|
278
|
+
.addOption(new commander_1.Option("--private-key <key>", "Private key for execution").env("PRIVATE_KEY"))
|
|
279
|
+
.option("--force", "Force prepare even for completed stages (historical validation)")
|
|
280
|
+
.option("--prepare-pending", "Prepare pending stages (waiting for delays)")
|
|
281
|
+
.option("--l1-chunk-size <size>", `L1 chunk size for log searches (default: ${index_1.CHUNK_SIZES.L1})`, String(index_1.CHUNK_SIZES.L1))
|
|
282
|
+
.option("--l2-chunk-size <size>", `L2 chunk size for log searches (default: ${index_1.CHUNK_SIZES.L2})`, String(index_1.CHUNK_SIZES.L2))
|
|
283
|
+
.option("--verbose", "Enable verbose logging")
|
|
284
|
+
.action(async (opts) => {
|
|
285
|
+
if (opts.verbose)
|
|
286
|
+
debug_1.default.enable("gov-tracker:*");
|
|
287
|
+
(0, cli_1.requirePrivateKeyForWrite)(opts);
|
|
288
|
+
if (!opts.tx) {
|
|
289
|
+
console.error("Error: --tx is required for tracking");
|
|
290
|
+
process.exit(1);
|
|
291
|
+
}
|
|
292
|
+
console.log(`Tracking from tx: ${opts.tx}\n`);
|
|
293
|
+
try {
|
|
294
|
+
const providers = (0, cli_1.createProvidersFromOptions)(opts);
|
|
295
|
+
const l1ChunkSize = parseInt(opts.l1ChunkSize, 10);
|
|
296
|
+
const l2ChunkSize = parseInt(opts.l2ChunkSize, 10);
|
|
297
|
+
const chunkingConfig = {
|
|
298
|
+
l1ChunkSize,
|
|
299
|
+
l2ChunkSize,
|
|
300
|
+
novaChunkSize: l2ChunkSize,
|
|
301
|
+
delayBetweenChunks: index_1.CHUNK_SIZES.DELAY_MS,
|
|
302
|
+
};
|
|
303
|
+
const tracker = (0, index_1.createTracker)({
|
|
304
|
+
...providers,
|
|
305
|
+
chunkingConfig,
|
|
306
|
+
onProgress: opts.concurrency === 1 || opts.verbose ? createProgressCallback() : undefined,
|
|
307
|
+
});
|
|
308
|
+
const shouldPrepare = opts.prepare || opts.write || opts.force || opts.preparePending;
|
|
309
|
+
const { results, preparations } = await (0, cli_1.trackAndPrepare)(tracker, opts.tx, {
|
|
310
|
+
prepare: shouldPrepare,
|
|
311
|
+
force: opts.force,
|
|
312
|
+
preparePending: opts.preparePending,
|
|
313
|
+
});
|
|
314
|
+
// Format output
|
|
315
|
+
results.forEach((r, i) => {
|
|
316
|
+
const label = results.length > 1 ? `Operation ${i + 1}/${results.length}` : undefined;
|
|
317
|
+
console.log((0, cli_1.formatTrackingResult)(r, label));
|
|
318
|
+
});
|
|
319
|
+
preparations.forEach((prep) => {
|
|
320
|
+
if (prep.success && prep.prepared) {
|
|
321
|
+
console.log(`\n${(0, cli_1.formatDryRun)(prep.prepared)}`);
|
|
322
|
+
}
|
|
323
|
+
else if (!prep.success) {
|
|
324
|
+
console.log(`\n[PREPARE ERROR] ${prep.error}`);
|
|
325
|
+
}
|
|
326
|
+
});
|
|
327
|
+
// Execute if --write
|
|
328
|
+
if (opts.write && preparations.length > 0) {
|
|
329
|
+
const signer = (0, cli_1.createSigner)(opts.privateKey);
|
|
330
|
+
console.log(`\n=== Executing with ${signer.address} ===`);
|
|
331
|
+
let currentPreparations = preparations;
|
|
332
|
+
let chainDepth = 0;
|
|
333
|
+
const maxChainDepth = 10;
|
|
334
|
+
while (currentPreparations.length > 0 && chainDepth < maxChainDepth) {
|
|
335
|
+
chainDepth++;
|
|
336
|
+
let executedAny = false;
|
|
337
|
+
for (const prep of currentPreparations) {
|
|
338
|
+
if (prep.success && prep.prepared) {
|
|
339
|
+
const result = await (0, cli_1.executeTransaction)(prep.prepared, signer, providers);
|
|
340
|
+
if (!result.success) {
|
|
341
|
+
console.error(`Execution failed: ${result.error}`);
|
|
342
|
+
}
|
|
343
|
+
else {
|
|
344
|
+
executedAny = true;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
if (!executedAny)
|
|
349
|
+
break;
|
|
350
|
+
console.log(`\nRe-tracking to find next stages...`);
|
|
351
|
+
const retracked = await (0, cli_1.trackAndPrepare)(tracker, opts.tx, { prepare: true });
|
|
352
|
+
retracked.results.forEach((r, i) => {
|
|
353
|
+
const label = retracked.results.length > 1
|
|
354
|
+
? `Operation ${i + 1}/${retracked.results.length}`
|
|
355
|
+
: undefined;
|
|
356
|
+
console.log((0, cli_1.formatTrackingResult)(r, label));
|
|
357
|
+
});
|
|
358
|
+
retracked.preparations.forEach((prep) => {
|
|
359
|
+
if (prep.success && prep.prepared)
|
|
360
|
+
console.log(`\n${(0, cli_1.formatDryRun)(prep.prepared)}`);
|
|
361
|
+
else if (!prep.success)
|
|
362
|
+
console.log(`\n[PREPARE ERROR] ${prep.error}`);
|
|
363
|
+
});
|
|
364
|
+
currentPreparations = retracked.preparations;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
catch (e) {
|
|
369
|
+
console.error(e.message);
|
|
370
|
+
process.exit(1);
|
|
371
|
+
}
|
|
372
|
+
});
|
|
373
|
+
// ============================================================================
|
|
374
|
+
// Status Command
|
|
375
|
+
// ============================================================================
|
|
376
|
+
program
|
|
377
|
+
.command("status")
|
|
378
|
+
.description("Show cached state")
|
|
379
|
+
.option("--cache <path>", "Cache file", DEFAULT_CACHE_PATH)
|
|
380
|
+
.option("--json", "Output as JSON")
|
|
381
|
+
.action(async (opts) => {
|
|
382
|
+
const { watermarks, checkpoints } = await index_1.ProposalStageTracker.readCacheStatus(opts.cache);
|
|
383
|
+
if (opts.json) {
|
|
384
|
+
const checkpointsObj = {};
|
|
385
|
+
for (const [key, checkpoint] of checkpoints) {
|
|
386
|
+
checkpointsObj[key] = checkpoint;
|
|
387
|
+
}
|
|
388
|
+
console.log(JSON.stringify({ watermarks, checkpoints: checkpointsObj }, null, 2));
|
|
389
|
+
}
|
|
390
|
+
else {
|
|
391
|
+
console.log((0, cli_1.formatCacheStatus)(checkpoints));
|
|
392
|
+
}
|
|
393
|
+
});
|
|
394
|
+
// ============================================================================
|
|
395
|
+
// Election Command
|
|
396
|
+
// ============================================================================
|
|
397
|
+
const electionCmd = program
|
|
398
|
+
.command("election")
|
|
399
|
+
.description("Check Security Council election status");
|
|
400
|
+
(0, cli_1.addOptions)(electionCmd, cli_1.rpcOptions);
|
|
401
|
+
electionCmd
|
|
402
|
+
.option("--write", "Create election if ready (requires --private-key)")
|
|
403
|
+
.addOption(new commander_1.Option("--private-key <key>", "Private key for execution").env("PRIVATE_KEY"))
|
|
404
|
+
.option("--verbose", "Enable verbose logging")
|
|
405
|
+
.option("--loop", "Run in continuous loop")
|
|
406
|
+
.option("--interval <seconds>", "Loop interval in seconds", "60")
|
|
407
|
+
.addOption(new commander_1.Option("--health-check-url <url>", "Health check URL to ping").env("HEALTH_CHECK_URL"))
|
|
408
|
+
.action(async (opts) => {
|
|
409
|
+
if (opts.verbose)
|
|
410
|
+
debug_1.default.enable("gov-tracker:*");
|
|
411
|
+
(0, cli_1.requirePrivateKeyForWrite)(opts);
|
|
412
|
+
const providers = (0, cli_1.createProvidersFromOptions)(opts);
|
|
413
|
+
const signer = opts.write ? (0, cli_1.createSigner)(opts.privateKey) : null;
|
|
414
|
+
async function checkElection() {
|
|
415
|
+
try {
|
|
416
|
+
const result = await (0, election_check_1.checkAndExecuteElection)(providers, signer, {
|
|
417
|
+
write: opts.write,
|
|
418
|
+
verbose: true,
|
|
419
|
+
});
|
|
420
|
+
console.log(`\n${(0, election_check_1.formatElectionStatus)(result.status, result.currentElectionStatus)}`);
|
|
421
|
+
for (const error of result.errors) {
|
|
422
|
+
console.error(`[ERROR] ${error}`);
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
catch (error) {
|
|
426
|
+
console.error("Election check failed:", error.message);
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
const intervalMs = parseInt(opts.interval, 10) * 1000;
|
|
430
|
+
if (opts.loop) {
|
|
431
|
+
console.log(`Running in loop mode, checking every ${opts.interval} seconds...`);
|
|
432
|
+
if (opts.healthCheckUrl)
|
|
433
|
+
console.log(`Health check URL: ${opts.healthCheckUrl}`);
|
|
434
|
+
}
|
|
435
|
+
await (0, cli_1.runWithLoop)(checkElection, {
|
|
436
|
+
loop: opts.loop,
|
|
437
|
+
intervalMs,
|
|
438
|
+
healthCheckUrl: opts.healthCheckUrl,
|
|
439
|
+
});
|
|
440
|
+
});
|
|
441
|
+
program.parse();
|
|
442
|
+
//# sourceMappingURL=monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monitor.js","sourceRoot":"","sources":["../../src/cli/monitor.ts"],"names":[],"mappings":"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"}
|