@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.
- package/README.md +95 -11
- package/dist/abis-json.d.ts +2315 -0
- package/dist/abis-json.d.ts.map +1 -0
- package/dist/abis-json.js +3207 -0
- package/dist/abis-json.js.map +1 -0
- package/dist/abis.d.ts +12 -7
- package/dist/abis.d.ts.map +1 -1
- package/dist/abis.js +32 -1
- package/dist/abis.js.map +1 -1
- package/dist/calldata/decoder.d.ts.map +1 -1
- package/dist/calldata/decoder.js +33 -28
- package/dist/calldata/decoder.js.map +1 -1
- package/dist/calldata/parameter-decoder.d.ts.map +1 -1
- package/dist/calldata/parameter-decoder.js +19 -25
- package/dist/calldata/parameter-decoder.js.map +1 -1
- package/dist/calldata/retryable-ticket.d.ts +2 -2
- package/dist/calldata/retryable-ticket.d.ts.map +1 -1
- package/dist/calldata/retryable-ticket.js +17 -12
- package/dist/calldata/retryable-ticket.js.map +1 -1
- package/dist/calldata/signature-lookup.js +5 -4
- package/dist/calldata/signature-lookup.js.map +1 -1
- package/dist/cli/cli.js +112 -20
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/lib/cli.d.ts +4 -2
- package/dist/cli/lib/cli.d.ts.map +1 -1
- package/dist/cli/lib/cli.js +34 -18
- package/dist/cli/lib/cli.js.map +1 -1
- package/dist/cli/lib/election-check.d.ts.map +1 -1
- package/dist/cli/lib/election-check.js +2 -1
- package/dist/cli/lib/election-check.js.map +1 -1
- package/dist/cli/lib/json-state.js +1 -1
- package/dist/cli/lib/json-state.js.map +1 -1
- package/dist/cli/tui/components/StageProgress.js +1 -1
- package/dist/cli/tui/components/StageProgress.js.map +1 -1
- package/dist/cli/tui/components/StageRow.d.ts.map +1 -1
- package/dist/cli/tui/components/StageRow.js +15 -20
- package/dist/cli/tui/components/StageRow.js.map +1 -1
- package/dist/cli/tui/components/VotingStats.d.ts.map +1 -1
- package/dist/cli/tui/components/VotingStats.js +2 -1
- package/dist/cli/tui/components/VotingStats.js.map +1 -1
- package/dist/cli/tui/hooks/useCache.d.ts.map +1 -1
- package/dist/cli/tui/hooks/useCache.js +2 -1
- package/dist/cli/tui/hooks/useCache.js.map +1 -1
- package/dist/cli/tui/hooks/useElectionData.d.ts.map +1 -1
- package/dist/cli/tui/hooks/useElectionData.js +3 -2
- package/dist/cli/tui/hooks/useElectionData.js.map +1 -1
- package/dist/cli/tui/hooks/useNavigation.d.ts.map +1 -1
- package/dist/cli/tui/hooks/useNavigation.js +2 -3
- package/dist/cli/tui/hooks/useNavigation.js.map +1 -1
- package/dist/cli/tui/hooks/useProposals.d.ts.map +1 -1
- package/dist/cli/tui/hooks/useProposals.js +26 -36
- package/dist/cli/tui/hooks/useProposals.js.map +1 -1
- package/dist/cli/tui/hooks/useStageCalldata.d.ts.map +1 -1
- package/dist/cli/tui/hooks/useStageCalldata.js +2 -1
- package/dist/cli/tui/hooks/useStageCalldata.js.map +1 -1
- package/dist/cli/tui/utils/index.d.ts +7 -7
- package/dist/cli/tui/utils/index.d.ts.map +1 -1
- package/dist/cli/tui/utils/index.js +18 -13
- package/dist/cli/tui/utils/index.js.map +1 -1
- package/dist/cli/tui/utils/markdown-parser.d.ts +5 -0
- package/dist/cli/tui/utils/markdown-parser.d.ts.map +1 -1
- package/dist/cli/tui/utils/markdown-parser.js +16 -0
- package/dist/cli/tui/utils/markdown-parser.js.map +1 -1
- package/dist/cli/tui/utils/navigation.d.ts +1 -0
- package/dist/cli/tui/utils/navigation.d.ts.map +1 -1
- package/dist/cli/tui/utils/navigation.js +9 -5
- package/dist/cli/tui/utils/navigation.js.map +1 -1
- package/dist/cli/tui/utils/proposal-detail-helpers.js +6 -6
- package/dist/cli/tui/utils/proposal-detail-helpers.js.map +1 -1
- package/dist/cli/tui/utils/stage-status.d.ts +4 -0
- package/dist/cli/tui/utils/stage-status.d.ts.map +1 -1
- package/dist/cli/tui/utils/stage-status.js +47 -1
- package/dist/cli/tui/utils/stage-status.js.map +1 -1
- package/dist/cli/tui/utils/time.d.ts +4 -4
- package/dist/cli/tui/utils/time.d.ts.map +1 -1
- package/dist/cli/tui/utils/time.js +13 -11
- package/dist/cli/tui/utils/time.js.map +1 -1
- package/dist/cli/tui/views/CalldataView.d.ts.map +1 -1
- package/dist/cli/tui/views/CalldataView.js +3 -2
- package/dist/cli/tui/views/CalldataView.js.map +1 -1
- package/dist/cli/tui/views/DescriptionView.d.ts.map +1 -1
- package/dist/cli/tui/views/DescriptionView.js +4 -2
- package/dist/cli/tui/views/DescriptionView.js.map +1 -1
- package/dist/cli/tui/views/ElectionView.d.ts.map +1 -1
- package/dist/cli/tui/views/ElectionView.js +4 -9
- package/dist/cli/tui/views/ElectionView.js.map +1 -1
- package/dist/constants.d.ts +54 -23
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +78 -21
- package/dist/constants.js.map +1 -1
- package/dist/data/bundled-cache.json +652 -20
- package/dist/data/delegate-cache.json +118014 -0
- package/dist/deduplication.d.ts.map +1 -1
- package/dist/deduplication.js +34 -54
- package/dist/deduplication.js.map +1 -1
- package/dist/delegates/cache.d.ts +44 -0
- package/dist/delegates/cache.d.ts.map +1 -0
- package/dist/delegates/cache.js +202 -0
- package/dist/delegates/cache.js.map +1 -0
- package/dist/delegates/index.d.ts +13 -0
- package/dist/delegates/index.d.ts.map +1 -0
- package/dist/delegates/index.js +32 -0
- package/dist/delegates/index.js.map +1 -0
- package/dist/delegates/indexer.d.ts +32 -0
- package/dist/delegates/indexer.d.ts.map +1 -0
- package/dist/delegates/indexer.js +191 -0
- package/dist/delegates/indexer.js.map +1 -0
- package/dist/delegates/queries.d.ts +30 -0
- package/dist/delegates/queries.d.ts.map +1 -0
- package/dist/delegates/queries.js +79 -0
- package/dist/delegates/queries.js.map +1 -0
- package/dist/discovery/governor-discovery.d.ts +21 -1
- package/dist/discovery/governor-discovery.d.ts.map +1 -1
- package/dist/discovery/governor-discovery.js +47 -13
- package/dist/discovery/governor-discovery.js.map +1 -1
- package/dist/discovery/timelock-discovery.d.ts.map +1 -1
- package/dist/discovery/timelock-discovery.js +27 -30
- package/dist/discovery/timelock-discovery.js.map +1 -1
- package/dist/election/contracts.d.ts.map +1 -1
- package/dist/election/contracts.js +4 -1
- package/dist/election/contracts.js.map +1 -1
- package/dist/election/details.d.ts.map +1 -1
- package/dist/election/details.js +7 -3
- package/dist/election/details.js.map +1 -1
- package/dist/election/index.d.ts +3 -1
- package/dist/election/index.d.ts.map +1 -1
- package/dist/election/index.js +12 -1
- package/dist/election/index.js.map +1 -1
- package/dist/election/params.d.ts.map +1 -1
- package/dist/election/params.js +14 -28
- package/dist/election/params.js.map +1 -1
- package/dist/election/participants.d.ts.map +1 -1
- package/dist/election/participants.js +21 -26
- package/dist/election/participants.js.map +1 -1
- package/dist/election/proposal-ids.js +19 -22
- package/dist/election/proposal-ids.js.map +1 -1
- package/dist/election/status.d.ts +28 -1
- package/dist/election/status.d.ts.map +1 -1
- package/dist/election/status.js +116 -3
- package/dist/election/status.js.map +1 -1
- package/dist/election/write.d.ts +132 -0
- package/dist/election/write.d.ts.map +1 -0
- package/dist/election/write.js +184 -0
- package/dist/election/write.js.map +1 -0
- package/dist/governance/index.d.ts +5 -0
- package/dist/governance/index.d.ts.map +1 -0
- package/dist/governance/index.js +28 -0
- package/dist/governance/index.js.map +1 -0
- package/dist/governance/read.d.ts +50 -0
- package/dist/governance/read.d.ts.map +1 -0
- package/dist/governance/read.js +194 -0
- package/dist/governance/read.js.map +1 -0
- package/dist/governance/write.d.ts +54 -0
- package/dist/governance/write.d.ts.map +1 -0
- package/dist/governance/write.js +132 -0
- package/dist/governance/write.js.map +1 -0
- package/dist/index.d.ts +40 -21
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +149 -15
- package/dist/index.js.map +1 -1
- package/dist/simulation/index.d.ts +4 -1
- package/dist/simulation/index.d.ts.map +1 -1
- package/dist/simulation/index.js +5 -1
- package/dist/simulation/index.js.map +1 -1
- package/dist/simulation/simulation-data.d.ts +33 -2
- package/dist/simulation/simulation-data.d.ts.map +1 -1
- package/dist/simulation/simulation-data.js +68 -24
- package/dist/simulation/simulation-data.js.map +1 -1
- package/dist/simulation/tenderly-payloads.d.ts +107 -0
- package/dist/simulation/tenderly-payloads.d.ts.map +1 -0
- package/dist/simulation/tenderly-payloads.js +103 -0
- package/dist/simulation/tenderly-payloads.js.map +1 -0
- package/dist/stages/l2-to-l1-message.d.ts.map +1 -1
- package/dist/stages/l2-to-l1-message.js +43 -63
- package/dist/stages/l2-to-l1-message.js.map +1 -1
- package/dist/stages/proposal-queued.js.map +1 -1
- package/dist/stages/retryables.d.ts.map +1 -1
- package/dist/stages/retryables.js +10 -9
- package/dist/stages/retryables.js.map +1 -1
- package/dist/stages/timelock.d.ts +43 -3
- package/dist/stages/timelock.d.ts.map +1 -1
- package/dist/stages/timelock.js +170 -53
- package/dist/stages/timelock.js.map +1 -1
- package/dist/stages/utils.d.ts +76 -2
- package/dist/stages/utils.d.ts.map +1 -1
- package/dist/stages/utils.js +185 -30
- package/dist/stages/utils.js.map +1 -1
- package/dist/tracker/bundled-cache.d.ts +136 -0
- package/dist/tracker/bundled-cache.d.ts.map +1 -0
- package/dist/tracker/bundled-cache.js +220 -0
- package/dist/tracker/bundled-cache.js.map +1 -0
- package/dist/tracker/checkpoint-helpers.d.ts +34 -1
- package/dist/tracker/checkpoint-helpers.d.ts.map +1 -1
- package/dist/tracker/checkpoint-helpers.js +83 -8
- package/dist/tracker/checkpoint-helpers.js.map +1 -1
- package/dist/tracker/discovery.d.ts +3 -0
- package/dist/tracker/discovery.d.ts.map +1 -1
- package/dist/tracker/discovery.js +59 -34
- package/dist/tracker/discovery.js.map +1 -1
- package/dist/tracker/pipeline.d.ts +3 -10
- package/dist/tracker/pipeline.d.ts.map +1 -1
- package/dist/tracker/pipeline.js +18 -32
- package/dist/tracker/pipeline.js.map +1 -1
- package/dist/tracker/query.d.ts +1 -0
- package/dist/tracker/query.d.ts.map +1 -1
- package/dist/tracker/query.js +54 -41
- package/dist/tracker/query.js.map +1 -1
- package/dist/tracker/state.d.ts +3 -2
- package/dist/tracker/state.d.ts.map +1 -1
- package/dist/tracker/state.js +9 -5
- package/dist/tracker/state.js.map +1 -1
- package/dist/tracker.d.ts +33 -11
- package/dist/tracker.d.ts.map +1 -1
- package/dist/tracker.js +76 -43
- package/dist/tracker.js.map +1 -1
- package/dist/types/config.d.ts +39 -3
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/delegates.d.ts +55 -0
- package/dist/types/delegates.d.ts.map +1 -0
- package/dist/types/delegates.js +9 -0
- package/dist/types/delegates.js.map +1 -0
- package/dist/types/election.d.ts +23 -0
- package/dist/types/election.d.ts.map +1 -1
- package/dist/types/index.d.ts +3 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/simulation.d.ts +2 -2
- package/dist/types/simulation.d.ts.map +1 -1
- package/dist/types/tracking.d.ts +2 -2
- package/dist/types/tracking.d.ts.map +1 -1
- package/dist/utils/chain.d.ts +5 -1
- package/dist/utils/chain.d.ts.map +1 -1
- package/dist/utils/chain.js +7 -0
- package/dist/utils/chain.js.map +1 -1
- package/dist/utils/formatters.d.ts +2 -6
- package/dist/utils/formatters.d.ts.map +1 -1
- package/dist/utils/formatters.js +9 -12
- package/dist/utils/formatters.js.map +1 -1
- package/dist/utils/log-filters.js +1 -1
- package/dist/utils/log-filters.js.map +1 -1
- package/dist/utils/logger.d.ts +2 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +2 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/multicall.d.ts +0 -1
- package/dist/utils/multicall.d.ts.map +1 -1
- package/dist/utils/rpc-utils.d.ts +5 -0
- package/dist/utils/rpc-utils.d.ts.map +1 -1
- package/dist/utils/rpc-utils.js +9 -1
- package/dist/utils/rpc-utils.js.map +1 -1
- package/dist/utils/stage-metadata.d.ts +19 -0
- package/dist/utils/stage-metadata.d.ts.map +1 -1
- package/dist/utils/stage-metadata.js +44 -0
- package/dist/utils/stage-metadata.js.map +1 -1
- package/dist/utils/timing.d.ts +3 -10
- package/dist/utils/timing.d.ts.map +1 -1
- package/dist/utils/timing.js +9 -22
- package/dist/utils/timing.js.map +1 -1
- package/package.json +7 -3
- package/dist/cli/tui/utils/calldata-formatter.d.ts +0 -7
- package/dist/cli/tui/utils/calldata-formatter.d.ts.map +0 -1
- package/dist/cli/tui/utils/calldata-formatter.js +0 -14
- package/dist/cli/tui/utils/calldata-formatter.js.map +0 -1
- package/dist/cli/tui/utils/stage-formatter.d.ts +0 -7
- package/dist/cli/tui/utils/stage-formatter.d.ts.map +0 -1
- package/dist/cli/tui/utils/stage-formatter.js +0 -13
- package/dist/cli/tui/utils/stage-formatter.js.map +0 -1
- package/dist/cli/tui/utils/text.d.ts +0 -7
- package/dist/cli/tui/utils/text.d.ts.map +0 -1
- package/dist/cli/tui/utils/text.js +0 -12
- 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;
|
|
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
|
-
|
|
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
|
-
|
|
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":";AAAA;;;;;GAKG;;;
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
181
|
-
|
|
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
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
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
|
-
|
|
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.
|
|
266
|
-
for (const
|
|
267
|
-
|
|
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 {
|