@gzeoneth/gov-tracker 0.4.0-beta.757932 → 0.4.0-beta.d2d5c17

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 (173) hide show
  1. package/README.md +18 -10
  2. package/dist/calldata/decoder.d.ts.map +1 -1
  3. package/dist/calldata/decoder.js +33 -28
  4. package/dist/calldata/decoder.js.map +1 -1
  5. package/dist/calldata/retryable-ticket.d.ts +2 -2
  6. package/dist/calldata/retryable-ticket.d.ts.map +1 -1
  7. package/dist/calldata/retryable-ticket.js +17 -12
  8. package/dist/calldata/retryable-ticket.js.map +1 -1
  9. package/dist/calldata/signature-lookup.js +5 -4
  10. package/dist/calldata/signature-lookup.js.map +1 -1
  11. package/dist/cli/cli.js +39 -19
  12. package/dist/cli/cli.js.map +1 -1
  13. package/dist/cli/lib/cli.d.ts +4 -2
  14. package/dist/cli/lib/cli.d.ts.map +1 -1
  15. package/dist/cli/lib/cli.js +31 -16
  16. package/dist/cli/lib/cli.js.map +1 -1
  17. package/dist/cli/lib/json-state.js +1 -1
  18. package/dist/cli/lib/json-state.js.map +1 -1
  19. package/dist/cli/tui/components/StageProgress.js +1 -1
  20. package/dist/cli/tui/components/StageProgress.js.map +1 -1
  21. package/dist/cli/tui/components/StageRow.d.ts.map +1 -1
  22. package/dist/cli/tui/components/StageRow.js +15 -20
  23. package/dist/cli/tui/components/StageRow.js.map +1 -1
  24. package/dist/cli/tui/hooks/useCache.d.ts.map +1 -1
  25. package/dist/cli/tui/hooks/useCache.js +2 -1
  26. package/dist/cli/tui/hooks/useCache.js.map +1 -1
  27. package/dist/cli/tui/hooks/useElectionData.d.ts.map +1 -1
  28. package/dist/cli/tui/hooks/useElectionData.js +3 -2
  29. package/dist/cli/tui/hooks/useElectionData.js.map +1 -1
  30. package/dist/cli/tui/hooks/useProposals.d.ts.map +1 -1
  31. package/dist/cli/tui/hooks/useProposals.js +24 -34
  32. package/dist/cli/tui/hooks/useProposals.js.map +1 -1
  33. package/dist/cli/tui/hooks/useStageCalldata.d.ts.map +1 -1
  34. package/dist/cli/tui/hooks/useStageCalldata.js +2 -1
  35. package/dist/cli/tui/hooks/useStageCalldata.js.map +1 -1
  36. package/dist/cli/tui/utils/index.d.ts +6 -6
  37. package/dist/cli/tui/utils/index.d.ts.map +1 -1
  38. package/dist/cli/tui/utils/index.js +14 -13
  39. package/dist/cli/tui/utils/index.js.map +1 -1
  40. package/dist/cli/tui/utils/markdown-parser.d.ts +5 -0
  41. package/dist/cli/tui/utils/markdown-parser.d.ts.map +1 -1
  42. package/dist/cli/tui/utils/markdown-parser.js +16 -0
  43. package/dist/cli/tui/utils/markdown-parser.js.map +1 -1
  44. package/dist/cli/tui/utils/navigation.d.ts.map +1 -1
  45. package/dist/cli/tui/utils/navigation.js +5 -1
  46. package/dist/cli/tui/utils/navigation.js.map +1 -1
  47. package/dist/cli/tui/utils/proposal-detail-helpers.js +6 -6
  48. package/dist/cli/tui/utils/proposal-detail-helpers.js.map +1 -1
  49. package/dist/cli/tui/utils/time.d.ts +4 -4
  50. package/dist/cli/tui/utils/time.d.ts.map +1 -1
  51. package/dist/cli/tui/utils/time.js +13 -11
  52. package/dist/cli/tui/utils/time.js.map +1 -1
  53. package/dist/cli/tui/views/DescriptionView.d.ts.map +1 -1
  54. package/dist/cli/tui/views/DescriptionView.js +4 -2
  55. package/dist/cli/tui/views/DescriptionView.js.map +1 -1
  56. package/dist/constants.d.ts +11 -1
  57. package/dist/constants.d.ts.map +1 -1
  58. package/dist/constants.js +16 -4
  59. package/dist/constants.js.map +1 -1
  60. package/dist/deduplication.d.ts.map +1 -1
  61. package/dist/deduplication.js +36 -33
  62. package/dist/deduplication.js.map +1 -1
  63. package/dist/discovery/governor-discovery.js +1 -1
  64. package/dist/discovery/governor-discovery.js.map +1 -1
  65. package/dist/discovery/timelock-discovery.d.ts.map +1 -1
  66. package/dist/discovery/timelock-discovery.js +28 -30
  67. package/dist/discovery/timelock-discovery.js.map +1 -1
  68. package/dist/election/contracts.d.ts.map +1 -1
  69. package/dist/election/contracts.js +4 -1
  70. package/dist/election/contracts.js.map +1 -1
  71. package/dist/election/details.d.ts.map +1 -1
  72. package/dist/election/details.js +7 -3
  73. package/dist/election/details.js.map +1 -1
  74. package/dist/election/params.d.ts.map +1 -1
  75. package/dist/election/params.js +3 -12
  76. package/dist/election/params.js.map +1 -1
  77. package/dist/election/participants.d.ts.map +1 -1
  78. package/dist/election/participants.js +21 -26
  79. package/dist/election/participants.js.map +1 -1
  80. package/dist/election/proposal-ids.js +17 -20
  81. package/dist/election/proposal-ids.js.map +1 -1
  82. package/dist/election/status.d.ts.map +1 -1
  83. package/dist/election/status.js +6 -0
  84. package/dist/election/status.js.map +1 -1
  85. package/dist/index.d.ts +23 -13
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +37 -12
  88. package/dist/index.js.map +1 -1
  89. package/dist/simulation/index.d.ts +4 -1
  90. package/dist/simulation/index.d.ts.map +1 -1
  91. package/dist/simulation/index.js +5 -1
  92. package/dist/simulation/index.js.map +1 -1
  93. package/dist/simulation/simulation-data.d.ts +33 -2
  94. package/dist/simulation/simulation-data.d.ts.map +1 -1
  95. package/dist/simulation/simulation-data.js +68 -24
  96. package/dist/simulation/simulation-data.js.map +1 -1
  97. package/dist/simulation/tenderly-payloads.d.ts +107 -0
  98. package/dist/simulation/tenderly-payloads.d.ts.map +1 -0
  99. package/dist/simulation/tenderly-payloads.js +103 -0
  100. package/dist/simulation/tenderly-payloads.js.map +1 -0
  101. package/dist/stages/l2-to-l1-message.js +3 -3
  102. package/dist/stages/l2-to-l1-message.js.map +1 -1
  103. package/dist/stages/retryables.d.ts.map +1 -1
  104. package/dist/stages/retryables.js +10 -9
  105. package/dist/stages/retryables.js.map +1 -1
  106. package/dist/stages/timelock.d.ts +3 -1
  107. package/dist/stages/timelock.d.ts.map +1 -1
  108. package/dist/stages/timelock.js +15 -9
  109. package/dist/stages/timelock.js.map +1 -1
  110. package/dist/stages/utils.d.ts +55 -0
  111. package/dist/stages/utils.d.ts.map +1 -1
  112. package/dist/stages/utils.js +130 -2
  113. package/dist/stages/utils.js.map +1 -1
  114. package/dist/tracker/bundled-cache.d.ts +136 -0
  115. package/dist/tracker/bundled-cache.d.ts.map +1 -0
  116. package/dist/tracker/bundled-cache.js +207 -0
  117. package/dist/tracker/bundled-cache.js.map +1 -0
  118. package/dist/tracker/checkpoint-helpers.d.ts +20 -1
  119. package/dist/tracker/checkpoint-helpers.d.ts.map +1 -1
  120. package/dist/tracker/checkpoint-helpers.js +41 -7
  121. package/dist/tracker/checkpoint-helpers.js.map +1 -1
  122. package/dist/tracker/discovery.d.ts +3 -0
  123. package/dist/tracker/discovery.d.ts.map +1 -1
  124. package/dist/tracker/discovery.js +59 -34
  125. package/dist/tracker/discovery.js.map +1 -1
  126. package/dist/tracker/query.d.ts +1 -0
  127. package/dist/tracker/query.d.ts.map +1 -1
  128. package/dist/tracker/query.js +28 -36
  129. package/dist/tracker/query.js.map +1 -1
  130. package/dist/tracker/state.d.ts +3 -2
  131. package/dist/tracker/state.d.ts.map +1 -1
  132. package/dist/tracker/state.js +5 -4
  133. package/dist/tracker/state.js.map +1 -1
  134. package/dist/tracker.d.ts +33 -11
  135. package/dist/tracker.d.ts.map +1 -1
  136. package/dist/tracker.js +72 -40
  137. package/dist/tracker.js.map +1 -1
  138. package/dist/types/config.d.ts +39 -3
  139. package/dist/types/config.d.ts.map +1 -1
  140. package/dist/types/index.d.ts +1 -1
  141. package/dist/types/index.d.ts.map +1 -1
  142. package/dist/types/index.js.map +1 -1
  143. package/dist/types/simulation.d.ts +2 -2
  144. package/dist/types/simulation.d.ts.map +1 -1
  145. package/dist/utils/log-filters.js +1 -1
  146. package/dist/utils/log-filters.js.map +1 -1
  147. package/dist/utils/multicall.d.ts +0 -1
  148. package/dist/utils/multicall.d.ts.map +1 -1
  149. package/dist/utils/rpc-utils.d.ts +11 -0
  150. package/dist/utils/rpc-utils.d.ts.map +1 -1
  151. package/dist/utils/rpc-utils.js +18 -1
  152. package/dist/utils/rpc-utils.js.map +1 -1
  153. package/dist/utils/stage-metadata.d.ts +19 -0
  154. package/dist/utils/stage-metadata.d.ts.map +1 -1
  155. package/dist/utils/stage-metadata.js +44 -0
  156. package/dist/utils/stage-metadata.js.map +1 -1
  157. package/dist/utils/timing.d.ts +1 -1
  158. package/dist/utils/timing.d.ts.map +1 -1
  159. package/dist/utils/timing.js +6 -2
  160. package/dist/utils/timing.js.map +1 -1
  161. package/package.json +1 -1
  162. package/dist/cli/tui/utils/calldata-formatter.d.ts +0 -7
  163. package/dist/cli/tui/utils/calldata-formatter.d.ts.map +0 -1
  164. package/dist/cli/tui/utils/calldata-formatter.js +0 -14
  165. package/dist/cli/tui/utils/calldata-formatter.js.map +0 -1
  166. package/dist/cli/tui/utils/stage-formatter.d.ts +0 -7
  167. package/dist/cli/tui/utils/stage-formatter.d.ts.map +0 -1
  168. package/dist/cli/tui/utils/stage-formatter.js +0 -13
  169. package/dist/cli/tui/utils/stage-formatter.js.map +0 -1
  170. package/dist/cli/tui/utils/text.d.ts +0 -7
  171. package/dist/cli/tui/utils/text.d.ts.map +0 -1
  172. package/dist/cli/tui/utils/text.js +0 -12
  173. package/dist/cli/tui/utils/text.js.map +0 -1
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Bundled Cache Extraction Utilities
3
+ *
4
+ * Type-safe utilities for extracting data from the bundled cache JSON.
5
+ * These eliminate the need for consumers to parse checkpoint internals.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import bundledCache from "@gzeoneth/gov-tracker/bundled-cache.json";
10
+ * import { extractProposals, getWatermarksFromCache } from "@gzeoneth/gov-tracker";
11
+ *
12
+ * const proposals = extractProposals(bundledCache);
13
+ * const watermarks = getWatermarksFromCache(bundledCache);
14
+ * ```
15
+ */
16
+ import type { TrackingCheckpoint, TrackedStage, TimelockLink, DiscoveryWatermarks, VotingActiveData, ProposalState } from "../types";
17
+ /**
18
+ * Type for the bundled cache JSON structure
19
+ */
20
+ export type BundledCache = Record<string, TrackingCheckpoint>;
21
+ /**
22
+ * Extracted proposal metadata from a checkpoint
23
+ */
24
+ export interface ExtractedProposal {
25
+ cacheKey: string;
26
+ proposalId: string;
27
+ governorAddress: string;
28
+ creationTxHash: string;
29
+ stages: TrackedStage[];
30
+ isComplete: boolean;
31
+ timelockLink?: TimelockLink;
32
+ currentState?: ProposalState;
33
+ operationId?: string;
34
+ }
35
+ /**
36
+ * Extracted timelock operation metadata from a checkpoint
37
+ */
38
+ export interface ExtractedTimelockOp {
39
+ cacheKey: string;
40
+ timelockAddress: string;
41
+ operationId: string;
42
+ scheduledTxHash: string;
43
+ stages: TrackedStage[];
44
+ isComplete: boolean;
45
+ }
46
+ /**
47
+ * Extracted election metadata from a checkpoint
48
+ */
49
+ export interface ExtractedElection {
50
+ cacheKey: string;
51
+ electionIndex: number;
52
+ stages: TrackedStage[];
53
+ phase?: string;
54
+ isComplete: boolean;
55
+ }
56
+ /**
57
+ * Extract proposal metadata from bundled cache
58
+ *
59
+ * Filters to governor-type checkpoints (excludes elections, timelocks, discovery).
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * import bundledCache from "@gzeoneth/gov-tracker/bundled-cache.json";
64
+ * const proposals = extractProposals(bundledCache);
65
+ *
66
+ * for (const p of proposals) {
67
+ * console.log(`Proposal ${p.proposalId}: ${p.isComplete ? "done" : "active"}`);
68
+ * }
69
+ * ```
70
+ */
71
+ export declare function extractProposals(cache: BundledCache): ExtractedProposal[];
72
+ /**
73
+ * Extract timelock operation metadata from bundled cache
74
+ *
75
+ * Filters to timelock-type checkpoints only.
76
+ */
77
+ export declare function extractTimelockOps(cache: BundledCache): ExtractedTimelockOp[];
78
+ /**
79
+ * Extract election metadata from bundled cache
80
+ *
81
+ * Filters to election-type checkpoints only.
82
+ */
83
+ export declare function extractElections(cache: BundledCache): ExtractedElection[];
84
+ /**
85
+ * Get discovery watermarks from bundled cache
86
+ *
87
+ * Returns the watermarks stored in the discovery:watermarks checkpoint.
88
+ *
89
+ * @example
90
+ * ```typescript
91
+ * import bundledCache from "@gzeoneth/gov-tracker/bundled-cache.json";
92
+ * const watermarks = getWatermarksFromCache(bundledCache);
93
+ *
94
+ * if (watermarks) {
95
+ * console.log("Core Governor scanned to block:", watermarks.constitutionalGovernor);
96
+ * }
97
+ * ```
98
+ */
99
+ export declare function getWatermarksFromCache(cache: BundledCache): DiscoveryWatermarks | null;
100
+ /**
101
+ * Extract all operation IDs from governor checkpoints
102
+ *
103
+ * Returns a Map of proposalId -> operationId for all proposals that have
104
+ * been queued in a timelock.
105
+ *
106
+ * @param cache - The bundled cache object to extract from
107
+ * @returns Map of proposalId to operationId for queued proposals
108
+ */
109
+ export declare function extractOperationIds(cache: BundledCache): Map<string, string>;
110
+ /**
111
+ * Extract TimelockLink from stages array
112
+ *
113
+ * Helper to get timelock link data from completed PROPOSAL_QUEUED stage.
114
+ *
115
+ * @param stages - Array of tracked stages from a proposal
116
+ * @returns TimelockLink if PROPOSAL_QUEUED stage is complete, undefined otherwise
117
+ */
118
+ export declare function extractTimelockLinkFromStages(stages: TrackedStage[]): TimelockLink | undefined;
119
+ /**
120
+ * Get voting data from stages array
121
+ *
122
+ * Extracts typed vote counts and proposal state from VOTING_ACTIVE stage.
123
+ *
124
+ * @param stages - Array of tracked stages from a proposal
125
+ * @returns VotingActiveData if VOTING_ACTIVE stage exists, null otherwise
126
+ *
127
+ * @example
128
+ * ```typescript
129
+ * const votingData = getVotingDataFromStages(result.stages);
130
+ * if (votingData) {
131
+ * console.log(`For: ${votingData.forVotesRaw}, Against: ${votingData.againstVotesRaw}`);
132
+ * }
133
+ * ```
134
+ */
135
+ export declare function getVotingDataFromStages(stages: TrackedStage[]): VotingActiveData | null;
136
+ //# sourceMappingURL=bundled-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundled-cache.d.ts","sourceRoot":"","sources":["../../src/tracker/bundled-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,mBAAmB,EAKnB,gBAAgB,EAChB,aAAa,EACd,MAAM,UAAU,CAAC;AAIlB;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,YAAY,CAAC,EAAE,aAAa,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,YAAY,EAAE,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,iBAAiB,EAAE,CA+BzE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,mBAAmB,EAAE,CAoB7E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,iBAAiB,EAAE,CAoBzE;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,GAAG,mBAAmB,GAAG,IAAI,CAKtF;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAiB5E;AAED;;;;;;;GAOG;AACH,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,GAAG,SAAS,CAa9F;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,gBAAgB,GAAG,IAAI,CAMvF"}
@@ -0,0 +1,207 @@
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 stages = checkpoint.cachedData?.completedStages ?? [];
51
+ const queuedStage = (0, utils_1.findStage)(stages, "PROPOSAL_QUEUED");
52
+ const votingStage = (0, utils_1.findStage)(stages, "VOTING_ACTIVE");
53
+ const timelockLink = extractTimelockLinkFromStages(stages);
54
+ const votingData = votingStage?.data;
55
+ const currentState = votingData?.proposalState;
56
+ results.push({
57
+ cacheKey: key,
58
+ proposalId: input.proposalId,
59
+ governorAddress: input.governorAddress,
60
+ creationTxHash: input.creationTxHash,
61
+ stages,
62
+ isComplete: stages.length > 0 && stages.every((s) => isTerminal(s.status)),
63
+ timelockLink,
64
+ currentState,
65
+ operationId: queuedStage?.data?.operationId,
66
+ });
67
+ }
68
+ return results;
69
+ }
70
+ /**
71
+ * Extract timelock operation metadata from bundled cache
72
+ *
73
+ * Filters to timelock-type checkpoints only.
74
+ */
75
+ function extractTimelockOps(cache) {
76
+ const results = [];
77
+ for (const [key, checkpoint] of Object.entries(cache)) {
78
+ if (checkpoint.input.type !== "timelock")
79
+ continue;
80
+ const input = checkpoint.input;
81
+ const stages = checkpoint.cachedData?.completedStages ?? [];
82
+ results.push({
83
+ cacheKey: key,
84
+ timelockAddress: input.timelockAddress,
85
+ operationId: input.operationId,
86
+ scheduledTxHash: input.scheduledTxHash,
87
+ stages,
88
+ isComplete: stages.length > 0 && stages.every((s) => isTerminal(s.status)),
89
+ });
90
+ }
91
+ return results;
92
+ }
93
+ /**
94
+ * Extract election metadata from bundled cache
95
+ *
96
+ * Filters to election-type checkpoints only.
97
+ */
98
+ function extractElections(cache) {
99
+ const results = [];
100
+ for (const [key, checkpoint] of Object.entries(cache)) {
101
+ if (checkpoint.input.type !== "election")
102
+ continue;
103
+ const input = checkpoint.input;
104
+ const stages = checkpoint.cachedData?.completedStages ?? [];
105
+ const electionStatus = checkpoint.cachedData?.electionStatus;
106
+ results.push({
107
+ cacheKey: key,
108
+ electionIndex: input.electionIndex,
109
+ stages,
110
+ phase: electionStatus?.phase,
111
+ isComplete: electionStatus?.phase === "COMPLETED",
112
+ });
113
+ }
114
+ return results;
115
+ }
116
+ /**
117
+ * Get discovery watermarks from bundled cache
118
+ *
119
+ * Returns the watermarks stored in the discovery:watermarks checkpoint.
120
+ *
121
+ * @example
122
+ * ```typescript
123
+ * import bundledCache from "@gzeoneth/gov-tracker/bundled-cache.json";
124
+ * const watermarks = getWatermarksFromCache(bundledCache);
125
+ *
126
+ * if (watermarks) {
127
+ * console.log("Core Governor scanned to block:", watermarks.constitutionalGovernor);
128
+ * }
129
+ * ```
130
+ */
131
+ function getWatermarksFromCache(cache) {
132
+ const checkpoint = cache["discovery:watermarks"];
133
+ if (!checkpoint)
134
+ return null;
135
+ return checkpoint.cachedData?.discoveryWatermarks ?? null;
136
+ }
137
+ /**
138
+ * Extract all operation IDs from governor checkpoints
139
+ *
140
+ * Returns a Map of proposalId -> operationId for all proposals that have
141
+ * been queued in a timelock.
142
+ *
143
+ * @param cache - The bundled cache object to extract from
144
+ * @returns Map of proposalId to operationId for queued proposals
145
+ */
146
+ function extractOperationIds(cache) {
147
+ const result = new Map();
148
+ for (const [, checkpoint] of Object.entries(cache)) {
149
+ if (checkpoint.input.type !== "governor")
150
+ continue;
151
+ const input = checkpoint.input;
152
+ const stages = checkpoint.cachedData?.completedStages ?? [];
153
+ const queuedStage = (0, utils_1.findStage)(stages, "PROPOSAL_QUEUED");
154
+ const operationId = queuedStage?.data?.operationId;
155
+ if (operationId) {
156
+ result.set(input.proposalId, operationId);
157
+ }
158
+ }
159
+ return result;
160
+ }
161
+ /**
162
+ * Extract TimelockLink from stages array
163
+ *
164
+ * Helper to get timelock link data from completed PROPOSAL_QUEUED stage.
165
+ *
166
+ * @param stages - Array of tracked stages from a proposal
167
+ * @returns TimelockLink if PROPOSAL_QUEUED stage is complete, undefined otherwise
168
+ */
169
+ function extractTimelockLinkFromStages(stages) {
170
+ const queuedStage = (0, utils_1.findStage)(stages, "PROPOSAL_QUEUED");
171
+ if (queuedStage?.status !== "COMPLETED" || queuedStage.type !== "PROPOSAL_QUEUED") {
172
+ return undefined;
173
+ }
174
+ const tx = queuedStage.transactions[0];
175
+ const data = queuedStage.data;
176
+ const { operationId, timelockAddress } = data;
177
+ return tx?.hash && operationId && timelockAddress && tx.blockNumber
178
+ ? { txHash: tx.hash, operationId, timelockAddress, queueBlockNumber: tx.blockNumber }
179
+ : undefined;
180
+ }
181
+ /**
182
+ * Get voting data from stages array
183
+ *
184
+ * Extracts typed vote counts and proposal state from VOTING_ACTIVE stage.
185
+ *
186
+ * @param stages - Array of tracked stages from a proposal
187
+ * @returns VotingActiveData if VOTING_ACTIVE stage exists, null otherwise
188
+ *
189
+ * @example
190
+ * ```typescript
191
+ * const votingData = getVotingDataFromStages(result.stages);
192
+ * if (votingData) {
193
+ * console.log(`For: ${votingData.forVotesRaw}, Against: ${votingData.againstVotesRaw}`);
194
+ * }
195
+ * ```
196
+ */
197
+ function getVotingDataFromStages(stages) {
198
+ const votingStage = (0, utils_1.findStage)(stages, "VOTING_ACTIVE");
199
+ if (!votingStage || votingStage.type !== "VOTING_ACTIVE") {
200
+ return null;
201
+ }
202
+ return votingStage.data;
203
+ }
204
+ function isTerminal(status) {
205
+ return status === "COMPLETED" || status === "SKIPPED" || status === "FAILED";
206
+ }
207
+ //# 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
  /**
@@ -68,6 +69,24 @@ export declare function parseTimelockOpKey(key: string): {
68
69
  txHash: string;
69
70
  operationId: string;
70
71
  } | null;
72
+ /**
73
+ * Trim checkpoint stages from a specific index for re-tracking.
74
+ *
75
+ * Creates a new checkpoint with stages truncated at stageIndex, resetting
76
+ * the tracking position to allow re-processing from that point.
77
+ *
78
+ * @param checkpoint - The checkpoint to trim
79
+ * @param stageIndex - Index to trim from (0 = keep no stages, 1 = keep first stage, etc.)
80
+ * @returns New checkpoint with trimmed stages and updated metadata
81
+ *
82
+ * @example
83
+ * ```typescript
84
+ * // Re-track from PROPOSAL_QUEUED (index 2)
85
+ * const trimmed = trimFromStage(checkpoint, 2);
86
+ * const results = await tracker.trackByTxHash(txHash, { checkpoint: trimmed });
87
+ * ```
88
+ */
89
+ export declare function trimFromStage(checkpoint: TrackingCheckpoint, stageIndex: number): TrackingCheckpoint;
71
90
  /**
72
91
  * Compute aggregated stats from loaded checkpoints.
73
92
  *
@@ -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,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;;;;;;;;;;;;;;;;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"}
@@ -21,9 +21,11 @@ exports.parseElectionKey = parseElectionKey;
21
21
  exports.timelockOpCacheKey = timelockOpCacheKey;
22
22
  exports.isTimelockOpKey = isTimelockOpKey;
23
23
  exports.parseTimelockOpKey = parseTimelockOpKey;
24
+ exports.trimFromStage = trimFromStage;
24
25
  exports.computeCacheStats = computeCacheStats;
25
26
  const utils_1 = require("../stages/utils");
26
27
  const constants_1 = require("../constants");
28
+ const rpc_utils_1 = require("../utils/rpc-utils");
27
29
  exports.DEFAULT_ERROR_THRESHOLD = 5;
28
30
  /**
29
31
  * Create standard checkpoint metadata
@@ -36,15 +38,11 @@ function createCheckpointMetadata(errorCount = 0) {
36
38
  }
37
39
  /**
38
40
  * Increment error count for retry logic
39
- * Gas errors don't increment the count (transient)
41
+ * Gas estimation errors don't increment the count (transient)
42
+ * Uses centralized isGasEstimationError from rpc-utils for consistency
40
43
  */
