@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,287 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cache utilities for tracker state
|
|
4
|
+
*
|
|
5
|
+
* Provides cache implementations and utility functions.
|
|
6
|
+
* All other state management is handled directly in tracker.ts.
|
|
7
|
+
*
|
|
8
|
+
* Available cache adapters:
|
|
9
|
+
* - FileCache: File-based persistence (Node.js only)
|
|
10
|
+
* - LocalStorageCache: Browser localStorage (web only)
|
|
11
|
+
* - MemoryCache: In-memory, no persistence (universal)
|
|
12
|
+
*/
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.MemoryCache = exports.LocalStorageCache = exports.FileCache = void 0;
|
|
48
|
+
exports.txHashCacheKey = txHashCacheKey;
|
|
49
|
+
exports.readCacheStatus = readCacheStatus;
|
|
50
|
+
const fs = __importStar(require("fs"));
|
|
51
|
+
const discovery_1 = require("./discovery");
|
|
52
|
+
/**
|
|
53
|
+
* File-based cache that persists to JSON file.
|
|
54
|
+
* Synchronously loads on construction, persists on every write.
|
|
55
|
+
* Uses a write queue to prevent race conditions from concurrent writes.
|
|
56
|
+
*/
|
|
57
|
+
class FileCache {
|
|
58
|
+
constructor(path) {
|
|
59
|
+
this.writeQueue = Promise.resolve();
|
|
60
|
+
this.path = path;
|
|
61
|
+
this.cache = this.load();
|
|
62
|
+
}
|
|
63
|
+
load() {
|
|
64
|
+
try {
|
|
65
|
+
const data = JSON.parse(fs.readFileSync(this.path, "utf8"));
|
|
66
|
+
return new Map(Object.entries(data));
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return new Map();
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
persistSync() {
|
|
73
|
+
const obj = Object.fromEntries(this.cache);
|
|
74
|
+
fs.writeFileSync(this.path, JSON.stringify(obj, null, 2));
|
|
75
|
+
}
|
|
76
|
+
async persist() {
|
|
77
|
+
// Chain writes to prevent race conditions
|
|
78
|
+
// Create the write promise that may reject on error
|
|
79
|
+
const writePromise = this.writeQueue.then(() => {
|
|
80
|
+
this.persistSync();
|
|
81
|
+
});
|
|
82
|
+
// Update the queue with error recovery to prevent getting stuck
|
|
83
|
+
// This ensures future writes can proceed even if this one fails
|
|
84
|
+
this.writeQueue = writePromise.catch(() => {
|
|
85
|
+
// Silently recover the queue - error is propagated via writePromise
|
|
86
|
+
});
|
|
87
|
+
// Return the original promise so errors propagate to caller
|
|
88
|
+
return writePromise;
|
|
89
|
+
}
|
|
90
|
+
async get(key) {
|
|
91
|
+
return this.cache.get(key) ?? null;
|
|
92
|
+
}
|
|
93
|
+
async set(key, value) {
|
|
94
|
+
this.cache.set(key, value);
|
|
95
|
+
await this.persist();
|
|
96
|
+
}
|
|
97
|
+
async delete(key) {
|
|
98
|
+
this.cache.delete(key);
|
|
99
|
+
await this.persist();
|
|
100
|
+
}
|
|
101
|
+
async clear() {
|
|
102
|
+
this.cache.clear();
|
|
103
|
+
await this.persist();
|
|
104
|
+
}
|
|
105
|
+
async has(key) {
|
|
106
|
+
return this.cache.has(key);
|
|
107
|
+
}
|
|
108
|
+
keys() {
|
|
109
|
+
return this.cache.keys();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.FileCache = FileCache;
|
|
113
|
+
/**
|
|
114
|
+
* Get localStorage if available (browser environment)
|
|
115
|
+
*/
|
|
116
|
+
function getLocalStorage() {
|
|
117
|
+
// Check for browser environment with localStorage
|
|
118
|
+
if (typeof globalThis !== "undefined") {
|
|
119
|
+
const global = globalThis;
|
|
120
|
+
if (typeof global.localStorage !== "undefined") {
|
|
121
|
+
return global.localStorage;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Browser localStorage-based cache adapter.
|
|
128
|
+
* Persists to localStorage with a configurable key prefix.
|
|
129
|
+
*
|
|
130
|
+
* Limitations:
|
|
131
|
+
* - 5MB storage limit (varies by browser)
|
|
132
|
+
* - Synchronous API (blocks main thread, usually negligible)
|
|
133
|
+
* - String-only storage (JSON serialization handled internally)
|
|
134
|
+
*
|
|
135
|
+
* @example
|
|
136
|
+
* ```typescript
|
|
137
|
+
* import { createTracker, LocalStorageCache } from "@gzeoneth/gov-tracker";
|
|
138
|
+
*
|
|
139
|
+
* const tracker = createTracker({
|
|
140
|
+
* l2Provider,
|
|
141
|
+
* l1Provider,
|
|
142
|
+
* cache: new LocalStorageCache("arb-gov:"),
|
|
143
|
+
* });
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
class LocalStorageCache {
|
|
147
|
+
constructor(prefix = "tracker:") {
|
|
148
|
+
this.prefix = prefix;
|
|
149
|
+
}
|
|
150
|
+
fullKey(key) {
|
|
151
|
+
return `${this.prefix}${key}`;
|
|
152
|
+
}
|
|
153
|
+
async get(key) {
|
|
154
|
+
const storage = getLocalStorage();
|
|
155
|
+
if (!storage)
|
|
156
|
+
return null;
|
|
157
|
+
const data = storage.getItem(this.fullKey(key));
|
|
158
|
+
if (data === null)
|
|
159
|
+
return null;
|
|
160
|
+
try {
|
|
161
|
+
return JSON.parse(data);
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
async set(key, value) {
|
|
168
|
+
const storage = getLocalStorage();
|
|
169
|
+
if (!storage)
|
|
170
|
+
return;
|
|
171
|
+
storage.setItem(this.fullKey(key), JSON.stringify(value));
|
|
172
|
+
}
|
|
173
|
+
async delete(key) {
|
|
174
|
+
const storage = getLocalStorage();
|
|
175
|
+
if (!storage)
|
|
176
|
+
return;
|
|
177
|
+
storage.removeItem(this.fullKey(key));
|
|
178
|
+
}
|
|
179
|
+
async clear() {
|
|
180
|
+
const storage = getLocalStorage();
|
|
181
|
+
if (!storage)
|
|
182
|
+
return;
|
|
183
|
+
const keysToRemove = [];
|
|
184
|
+
for (let i = 0; i < storage.length; i++) {
|
|
185
|
+
const key = storage.key(i);
|
|
186
|
+
if (key?.startsWith(this.prefix)) {
|
|
187
|
+
keysToRemove.push(key);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
keysToRemove.forEach((k) => storage.removeItem(k));
|
|
191
|
+
}
|
|
192
|
+
async has(key) {
|
|
193
|
+
const storage = getLocalStorage();
|
|
194
|
+
if (!storage)
|
|
195
|
+
return false;
|
|
196
|
+
return storage.getItem(this.fullKey(key)) !== null;
|
|
197
|
+
}
|
|
198
|
+
async keys(prefix) {
|
|
199
|
+
const storage = getLocalStorage();
|
|
200
|
+
if (!storage)
|
|
201
|
+
return [];
|
|
202
|
+
const result = [];
|
|
203
|
+
for (let i = 0; i < storage.length; i++) {
|
|
204
|
+
const fullKey = storage.key(i);
|
|
205
|
+
if (fullKey?.startsWith(this.prefix)) {
|
|
206
|
+
const key = fullKey.slice(this.prefix.length);
|
|
207
|
+
if (!prefix || key.startsWith(prefix)) {
|
|
208
|
+
result.push(key);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return result;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
exports.LocalStorageCache = LocalStorageCache;
|
|
216
|
+
/**
|
|
217
|
+
* In-memory cache adapter with no persistence.
|
|
218
|
+
* Useful for testing, short-lived sessions, or as a fallback.
|
|
219
|
+
*
|
|
220
|
+
* Data is lost when the page is refreshed or the process exits.
|
|
221
|
+
*
|
|
222
|
+
* @example
|
|
223
|
+
* ```typescript
|
|
224
|
+
* import { createTracker, MemoryCache } from "@gzeoneth/gov-tracker";
|
|
225
|
+
*
|
|
226
|
+
* const tracker = createTracker({
|
|
227
|
+
* l2Provider,
|
|
228
|
+
* l1Provider,
|
|
229
|
+
* cache: new MemoryCache(),
|
|
230
|
+
* });
|
|
231
|
+
* ```
|
|
232
|
+
*/
|
|
233
|
+
class MemoryCache {
|
|
234
|
+
constructor() {
|
|
235
|
+
this.cache = new Map();
|
|
236
|
+
}
|
|
237
|
+
async get(key) {
|
|
238
|
+
return this.cache.get(key) ?? null;
|
|
239
|
+
}
|
|
240
|
+
async set(key, value) {
|
|
241
|
+
this.cache.set(key, value);
|
|
242
|
+
}
|
|
243
|
+
async delete(key) {
|
|
244
|
+
this.cache.delete(key);
|
|
245
|
+
}
|
|
246
|
+
async clear() {
|
|
247
|
+
this.cache.clear();
|
|
248
|
+
}
|
|
249
|
+
async has(key) {
|
|
250
|
+
return this.cache.has(key);
|
|
251
|
+
}
|
|
252
|
+
keys() {
|
|
253
|
+
return this.cache.keys();
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
exports.MemoryCache = MemoryCache;
|
|
257
|
+
/**
|
|
258
|
+
* Generate cache key from transaction hash (primary cache key format)
|
|
259
|
+
*/
|
|
260
|
+
function txHashCacheKey(txHash) {
|
|
261
|
+
return `tx:${txHash.toLowerCase()}`;
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Read all cache data without requiring RPC providers.
|
|
265
|
+
* Use this for status/dashboard views that only need cached data.
|
|
266
|
+
*
|
|
267
|
+
* @param cachePath - Path to the cache file
|
|
268
|
+
*/
|
|
269
|
+
async function readCacheStatus(cachePath) {
|
|
270
|
+
const cache = new FileCache(cachePath);
|
|
271
|
+
// Load watermarks from discovery checkpoint (unified format)
|
|
272
|
+
const discoveryCheckpoint = await cache.get(discovery_1.WATERMARKS_KEY);
|
|
273
|
+
const watermarks = discoveryCheckpoint?.cachedData.discoveryWatermarks ?? {};
|
|
274
|
+
const checkpoints = new Map();
|
|
275
|
+
const allKeys = cache.keys();
|
|
276
|
+
const keys = Array.isArray(allKeys) ? allKeys : Array.from(allKeys);
|
|
277
|
+
for (const key of keys) {
|
|
278
|
+
if (key.startsWith("tx:")) {
|
|
279
|
+
const checkpoint = await cache.get(key);
|
|
280
|
+
if (checkpoint) {
|
|
281
|
+
checkpoints.set(key, checkpoint);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return { watermarks, checkpoints };
|
|
286
|
+
}
|
|
287
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/tracker/state.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ProposalStageTracker - Main entry point
|
|
3
|
+
*
|
|
4
|
+
* Tracks Arbitrum governance proposal lifecycle stages from
|
|
5
|
+
* either a governor proposal or a timelock operation.
|
|
6
|
+
*
|
|
7
|
+
* This file is the public API that composes focused modules:
|
|
8
|
+
* - tracker/context.ts: Functional TrackingContext for stage tracking
|
|
9
|
+
* - tracker/pipeline.ts: Pure functions that track stages
|
|
10
|
+
* - tracker/discovery.ts: Proposal and timelock discovery
|
|
11
|
+
* - tracker/query.ts: Checkpoint query operations
|
|
12
|
+
* - tracker/execute.ts: Transaction preparation
|
|
13
|
+
*/
|
|
14
|
+
import { ethers } from "ethers";
|
|
15
|
+
import { TrackerOptions, TrackingResult, TrackedStage, TrackingCheckpoint, TrackerStats, ChunkingConfig, DiscoveryWatermarks, DiscoveryTargets, PrepareResult, PrepareOptions, ElectionCheckResult, TimelockLink } from "./types";
|
|
16
|
+
import { DiscoveredProposal, DiscoveredTimelockOp } from "./tracker/discovery";
|
|
17
|
+
/**
|
|
18
|
+
* Extract TimelockLink from stages if PROPOSAL_QUEUED is completed
|
|
19
|
+
*/
|
|
20
|
+
export declare function extractTimelockLink(stages: TrackedStage[]): TimelockLink | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Main proposal stage tracker class
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const tracker = new ProposalStageTracker({
|
|
27
|
+
* l2Provider: new ethers.providers.JsonRpcProvider(ARB1_RPC),
|
|
28
|
+
* l1Provider: new ethers.providers.JsonRpcProvider(ETH_RPC),
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* // Track by transaction hash (recommended)
|
|
32
|
+
* const results = await tracker.trackByTxHash(creationTxHash);
|
|
33
|
+
*
|
|
34
|
+
* for (const stage of results[0].stages) {
|
|
35
|
+
* console.log(`${stage.type}: ${stage.status}`);
|
|
36
|
+
* }
|
|
37
|
+
*
|
|
38
|
+
* // Resume from checkpoint
|
|
39
|
+
* const resumedTracker = createTracker({
|
|
40
|
+
* l2Provider,
|
|
41
|
+
* l1Provider,
|
|
42
|
+
* checkpoint: savedCheckpoint
|
|
43
|
+
* });
|
|
44
|
+
* const fresh = await resumedTracker.trackByTxHash(creationTxHash);
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare class ProposalStageTracker {
|
|
48
|
+
private l2Provider;
|
|
49
|
+
private l1Provider;
|
|
50
|
+
private novaProvider;
|
|
51
|
+
private onProgress?;
|
|
52
|
+
/** Chunking configuration for log searches */
|
|
53
|
+
readonly chunkingConfig: ChunkingConfig;
|
|
54
|
+
/** Cache adapter for checkpoint persistence */
|
|
55
|
+
private cache?;
|
|
56
|
+
constructor(options: TrackerOptions);
|
|
57
|
+
/**
|
|
58
|
+
* Read all cache data without requiring RPC providers.
|
|
59
|
+
* Use this for status/dashboard views that only need cached data.
|
|
60
|
+
*
|
|
61
|
+
* This is the ONLY way to access cache data outside of a full tracker instance.
|
|
62
|
+
* All cache access goes through this class to maintain single-system ownership.
|
|
63
|
+
*
|
|
64
|
+
* @param cachePath - Path to the cache file (tracker creates FileCache internally)
|
|
65
|
+
*/
|
|
66
|
+
static readCacheStatus(cachePath: string): Promise<{
|
|
67
|
+
watermarks: DiscoveryWatermarks;
|
|
68
|
+
checkpoints: Map<string, TrackingCheckpoint>;
|
|
69
|
+
}>;
|
|
70
|
+
/**
|
|
71
|
+
* Load discovery watermarks from cache.
|
|
72
|
+
* Watermarks are stored as a TrackingCheckpoint for unified cache format.
|
|
73
|
+
* Returns empty object if no watermarks are cached.
|
|
74
|
+
*/
|
|
75
|
+
loadWatermarks(): Promise<DiscoveryWatermarks>;
|
|
76
|
+
/**
|
|
77
|
+
* Save discovery watermarks to cache.
|
|
78
|
+
* Watermarks are stored as TrackingCheckpoint with proper metadata,
|
|
79
|
+
* following the same pattern as proposal/timelock checkpoints.
|
|
80
|
+
*/
|
|
81
|
+
saveWatermarks(watermarks: DiscoveryWatermarks): Promise<void>;
|
|
82
|
+
/**
|
|
83
|
+
* Discover proposals from a governor in a block range.
|
|
84
|
+
*
|
|
85
|
+
* @param governorAddress - Governor contract address
|
|
86
|
+
* @param fromBlock - Start block (exclusive - searches from fromBlock + 1)
|
|
87
|
+
* @param toBlock - End block (inclusive)
|
|
88
|
+
* @returns Array of discovered proposals
|
|
89
|
+
*/
|
|
90
|
+
discoverProposals(governorAddress: string, fromBlock: number, toBlock: number): Promise<DiscoveredProposal[]>;
|
|
91
|
+
/**
|
|
92
|
+
* Discover timelock operations from a timelock in a block range.
|
|
93
|
+
*
|
|
94
|
+
* @param timelockAddress - Timelock contract address
|
|
95
|
+
* @param fromBlock - Start block (exclusive - searches from fromBlock + 1)
|
|
96
|
+
* @param toBlock - End block (inclusive)
|
|
97
|
+
* @returns Array of discovered timelock operations
|
|
98
|
+
*/
|
|
99
|
+
discoverTimelockOps(timelockAddress: string, fromBlock: number, toBlock: number): Promise<DiscoveredTimelockOp[]>;
|
|
100
|
+
/**
|
|
101
|
+
* Discover all proposals and timelock operations with auto-watermark management.
|
|
102
|
+
*
|
|
103
|
+
* This is the unified discovery API that handles everything internally:
|
|
104
|
+
* - Loads watermarks from cache (or uses provided fromWatermarks)
|
|
105
|
+
* - Discovers from all enabled targets in parallel
|
|
106
|
+
* - Auto-saves updated watermarks to cache
|
|
107
|
+
*
|
|
108
|
+
* @param targets - Which governors/timelocks to scan
|
|
109
|
+
* @param toBlock - End block for discovery
|
|
110
|
+
* @param fromWatermarks - Optional starting watermarks (overrides cached watermarks)
|
|
111
|
+
* @returns Discovered proposals, timelock ops, and updated watermarks
|
|
112
|
+
*/
|
|
113
|
+
discoverAll(targets: DiscoveryTargets, toBlock: number, fromWatermarks?: DiscoveryWatermarks): Promise<{
|
|
114
|
+
proposals: DiscoveredProposal[];
|
|
115
|
+
timelockOps: DiscoveredTimelockOp[];
|
|
116
|
+
watermarks: DiscoveryWatermarks;
|
|
117
|
+
}>;
|
|
118
|
+
/**
|
|
119
|
+
* List all checkpoint keys in the cache.
|
|
120
|
+
*/
|
|
121
|
+
listCheckpointKeys(): Promise<string[]>;
|
|
122
|
+
/**
|
|
123
|
+
* Get a specific checkpoint from cache by key.
|
|
124
|
+
*/
|
|
125
|
+
getCheckpoint(key: string): Promise<TrackingCheckpoint | null>;
|
|
126
|
+
/**
|
|
127
|
+
* Get all checkpoints from cache.
|
|
128
|
+
*/
|
|
129
|
+
getAllCheckpoints(): Promise<Map<string, TrackingCheckpoint>>;
|
|
130
|
+
/**
|
|
131
|
+
* Query incomplete checkpoints that should be re-tracked.
|
|
132
|
+
*
|
|
133
|
+
* @param options.maxAgeDays - Skip items older than this (default: 60)
|
|
134
|
+
* @param options.maxErrorCount - Skip items with more consecutive errors (default: 5)
|
|
135
|
+
*/
|
|
136
|
+
queryIncompleteCheckpoints(options?: {
|
|
137
|
+
maxAgeDays?: number;
|
|
138
|
+
maxErrorCount?: number;
|
|
139
|
+
}): Promise<Array<{
|
|
140
|
+
key: string;
|
|
141
|
+
checkpoint: TrackingCheckpoint;
|
|
142
|
+
}>>;
|
|
143
|
+
/**
|
|
144
|
+
* Get aggregated cache statistics.
|
|
145
|
+
*
|
|
146
|
+
* @param maxErrorCount - Items with this many or more errors are counted as "errored" (default: 5)
|
|
147
|
+
*/
|
|
148
|
+
getStats(maxErrorCount?: number): Promise<TrackerStats>;
|
|
149
|
+
/**
|
|
150
|
+
* Track from transaction hash (primary tracking entry point)
|
|
151
|
+
*
|
|
152
|
+
* Auto-detects whether the transaction contains a governor proposal or
|
|
153
|
+
* timelock operations and tracks accordingly.
|
|
154
|
+
*
|
|
155
|
+
* Returns an array because a single transaction may contain multiple
|
|
156
|
+
* timelock operations (e.g., SC rotation with 4 operations).
|
|
157
|
+
*
|
|
158
|
+
* When cache is configured on the tracker:
|
|
159
|
+
* - Automatically loads existing checkpoint from cache (zero-RPC resume)
|
|
160
|
+
* - Automatically saves checkpoint to cache after tracking
|
|
161
|
+
*
|
|
162
|
+
* @example
|
|
163
|
+
* ```typescript
|
|
164
|
+
* const results = await tracker.trackByTxHash("0x...");
|
|
165
|
+
* for (const result of results) {
|
|
166
|
+
* console.log(`Found ${result.stages.length} stages`);
|
|
167
|
+
* }
|
|
168
|
+
* ```
|
|
169
|
+
*/
|
|
170
|
+
trackByTxHash(txHash: string): Promise<TrackingResult[]>;
|
|
171
|
+
/**
|
|
172
|
+
* Internal implementation of trackByTxHash.
|
|
173
|
+
*
|
|
174
|
+
* Uses PipelineContext for stateful tracking - no parameter passing between stages.
|
|
175
|
+
*/
|
|
176
|
+
private trackByTxHashInternal;
|
|
177
|
+
/**
|
|
178
|
+
* Track governor proposal using TrackingContext (stateful tracking)
|
|
179
|
+
*/
|
|
180
|
+
private trackGovernorWithPipeline;
|
|
181
|
+
/**
|
|
182
|
+
* Track timelock operation using TrackingContext (stateful tracking)
|
|
183
|
+
*/
|
|
184
|
+
private trackTimelockWithPipeline;
|
|
185
|
+
/**
|
|
186
|
+
* Build TrackingResult from TrackingContext
|
|
187
|
+
*/
|
|
188
|
+
private buildResultFromState;
|
|
189
|
+
/**
|
|
190
|
+
* Track from a cached checkpoint.
|
|
191
|
+
*
|
|
192
|
+
* This is a convenience method that extracts the transaction hash from the
|
|
193
|
+
* checkpoint and dispatches to trackByTxHash. Use this when re-tracking
|
|
194
|
+
* items from queryIncompleteCheckpoints().
|
|
195
|
+
*
|
|
196
|
+
* @example
|
|
197
|
+
* ```typescript
|
|
198
|
+
* const incomplete = await tracker.queryIncompleteCheckpoints({ maxAgeDays: 60 });
|
|
199
|
+
* for (const { checkpoint } of incomplete) {
|
|
200
|
+
* const result = await tracker.trackFromCheckpoint(checkpoint);
|
|
201
|
+
* // ... handle result
|
|
202
|
+
* }
|
|
203
|
+
* ```
|
|
204
|
+
*/
|
|
205
|
+
trackFromCheckpoint(checkpoint: TrackingCheckpoint): Promise<TrackingResult>;
|
|
206
|
+
/**
|
|
207
|
+
* Prepare a transaction for a READY stage without sending it.
|
|
208
|
+
*
|
|
209
|
+
* Returns PrepareResult with the prepared transaction data.
|
|
210
|
+
* Consumer is responsible for signing and sending the transaction.
|
|
211
|
+
*
|
|
212
|
+
* @param stage - The stage to prepare
|
|
213
|
+
* @param options - Preparation options
|
|
214
|
+
* @param allStages - Optional array of all stages (used to extract description for salt resolution)
|
|
215
|
+
*
|
|
216
|
+
* @example
|
|
217
|
+
* ```typescript
|
|
218
|
+
* const result = await tracker.prepareTransaction(readyStage);
|
|
219
|
+
* if (result.success) {
|
|
220
|
+
* console.log(`To: ${result.prepared.to}`);
|
|
221
|
+
* console.log(`Data: ${result.prepared.data}`);
|
|
222
|
+
* console.log(`Chain: ${result.prepared.chain}`);
|
|
223
|
+
*
|
|
224
|
+
* // Execute with your own signer
|
|
225
|
+
* const tx = await signer.sendTransaction({
|
|
226
|
+
* to: result.prepared.to,
|
|
227
|
+
* data: result.prepared.data,
|
|
228
|
+
* value: result.prepared.value,
|
|
229
|
+
* });
|
|
230
|
+
* await tx.wait();
|
|
231
|
+
* } else {
|
|
232
|
+
* console.error(result.error);
|
|
233
|
+
* }
|
|
234
|
+
* ```
|
|
235
|
+
*
|
|
236
|
+
* @note Salt is now pre-computed during tracking and stored in stage.data
|
|
237
|
+
*/
|
|
238
|
+
prepareTransaction(stage: TrackedStage, options?: PrepareOptions): Promise<PrepareResult>;
|
|
239
|
+
/**
|
|
240
|
+
* Get the current providers
|
|
241
|
+
*/
|
|
242
|
+
getProviders(): {
|
|
243
|
+
l1: ethers.providers.Provider;
|
|
244
|
+
l2: ethers.providers.Provider;
|
|
245
|
+
nova?: ethers.providers.Provider;
|
|
246
|
+
};
|
|
247
|
+
/**
|
|
248
|
+
* Check Security Council election status and prepare available actions
|
|
249
|
+
*
|
|
250
|
+
* @param options.nomineeGovernorAddress - Override the nominee election governor address
|
|
251
|
+
* @returns Election status with prepared transactions for available actions
|
|
252
|
+
*/
|
|
253
|
+
checkElection(options?: {
|
|
254
|
+
nomineeGovernorAddress?: string;
|
|
255
|
+
}): Promise<ElectionCheckResult>;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Factory function to create a tracker instance
|
|
259
|
+
*/
|
|
260
|
+
export declare function createTracker(options: TrackerOptions): ProposalStageTracker;
|
|
261
|
+
//# sourceMappingURL=tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker.d.ts","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"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"}
|