@gzeoneth/gov-tracker 0.4.0 → 0.5.0-alpha.fix-refresh.3fdec9c

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 (271) hide show
  1. package/README.md +95 -11
  2. package/dist/abis-json.d.ts +2315 -0
  3. package/dist/abis-json.d.ts.map +1 -0
  4. package/dist/abis-json.js +3207 -0
  5. package/dist/abis-json.js.map +1 -0
  6. package/dist/abis.d.ts +12 -7
  7. package/dist/abis.d.ts.map +1 -1
  8. package/dist/abis.js +32 -1
  9. package/dist/abis.js.map +1 -1
  10. package/dist/calldata/decoder.d.ts.map +1 -1
  11. package/dist/calldata/decoder.js +33 -28
  12. package/dist/calldata/decoder.js.map +1 -1
  13. package/dist/calldata/parameter-decoder.d.ts.map +1 -1
  14. package/dist/calldata/parameter-decoder.js +19 -25
  15. package/dist/calldata/parameter-decoder.js.map +1 -1
  16. package/dist/calldata/retryable-ticket.d.ts +2 -2
  17. package/dist/calldata/retryable-ticket.d.ts.map +1 -1
  18. package/dist/calldata/retryable-ticket.js +17 -12
  19. package/dist/calldata/retryable-ticket.js.map +1 -1
  20. package/dist/calldata/signature-lookup.js +5 -4
  21. package/dist/calldata/signature-lookup.js.map +1 -1
  22. package/dist/cli/cli.js +112 -20
  23. package/dist/cli/cli.js.map +1 -1
  24. package/dist/cli/lib/cli.d.ts +4 -2
  25. package/dist/cli/lib/cli.d.ts.map +1 -1
  26. package/dist/cli/lib/cli.js +34 -18
  27. package/dist/cli/lib/cli.js.map +1 -1
  28. package/dist/cli/lib/election-check.d.ts.map +1 -1
  29. package/dist/cli/lib/election-check.js +2 -1
  30. package/dist/cli/lib/election-check.js.map +1 -1
  31. package/dist/cli/lib/json-state.js +1 -1
  32. package/dist/cli/lib/json-state.js.map +1 -1
  33. package/dist/cli/tui/components/StageProgress.js +1 -1
  34. package/dist/cli/tui/components/StageProgress.js.map +1 -1
  35. package/dist/cli/tui/components/StageRow.d.ts.map +1 -1
  36. package/dist/cli/tui/components/StageRow.js +15 -20
  37. package/dist/cli/tui/components/StageRow.js.map +1 -1
  38. package/dist/cli/tui/components/VotingStats.d.ts.map +1 -1
  39. package/dist/cli/tui/components/VotingStats.js +2 -1
  40. package/dist/cli/tui/components/VotingStats.js.map +1 -1
  41. package/dist/cli/tui/hooks/useCache.d.ts.map +1 -1
  42. package/dist/cli/tui/hooks/useCache.js +2 -1
  43. package/dist/cli/tui/hooks/useCache.js.map +1 -1
  44. package/dist/cli/tui/hooks/useElectionData.d.ts.map +1 -1
  45. package/dist/cli/tui/hooks/useElectionData.js +3 -2
  46. package/dist/cli/tui/hooks/useElectionData.js.map +1 -1
  47. package/dist/cli/tui/hooks/useNavigation.d.ts.map +1 -1
  48. package/dist/cli/tui/hooks/useNavigation.js +2 -3
  49. package/dist/cli/tui/hooks/useNavigation.js.map +1 -1
  50. package/dist/cli/tui/hooks/useProposals.d.ts.map +1 -1
  51. package/dist/cli/tui/hooks/useProposals.js +26 -36
  52. package/dist/cli/tui/hooks/useProposals.js.map +1 -1
  53. package/dist/cli/tui/hooks/useStageCalldata.d.ts.map +1 -1
  54. package/dist/cli/tui/hooks/useStageCalldata.js +2 -1
  55. package/dist/cli/tui/hooks/useStageCalldata.js.map +1 -1
  56. package/dist/cli/tui/utils/index.d.ts +7 -7
  57. package/dist/cli/tui/utils/index.d.ts.map +1 -1
  58. package/dist/cli/tui/utils/index.js +18 -13
  59. package/dist/cli/tui/utils/index.js.map +1 -1
  60. package/dist/cli/tui/utils/markdown-parser.d.ts +5 -0
  61. package/dist/cli/tui/utils/markdown-parser.d.ts.map +1 -1
  62. package/dist/cli/tui/utils/markdown-parser.js +16 -0
  63. package/dist/cli/tui/utils/markdown-parser.js.map +1 -1
  64. package/dist/cli/tui/utils/navigation.d.ts +1 -0
  65. package/dist/cli/tui/utils/navigation.d.ts.map +1 -1
  66. package/dist/cli/tui/utils/navigation.js +9 -5
  67. package/dist/cli/tui/utils/navigation.js.map +1 -1
  68. package/dist/cli/tui/utils/proposal-detail-helpers.js +6 -6
  69. package/dist/cli/tui/utils/proposal-detail-helpers.js.map +1 -1
  70. package/dist/cli/tui/utils/stage-status.d.ts +4 -0
  71. package/dist/cli/tui/utils/stage-status.d.ts.map +1 -1
  72. package/dist/cli/tui/utils/stage-status.js +47 -1
  73. package/dist/cli/tui/utils/stage-status.js.map +1 -1
  74. package/dist/cli/tui/utils/time.d.ts +4 -4
  75. package/dist/cli/tui/utils/time.d.ts.map +1 -1
  76. package/dist/cli/tui/utils/time.js +13 -11
  77. package/dist/cli/tui/utils/time.js.map +1 -1
  78. package/dist/cli/tui/views/CalldataView.d.ts.map +1 -1
  79. package/dist/cli/tui/views/CalldataView.js +3 -2
  80. package/dist/cli/tui/views/CalldataView.js.map +1 -1
  81. package/dist/cli/tui/views/DescriptionView.d.ts.map +1 -1
  82. package/dist/cli/tui/views/DescriptionView.js +4 -2
  83. package/dist/cli/tui/views/DescriptionView.js.map +1 -1
  84. package/dist/cli/tui/views/ElectionView.d.ts.map +1 -1
  85. package/dist/cli/tui/views/ElectionView.js +4 -9
  86. package/dist/cli/tui/views/ElectionView.js.map +1 -1
  87. package/dist/constants.d.ts +54 -23
  88. package/dist/constants.d.ts.map +1 -1
  89. package/dist/constants.js +78 -21
  90. package/dist/constants.js.map +1 -1
  91. package/dist/data/bundled-cache.json +652 -20
  92. package/dist/data/delegate-cache.json +118014 -0
  93. package/dist/deduplication.d.ts.map +1 -1
  94. package/dist/deduplication.js +34 -54
  95. package/dist/deduplication.js.map +1 -1
  96. package/dist/delegates/cache.d.ts +44 -0
  97. package/dist/delegates/cache.d.ts.map +1 -0
  98. package/dist/delegates/cache.js +202 -0
  99. package/dist/delegates/cache.js.map +1 -0
  100. package/dist/delegates/index.d.ts +13 -0
  101. package/dist/delegates/index.d.ts.map +1 -0
  102. package/dist/delegates/index.js +32 -0
  103. package/dist/delegates/index.js.map +1 -0
  104. package/dist/delegates/indexer.d.ts +32 -0
  105. package/dist/delegates/indexer.d.ts.map +1 -0
  106. package/dist/delegates/indexer.js +191 -0
  107. package/dist/delegates/indexer.js.map +1 -0
  108. package/dist/delegates/queries.d.ts +30 -0
  109. package/dist/delegates/queries.d.ts.map +1 -0
  110. package/dist/delegates/queries.js +79 -0
  111. package/dist/delegates/queries.js.map +1 -0
  112. package/dist/discovery/governor-discovery.d.ts +21 -1
  113. package/dist/discovery/governor-discovery.d.ts.map +1 -1
  114. package/dist/discovery/governor-discovery.js +47 -13
  115. package/dist/discovery/governor-discovery.js.map +1 -1
  116. package/dist/discovery/timelock-discovery.d.ts.map +1 -1
  117. package/dist/discovery/timelock-discovery.js +27 -30
  118. package/dist/discovery/timelock-discovery.js.map +1 -1
  119. package/dist/election/contracts.d.ts.map +1 -1
  120. package/dist/election/contracts.js +4 -1
  121. package/dist/election/contracts.js.map +1 -1
  122. package/dist/election/details.d.ts.map +1 -1
  123. package/dist/election/details.js +7 -3
  124. package/dist/election/details.js.map +1 -1
  125. package/dist/election/index.d.ts +3 -1
  126. package/dist/election/index.d.ts.map +1 -1
  127. package/dist/election/index.js +12 -1
  128. package/dist/election/index.js.map +1 -1
  129. package/dist/election/params.d.ts.map +1 -1
  130. package/dist/election/params.js +14 -28
  131. package/dist/election/params.js.map +1 -1
  132. package/dist/election/participants.d.ts.map +1 -1
  133. package/dist/election/participants.js +21 -26
  134. package/dist/election/participants.js.map +1 -1
  135. package/dist/election/proposal-ids.js +19 -22
  136. package/dist/election/proposal-ids.js.map +1 -1
  137. package/dist/election/status.d.ts +28 -1
  138. package/dist/election/status.d.ts.map +1 -1
  139. package/dist/election/status.js +116 -3
  140. package/dist/election/status.js.map +1 -1
  141. package/dist/election/write.d.ts +132 -0
  142. package/dist/election/write.d.ts.map +1 -0
  143. package/dist/election/write.js +184 -0
  144. package/dist/election/write.js.map +1 -0
  145. package/dist/governance/index.d.ts +5 -0
  146. package/dist/governance/index.d.ts.map +1 -0
  147. package/dist/governance/index.js +28 -0
  148. package/dist/governance/index.js.map +1 -0
  149. package/dist/governance/read.d.ts +50 -0
  150. package/dist/governance/read.d.ts.map +1 -0
  151. package/dist/governance/read.js +194 -0
  152. package/dist/governance/read.js.map +1 -0
  153. package/dist/governance/write.d.ts +54 -0
  154. package/dist/governance/write.d.ts.map +1 -0
  155. package/dist/governance/write.js +132 -0
  156. package/dist/governance/write.js.map +1 -0
  157. package/dist/index.d.ts +40 -21
  158. package/dist/index.d.ts.map +1 -1
  159. package/dist/index.js +149 -15
  160. package/dist/index.js.map +1 -1
  161. package/dist/simulation/index.d.ts +4 -1
  162. package/dist/simulation/index.d.ts.map +1 -1
  163. package/dist/simulation/index.js +5 -1
  164. package/dist/simulation/index.js.map +1 -1
  165. package/dist/simulation/simulation-data.d.ts +33 -2
  166. package/dist/simulation/simulation-data.d.ts.map +1 -1
  167. package/dist/simulation/simulation-data.js +68 -24
  168. package/dist/simulation/simulation-data.js.map +1 -1
  169. package/dist/simulation/tenderly-payloads.d.ts +107 -0
  170. package/dist/simulation/tenderly-payloads.d.ts.map +1 -0
  171. package/dist/simulation/tenderly-payloads.js +103 -0
  172. package/dist/simulation/tenderly-payloads.js.map +1 -0
  173. package/dist/stages/l2-to-l1-message.d.ts.map +1 -1
  174. package/dist/stages/l2-to-l1-message.js +43 -63
  175. package/dist/stages/l2-to-l1-message.js.map +1 -1
  176. package/dist/stages/proposal-queued.js.map +1 -1
  177. package/dist/stages/retryables.d.ts.map +1 -1
  178. package/dist/stages/retryables.js +10 -9
  179. package/dist/stages/retryables.js.map +1 -1
  180. package/dist/stages/timelock.d.ts +43 -3
  181. package/dist/stages/timelock.d.ts.map +1 -1
  182. package/dist/stages/timelock.js +170 -53
  183. package/dist/stages/timelock.js.map +1 -1
  184. package/dist/stages/utils.d.ts +76 -2
  185. package/dist/stages/utils.d.ts.map +1 -1
  186. package/dist/stages/utils.js +185 -30
  187. package/dist/stages/utils.js.map +1 -1
  188. package/dist/tracker/bundled-cache.d.ts +136 -0
  189. package/dist/tracker/bundled-cache.d.ts.map +1 -0
  190. package/dist/tracker/bundled-cache.js +220 -0
  191. package/dist/tracker/bundled-cache.js.map +1 -0
  192. package/dist/tracker/checkpoint-helpers.d.ts +34 -1
  193. package/dist/tracker/checkpoint-helpers.d.ts.map +1 -1
  194. package/dist/tracker/checkpoint-helpers.js +83 -8
  195. package/dist/tracker/checkpoint-helpers.js.map +1 -1
  196. package/dist/tracker/discovery.d.ts +3 -0
  197. package/dist/tracker/discovery.d.ts.map +1 -1
  198. package/dist/tracker/discovery.js +59 -34
  199. package/dist/tracker/discovery.js.map +1 -1
  200. package/dist/tracker/pipeline.d.ts +3 -10
  201. package/dist/tracker/pipeline.d.ts.map +1 -1
  202. package/dist/tracker/pipeline.js +18 -32
  203. package/dist/tracker/pipeline.js.map +1 -1
  204. package/dist/tracker/query.d.ts +1 -0
  205. package/dist/tracker/query.d.ts.map +1 -1
  206. package/dist/tracker/query.js +54 -41
  207. package/dist/tracker/query.js.map +1 -1
  208. package/dist/tracker/state.d.ts +3 -2
  209. package/dist/tracker/state.d.ts.map +1 -1
  210. package/dist/tracker/state.js +9 -5
  211. package/dist/tracker/state.js.map +1 -1
  212. package/dist/tracker.d.ts +33 -11
  213. package/dist/tracker.d.ts.map +1 -1
  214. package/dist/tracker.js +76 -43
  215. package/dist/tracker.js.map +1 -1
  216. package/dist/types/config.d.ts +39 -3
  217. package/dist/types/config.d.ts.map +1 -1
  218. package/dist/types/delegates.d.ts +55 -0
  219. package/dist/types/delegates.d.ts.map +1 -0
  220. package/dist/types/delegates.js +9 -0
  221. package/dist/types/delegates.js.map +1 -0
  222. package/dist/types/election.d.ts +23 -0
  223. package/dist/types/election.d.ts.map +1 -1
  224. package/dist/types/index.d.ts +3 -2
  225. package/dist/types/index.d.ts.map +1 -1
  226. package/dist/types/index.js.map +1 -1
  227. package/dist/types/simulation.d.ts +2 -2
  228. package/dist/types/simulation.d.ts.map +1 -1
  229. package/dist/types/tracking.d.ts +2 -2
  230. package/dist/types/tracking.d.ts.map +1 -1
  231. package/dist/utils/chain.d.ts +5 -1
  232. package/dist/utils/chain.d.ts.map +1 -1
  233. package/dist/utils/chain.js +7 -0
  234. package/dist/utils/chain.js.map +1 -1
  235. package/dist/utils/formatters.d.ts +2 -6
  236. package/dist/utils/formatters.d.ts.map +1 -1
  237. package/dist/utils/formatters.js +9 -12
  238. package/dist/utils/formatters.js.map +1 -1
  239. package/dist/utils/log-filters.js +1 -1
  240. package/dist/utils/log-filters.js.map +1 -1
  241. package/dist/utils/logger.d.ts +2 -0
  242. package/dist/utils/logger.d.ts.map +1 -1
  243. package/dist/utils/logger.js +2 -0
  244. package/dist/utils/logger.js.map +1 -1
  245. package/dist/utils/multicall.d.ts +0 -1
  246. package/dist/utils/multicall.d.ts.map +1 -1
  247. package/dist/utils/rpc-utils.d.ts +5 -0
  248. package/dist/utils/rpc-utils.d.ts.map +1 -1
  249. package/dist/utils/rpc-utils.js +9 -1
  250. package/dist/utils/rpc-utils.js.map +1 -1
  251. package/dist/utils/stage-metadata.d.ts +19 -0
  252. package/dist/utils/stage-metadata.d.ts.map +1 -1
  253. package/dist/utils/stage-metadata.js +44 -0
  254. package/dist/utils/stage-metadata.js.map +1 -1
  255. package/dist/utils/timing.d.ts +3 -10
  256. package/dist/utils/timing.d.ts.map +1 -1
  257. package/dist/utils/timing.js +9 -22
  258. package/dist/utils/timing.js.map +1 -1
  259. package/package.json +7 -3
  260. package/dist/cli/tui/utils/calldata-formatter.d.ts +0 -7
  261. package/dist/cli/tui/utils/calldata-formatter.d.ts.map +0 -1
  262. package/dist/cli/tui/utils/calldata-formatter.js +0 -14
  263. package/dist/cli/tui/utils/calldata-formatter.js.map +0 -1
  264. package/dist/cli/tui/utils/stage-formatter.d.ts +0 -7
  265. package/dist/cli/tui/utils/stage-formatter.d.ts.map +0 -1
  266. package/dist/cli/tui/utils/stage-formatter.js +0 -13
  267. package/dist/cli/tui/utils/stage-formatter.js.map +0 -1
  268. package/dist/cli/tui/utils/text.d.ts +0 -7
  269. package/dist/cli/tui/utils/text.d.ts.map +0 -1
  270. package/dist/cli/tui/utils/text.js +0 -12
  271. package/dist/cli/tui/utils/text.js.map +0 -1
