@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.
Files changed (203) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +201 -0
  3. package/dist/abis.d.ts +79 -0
  4. package/dist/abis.d.ts.map +1 -0
  5. package/dist/abis.js +159 -0
  6. package/dist/abis.js.map +1 -0
  7. package/dist/cli/lib/cli.d.ts +92 -0
  8. package/dist/cli/lib/cli.d.ts.map +1 -0
  9. package/dist/cli/lib/cli.js +562 -0
  10. package/dist/cli/lib/cli.js.map +1 -0
  11. package/dist/cli/lib/election-check.d.ts +46 -0
  12. package/dist/cli/lib/election-check.d.ts.map +1 -0
  13. package/dist/cli/lib/election-check.js +136 -0
  14. package/dist/cli/lib/election-check.js.map +1 -0
  15. package/dist/cli/lib/json-state.d.ts +100 -0
  16. package/dist/cli/lib/json-state.d.ts.map +1 -0
  17. package/dist/cli/lib/json-state.js +225 -0
  18. package/dist/cli/lib/json-state.js.map +1 -0
  19. package/dist/cli/monitor.d.ts +3 -0
  20. package/dist/cli/monitor.d.ts.map +1 -0
  21. package/dist/cli/monitor.js +442 -0
  22. package/dist/cli/monitor.js.map +1 -0
  23. package/dist/constants.d.ts +235 -0
  24. package/dist/constants.d.ts.map +1 -0
  25. package/dist/constants.js +293 -0
  26. package/dist/constants.js.map +1 -0
  27. package/dist/discovery/governor-discovery.d.ts +84 -0
  28. package/dist/discovery/governor-discovery.d.ts.map +1 -0
  29. package/dist/discovery/governor-discovery.js +310 -0
  30. package/dist/discovery/governor-discovery.js.map +1 -0
  31. package/dist/discovery/security-council.d.ts +68 -0
  32. package/dist/discovery/security-council.d.ts.map +1 -0
  33. package/dist/discovery/security-council.js +181 -0
  34. package/dist/discovery/security-council.js.map +1 -0
  35. package/dist/discovery/timelock-discovery.d.ts +99 -0
  36. package/dist/discovery/timelock-discovery.d.ts.map +1 -0
  37. package/dist/discovery/timelock-discovery.js +322 -0
  38. package/dist/discovery/timelock-discovery.js.map +1 -0
  39. package/dist/election.d.ts +172 -0
  40. package/dist/election.d.ts.map +1 -0
  41. package/dist/election.js +464 -0
  42. package/dist/election.js.map +1 -0
  43. package/dist/index.d.ts +56 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +164 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/stages/base.d.ts +127 -0
  48. package/dist/stages/base.d.ts.map +1 -0
  49. package/dist/stages/base.js +280 -0
  50. package/dist/stages/base.js.map +1 -0
  51. package/dist/stages/l2-to-l1-message.d.ts +108 -0
  52. package/dist/stages/l2-to-l1-message.d.ts.map +1 -0
  53. package/dist/stages/l2-to-l1-message.js +422 -0
  54. package/dist/stages/l2-to-l1-message.js.map +1 -0
  55. package/dist/stages/proposal-created.d.ts +20 -0
  56. package/dist/stages/proposal-created.d.ts.map +1 -0
  57. package/dist/stages/proposal-created.js +62 -0
  58. package/dist/stages/proposal-created.js.map +1 -0
  59. package/dist/stages/proposal-queued.d.ts +39 -0
  60. package/dist/stages/proposal-queued.d.ts.map +1 -0
  61. package/dist/stages/proposal-queued.js +131 -0
  62. package/dist/stages/proposal-queued.js.map +1 -0
  63. package/dist/stages/retryables.d.ts +79 -0
  64. package/dist/stages/retryables.d.ts.map +1 -0
  65. package/dist/stages/retryables.js +307 -0
  66. package/dist/stages/retryables.js.map +1 -0
  67. package/dist/stages/stage-builder.d.ts +46 -0
  68. package/dist/stages/stage-builder.d.ts.map +1 -0
  69. package/dist/stages/stage-builder.js +87 -0
  70. package/dist/stages/stage-builder.js.map +1 -0
  71. package/dist/stages/timelock.d.ts +100 -0
  72. package/dist/stages/timelock.d.ts.map +1 -0
  73. package/dist/stages/timelock.js +552 -0
  74. package/dist/stages/timelock.js.map +1 -0
  75. package/dist/stages/voting.d.ts +18 -0
  76. package/dist/stages/voting.d.ts.map +1 -0
  77. package/dist/stages/voting.js +109 -0
  78. package/dist/stages/voting.js.map +1 -0
  79. package/dist/tracker/context.d.ts +111 -0
  80. package/dist/tracker/context.d.ts.map +1 -0
  81. package/dist/tracker/context.js +264 -0
  82. package/dist/tracker/context.js.map +1 -0
  83. package/dist/tracker/discovery.d.ts +89 -0
  84. package/dist/tracker/discovery.d.ts.map +1 -0
  85. package/dist/tracker/discovery.js +228 -0
  86. package/dist/tracker/discovery.js.map +1 -0
  87. package/dist/tracker/execute.d.ts +44 -0
  88. package/dist/tracker/execute.d.ts.map +1 -0
  89. package/dist/tracker/execute.js +126 -0
  90. package/dist/tracker/execute.js.map +1 -0
  91. package/dist/tracker/index.d.ts +18 -0
  92. package/dist/tracker/index.d.ts.map +1 -0
  93. package/dist/tracker/index.js +70 -0
  94. package/dist/tracker/index.js.map +1 -0
  95. package/dist/tracker/pipeline.d.ts +47 -0
  96. package/dist/tracker/pipeline.d.ts.map +1 -0
  97. package/dist/tracker/pipeline.js +299 -0
  98. package/dist/tracker/pipeline.js.map +1 -0
  99. package/dist/tracker/query.d.ts +45 -0
  100. package/dist/tracker/query.d.ts.map +1 -0
  101. package/dist/tracker/query.js +159 -0
  102. package/dist/tracker/query.js.map +1 -0
  103. package/dist/tracker/state.d.ts +104 -0
  104. package/dist/tracker/state.d.ts.map +1 -0
  105. package/dist/tracker/state.js +287 -0
  106. package/dist/tracker/state.js.map +1 -0
  107. package/dist/tracker.d.ts +261 -0
  108. package/dist/tracker.d.ts.map +1 -0
  109. package/dist/tracker.js +556 -0
  110. package/dist/tracker.js.map +1 -0
  111. package/dist/types/config.d.ts +81 -0
  112. package/dist/types/config.d.ts.map +1 -0
  113. package/dist/types/config.js +6 -0
  114. package/dist/types/config.js.map +1 -0
  115. package/dist/types/core.d.ts +51 -0
  116. package/dist/types/core.d.ts.map +1 -0
  117. package/dist/types/core.js +6 -0
  118. package/dist/types/core.js.map +1 -0
  119. package/dist/types/cross-chain.d.ts +80 -0
  120. package/dist/types/cross-chain.d.ts.map +1 -0
  121. package/dist/types/cross-chain.js +6 -0
  122. package/dist/types/cross-chain.js.map +1 -0
  123. package/dist/types/election.d.ts +59 -0
  124. package/dist/types/election.d.ts.map +1 -0
  125. package/dist/types/election.js +6 -0
  126. package/dist/types/election.js.map +1 -0
  127. package/dist/types/governor.d.ts +71 -0
  128. package/dist/types/governor.d.ts.map +1 -0
  129. package/dist/types/governor.js +6 -0
  130. package/dist/types/governor.js.map +1 -0
  131. package/dist/types/index.d.ts +22 -0
  132. package/dist/types/index.d.ts.map +1 -0
  133. package/dist/types/index.js +21 -0
  134. package/dist/types/index.js.map +1 -0
  135. package/dist/types/stages.d.ts +189 -0
  136. package/dist/types/stages.d.ts.map +1 -0
  137. package/dist/types/stages.js +23 -0
  138. package/dist/types/stages.js.map +1 -0
  139. package/dist/types/timelock.d.ts +108 -0
  140. package/dist/types/timelock.d.ts.map +1 -0
  141. package/dist/types/timelock.js +6 -0
  142. package/dist/types/timelock.js.map +1 -0
  143. package/dist/types/tracking.d.ts +180 -0
  144. package/dist/types/tracking.d.ts.map +1 -0
  145. package/dist/types/tracking.js +6 -0
  146. package/dist/types/tracking.js.map +1 -0
  147. package/dist/types.d.ts +6 -0
  148. package/dist/types.d.ts.map +1 -0
  149. package/dist/types.js +22 -0
  150. package/dist/types.js.map +1 -0
  151. package/dist/utils/chain.d.ts +18 -0
  152. package/dist/utils/chain.d.ts.map +1 -0
  153. package/dist/utils/chain.js +34 -0
  154. package/dist/utils/chain.js.map +1 -0
  155. package/dist/utils/log-filters.d.ts +67 -0
  156. package/dist/utils/log-filters.d.ts.map +1 -0
  157. package/dist/utils/log-filters.js +116 -0
  158. package/dist/utils/log-filters.js.map +1 -0
  159. package/dist/utils/log-search.d.ts +76 -0
  160. package/dist/utils/log-search.d.ts.map +1 -0
  161. package/dist/utils/log-search.js +142 -0
  162. package/dist/utils/log-search.js.map +1 -0
  163. package/dist/utils/logger.d.ts +41 -0
  164. package/dist/utils/logger.d.ts.map +1 -0
  165. package/dist/utils/logger.js +50 -0
  166. package/dist/utils/logger.js.map +1 -0
  167. package/dist/utils/operation-id.d.ts +48 -0
  168. package/dist/utils/operation-id.d.ts.map +1 -0
  169. package/dist/utils/operation-id.js +102 -0
  170. package/dist/utils/operation-id.js.map +1 -0
  171. package/dist/utils/rpc-utils.d.ts +30 -0
  172. package/dist/utils/rpc-utils.d.ts.map +1 -0
  173. package/dist/utils/rpc-utils.js +99 -0
  174. package/dist/utils/rpc-utils.js.map +1 -0
  175. package/dist/utils/salt-computation.d.ts +78 -0
  176. package/dist/utils/salt-computation.d.ts.map +1 -0
  177. package/dist/utils/salt-computation.js +132 -0
  178. package/dist/utils/salt-computation.js.map +1 -0
  179. package/dist/utils/salt-resolver.d.ts +63 -0
  180. package/dist/utils/salt-resolver.d.ts.map +1 -0
  181. package/dist/utils/salt-resolver.js +144 -0
  182. package/dist/utils/salt-resolver.js.map +1 -0
  183. package/dist/utils/scoped-logger.d.ts +43 -0
  184. package/dist/utils/scoped-logger.d.ts.map +1 -0
  185. package/dist/utils/scoped-logger.js +72 -0
  186. package/dist/utils/scoped-logger.js.map +1 -0
  187. package/dist/utils/stage-helpers.d.ts +51 -0
  188. package/dist/utils/stage-helpers.d.ts.map +1 -0
  189. package/dist/utils/stage-helpers.js +143 -0
  190. package/dist/utils/stage-helpers.js.map +1 -0
  191. package/dist/utils/stage-metadata.d.ts +62 -0
  192. package/dist/utils/stage-metadata.d.ts.map +1 -0
  193. package/dist/utils/stage-metadata.js +140 -0
  194. package/dist/utils/stage-metadata.js.map +1 -0
  195. package/dist/utils/timing.d.ts +115 -0
  196. package/dist/utils/timing.d.ts.map +1 -0
  197. package/dist/utils/timing.js +303 -0
  198. package/dist/utils/timing.js.map +1 -0
  199. package/dist/utils/urls.d.ts +20 -0
  200. package/dist/utils/urls.d.ts.map +1 -0
  201. package/dist/utils/urls.js +51 -0
  202. package/dist/utils/urls.js.map +1 -0
  203. package/package.json +72 -0