41
44
  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;
45
+ return (0, rpc_utils_1.isGasEstimationError)(error) ? currentCount : currentCount + 1;
48
46
  }
49
47
  /**
50
48
  * Check if checkpoint has too many errors to continue tracking
@@ -127,6 +125,42 @@ function parseTimelockOpKey(key) {
127
125
  const match = key.match(/^tx:([^:]+):op:(.+)$/);
128
126
  return match ? { txHash: match[1], operationId: match[2] } : null;
129
127
  }
128
+ /**
129
+ * Trim checkpoint stages from a specific index for re-tracking.
130
+ *
131
+ * Creates a new checkpoint with stages truncated at stageIndex, resetting
132
+ * the tracking position to allow re-processing from that point.
133
+ *
134
+ * @param checkpoint - The checkpoint to trim
135
+ * @param stageIndex - Index to trim from (0 = keep no stages, 1 = keep first stage, etc.)
136
+ * @returns New checkpoint with trimmed stages and updated metadata
137
+ *
138
+ * @example
139
+ * ```typescript
140
+ * // Re-track from PROPOSAL_QUEUED (index 2)
141
+ * const trimmed = trimFromStage(checkpoint, 2);
142
+ * const results = await tracker.trackByTxHash(txHash, { checkpoint: trimmed });
143
+ * ```
144
+ */
145
+ function trimFromStage(checkpoint, stageIndex) {
146
+ const stages = checkpoint.cachedData?.completedStages ?? [];
147
+ const trimmedStages = stages.slice(0, stageIndex);
148
+ const lastStage = trimmedStages[trimmedStages.length - 1];
149
+ return {
150
+ ...checkpoint,
151
+ lastProcessedStage: lastStage?.type ?? null,
152
+ cachedData: {
153
+ ...checkpoint.cachedData,
154
+ completedStages: trimmedStages,
155
+ },
156
+ metadata: {
157
+ ...checkpoint.metadata,
158
+ errorCount: 0,
159
+ lastTrackedAt: Date.now(),
160
+ timelockOpKey: stageIndex <= 2 ? undefined : checkpoint.metadata?.timelockOpKey,
161
+ },
162
+ };
163
+ }
130
164
  /**
131
165
  * Compute aggregated stats from loaded checkpoints.
132
166
  *
@@ -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":";AAAA;;;;;GAKG;;;AAoBH,4DAKC;AAOD,kDAEC;AAKD,kDAMC;AAMD,oDAcC;AAKD,0DAEC;AASD,4CAEC;AAED,wCAEC;AAED,sCAEC;AAED,0BAEC;AAED,wCAEC;AAKD,4CAIC;AAQD,gDAEC;AAKD,0CAEC;AAKD,gDAGC;AAmBD,sCAsBC;AAUD,8CAqEC;AA1PD,2CAAuD;AACvD,4CAAkD;AAClD,kDAA0D;AAE7C,QAAA,uBAAuB,GAAG,CAAC,CAAC;AAUzC;;GAEG;AACH,SAAgB,wBAAwB,CAAC,UAAU,GAAG,CAAC;IACrD,OAAO;QACL,UAAU;QACV,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE;KAC1B,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,YAAoB,EAAE,KAAqB;IAC7E,OAAO,IAAA,gCAAoB,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC;AACvE,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CACjC,UAA8B,EAC9B,SAAS,GAAG,+BAAuB;IAEnC,MAAM,UAAU,GAAG,UAAU,CAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,CAAC;IACxD,OAAO,UAAU,IAAI,SAAS,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,UAA8B;IACjE,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;IAExC,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAG,UAAU,CAAC,UAAU,EAAE,cAAgD,CAAC;QAC/F,OAAO,cAAc,EAAE,KAAK,KAAK,WAAW,CAAC;IAC/C,CAAC;IAED,IAAI,SAAS,KAAK,WAAW,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,eAAe,IAAI,EAAE,CAAC;IAC5D,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,IAAA,4BAAoB,EAAC,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,UAA8B;IACpE,OAAO,UAAU,CAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACU,QAAA,mBAAmB,GAAG,WAAW,CAAC;AAClC,QAAA,aAAa,GAAG,KAAK,CAAC;AACtB,QAAA,oBAAoB,GAAG,YAAY,CAAC;AAEjD,SAAgB,gBAAgB,CAAC,aAAqB;IACpD,OAAO,GAAG,2BAAmB,GAAG,aAAa,EAAE,CAAC;AAClD,CAAC;AAED,SAAgB,cAAc,CAAC,MAAc;IAC3C,OAAO,GAAG,qBAAa,GAAG,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;AACnD,CAAC;AAED,SAAgB,aAAa,CAAC,GAAW;IACvC,OAAO,GAAG,CAAC,UAAU,CAAC,2BAAmB,CAAC,CAAC;AAC7C,CAAC;AAED,SAAgB,OAAO,CAAC,GAAW;IACjC,OAAO,GAAG,CAAC,UAAU,CAAC,qBAAa,CAAC,CAAC;AACvC,CAAC;AAED,SAAgB,cAAc,CAAC,GAAW;IACxC,OAAO,GAAG,CAAC,UAAU,CAAC,4BAAoB,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,SAAgB,gBAAgB,CAAC,GAAW;IAC1C,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,2BAAmB,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAClE,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AACrC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,kBAAkB,CAAC,MAAc,EAAE,WAAmB;IACpE,OAAO,GAAG,qBAAa,GAAG,MAAM,CAAC,WAAW,EAAE,OAAO,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;AACnF,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAAC,GAAW;IACzC,OAAO,GAAG,CAAC,UAAU,CAAC,qBAAa,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,GAAW;IAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAChD,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpE,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAgB,aAAa,CAC3B,UAA8B,EAC9B,UAAkB;IAElB,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,eAAe,IAAI,EAAE,CAAC;IAC5D,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,aAAa,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE1D,OAAO;QACL,GAAG,UAAU;QACb,kBAAkB,EAAE,SAAS,EAAE,IAAI,IAAI,IAAI;QAC3C,UAAU,EAAE;YACV,GAAG,UAAU,CAAC,UAAU;YACxB,eAAe,EAAE,aAAa;SAC/B;QACD,QAAQ,EAAE;YACR,GAAG,UAAU,CAAC,QAAQ;YACtB,UAAU,EAAE,CAAC;YACb,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE;YACzB,aAAa,EAAE,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,aAAa;SAChF;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,iBAAiB,CAC/B,WAA4C,EAC5C,SAA0C,EAC1C,gBAAwB,+BAAuB;IAE/C,IAAI,aAAa,GAAG,CAAC,EACnB,gBAAgB,GAAG,CAAC,EACpB,cAAc,GAAG,CAAC,EAClB,eAAe,GAAG,CAAC,CAAC;IACtB,IAAI,aAAa,GAAG,CAAC,EACnB,gBAAgB,GAAG,CAAC,EACpB,cAAc,GAAG,CAAC,EAClB,eAAe,GAAG,CAAC,CAAC;IACtB,IAAI,aAAa,GAAG,CAAC,EACnB,gBAAgB,GAAG,CAAC,CAAC;IAEvB,KAAK,MAAM,UAAU,IAAI,WAAW,CAAC,MAAM,EAAE,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;QAExC,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YAC7B,IACE,UAAU,CAAC,KAAK,CAAC,eAAe;gBAChC,IAAA,8BAAkB,EAAC,UAAU,CAAC,KAAK,CAAC,eAAe,CAAC,EACpD,CAAC;gBACD,SAAS;YACX,CAAC;YACD,aAAa,EAAE,CAAC;YAChB,IAAI,QAAQ;gBAAE,gBAAgB,EAAE,CAAC;iBAC5B,IAAI,OAAO;gBAAE,eAAe,EAAE,CAAC;;gBAC/B,cAAc,EAAE,CAAC;QACxB,CAAC;aAAM,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YACpC,aAAa,EAAE,CAAC;YAChB,IAAI,QAAQ;gBAAE,gBAAgB,EAAE,CAAC;QACnC,CAAC;aAAM,IAAI,SAAS,KAAK,UAAU,EAAE,CAAC;YACpC,aAAa,EAAE,CAAC;YAChB,IAAI,QAAQ;gBAAE,gBAAgB,EAAE,CAAC;iBAC5B,IAAI,OAAO;gBAAE,eAAe,EAAE,CAAC;;gBAC/B,cAAc,EAAE,CAAC;QACxB,CAAC;IACH,CAAC;IAED,KAAK,MAAM,UAAU,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QAC5C,aAAa,EAAE,CAAC;QAChB,IAAI,oBAAoB,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,gBAAgB,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO;QACL,KAAK,EAAE,WAAW,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI;QACxC,SAAS,EAAE;YACT,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,gBAAgB;YAC1B,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,eAAe;SACzB;QACD,SAAS,EAAE;YACT,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,gBAAgB;YAC1B,MAAM,EAAE,cAAc;YACtB,OAAO,EAAE,eAAe;SACzB;QACD,SAAS,EAAE;YACT,KAAK,EAAE,aAAa;YACpB,QAAQ,EAAE,gBAAgB;SAC3B;KACF,CAAC;AACJ,CAAC"}
@@ -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 {