@@ -0,0 +1,220 @@
1
+ "use strict";
2
+ /**
3
+ * Bundled Cache Extraction Utilities
4
+ *
5
+ * Type-safe utilities for extracting data from the bundled cache JSON.
6
+ * These eliminate the need for consumers to parse checkpoint internals.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import bundledCache from "@gzeoneth/gov-tracker/bundled-cache.json";
11
+ * import { extractProposals, getWatermarksFromCache } from "@gzeoneth/gov-tracker";
12
+ *
13
+ * const proposals = extractProposals(bundledCache);
14
+ * const watermarks = getWatermarksFromCache(bundledCache);
15
+ * ```
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.extractProposals = extractProposals;
19
+ exports.extractTimelockOps = extractTimelockOps;
20
+ exports.extractElections = extractElections;
21
+ exports.getWatermarksFromCache = getWatermarksFromCache;
22
+ exports.extractOperationIds = extractOperationIds;
23
+ exports.extractTimelockLinkFromStages = extractTimelockLinkFromStages;
24
+ exports.getVotingDataFromStages = getVotingDataFromStages;
25
+ const utils_1 = require("../stages/utils");
26
+ const checkpoint_helpers_1 = require("./checkpoint-helpers");
27
+ /**
28
+ * Extract proposal metadata from bundled cache
29
+ *
30
+ * Filters to governor-type checkpoints (excludes elections, timelocks, discovery).
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * import bundledCache from "@gzeoneth/gov-tracker/bundled-cache.json";
35
+ * const proposals = extractProposals(bundledCache);
36
+ *
37
+ * for (const p of proposals) {
38
+ * console.log(`Proposal ${p.proposalId}: ${p.isComplete ? "done" : "active"}`);
39
+ * }
40
+ * ```
41
+ */
42
+ function extractProposals(cache) {
43
+ const results = [];
44
+ for (const [key, checkpoint] of Object.entries(cache)) {
45
+ if (checkpoint.input.type !== "governor")
46
+ continue;
47
+ if ((0, checkpoint_helpers_1.isElectionKey)(key) || (0, checkpoint_helpers_1.isTimelockOpKey)(key) || (0, checkpoint_helpers_1.isDiscoveryKey)(key))
48
+ continue;
49
+ const input = checkpoint.input;
50
+ const parentStages = checkpoint.cachedData?.completedStages ?? [];
51
+ // Merge linked timelock stages so consumers see the full lifecycle. Under
52
+ // modular caching the parent stores only the 3 governor stages
53
+ // (PROPOSAL_CREATED, VOTING_ACTIVE, PROPOSAL_QUEUED) and the timelock
54
+ // stages live in a separate checkpoint referenced via metadata.timelockOpKey.
55
+ // Without this merge the list view would freeze at "Queued" forever.
56
+ const timelockOpKey = checkpoint.metadata?.timelockOpKey;
57
+ const linkedStages = typeof timelockOpKey === "string"
58
+ ? (cache[timelockOpKey]?.cachedData?.completedStages ?? [])
59
+ : [];
60
+ const stages = linkedStages.length > 0
61
+ ? (0, utils_1.normalizeTimeline)((0, utils_1.mergeStages)(parentStages, linkedStages))
62
+ : parentStages;
63
+ const queuedStage = (0, utils_1.findStage)(stages, "PROPOSAL_QUEUED");
64
+ const votingStage = (0, utils_1.findStage)(stages, "VOTING_ACTIVE");
65
+ const timelockLink = extractTimelockLinkFromStages(stages);
66
+ const votingData = votingStage?.data;
67
+ const snapshotState = votingData?.proposalState;
68
+ const currentState = (0, utils_1.deriveProposalState)(stages, snapshotState);
69
+ results.push({
70
+ cacheKey: key,
71
+ proposalId: input.proposalId,
72
+ governorAddress: input.governorAddress,
73
+ creationTxHash: input.creationTxHash,
74
+ stages,
75
+ isComplete: stages.length > 0 && stages.every((s) => isTerminal(s.status)),
76
+ timelockLink,
77
+ currentState,
78
+ operationId: queuedStage?.data?.operationId,
79
+ });
80
+ }
81
+ return results;
82
+ }
83
+ /**
84
+ * Extract timelock operation metadata from bundled cache
85
+ *
86
+ * Filters to timelock-type checkpoints only.
87
+ */
88
+ function extractTimelockOps(cache) {
89
+ const results = [];
90
+ for (const [key, checkpoint] of Object.entries(cache)) {
91
+ if (checkpoint.input.type !== "timelock")
92
+ continue;
93
+ const input = checkpoint.input;
94
+ const stages = checkpoint.cachedData?.completedStages ?? [];
95
+ results.push({
96
+ cacheKey: key,
97
+ timelockAddress: input.timelockAddress,
98
+ operationId: input.operationId,
99
+ scheduledTxHash: input.scheduledTxHash,
100
+ stages,
101
+ isComplete: stages.length > 0 && stages.every((s) => isTerminal(s.status)),
102
+ });
103
+ }
104
+ return results;
105
+ }
106
+ /**
107
+ * Extract election metadata from bundled cache
108
+ *
109
+ * Filters to election-type checkpoints only.
110
+ */
111
+ function extractElections(cache) {
112
+ const results = [];
113
+ for (const [key, checkpoint] of Object.entries(cache)) {
114
+ if (checkpoint.input.type !== "election")
115
+ continue;
116
+ const input = checkpoint.input;
117
+ const stages = checkpoint.cachedData?.completedStages ?? [];
118
+ const electionStatus = checkpoint.cachedData?.electionStatus;
119
+ results.push({
120
+ cacheKey: key,
121
+ electionIndex: input.electionIndex,
122
+ stages,
123
+ phase: electionStatus?.phase,
124
+ isComplete: electionStatus?.phase === "COMPLETED",
125
+ });
126
+ }
127
+ return results;
128
+ }
129
+ /**
130
+ * Get discovery watermarks from bundled cache
131
+ *
132
+ * Returns the watermarks stored in the discovery:watermarks checkpoint.
133
+ *
134
+ * @example
135
+ * ```typescript
136
+ * import bundledCache from "@gzeoneth/gov-tracker/bundled-cache.json";
137
+ * const watermarks = getWatermarksFromCache(bundledCache);
138
+ *
139
+ * if (watermarks) {
140
+ * console.log("Core Governor scanned to block:", watermarks.constitutionalGovernor);
141
+ * }
142
+ * ```
143
+ */
144
+ function getWatermarksFromCache(cache) {
145
+ const checkpoint = cache["discovery:watermarks"];
146
+ if (!checkpoint)
147
+ return null;
148
+ return checkpoint.cachedData?.discoveryWatermarks ?? null;
149
+ }
150
+ /**
151
+ * Extract all operation IDs from governor checkpoints
152
+ *
153
+ * Returns a Map of proposalId -> operationId for all proposals that have
154
+ * been queued in a timelock.
155
+ *
156
+ * @param cache - The bundled cache object to extract from
157
+ * @returns Map of proposalId to operationId for queued proposals
158
+ */
159
+ function extractOperationIds(cache) {
160
+ const result = new Map();
161
+ for (const [, checkpoint] of Object.entries(cache)) {
162
+ if (checkpoint.input.type !== "governor")
163
+ continue;
164
+ const input = checkpoint.input;
165
+ const stages = checkpoint.cachedData?.completedStages ?? [];
166
+ const queuedStage = (0, utils_1.findStage)(stages, "PROPOSAL_QUEUED");
167
+ const operationId = queuedStage?.data?.operationId;
168
+ if (operationId) {
169
+ result.set(input.proposalId, operationId);
170
+ }
171
+ }
172
+ return result;
173
+ }
174
+ /**
175
+ * Extract TimelockLink from stages array
176
+ *
177
+ * Helper to get timelock link data from completed PROPOSAL_QUEUED stage.
178
+ *
179
+ * @param stages - Array of tracked stages from a proposal
180
+ * @returns TimelockLink if PROPOSAL_QUEUED stage is complete, undefined otherwise
181
+ */
182
+ function extractTimelockLinkFromStages(stages) {
183
+ const queuedStage = (0, utils_1.findStage)(stages, "PROPOSAL_QUEUED");
184
+ if (queuedStage?.status !== "COMPLETED" || queuedStage.type !== "PROPOSAL_QUEUED") {
185
+ return undefined;
186
+ }
187
+ const tx = queuedStage.transactions[0];
188
+ const data = queuedStage.data;
189
+ const { operationId, timelockAddress } = data;
190
+ return tx?.hash && operationId && timelockAddress && tx.blockNumber
191
+ ? { txHash: tx.hash, operationId, timelockAddress, queueBlockNumber: tx.blockNumber }
192
+ : undefined;
193
+ }
194
+ /**
195
+ * Get voting data from stages array
196
+ *
197
+ * Extracts typed vote counts and proposal state from VOTING_ACTIVE stage.
198
+ *
199
+ * @param stages - Array of tracked stages from a proposal
200
+ * @returns VotingActiveData if VOTING_ACTIVE stage exists, null otherwise
201
+ *
202
+ * @example
203
+ * ```typescript
204
+ * const votingData = getVotingDataFromStages(result.stages);
205
+ * if (votingData) {
206
+ * console.log(`For: ${votingData.forVotesRaw}, Against: ${votingData.againstVotesRaw}`);
207
+ * }
208
+ * ```
209
+ */
210
+ function getVotingDataFromStages(stages) {
211
+ const votingStage = (0, utils_1.findStage)(stages, "VOTING_ACTIVE");
212
+ if (!votingStage || votingStage.type !== "VOTING_ACTIVE") {
213
+ return null;
214
+ }
215
+ return votingStage.data;
216
+ }
217
+ function isTerminal(status) {
218
+ return status === "COMPLETED" || status === "SKIPPED" || status === "FAILED";
219
+ }
220
+ //# sourceMappingURL=bundled-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundled-cache.js","sourceRoot":"","sources":["../../src/tracker/bundled-cache.ts"],"names":[],"mappings":"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"}
@@ -19,7 +19,8 @@ export interface CheckpointMetadata {
19
19
  export declare function createCheckpointMetadata(errorCount?: number): CheckpointMetadata;
20
20
  /**
21
21
  * Increment error count for retry logic
22
- * Gas errors don't increment the count (transient)
22
+ * Gas estimation errors don't increment the count (transient)
23
+ * Uses centralized isGasEstimationError from rpc-utils for consistency
23
24
  */
24
25
  export declare function incrementErrorCount(currentCount: number, error: Error | string): number;
25
26
  /**
@@ -35,6 +36,20 @@ export declare function isCheckpointComplete(checkpoint: TrackingCheckpoint): bo
35
36
  * Get the error count from a checkpoint
36
37
  */
37
38
  export declare function getCheckpointErrorCount(checkpoint: TrackingCheckpoint): number;
39
+ /**
40
+ * Get the on-chain anchor time for a checkpoint, in Unix **milliseconds**.
41
+ *
42
+ * Prefers the immutable timestamp of the checkpoint's first stage (proposal
43
+ * creation block / timelock schedule block / election creation block) over
44
+ * the mutable `checkpoint.createdAt`, which `saveModularCheckpoints` refreshes
45
+ * on every save. Falls back to `createdAt` when no stage timestamp is
46
+ * available (legacy / partial checkpoints).
47
+ *
48
+ * Used by `queryIncompleteCheckpoints` so the `maxAgeDays` gate measures the
49
+ * age of the underlying governance event, not the age of the last cache
50
+ * write.
51
+ */
52
+ export declare function getCheckpointAnchorTime(checkpoint: TrackingCheckpoint): number | null;
38
53
  /**
39
54
  * Cache key format utilities
40
55
  */
@@ -68,6 +83,24 @@ export declare function parseTimelockOpKey(key: string): {
68
83
  txHash: string;
69
84
  operationId: string;
70
85
  } | null;
86
+ /**
87
+ * Trim checkpoint stages from a specific index for re-tracking.
88
+ *
89
+ * Creates a new checkpoint with stages truncated at stageIndex, resetting
90
+ * the tracking position to allow re-processing from that point.
91
+ *
92
+ * @param checkpoint - The checkpoint to trim
93
+ * @param stageIndex - Index to trim from (0 = keep no stages, 1 = keep first stage, etc.)
94
+ * @returns New checkpoint with trimmed stages and updated metadata
95
+ *
96
+ * @example
97
+ * ```typescript
98
+ * // Re-track from PROPOSAL_QUEUED (index 2)
99
+ * const trimmed = trimFromStage(checkpoint, 2);
100
+ * const results = await tracker.trackByTxHash(txHash, { checkpoint: trimmed });
101
+ * ```
102
+ */
103
+ export declare function trimFromStage(checkpoint: TrackingCheckpoint, stageIndex: number): TrackingCheckpoint;
71
104
  /**
72
105
  * Compute aggregated stats from loaded checkpoints.
73
106
  *
@@ -1 +1 @@
1
- {"version":3,"file":"checkpoint-helpers.d.ts","sourceRoot":"","sources":["../../src/tracker/checkpoint-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAIjE,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,SAAI,GAAG,kBAAkB,CAK3E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CASvF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,kBAAkB,EAC9B,SAAS,SAA0B,GAClC,OAAO,CAGT;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAc5E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,kBAAkB,GAAG,MAAM,CAE9E;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAC/C,eAAO,MAAM,aAAa,QAAQ,CAAC;AACnC,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAEjD,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI3D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAG9F;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAC5C,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAC1C,aAAa,GAAE,MAAgC,GAC9C,YAAY,CAiEd"}
1
+ {"version":3,"file":"checkpoint-helpers.d.ts","sourceRoot":"","sources":["../../src/tracker/checkpoint-helpers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAKjE,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,SAAI,GAAG,kBAAkB,CAK3E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAEvF;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,kBAAkB,EAC9B,SAAS,SAA0B,GAClC,OAAO,CAGT;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,UAAU,EAAE,kBAAkB,GAAG,OAAO,CAiC5E;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,kBAAkB,GAAG,MAAM,CAE9E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CASrF;AAED;;GAEG;AACH,eAAO,MAAM,mBAAmB,cAAc,CAAC;AAC/C,eAAO,MAAM,aAAa,QAAQ,CAAC;AACnC,eAAO,MAAM,oBAAoB,eAAe,CAAC;AAEjD,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE5C;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAI3D;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAG9F;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,kBAAkB,EAC9B,UAAU,EAAE,MAAM,GACjB,kBAAkB,CAmBpB;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAC5C,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,EAC1C,aAAa,GAAE,MAAgC,GAC9C,YAAY,CAiEd"}
@@ -12,6 +12,7 @@ exports.incrementErrorCount = incrementErrorCount;
12
12
  exports.isCheckpointErrored = isCheckpointErrored;
13
13
  exports.isCheckpointComplete = isCheckpointComplete;
14
14
  exports.getCheckpointErrorCount = getCheckpointErrorCount;
15
+ exports.getCheckpointAnchorTime = getCheckpointAnchorTime;
15
16
  exports.electionCacheKey = electionCacheKey;
16
17
  exports.txHashCacheKey = txHashCacheKey;
17
18
  exports.isElectionKey = isElectionKey;
@@ -21,9 +22,11 @@ exports.parseElectionKey = parseElectionKey;
21
22
  exports.timelockOpCacheKey = timelockOpCacheKey;
22
23
  exports.isTimelockOpKey = isTimelockOpKey;
23
24
  exports.parseTimelockOpKey = parseTimelockOpKey;
25
+ exports.trimFromStage = trimFromStage;
24
26
  exports.computeCacheStats = computeCacheStats;
25
27
  const utils_1 = require("../stages/utils");
26
28
  const constants_1 = require("../constants");
29
+ const rpc_utils_1 = require("../utils/rpc-utils");
27
30
  exports.DEFAULT_ERROR_THRESHOLD = 5;
28
31
  /**
29
32
  * Create standard checkpoint metadata
@@ -36,15 +39,11 @@ function createCheckpointMetadata(errorCount = 0) {
36
39
  }
37
40
  /**
38
41
  * Increment error count for retry logic
39
- * Gas errors don't increment the count (transient)
42
+ * Gas estimation errors don't increment the count (transient)
43
+ * Uses centralized isGasEstimationError from rpc-utils for consistency
40
44
  */
41
45
  function incrementErrorCount(currentCount, error) {
42
- const isGasError = error instanceof Error
43
- ? error.message.includes("insufficient funds") ||
44
- error.message.includes("gas required exceeds allowance")
45
- : typeof error === "string" &&
46
- (error.includes("insufficient funds") || error.includes("gas required exceeds allowance"));
47
- return isGasError ? currentCount : currentCount + 1;
46
+ return (0, rpc_utils_1.isGasEstimationError)(error) ? currentCount : currentCount + 1;
48
47
  }
49
48
  /**
50
49
  * Check if checkpoint has too many errors to continue tracking
@@ -67,7 +66,24 @@ function isCheckpointComplete(checkpoint) {
67
66
  return false;
68
67
  }
69
68
  const stages = checkpoint.cachedData?.completedStages ?? [];
70
- return stages.length > 0 && (0, utils_1.areAllStagesComplete)(stages);
69
+ if (stages.length === 0 || !(0, utils_1.areAllStagesComplete)(stages)) {
70
+ return false;
71
+ }
72
+ // Modular parent guard: a governor parent checkpoint stores only parent
73
+ // stages (PROPOSAL_CREATED, VOTING_ACTIVE, PROPOSAL_QUEUED). If
74
+ // PROPOSAL_QUEUED is COMPLETED, the proposal was queued successfully —
75
+ // timelock execution must follow. Unless the checkpoint also carries
76
+ // timelock stages (legacy combined view), the parent alone is NOT complete;
77
+ // tracking continues in the linked timelock checkpoint referenced by
78
+ // `metadata.timelockOpKey`. Without this guard, rebuilders that call
79
+ // `queryIncompleteCheckpoints` skip queued proposals forever.
80
+ if (inputType === "governor") {
81
+ const queuedStage = stages.find((s) => s.type === "PROPOSAL_QUEUED");
82
+ if (queuedStage?.status === "COMPLETED" && !stages.some((s) => (0, utils_1.isTimelockPathStage)(s.type))) {
83
+ return false;
84
+ }
85
+ }
86
+ return true;
71
87
  }
72
88
  /**
73
89
  * Get the error count from a checkpoint
@@ -75,6 +91,29 @@ function isCheckpointComplete(checkpoint) {
75
91
  function getCheckpointErrorCount(checkpoint) {
76
92
  return checkpoint.metadata?.errorCount ?? 0;
77
93
  }
94
+ /**
95
+ * Get the on-chain anchor time for a checkpoint, in Unix **milliseconds**.
96
+ *
97
+ * Prefers the immutable timestamp of the checkpoint's first stage (proposal
98
+ * creation block / timelock schedule block / election creation block) over
99
+ * the mutable `checkpoint.createdAt`, which `saveModularCheckpoints` refreshes
100
+ * on every save. Falls back to `createdAt` when no stage timestamp is
101
+ * available (legacy / partial checkpoints).
102
+ *
103
+ * Used by `queryIncompleteCheckpoints` so the `maxAgeDays` gate measures the
104
+ * age of the underlying governance event, not the age of the last cache
105
+ * write.
106
+ */
107
+ function getCheckpointAnchorTime(checkpoint) {
108
+ const stages = checkpoint.cachedData?.completedStages ?? [];
109
+ for (const stage of stages) {
110
+ const tsSec = stage.transactions?.[0]?.timestamp ?? stage.timing?.startedAt;
111
+ if (typeof tsSec === "number" && tsSec > 0) {
112
+ return tsSec * 1000;
113
+ }
114
+ }
115
+ return checkpoint.createdAt && checkpoint.createdAt > 0 ? checkpoint.createdAt : null;
116
+ }
78
117
  /**
79
118
  * Cache key format utilities
80
119
  */
@@ -127,6 +166,42 @@ function parseTimelockOpKey(key) {
127
166
  const match = key.match(/^tx:([^:]+):op:(.+)$/);
128
167
  return match ? { txHash: match[1], operationId: match[2] } : null;
129
168
  }
169
+ /**
170
+ * Trim checkpoint stages from a specific index for re-tracking.
171
+ *
172
+ * Creates a new checkpoint with stages truncated at stageIndex, resetting
173
+ * the tracking position to allow re-processing from that point.
174
+ *
175
+ * @param checkpoint - The checkpoint to trim
176
+ * @param stageIndex - Index to trim from (0 = keep no stages, 1 = keep first stage, etc.)
177
+ * @returns New checkpoint with trimmed stages and updated metadata
178
+ *
179
+ * @example
180
+ * ```typescript
181
+ * // Re-track from PROPOSAL_QUEUED (index 2)
182
+ * const trimmed = trimFromStage(checkpoint, 2);
183
+ * const results = await tracker.trackByTxHash(txHash, { checkpoint: trimmed });
184
+ * ```
185
+ */
186
+ function trimFromStage(checkpoint, stageIndex) {
187
+ const stages = checkpoint.cachedData?.completedStages ?? [];
188
+ const trimmedStages = stages.slice(0, stageIndex);
189
+ const lastStage = trimmedStages[trimmedStages.length - 1];
190
+ return {
191
+ ...checkpoint,
192
+ lastProcessedStage: lastStage?.type ?? null,
193
+ cachedData: {
194
+ ...checkpoint.cachedData,
195
+ completedStages: trimmedStages,
196
+ },
197
+ metadata: {
198
+ ...checkpoint.metadata,
199
+ errorCount: 0,
200
+ lastTrackedAt: Date.now(),
201
+ timelockOpKey: stageIndex <= 2 ? undefined : checkpoint.metadata?.timelockOpKey,
202
+ },
203
+ };
204
+ }
130
205
  /**
131
206
  * Compute aggregated stats from loaded checkpoints.
132
207
  *
@@ -1 +1 @@
1
- {"version":3,"file":"checkpoint-helpers.js","sourceRoot":"","sources":["../../src/tracker/checkpoint-helpers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checkpoint-helpers.js","sourceRoot":"","sources":["../../src/tracker/checkpoint-helpers.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,9 @@ export interface LoadedWatermarks {
25
25
  * Load discovery watermarks from cache.
26
26
  * Watermarks are stored as a TrackingCheckpoint for unified cache format.
27
27
  * Returns empty objects if no watermarks are cached.
28
+ *
29
+ * @param cache - Cache adapter to load from, or undefined for no cache
30
+ * @returns LoadedWatermarks with watermarks and block hashes for reorg detection
28
31
  */
29
32
  export declare function loadWatermarks(cache: CacheAdapter | undefined): Promise<LoadedWatermarks>;
30
33
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/tracker/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAEL,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,OAAO,EAEL,kBAAkB,EAGnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAEL,oBAAoB,EACrB,MAAM,iCAAiC,CAAC;AAMzC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,CAAC;AAEpD;;;GAGG;AACH,eAAO,MAAM,cAAc,yBAAyB,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,eAAe,CAAC;CACzB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAO/F;AAQD;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,GAClC,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsDtE;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,mBAAmB,EAC/B,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,YAAY,GAAG,SAAS,GAC9B,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAG/B;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC;AAED;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,kBAAkB,EAAE,EAC/B,WAAW,EAAE,oBAAoB,EAAE,EACnC,KAAK,EAAE,YAAY,GAAG,SAAS,GAC9B,OAAO,CAAC,IAAI,CAAC,CA8Cf;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,cAAc,EAAE,mBAAmB,EACnC,UAAU,GAAE,eAAoB,EAChC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7D,OAAO,CAAC;IACT,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,UAAU,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,eAAe,CAAC;CACzB,CAAC,CA4LD"}
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../../src/tracker/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAEL,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,YAAY,EACZ,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,OAAO,EAEL,kBAAkB,EAGnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAEL,oBAAoB,EACrB,MAAM,iCAAiC,CAAC;AAMzC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,CAAC;AAEpD;;;GAGG;AACH,eAAO,MAAM,cAAc,yBAAyB,CAAC;AAErD;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,eAAe,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAO/F;AAQD;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CACnC,GAAG,EAAE,YAAY,EACjB,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,GAClC,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CA2DtE;AAED;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,mBAAmB,EAC/B,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,YAAY,GAAG,SAAS,GAC9B,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED;;;;;;;;;GASG;AACH,wBAAsB,iBAAiB,CACrC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAG/B;AAED;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,eAAe,EAAE,MAAM,EACvB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAGjC;AAED;;;;;;;;GAQG;AACH,wBAAsB,wBAAwB,CAC5C,SAAS,EAAE,kBAAkB,EAAE,EAC/B,WAAW,EAAE,oBAAoB,EAAE,EACnC,KAAK,EAAE,YAAY,GAAG,SAAS,GAC9B,OAAO,CAAC,IAAI,CAAC,CAuDf;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,cAAc,EAAE,mBAAmB,EACnC,UAAU,GAAE,eAAoB,EAChC,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7D,OAAO,CAAC;IACT,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,UAAU,EAAE,mBAAmB,CAAC;IAChC,MAAM,EAAE,eAAe,CAAC;CACzB,CAAC,CA0MD"}
@@ -29,6 +29,9 @@ exports.WATERMARKS_KEY = "discovery:watermarks";
29
29
  * Load discovery watermarks from cache.
30
30
  * Watermarks are stored as a TrackingCheckpoint for unified cache format.
31
31
  * Returns empty objects if no watermarks are cached.
32
+ *
33
+ * @param cache - Cache adapter to load from, or undefined for no cache
34
+ * @returns LoadedWatermarks with watermarks and block hashes for reorg detection
32
35
  */
33
36
  async function loadWatermarks(cache) {
34
37
  if (!cache)
@@ -67,11 +70,16 @@ async function verifyWatermark(key, blockNumber, expectedHash, provider) {
67
70
  logDiscovery("%s: no stored hash, establishing hash at block %d", key, blockNumber);
68
71
  return { blockNumber, isValid: true, newHash: block.hash };
69
72
  }
73
+ // Block not found - could indicate reorg or future block
74
+ logDiscovery("%s: block %d not found when establishing hash", key, blockNumber);
70
75
  }
71
- catch {
72
- // Block might not exist yet or provider error - continue without hash
76
+ catch (error) {
77
+ logDiscovery("%s: provider error establishing hash at block %d: %s", key, blockNumber, error);
78
+ // Provider error during hash establishment - return invalid to trigger retry on next cycle
79
+ return { blockNumber, isValid: false };
73
80
  }
74
- return { blockNumber, isValid: true };
81
+ // Block not found but no error - treat as invalid (may be future block or transient issue)
82
+ return { blockNumber, isValid: false };
75
83
  }
76
84
  // Verify stored hash against chain
77
85
  try {
@@ -177,38 +185,43 @@ async function createPendingCheckpoints(proposals, timelockOps, cache) {
177
185
  void timelockOps;
178
186
  if (!cache)
179
187
  return;
180
- let created = 0;
181
- let skippedElections = 0;
182
- // Create pending checkpoints for proposals (if not already tracked)
183
- // Use tx: key format to match trackByTxHash cache keys
184
- // Skip election proposals - they use election:* checkpoints
185
- for (const p of proposals) {
188
+ // Filter out election proposals first (they use election:* checkpoints)
189
+ const governorProposals = proposals.filter((p) => {
186
190
  const proposalType = (0, governor_discovery_1.detectProposalType)(p.governorAddress);
187
- if ((0, governor_discovery_1.isElectionProposal)(proposalType)) {
188
- skippedElections++;
189
- continue;
190
- }
191
- const key = `tx:${p.creationTxHash.toLowerCase()}`;
192
- const existing = await cache.get(key);
193
- if (existing)
191
+ return !(0, governor_discovery_1.isElectionProposal)(proposalType);
192
+ });
193
+ const skippedElections = proposals.length - governorProposals.length;
194
+ // Build cache keys and check existing checkpoints in parallel
195
+ const keys = governorProposals.map((p) => `tx:${p.creationTxHash.toLowerCase()}`);
196
+ const existingCheckpoints = await Promise.all(keys.map((key) => cache.get(key)));
197
+ // Create checkpoints only for proposals that don't exist yet
198
+ const now = Date.now();
199
+ const toCreate = [];
200
+ for (let i = 0; i < governorProposals.length; i++) {
201
+ if (existingCheckpoints[i])
194
202
  continue; // Already has a checkpoint
195
- const checkpoint = {
196
- version: 1,
197
- createdAt: Date.now(),
198
- input: {
199
- type: "governor",
200
- governorAddress: p.governorAddress,
201
- proposalId: p.proposalId,
202
- creationTxHash: p.creationTxHash,
203
+ const p = governorProposals[i];
204
+ toCreate.push({
205
+ key: keys[i],
206
+ checkpoint: {
207
+ version: 1,
208
+ createdAt: now,
209
+ input: {
210
+ type: "governor",
211
+ governorAddress: p.governorAddress,
212
+ proposalId: p.proposalId,
213
+ creationTxHash: p.creationTxHash,
214
+ },
215
+ lastProcessedStage: null,
216
+ lastProcessedBlock: { l1: 0, l2: p.creationBlock },
217
+ cachedData: {},
218
+ metadata: { errorCount: 0, lastTrackedAt: 0 },
203
219
  },
204
- lastProcessedStage: null,
205
- lastProcessedBlock: { l1: 0, l2: p.creationBlock },
206
- cachedData: {},
207
- metadata: { errorCount: 0, lastTrackedAt: 0 }, // lastTrackedAt=0 means never tracked
208
- };
209
- await cache.set(key, checkpoint);
210
- created++;
220
+ });
211
221
  }
222
+ // Write all new checkpoints in parallel
223
+ await Promise.all(toCreate.map(({ key, checkpoint }) => cache.set(key, checkpoint)));
224
+ const created = toCreate.length;
212
225
  if (created > 0 || skippedElections > 0) {
213
226
  logDiscovery("created pending checkpoints: %d proposals (skipped %d elections)", created, skippedElections);
214
227
  }
@@ -262,9 +275,21 @@ async function discoverAll(targets, toBlock, l2Provider, cache, fromWatermarks,
262
275
  }
263
276
  return { key, blockNumber: result.blockNumber };
264
277
  });
265
- const verificationResults = await Promise.all(verificationPromises);
266
- for (const { key, blockNumber } of verificationResults) {
267
- verifiedWatermarks[key] = blockNumber;
278
+ const verificationResults = await Promise.allSettled(verificationPromises);
279
+ for (const result of verificationResults) {
280
+ if (result.status === "fulfilled") {
281
+ const { key, blockNumber } = result.value;
282
+ verifiedWatermarks[key] = blockNumber;
283
+ }
284
+ else {
285
+ logDiscovery("Watermark verification failed, using fallback: %s", (0, rpc_utils_1.getErrorMessage)(result.reason));
286
+ }
287
+ }
288
+ // Ensure all active keys have a watermark (fallback for rejected verifications)
289
+ for (const key of activeKeys) {
290
+ if (verifiedWatermarks[key] === undefined) {
291
+ verifiedWatermarks[key] = defaultStartBlock;
292
+ }
268
293
  }
269
294
  }
270
295
  else {