@@ -0,0 +1,556 @@
1
+ "use strict";
2
+ /**
3
+ * ProposalStageTracker - Main entry point
4
+ *
5
+ * Tracks Arbitrum governance proposal lifecycle stages from
6
+ * either a governor proposal or a timelock operation.
7
+ *
8
+ * This file is the public API that composes focused modules:
9
+ * - tracker/context.ts: Functional TrackingContext for stage tracking
10
+ * - tracker/pipeline.ts: Pure functions that track stages
11
+ * - tracker/discovery.ts: Proposal and timelock discovery
12
+ * - tracker/query.ts: Checkpoint query operations
13
+ * - tracker/execute.ts: Transaction preparation
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.ProposalStageTracker = void 0;
17
+ exports.extractTimelockLink = extractTimelockLink;
18
+ exports.createTracker = createTracker;
19
+ const ethers_1 = require("ethers");
20
+ const logger_1 = require("./utils/logger");
21
+ const constants_1 = require("./constants");
22
+ const election_1 = require("./election");
23
+ const governor_discovery_1 = require("./discovery/governor-discovery");
24
+ const timelock_discovery_1 = require("./discovery/timelock-discovery");
25
+ const base_1 = require("./stages/base");
26
+ const { tracker: logTracker, discovery: logDiscovery } = logger_1.loggers;
27
+ // Import context and pipeline from tracker modules
28
+ const context_1 = require("./tracker/context");
29
+ const pipeline_1 = require("./tracker/pipeline");
30
+ // Import from focused modules
31
+ const state_1 = require("./tracker/state");
32
+ const discovery_1 = require("./tracker/discovery");
33
+ const discovery_2 = require("./tracker/discovery");
34
+ const query_1 = require("./tracker/query");
35
+ const execute_1 = require("./tracker/execute");
36
+ /**
37
+ * Extract TimelockLink from stages if PROPOSAL_QUEUED is completed
38
+ */
39
+ function extractTimelockLink(stages) {
40
+ const queuedStage = (0, base_1.findStage)(stages, "PROPOSAL_QUEUED");
41
+ if (!queuedStage || queuedStage.status !== "COMPLETED") {
42
+ return undefined;
43
+ }
44
+ const txHash = queuedStage.transactions[0]?.hash;
45
+ const operationId = queuedStage.data.operationId;
46
+ const timelockAddress = queuedStage.data.timelockAddress;
47
+ const queueBlockNumber = queuedStage.transactions[0]?.blockNumber;
48
+ if (!txHash || !operationId || !timelockAddress || !queueBlockNumber) {
49
+ return undefined;
50
+ }
51
+ return {
52
+ txHash,
53
+ operationId,
54
+ timelockAddress,
55
+ queueBlockNumber,
56
+ };
57
+ }
58
+ /**
59
+ * Main proposal stage tracker class
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * const tracker = new ProposalStageTracker({
64
+ * l2Provider: new ethers.providers.JsonRpcProvider(ARB1_RPC),
65
+ * l1Provider: new ethers.providers.JsonRpcProvider(ETH_RPC),
66
+ * });
67
+ *
68
+ * // Track by transaction hash (recommended)
69
+ * const results = await tracker.trackByTxHash(creationTxHash);
70
+ *
71
+ * for (const stage of results[0].stages) {
72
+ * console.log(`${stage.type}: ${stage.status}`);
73
+ * }
74
+ *
75
+ * // Resume from checkpoint
76
+ * const resumedTracker = createTracker({
77
+ * l2Provider,
78
+ * l1Provider,
79
+ * checkpoint: savedCheckpoint
80
+ * });
81
+ * const fresh = await resumedTracker.trackByTxHash(creationTxHash);
82
+ * ```
83
+ */
84
+ class ProposalStageTracker {
85
+ constructor(options) {
86
+ if (!options.l1Provider) {
87
+ throw new Error("l1Provider is required");
88
+ }
89
+ this.l1Provider = options.l1Provider;
90
+ this.l2Provider =
91
+ options.l2Provider ?? new ethers_1.ethers.providers.JsonRpcProvider(constants_1.DEFAULT_RPC_URLS.ARB_ONE);
92
+ this.novaProvider =
93
+ options.novaProvider ?? new ethers_1.ethers.providers.JsonRpcProvider(constants_1.DEFAULT_RPC_URLS.NOVA);
94
+ this.onProgress = options.onProgress;
95
+ this.chunkingConfig = options.chunkingConfig ?? constants_1.DEFAULT_CHUNKING_CONFIG;
96
+ // Initialize cache: prefer direct cache adapter, fallback to cachePath
97
+ if (options.cache) {
98
+ this.cache = options.cache;
99
+ }
100
+ else if (options.cachePath) {
101
+ this.cache = new state_1.FileCache(options.cachePath);
102
+ }
103
+ }
104
+ // Static Cache Access
105
+ /**
106
+ * Read all cache data without requiring RPC providers.
107
+ * Use this for status/dashboard views that only need cached data.
108
+ *
109
+ * This is the ONLY way to access cache data outside of a full tracker instance.
110
+ * All cache access goes through this class to maintain single-system ownership.
111
+ *
112
+ * @param cachePath - Path to the cache file (tracker creates FileCache internally)
113
+ */
114
+ static async readCacheStatus(cachePath) {
115
+ return (0, state_1.readCacheStatus)(cachePath);
116
+ }
117
+ // Watermark Management
118
+ /**
119
+ * Load discovery watermarks from cache.
120
+ * Watermarks are stored as a TrackingCheckpoint for unified cache format.
121
+ * Returns empty object if no watermarks are cached.
122
+ */
123
+ async loadWatermarks() {
124
+ return (0, discovery_1.loadWatermarks)(this.cache);
125
+ }
126
+ /**
127
+ * Save discovery watermarks to cache.
128
+ * Watermarks are stored as TrackingCheckpoint with proper metadata,
129
+ * following the same pattern as proposal/timelock checkpoints.
130
+ */
131
+ async saveWatermarks(watermarks) {
132
+ return (0, discovery_1.saveWatermarks)(watermarks, this.cache);
133
+ }
134
+ // Discovery API
135
+ /**
136
+ * Discover proposals from a governor in a block range.
137
+ *
138
+ * @param governorAddress - Governor contract address
139
+ * @param fromBlock - Start block (exclusive - searches from fromBlock + 1)
140
+ * @param toBlock - End block (inclusive)
141
+ * @returns Array of discovered proposals
142
+ */
143
+ async discoverProposals(governorAddress, fromBlock, toBlock) {
144
+ return (0, discovery_2.discoverProposals)(governorAddress, fromBlock, toBlock, this.l2Provider);
145
+ }
146
+ /**
147
+ * Discover timelock operations from a timelock in a block range.
148
+ *
149
+ * @param timelockAddress - Timelock contract address
150
+ * @param fromBlock - Start block (exclusive - searches from fromBlock + 1)
151
+ * @param toBlock - End block (inclusive)
152
+ * @returns Array of discovered timelock operations
153
+ */
154
+ async discoverTimelockOps(timelockAddress, fromBlock, toBlock) {
155
+ return (0, discovery_2.discoverTimelockOps)(timelockAddress, fromBlock, toBlock, this.l2Provider);
156
+ }
157
+ /**
158
+ * Discover all proposals and timelock operations with auto-watermark management.
159
+ *
160
+ * This is the unified discovery API that handles everything internally:
161
+ * - Loads watermarks from cache (or uses provided fromWatermarks)
162
+ * - Discovers from all enabled targets in parallel
163
+ * - Auto-saves updated watermarks to cache
164
+ *
165
+ * @param targets - Which governors/timelocks to scan
166
+ * @param toBlock - End block for discovery
167
+ * @param fromWatermarks - Optional starting watermarks (overrides cached watermarks)
168
+ * @returns Discovered proposals, timelock ops, and updated watermarks
169
+ */
170
+ async discoverAll(targets, toBlock, fromWatermarks) {
171
+ // Load watermarks from cache (or use provided override)
172
+ const watermarks = fromWatermarks ?? (await this.loadWatermarks());
173
+ const result = await (0, discovery_2.discoverAll)(targets, toBlock, this.l2Provider, this.cache, watermarks, { chunkSize: this.chunkingConfig.l2ChunkSize });
174
+ // Auto-save updated watermarks
175
+ await this.saveWatermarks(result.watermarks);
176
+ return result;
177
+ }
178
+ // Checkpoint Query API
179
+ /**
180
+ * List all checkpoint keys in the cache.
181
+ */
182
+ async listCheckpointKeys() {
183
+ return (0, query_1.listCheckpointKeys)(this.cache);
184
+ }
185
+ /**
186
+ * Get a specific checkpoint from cache by key.
187
+ */
188
+ async getCheckpoint(key) {
189
+ return (0, query_1.getCheckpoint)(this.cache, key);
190
+ }
191
+ /**
192
+ * Get all checkpoints from cache.
193
+ */
194
+ async getAllCheckpoints() {
195
+ return (0, query_1.getAllCheckpoints)(this.cache);
196
+ }
197
+ /**
198
+ * Query incomplete checkpoints that should be re-tracked.
199
+ *
200
+ * @param options.maxAgeDays - Skip items older than this (default: 60)
201
+ * @param options.maxErrorCount - Skip items with more consecutive errors (default: 5)
202
+ */
203
+ async queryIncompleteCheckpoints(options = {}) {
204
+ return (0, query_1.queryIncompleteCheckpoints)(this.cache, options);
205
+ }
206
+ /**
207
+ * Get aggregated cache statistics.
208
+ *
209
+ * @param maxErrorCount - Items with this many or more errors are counted as "errored" (default: 5)
210
+ */
211
+ async getStats(maxErrorCount = 5) {
212
+ return (0, query_1.getStats)(this.cache, maxErrorCount);
213
+ }
214
+ // Main Tracking Entry Points
215
+ /**
216
+ * Track from transaction hash (primary tracking entry point)
217
+ *
218
+ * Auto-detects whether the transaction contains a governor proposal or
219
+ * timelock operations and tracks accordingly.
220
+ *
221
+ * Returns an array because a single transaction may contain multiple
222
+ * timelock operations (e.g., SC rotation with 4 operations).
223
+ *
224
+ * When cache is configured on the tracker:
225
+ * - Automatically loads existing checkpoint from cache (zero-RPC resume)
226
+ * - Automatically saves checkpoint to cache after tracking
227
+ *
228
+ * @example
229
+ * ```typescript
230
+ * const results = await tracker.trackByTxHash("0x...");
231
+ * for (const result of results) {
232
+ * console.log(`Found ${result.stages.length} stages`);
233
+ * }
234
+ * ```
235
+ */
236
+ async trackByTxHash(txHash) {
237
+ logTracker("trackByTxHash %s", txHash);
238
+ // Cache key for this transaction
239
+ const cacheKey = (0, state_1.txHashCacheKey)(txHash);
240
+ // Load checkpoint from cache for resume
241
+ let checkpoint;
242
+ if (this.cache) {
243
+ checkpoint = (await this.cache.get(cacheKey)) ?? undefined;
244
+ if (checkpoint) {
245
+ logTracker("loaded checkpoint from cache: %s", cacheKey);
246
+ }
247
+ }
248
+ try {
249
+ return await this.trackByTxHashInternal(txHash, cacheKey, checkpoint);
250
+ }
251
+ catch (error) {
252
+ // Save checkpoint on error with incremented error count
253
+ if (this.cache) {
254
+ const input = {
255
+ type: "governor",
256
+ governorAddress: "",
257
+ proposalId: "",
258
+ creationTxHash: txHash,
259
+ };
260
+ const prevErrorCount = checkpoint?.metadata?.errorCount ?? 0;
261
+ const errorCheckpoint = checkpoint ?? {
262
+ version: 1,
263
+ createdAt: Date.now(),
264
+ input,
265
+ lastProcessedStage: null,
266
+ lastProcessedBlock: { l1: 0, l2: 0 },
267
+ cachedData: {},
268
+ };
269
+ errorCheckpoint.metadata = { errorCount: prevErrorCount + 1, lastTrackedAt: Date.now() };
270
+ await this.cache.set(cacheKey, errorCheckpoint);
271
+ logTracker("saved checkpoint on error: %s (errorCount=%d)", cacheKey, prevErrorCount + 1);
272
+ }
273
+ throw error;
274
+ }
275
+ }
276
+ /**
277
+ * Internal implementation of trackByTxHash.
278
+ *
279
+ * Uses PipelineContext for stateful tracking - no parameter passing between stages.
280
+ */
281
+ async trackByTxHashInternal(txHash, cacheKey, checkpoint) {
282
+ // RESUME PATH: If we have a checkpoint, check what type it is
283
+ if (checkpoint && checkpoint.input.type !== "discovery") {
284
+ logTracker("RESUME: found checkpoint for tx, type=%s", checkpoint.input.type);
285
+ if (checkpoint.input.type === "governor") {
286
+ const input = checkpoint.input;
287
+ const result = await this.trackGovernorWithPipeline(input.governorAddress, input.proposalId, input.creationTxHash, checkpoint, cacheKey);
288
+ return [result];
289
+ }
290
+ else if (checkpoint.input.type === "timelock") {
291
+ const input = checkpoint.input;
292
+ const result = await this.trackTimelockWithPipeline(input.timelockAddress, input.operationId, input.scheduledTxHash, checkpoint, cacheKey);
293
+ return [result];
294
+ }
295
+ }
296
+ // Try as proposal first
297
+ const proposal = await (0, governor_discovery_1.discoverProposalByTxHash)(txHash, this.l2Provider);
298
+ if (proposal) {
299
+ logDiscovery("found proposal in tx, proposalId=%s", proposal.proposalId);
300
+ const result = await this.trackGovernorWithPipeline(proposal.governorAddress, proposal.proposalId, proposal.creationTxHash, checkpoint, cacheKey);
301
+ return [result];
302
+ }
303
+ // Try as timelock operations (may be batch with multiple ops)
304
+ const callScheduledEvents = await (0, timelock_discovery_1.findCallScheduledByTxHash)(txHash, this.l2Provider);
305
+ if (callScheduledEvents && callScheduledEvents.length > 0) {
306
+ logDiscovery("found %d timelock operation(s) in tx", callScheduledEvents.length);
307
+ // Group by unique operationId (batch operations have multiple calls with same operationId)
308
+ const seenOperationIds = new Set();
309
+ const results = [];
310
+ for (const event of callScheduledEvents) {
311
+ if (seenOperationIds.has(event.operationId))
312
+ continue;
313
+ seenOperationIds.add(event.operationId);
314
+ const result = await this.trackTimelockWithPipeline(event.timelockAddress, event.operationId, txHash, checkpoint, cacheKey, event);
315
+ results.push(result);
316
+ }
317
+ return results;
318
+ }
319
+ logTracker("no proposal or timelock operations found in tx");
320
+ return [];
321
+ }
322
+ /**
323
+ * Track governor proposal using TrackingContext (stateful tracking)
324
+ */
325
+ async trackGovernorWithPipeline(governorAddress, proposalId, creationTxHash, checkpoint, cacheKey) {
326
+ const input = {
327
+ type: "governor",
328
+ governorAddress,
329
+ proposalId,
330
+ creationTxHash,
331
+ };
332
+ // Create tracking context
333
+ const initialState = (0, context_1.createTrackingContext)({
334
+ providers: {
335
+ l2: this.l2Provider,
336
+ l1: this.l1Provider,
337
+ nova: this.novaProvider,
338
+ },
339
+ input,
340
+ onProgress: this.onProgress,
341
+ chunkingConfig: this.chunkingConfig,
342
+ checkpoint,
343
+ cacheKey,
344
+ });
345
+ // Run the governor pipeline (stages 1-7)
346
+ const finalState = await (0, pipeline_1.trackGovernorPipeline)(initialState);
347
+ // Build result from state
348
+ const result = this.buildResultFromState(finalState);
349
+ // Save checkpoint to cache
350
+ if (this.cache && cacheKey) {
351
+ result.checkpoint.metadata = { errorCount: 0, lastTrackedAt: Date.now() };
352
+ await this.cache.set(cacheKey, result.checkpoint);
353
+ logTracker("saved checkpoint to cache: %s", cacheKey);
354
+ }
355
+ return result;
356
+ }
357
+ /**
358
+ * Track timelock operation using TrackingContext (stateful tracking)
359
+ */
360
+ async trackTimelockWithPipeline(timelockAddress, operationId, scheduledTxHash, checkpoint, cacheKey, callScheduledEvent) {
361
+ const input = {
362
+ type: "timelock",
363
+ timelockAddress,
364
+ operationId,
365
+ scheduledTxHash,
366
+ };
367
+ // Create tracking context with bootstrap data
368
+ const initialState = (0, context_1.createTrackingContext)({
369
+ providers: {
370
+ l2: this.l2Provider,
371
+ l1: this.l1Provider,
372
+ nova: this.novaProvider,
373
+ },
374
+ input,
375
+ onProgress: this.onProgress,
376
+ chunkingConfig: this.chunkingConfig,
377
+ checkpoint,
378
+ cacheKey,
379
+ callScheduledData: callScheduledEvent ? [callScheduledEvent] : undefined,
380
+ });
381
+ // Run the timelock pipeline (stages 4-7)
382
+ const finalState = await (0, pipeline_1.trackTimelockPipeline)(initialState);
383
+ // Build result from state
384
+ const result = this.buildResultFromState(finalState);
385
+ // Save checkpoint to cache
386
+ if (this.cache && cacheKey) {
387
+ result.checkpoint.metadata = { errorCount: 0, lastTrackedAt: Date.now() };
388
+ await this.cache.set(cacheKey, result.checkpoint);
389
+ logTracker("saved checkpoint to cache: %s", cacheKey);
390
+ }
391
+ return result;
392
+ }
393
+ /**
394
+ * Build TrackingResult from TrackingContext
395
+ */
396
+ buildResultFromState(state) {
397
+ const stages = state.stages;
398
+ const checkpoint = (0, context_1.createCheckpoint)(state);
399
+ const timelockLink = extractTimelockLink(stages);
400
+ return {
401
+ input: state.input,
402
+ stages,
403
+ checkpoint,
404
+ isComplete: (0, context_1.isComplete)(state),
405
+ proposalType: (0, context_1.getProposalType)(state),
406
+ proposalData: (0, context_1.getProposalData)(state),
407
+ timelockLink,
408
+ currentState: (0, context_1.getProposalState)(state),
409
+ isElection: (0, context_1.getIsElection)(state),
410
+ };
411
+ }
412
+ /**
413
+ * Track from a cached checkpoint.
414
+ *
415
+ * This is a convenience method that extracts the transaction hash from the
416
+ * checkpoint and dispatches to trackByTxHash. Use this when re-tracking
417
+ * items from queryIncompleteCheckpoints().
418
+ *
419
+ * @example
420
+ * ```typescript
421
+ * const incomplete = await tracker.queryIncompleteCheckpoints({ maxAgeDays: 60 });
422
+ * for (const { checkpoint } of incomplete) {
423
+ * const result = await tracker.trackFromCheckpoint(checkpoint);
424
+ * // ... handle result
425
+ * }
426
+ * ```
427
+ */
428
+ async trackFromCheckpoint(checkpoint) {
429
+ const input = checkpoint.input;
430
+ if (input.type === "governor") {
431
+ if (!input.creationTxHash) {
432
+ throw new Error("Governor checkpoint missing creationTxHash");
433
+ }
434
+ const results = await this.trackByTxHash(input.creationTxHash);
435
+ if (results.length === 0) {
436
+ throw new Error(`No proposal found in tx ${input.creationTxHash}`);
437
+ }
438
+ if (results.length > 1) {
439
+ logTracker("WARNING: trackFromCheckpoint found %d results in tx %s, returning first only. " +
440
+ "Use trackByTxHash() to get all results.", results.length, input.creationTxHash);
441
+ }
442
+ return results[0];
443
+ }
444
+ else if (input.type === "timelock") {
445
+ if (!input.scheduledTxHash) {
446
+ throw new Error("Timelock checkpoint missing scheduledTxHash");
447
+ }
448
+ const results = await this.trackByTxHash(input.scheduledTxHash);
449
+ if (results.length === 0) {
450
+ throw new Error(`No timelock operation found in tx ${input.scheduledTxHash}`);
451
+ }
452
+ if (results.length > 1) {
453
+ logTracker("WARNING: trackFromCheckpoint found %d results in tx %s, returning first only. " +
454
+ "Use trackByTxHash() to get all results.", results.length, input.scheduledTxHash);
455
+ }
456
+ return results[0];
457
+ }
458
+ else {
459
+ throw new Error(`Unsupported checkpoint input type: ${input.type}`);
460
+ }
461
+ }
462
+ // Transaction Preparation
463
+ /**
464
+ * Prepare a transaction for a READY stage without sending it.
465
+ *
466
+ * Returns PrepareResult with the prepared transaction data.
467
+ * Consumer is responsible for signing and sending the transaction.
468
+ *
469
+ * @param stage - The stage to prepare
470
+ * @param options - Preparation options
471
+ * @param allStages - Optional array of all stages (used to extract description for salt resolution)
472
+ *
473
+ * @example
474
+ * ```typescript
475
+ * const result = await tracker.prepareTransaction(readyStage);
476
+ * if (result.success) {
477
+ * console.log(`To: ${result.prepared.to}`);
478
+ * console.log(`Data: ${result.prepared.data}`);
479
+ * console.log(`Chain: ${result.prepared.chain}`);
480
+ *
481
+ * // Execute with your own signer
482
+ * const tx = await signer.sendTransaction({
483
+ * to: result.prepared.to,
484
+ * data: result.prepared.data,
485
+ * value: result.prepared.value,
486
+ * });
487
+ * await tx.wait();
488
+ * } else {
489
+ * console.error(result.error);
490
+ * }
491
+ * ```
492
+ *
493
+ * @note Salt is now pre-computed during tracking and stored in stage.data
494
+ */
495
+ async prepareTransaction(stage, options = {}) {
496
+ return (0, execute_1.prepareTransaction)(stage, {
497
+ l1Provider: this.l1Provider,
498
+ l2Provider: this.l2Provider,
499
+ novaProvider: this.novaProvider,
500
+ }, options);
501
+ }
502
+ // Provider Access
503
+ /**
504
+ * Get the current providers
505
+ */
506
+ getProviders() {
507
+ return {
508
+ l1: this.l1Provider,
509
+ l2: this.l2Provider,
510
+ nova: this.novaProvider,
511
+ };
512
+ }
513
+ // Election Support
514
+ /**
515
+ * Check Security Council election status and prepare available actions
516
+ *
517
+ * @param options.nomineeGovernorAddress - Override the nominee election governor address
518
+ * @returns Election status with prepared transactions for available actions
519
+ */
520
+ async checkElection(options = {}) {
521
+ const nomineeGovernor = options.nomineeGovernorAddress ?? constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR;
522
+ logTracker("checkElection for %s", nomineeGovernor);
523
+ const status = await (0, election_1.checkElectionStatus)(this.l2Provider, this.l1Provider, nomineeGovernor);
524
+ const result = {
525
+ status,
526
+ canCreate: status.canCreateElection,
527
+ canTriggerMember: false,
528
+ prepared: {},
529
+ };
530
+ if (status.canCreateElection) {
531
+ const { transaction } = (0, election_1.prepareElectionCreation)(status, nomineeGovernor);
532
+ result.prepared.createElection = transaction;
533
+ }
534
+ if (status.electionCount > 0) {
535
+ const currentElectionIndex = status.electionCount - 1;
536
+ const electionStatus = await (0, election_1.trackElectionProposal)(currentElectionIndex, this.l2Provider, this.l1Provider);
537
+ result.currentElection = electionStatus;
538
+ result.canTriggerMember = electionStatus.canProceedToMemberPhase;
539
+ if (electionStatus.canProceedToMemberPhase) {
540
+ const memberTx = await (0, election_1.prepareMemberElectionTrigger)(electionStatus, this.l2Provider);
541
+ if (memberTx) {
542
+ result.prepared.triggerMember = memberTx;
543
+ }
544
+ }
545
+ }
546
+ return result;
547
+ }
548
+ }
549
+ exports.ProposalStageTracker = ProposalStageTracker;
550
+ /**
551
+ * Factory function to create a tracker instance
552
+ */
553
+ function createTracker(options) {
554
+ return new ProposalStageTracker(options);
555
+ }
556
+ //# sourceMappingURL=tracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracker.js","sourceRoot":"","sources":["../src/tracker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Configuration types for the tracker
3
+ */
4
+ import { ethers } from "ethers";
5
+ import { TrackedStage } from "./stages";
6
+ /**
7
+ * Chunking configuration for log searches
8
+ */
9
+ export interface ChunkingConfig {
10
+ l2ChunkSize: number;
11
+ l1ChunkSize: number;
12
+ novaChunkSize?: number;
13
+ delayBetweenChunks: number;
14
+ }
15
+ /**
16
+ * Retry configuration for RPC calls
17
+ */
18
+ export interface RetryConfig {
19
+ maxRetries: number;
20
+ initialDelay: number;
21
+ maxDelay: number;
22
+ backoffMultiplier: number;
23
+ }
24
+ /**
25
+ * Progress callback for monitoring stage tracking
26
+ */
27
+ export interface TrackingProgress {
28
+ stage: TrackedStage;
29
+ stages: TrackedStage[];
30
+ currentIndex: number;
31
+ totalStages: number;
32
+ isComplete: boolean;
33
+ }
34
+ /**
35
+ * Progress callback function type
36
+ */
37
+ export type OnProgressCallback = (progress: TrackingProgress) => void | Promise<void>;
38
+ /**
39
+ * Main tracker options
40
+ */
41
+ export interface TrackerOptions {
42
+ l2Provider: ethers.providers.Provider;
43
+ l1Provider: ethers.providers.Provider;
44
+ novaProvider?: ethers.providers.Provider;
45
+ chunkingConfig?: ChunkingConfig;
46
+ onProgress?: OnProgressCallback;
47
+ /**
48
+ * Path to cache file (Node.js only). Creates a FileCache internally.
49
+ * For browser environments, use the `cache` option instead.
50
+ */
51
+ cachePath?: string;
52
+ /**
53
+ * Custom cache adapter instance. Use this for browser environments
54
+ * or custom storage backends.
55
+ *
56
+ * @example
57
+ * ```typescript
58
+ * // Browser with localStorage
59
+ * cache: new LocalStorageCache("arb-gov:")
60
+ *
61
+ * // In-memory (no persistence)
62
+ * cache: new MemoryCache()
63
+ *
64
+ * // Custom adapter
65
+ * cache: new MyRedisCache(redisClient)
66
+ * ```
67
+ */
68
+ cache?: CacheAdapter;
69
+ }
70
+ /**
71
+ * Cache adapter interface
72
+ */
73
+ export interface CacheAdapter {
74
+ get<T>(key: string): Promise<T | null>;
75
+ set<T>(key: string, value: T): Promise<void>;
76
+ delete(key: string): Promise<void>;
77
+ clear(): Promise<void>;
78
+ has(key: string): Promise<boolean>;
79
+ keys(prefix?: string): Promise<string[]> | string[] | IterableIterator<string>;
80
+ }
81
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtF;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;IACtC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;IACtC,YAAY,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC;IACzC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACvC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,GAAG,MAAM,EAAE,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;CAChF"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ /**
3
+ * Configuration types for the tracker
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":";AAAA;;GAEG"}