@gzeoneth/gov-tracker 0.2.1-beta.682a255 → 0.2.1-beta.746bfec
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 +126 -80
- package/dist/abis.d.ts +3 -0
- package/dist/abis.d.ts.map +1 -1
- package/dist/abis.js +30 -2
- package/dist/abis.js.map +1 -1
- package/dist/calldata/index.d.ts +1 -1
- package/dist/calldata/index.d.ts.map +1 -1
- package/dist/calldata/index.js.map +1 -1
- package/dist/calldata/parameter-decoder.d.ts.map +1 -1
- package/dist/calldata/parameter-decoder.js +8 -1
- package/dist/calldata/parameter-decoder.js.map +1 -1
- package/dist/calldata/signature-lookup.d.ts +17 -2
- package/dist/calldata/signature-lookup.d.ts.map +1 -1
- package/dist/calldata/signature-lookup.js +20 -2
- package/dist/calldata/signature-lookup.js.map +1 -1
- package/dist/cli/cli.d.ts +21 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/{monitor.js → cli.js} +315 -46
- package/dist/cli/cli.js.map +1 -0
- package/dist/cli/lib/cli.d.ts +54 -3
- package/dist/cli/lib/cli.d.ts.map +1 -1
- package/dist/cli/lib/cli.js +384 -75
- package/dist/cli/lib/cli.js.map +1 -1
- package/dist/cli/lib/concurrency.d.ts +20 -0
- package/dist/cli/lib/concurrency.d.ts.map +1 -0
- package/dist/cli/lib/concurrency.js +32 -0
- package/dist/cli/lib/concurrency.js.map +1 -0
- package/dist/cli/lib/json-state.d.ts +23 -0
- package/dist/cli/lib/json-state.d.ts.map +1 -1
- package/dist/cli/lib/json-state.js +51 -4
- package/dist/cli/lib/json-state.js.map +1 -1
- package/dist/constants.d.ts +39 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +47 -1
- package/dist/constants.js.map +1 -1
- package/dist/data/bundled-cache.json +11807 -2559
- package/dist/deduplication.d.ts +132 -0
- package/dist/deduplication.d.ts.map +1 -0
- package/dist/deduplication.js +270 -0
- package/dist/deduplication.js.map +1 -0
- package/dist/discovery/governor-discovery.d.ts.map +1 -1
- package/dist/discovery/governor-discovery.js +52 -36
- package/dist/discovery/governor-discovery.js.map +1 -1
- package/dist/discovery/timelock-discovery.d.ts +15 -6
- package/dist/discovery/timelock-discovery.d.ts.map +1 -1
- package/dist/discovery/timelock-discovery.js +27 -11
- package/dist/discovery/timelock-discovery.js.map +1 -1
- package/dist/election/contracts.d.ts +8 -0
- package/dist/election/contracts.d.ts.map +1 -0
- package/dist/election/contracts.js +28 -0
- package/dist/election/contracts.js.map +1 -0
- package/dist/election/details.d.ts +15 -0
- package/dist/election/details.d.ts.map +1 -0
- package/dist/election/details.js +157 -0
- package/dist/election/details.js.map +1 -0
- package/dist/election/index.d.ts +11 -0
- package/dist/election/index.d.ts.map +1 -0
- package/dist/election/index.js +48 -0
- package/dist/election/index.js.map +1 -0
- package/dist/election/params.d.ts +13 -0
- package/dist/election/params.d.ts.map +1 -0
- package/dist/election/params.js +93 -0
- package/dist/election/params.js.map +1 -0
- package/dist/election/participants.d.ts +6 -0
- package/dist/election/participants.d.ts.map +1 -0
- package/dist/election/participants.js +102 -0
- package/dist/election/participants.js.map +1 -0
- package/dist/election/prepare.d.ts +10 -0
- package/dist/election/prepare.d.ts.map +1 -0
- package/dist/election/prepare.js +52 -0
- package/dist/election/prepare.js.map +1 -0
- package/dist/election/proposal-ids.d.ts +18 -0
- package/dist/election/proposal-ids.d.ts.map +1 -0
- package/dist/election/proposal-ids.js +77 -0
- package/dist/election/proposal-ids.js.map +1 -0
- package/dist/election/status.d.ts +15 -0
- package/dist/election/status.d.ts.map +1 -0
- package/dist/election/status.js +102 -0
- package/dist/election/status.js.map +1 -0
- package/dist/election/tracking.d.ts +28 -0
- package/dist/election/tracking.d.ts.map +1 -0
- package/dist/election/tracking.js +412 -0
- package/dist/election/tracking.js.map +1 -0
- package/dist/index.d.ts +30 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +94 -9
- package/dist/index.js.map +1 -1
- package/dist/stages/builder.d.ts +4 -0
- package/dist/stages/builder.d.ts.map +1 -1
- package/dist/stages/builder.js +7 -0
- package/dist/stages/builder.js.map +1 -1
- package/dist/stages/l2-to-l1-message.d.ts +8 -1
- package/dist/stages/l2-to-l1-message.d.ts.map +1 -1
- package/dist/stages/l2-to-l1-message.js +79 -13
- package/dist/stages/l2-to-l1-message.js.map +1 -1
- package/dist/stages/proposal-created.d.ts +1 -0
- package/dist/stages/proposal-created.d.ts.map +1 -1
- package/dist/stages/proposal-created.js +1 -0
- package/dist/stages/proposal-created.js.map +1 -1
- package/dist/stages/proposal-queued.d.ts +1 -0
- package/dist/stages/proposal-queued.d.ts.map +1 -1
- package/dist/stages/proposal-queued.js +3 -1
- package/dist/stages/proposal-queued.js.map +1 -1
- package/dist/stages/retryables.js +2 -2
- package/dist/stages/retryables.js.map +1 -1
- package/dist/stages/timelock.d.ts +3 -1
- package/dist/stages/timelock.d.ts.map +1 -1
- package/dist/stages/timelock.js +10 -4
- package/dist/stages/timelock.js.map +1 -1
- package/dist/stages/utils.d.ts +7 -8
- package/dist/stages/utils.d.ts.map +1 -1
- package/dist/stages/utils.js +40 -27
- package/dist/stages/utils.js.map +1 -1
- package/dist/stages/voting.d.ts.map +1 -1
- package/dist/stages/voting.js +5 -4
- package/dist/stages/voting.js.map +1 -1
- package/dist/tracker/cache.d.ts +10 -6
- package/dist/tracker/cache.d.ts.map +1 -1
- package/dist/tracker/cache.js +39 -15
- package/dist/tracker/cache.js.map +1 -1
- package/dist/tracker/checkpoint-helpers.d.ts +63 -0
- package/dist/tracker/checkpoint-helpers.d.ts.map +1 -0
- package/dist/tracker/checkpoint-helpers.js +176 -0
- package/dist/tracker/checkpoint-helpers.js.map +1 -0
- package/dist/tracker/discovery.d.ts +40 -9
- package/dist/tracker/discovery.d.ts.map +1 -1
- package/dist/tracker/discovery.js +152 -15
- package/dist/tracker/discovery.js.map +1 -1
- package/dist/tracker/pipeline.d.ts.map +1 -1
- package/dist/tracker/pipeline.js +26 -11
- 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 +14 -61
- package/dist/tracker/query.js.map +1 -1
- package/dist/tracker/state.d.ts +0 -10
- package/dist/tracker/state.d.ts.map +1 -1
- package/dist/tracker/state.js +1 -28
- package/dist/tracker/state.js.map +1 -1
- package/dist/tracker.d.ts +86 -4
- package/dist/tracker.d.ts.map +1 -1
- package/dist/tracker.js +311 -13
- package/dist/tracker.js.map +1 -1
- package/dist/types/config.d.ts +49 -0
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/core.d.ts +4 -2
- package/dist/types/core.d.ts.map +1 -1
- package/dist/types/election.d.ts +143 -0
- package/dist/types/election.d.ts.map +1 -1
- package/dist/types/index.d.ts +5 -7
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -3
- package/dist/types/index.js.map +1 -1
- package/dist/types/stages.d.ts +79 -1
- package/dist/types/stages.d.ts.map +1 -1
- package/dist/types/stages.js.map +1 -1
- package/dist/types/tracking.d.ts +34 -4
- package/dist/types/tracking.d.ts.map +1 -1
- package/dist/utils/block-cache.d.ts +50 -0
- package/dist/utils/block-cache.d.ts.map +1 -0
- package/dist/utils/block-cache.js +80 -0
- package/dist/utils/block-cache.js.map +1 -0
- package/dist/utils/formatters.d.ts +91 -0
- package/dist/utils/formatters.d.ts.map +1 -0
- package/dist/utils/formatters.js +327 -0
- package/dist/utils/formatters.js.map +1 -0
- package/dist/utils/multicall.d.ts +52 -0
- package/dist/utils/multicall.d.ts.map +1 -0
- package/dist/utils/multicall.js +75 -0
- package/dist/utils/multicall.js.map +1 -0
- package/dist/utils/salt-computation.d.ts.map +1 -1
- package/dist/utils/salt-computation.js +33 -7
- package/dist/utils/salt-computation.js.map +1 -1
- package/dist/utils/sanitize.d.ts +28 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +52 -0
- package/dist/utils/sanitize.js.map +1 -0
- package/dist/utils/stage-metadata.d.ts +0 -20
- package/dist/utils/stage-metadata.d.ts.map +1 -1
- package/dist/utils/stage-metadata.js +29 -44
- package/dist/utils/stage-metadata.js.map +1 -1
- package/dist/utils/timing.d.ts +13 -0
- package/dist/utils/timing.d.ts.map +1 -1
- package/dist/utils/timing.js +37 -1
- package/dist/utils/timing.js.map +1 -1
- package/package.json +25 -16
- package/dist/cli/monitor.d.ts +0 -3
- package/dist/cli/monitor.d.ts.map +0 -1
- package/dist/cli/monitor.js.map +0 -1
- package/dist/election.d.ts +0 -172
- package/dist/election.d.ts.map +0 -1
- package/dist/election.js +0 -467
- package/dist/election.js.map +0 -1
- package/dist/types/cross-chain.d.ts +0 -24
- package/dist/types/cross-chain.d.ts.map +0 -1
- package/dist/types/cross-chain.js +0 -6
- package/dist/types/cross-chain.js.map +0 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Checkpoint Deduplication Helpers
|
|
3
|
+
*
|
|
4
|
+
* Both regular governance proposals and Security Council elections can create
|
|
5
|
+
* "child" timelock operations that get tracked separately. This module provides
|
|
6
|
+
* utilities to identify, link, and filter these relationships.
|
|
7
|
+
*
|
|
8
|
+
* ## How Duplication Occurs
|
|
9
|
+
*
|
|
10
|
+
* **Proposals:**
|
|
11
|
+
* 1. Proposal is tracked with key `tx:{creation_hash}`
|
|
12
|
+
* 2. Proposal queues to L2 timelock → creates child timelock operation
|
|
13
|
+
* 3. If L2 timelock op is discovered separately, it gets key `tx:{schedule_hash}`
|
|
14
|
+
*
|
|
15
|
+
* **Elections:**
|
|
16
|
+
* 1. Election is tracked with key `election:{index}`
|
|
17
|
+
* 2. Member election execute → SecurityCouncilManager.replaceCohort()
|
|
18
|
+
* 3. This schedules to L2 Constitutional timelock → creates child timelock op
|
|
19
|
+
* 4. If discovered separately, gets key `tx:{schedule_hash}`
|
|
20
|
+
*
|
|
21
|
+
* ## Deduplication Strategy
|
|
22
|
+
*
|
|
23
|
+
* Child checkpoints have `metadata.sourceCheckpoint` set to their parent key.
|
|
24
|
+
* Use `filterChildCheckpoints()` to exclude children when listing all tracked items.
|
|
25
|
+
*
|
|
26
|
+
* @module deduplication
|
|
27
|
+
*/
|
|
28
|
+
import { TrackingCheckpoint, TrackingResult, CacheAdapter } from "./types";
|
|
29
|
+
/**
|
|
30
|
+
* Check if a timelock operation calldata involves Security Council management
|
|
31
|
+
*
|
|
32
|
+
* @param operationData - Calldata of the timelock operation
|
|
33
|
+
* @returns True if this likely originated from an election
|
|
34
|
+
*/
|
|
35
|
+
export declare function isSecurityCouncilTimelockOp(operationData: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Link a child checkpoint to its parent
|
|
38
|
+
*
|
|
39
|
+
* Updates the child checkpoint's metadata to reference its parent.
|
|
40
|
+
* This enables filtering out child checkpoints when displaying tracked items.
|
|
41
|
+
*
|
|
42
|
+
* @param childKey - Cache key for the child checkpoint (e.g., "tx:0x...")
|
|
43
|
+
* @param parentKey - Cache key for the parent (e.g., "election:5" or "tx:0x...")
|
|
44
|
+
* @param cache - Cache adapter to update
|
|
45
|
+
*/
|
|
46
|
+
export declare function linkCheckpointToChild(childKey: string, parentKey: string, cache: CacheAdapter): Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Get the parent checkpoint key for a child, if it exists
|
|
49
|
+
*
|
|
50
|
+
* @param childKey - Cache key to check
|
|
51
|
+
* @param cache - Cache adapter to read from
|
|
52
|
+
* @returns Parent key or null if not a child
|
|
53
|
+
*/
|
|
54
|
+
export declare function getParentCheckpoint(childKey: string, cache: CacheAdapter): Promise<string | null>;
|
|
55
|
+
/**
|
|
56
|
+
* Check if a checkpoint is a child of another checkpoint
|
|
57
|
+
*
|
|
58
|
+
* @param key - Cache key to check
|
|
59
|
+
* @param cache - Cache adapter to read from
|
|
60
|
+
* @returns True if this checkpoint has a parent
|
|
61
|
+
*/
|
|
62
|
+
export declare function isChildCheckpoint(key: string, cache: CacheAdapter): Promise<boolean>;
|
|
63
|
+
/**
|
|
64
|
+
* Filter out child checkpoints from tracking results
|
|
65
|
+
*
|
|
66
|
+
* Use this when displaying tracked items to avoid showing duplicates.
|
|
67
|
+
* Children are operations that were spawned by a parent proposal/election.
|
|
68
|
+
*
|
|
69
|
+
* @param results - Array of tracking results to filter
|
|
70
|
+
* @returns Results with child checkpoints removed
|
|
71
|
+
*/
|
|
72
|
+
export declare function filterChildCheckpoints(results: TrackingResult[]): TrackingResult[];
|
|
73
|
+
/**
|
|
74
|
+
* Get all child checkpoints and their parents
|
|
75
|
+
*
|
|
76
|
+
* @param cache - Cache adapter to read from
|
|
77
|
+
* @returns Map of child key to parent key
|
|
78
|
+
*/
|
|
79
|
+
export declare function getChildToParentMap(cache: CacheAdapter): Promise<Map<string, string>>;
|
|
80
|
+
/**
|
|
81
|
+
* Get all children for a given parent checkpoint
|
|
82
|
+
*
|
|
83
|
+
* @param parentKey - The parent checkpoint key
|
|
84
|
+
* @param cache - Cache adapter to read from
|
|
85
|
+
* @returns Array of child checkpoint keys
|
|
86
|
+
*/
|
|
87
|
+
export declare function getChildCheckpoints(parentKey: string, cache: CacheAdapter): Promise<string[]>;
|
|
88
|
+
/**
|
|
89
|
+
* Deduplication statistics
|
|
90
|
+
*/
|
|
91
|
+
export interface DeduplicationStats {
|
|
92
|
+
/** Total checkpoints (excluding watermarks) */
|
|
93
|
+
totalCheckpoints: number;
|
|
94
|
+
/** Root checkpoints (no parent) */
|
|
95
|
+
rootCheckpoints: number;
|
|
96
|
+
/** Child checkpoints (have a parent) */
|
|
97
|
+
childCheckpoints: number;
|
|
98
|
+
/** Breakdown by parent type */
|
|
99
|
+
parentTypes: {
|
|
100
|
+
/** Children of election checkpoints */
|
|
101
|
+
fromElections: number;
|
|
102
|
+
/** Children of proposal/timelock checkpoints */
|
|
103
|
+
fromProposals: number;
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Get deduplication statistics for the cache
|
|
108
|
+
*
|
|
109
|
+
* @param cache - Cache adapter to analyze
|
|
110
|
+
* @returns Statistics about checkpoint relationships
|
|
111
|
+
*/
|
|
112
|
+
export declare function getDeduplicationStats(cache: CacheAdapter): Promise<DeduplicationStats>;
|
|
113
|
+
/**
|
|
114
|
+
* Find potential parent for a timelock checkpoint
|
|
115
|
+
*
|
|
116
|
+
* Searches for elections or proposals that may have created this timelock operation.
|
|
117
|
+
*
|
|
118
|
+
* @param timelockCheckpoint - The timelock checkpoint to find a parent for
|
|
119
|
+
* @param cache - Cache adapter to search
|
|
120
|
+
* @returns Parent key or null if no parent found
|
|
121
|
+
*/
|
|
122
|
+
export declare function findPotentialParent(timelockCheckpoint: TrackingCheckpoint, cache: CacheAdapter): Promise<string | null>;
|
|
123
|
+
/**
|
|
124
|
+
* Auto-link orphaned timelock checkpoints to their parents
|
|
125
|
+
*
|
|
126
|
+
* Scans for timelock checkpoints without parents and attempts to find and link them.
|
|
127
|
+
*
|
|
128
|
+
* @param cache - Cache adapter to update
|
|
129
|
+
* @returns Number of newly linked checkpoints
|
|
130
|
+
*/
|
|
131
|
+
export declare function autoLinkOrphanedCheckpoints(cache: CacheAdapter): Promise<number>;
|
|
132
|
+
//# sourceMappingURL=deduplication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deduplication.d.ts","sourceRoot":"","sources":["../src/deduplication.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAyB3E;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAI1E;AAED;;;;;;;;;GASG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAaf;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGxB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAG1F;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,cAAc,EAAE,CAElF;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAY3F;AAED;;;;;;GAMG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,MAAM,EAAE,CAAC,CAYnB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,+CAA+C;IAC/C,gBAAgB,EAAE,MAAM,CAAC;IACzB,mCAAmC;IACnC,eAAe,EAAE,MAAM,CAAC;IACxB,wCAAwC;IACxC,gBAAgB,EAAE,MAAM,CAAC;IACzB,+BAA+B;IAC/B,WAAW,EAAE;QACX,uCAAuC;QACvC,aAAa,EAAE,MAAM,CAAC;QACtB,gDAAgD;QAChD,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAoC5F;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,kBAAkB,EAAE,kBAAkB,EACtC,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiCxB;AAED;;;;;;;GAOG;AACH,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CA0BtF"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Checkpoint Deduplication Helpers
|
|
4
|
+
*
|
|
5
|
+
* Both regular governance proposals and Security Council elections can create
|
|
6
|
+
* "child" timelock operations that get tracked separately. This module provides
|
|
7
|
+
* utilities to identify, link, and filter these relationships.
|
|
8
|
+
*
|
|
9
|
+
* ## How Duplication Occurs
|
|
10
|
+
*
|
|
11
|
+
* **Proposals:**
|
|
12
|
+
* 1. Proposal is tracked with key `tx:{creation_hash}`
|
|
13
|
+
* 2. Proposal queues to L2 timelock → creates child timelock operation
|
|
14
|
+
* 3. If L2 timelock op is discovered separately, it gets key `tx:{schedule_hash}`
|
|
15
|
+
*
|
|
16
|
+
* **Elections:**
|
|
17
|
+
* 1. Election is tracked with key `election:{index}`
|
|
18
|
+
* 2. Member election execute → SecurityCouncilManager.replaceCohort()
|
|
19
|
+
* 3. This schedules to L2 Constitutional timelock → creates child timelock op
|
|
20
|
+
* 4. If discovered separately, gets key `tx:{schedule_hash}`
|
|
21
|
+
*
|
|
22
|
+
* ## Deduplication Strategy
|
|
23
|
+
*
|
|
24
|
+
* Child checkpoints have `metadata.sourceCheckpoint` set to their parent key.
|
|
25
|
+
* Use `filterChildCheckpoints()` to exclude children when listing all tracked items.
|
|
26
|
+
*
|
|
27
|
+
* @module deduplication
|
|
28
|
+
*/
|
|
29
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
+
exports.isSecurityCouncilTimelockOp = isSecurityCouncilTimelockOp;
|
|
31
|
+
exports.linkCheckpointToChild = linkCheckpointToChild;
|
|
32
|
+
exports.getParentCheckpoint = getParentCheckpoint;
|
|
33
|
+
exports.isChildCheckpoint = isChildCheckpoint;
|
|
34
|
+
exports.filterChildCheckpoints = filterChildCheckpoints;
|
|
35
|
+
exports.getChildToParentMap = getChildToParentMap;
|
|
36
|
+
exports.getChildCheckpoints = getChildCheckpoints;
|
|
37
|
+
exports.getDeduplicationStats = getDeduplicationStats;
|
|
38
|
+
exports.findPotentialParent = findPotentialParent;
|
|
39
|
+
exports.autoLinkOrphanedCheckpoints = autoLinkOrphanedCheckpoints;
|
|
40
|
+
const constants_1 = require("./constants");
|
|
41
|
+
const logger_1 = require("./utils/logger");
|
|
42
|
+
const log = logger_1.loggers.tracker;
|
|
43
|
+
/** Helper to get cache keys as array (handles sync and async returns) */
|
|
44
|
+
async function getCacheKeysAsync(cache) {
|
|
45
|
+
if (typeof cache.keys !== "function")
|
|
46
|
+
return [];
|
|
47
|
+
const result = cache.keys();
|
|
48
|
+
// Handle Promise<string[]>
|
|
49
|
+
if (result instanceof Promise) {
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
// Handle IterableIterator<string> or string[]
|
|
53
|
+
if (Symbol.iterator in Object(result)) {
|
|
54
|
+
return [...result];
|
|
55
|
+
}
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Check if a timelock operation calldata involves Security Council management
|
|
60
|
+
*
|
|
61
|
+
* @param operationData - Calldata of the timelock operation
|
|
62
|
+
* @returns True if this likely originated from an election
|
|
63
|
+
*/
|
|
64
|
+
function isSecurityCouncilTimelockOp(operationData) {
|
|
65
|
+
const scManagerAddress = constants_1.ADDRESSES.SECURITY_COUNCIL_MANAGER?.toLowerCase();
|
|
66
|
+
if (!scManagerAddress)
|
|
67
|
+
return false;
|
|
68
|
+
return operationData.toLowerCase().includes(scManagerAddress.slice(2));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Link a child checkpoint to its parent
|
|
72
|
+
*
|
|
73
|
+
* Updates the child checkpoint's metadata to reference its parent.
|
|
74
|
+
* This enables filtering out child checkpoints when displaying tracked items.
|
|
75
|
+
*
|
|
76
|
+
* @param childKey - Cache key for the child checkpoint (e.g., "tx:0x...")
|
|
77
|
+
* @param parentKey - Cache key for the parent (e.g., "election:5" or "tx:0x...")
|
|
78
|
+
* @param cache - Cache adapter to update
|
|
79
|
+
*/
|
|
80
|
+
async function linkCheckpointToChild(childKey, parentKey, cache) {
|
|
81
|
+
const checkpoint = await cache.get(childKey);
|
|
82
|
+
if (!checkpoint) {
|
|
83
|
+
log("Cannot link - child checkpoint %s not found", childKey);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
// Initialize metadata if not present, then set sourceCheckpoint
|
|
87
|
+
checkpoint.metadata = checkpoint.metadata ?? { errorCount: 0, lastTrackedAt: Date.now() };
|
|
88
|
+
checkpoint.metadata.sourceCheckpoint = parentKey;
|
|
89
|
+
await cache.set(childKey, checkpoint);
|
|
90
|
+
log("Linked %s as child of %s", childKey, parentKey);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get the parent checkpoint key for a child, if it exists
|
|
94
|
+
*
|
|
95
|
+
* @param childKey - Cache key to check
|
|
96
|
+
* @param cache - Cache adapter to read from
|
|
97
|
+
* @returns Parent key or null if not a child
|
|
98
|
+
*/
|
|
99
|
+
async function getParentCheckpoint(childKey, cache) {
|
|
100
|
+
const checkpoint = await cache.get(childKey);
|
|
101
|
+
return checkpoint?.metadata?.sourceCheckpoint ?? null;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check if a checkpoint is a child of another checkpoint
|
|
105
|
+
*
|
|
106
|
+
* @param key - Cache key to check
|
|
107
|
+
* @param cache - Cache adapter to read from
|
|
108
|
+
* @returns True if this checkpoint has a parent
|
|
109
|
+
*/
|
|
110
|
+
async function isChildCheckpoint(key, cache) {
|
|
111
|
+
const parent = await getParentCheckpoint(key, cache);
|
|
112
|
+
return parent !== null;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Filter out child checkpoints from tracking results
|
|
116
|
+
*
|
|
117
|
+
* Use this when displaying tracked items to avoid showing duplicates.
|
|
118
|
+
* Children are operations that were spawned by a parent proposal/election.
|
|
119
|
+
*
|
|
120
|
+
* @param results - Array of tracking results to filter
|
|
121
|
+
* @returns Results with child checkpoints removed
|
|
122
|
+
*/
|
|
123
|
+
function filterChildCheckpoints(results) {
|
|
124
|
+
return results.filter((r) => r.checkpoint.metadata?.sourceCheckpoint === undefined);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get all child checkpoints and their parents
|
|
128
|
+
*
|
|
129
|
+
* @param cache - Cache adapter to read from
|
|
130
|
+
* @returns Map of child key to parent key
|
|
131
|
+
*/
|
|
132
|
+
async function getChildToParentMap(cache) {
|
|
133
|
+
const result = new Map();
|
|
134
|
+
const keys = await getCacheKeysAsync(cache);
|
|
135
|
+
for (const key of keys) {
|
|
136
|
+
const checkpoint = await cache.get(key);
|
|
137
|
+
if (checkpoint?.metadata?.sourceCheckpoint) {
|
|
138
|
+
result.set(key, checkpoint.metadata.sourceCheckpoint);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Get all children for a given parent checkpoint
|
|
145
|
+
*
|
|
146
|
+
* @param parentKey - The parent checkpoint key
|
|
147
|
+
* @param cache - Cache adapter to read from
|
|
148
|
+
* @returns Array of child checkpoint keys
|
|
149
|
+
*/
|
|
150
|
+
async function getChildCheckpoints(parentKey, cache) {
|
|
151
|
+
const children = [];
|
|
152
|
+
const keys = await getCacheKeysAsync(cache);
|
|
153
|
+
for (const key of keys) {
|
|
154
|
+
const checkpoint = await cache.get(key);
|
|
155
|
+
if (checkpoint?.metadata?.sourceCheckpoint === parentKey) {
|
|
156
|
+
children.push(key);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
return children;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Get deduplication statistics for the cache
|
|
163
|
+
*
|
|
164
|
+
* @param cache - Cache adapter to analyze
|
|
165
|
+
* @returns Statistics about checkpoint relationships
|
|
166
|
+
*/
|
|
167
|
+
async function getDeduplicationStats(cache) {
|
|
168
|
+
const keys = await getCacheKeysAsync(cache);
|
|
169
|
+
let totalCheckpoints = 0;
|
|
170
|
+
let childCheckpoints = 0;
|
|
171
|
+
let fromElections = 0;
|
|
172
|
+
let fromProposals = 0;
|
|
173
|
+
for (const key of keys) {
|
|
174
|
+
// Skip watermarks
|
|
175
|
+
if (key === "discovery:watermarks")
|
|
176
|
+
continue;
|
|
177
|
+
totalCheckpoints++;
|
|
178
|
+
const checkpoint = await cache.get(key);
|
|
179
|
+
const source = checkpoint?.metadata?.sourceCheckpoint;
|
|
180
|
+
if (source) {
|
|
181
|
+
childCheckpoints++;
|
|
182
|
+
if (source.startsWith("election:")) {
|
|
183
|
+
fromElections++;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
fromProposals++;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
totalCheckpoints,
|
|
192
|
+
rootCheckpoints: totalCheckpoints - childCheckpoints,
|
|
193
|
+
childCheckpoints,
|
|
194
|
+
parentTypes: {
|
|
195
|
+
fromElections,
|
|
196
|
+
fromProposals,
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Find potential parent for a timelock checkpoint
|
|
202
|
+
*
|
|
203
|
+
* Searches for elections or proposals that may have created this timelock operation.
|
|
204
|
+
*
|
|
205
|
+
* @param timelockCheckpoint - The timelock checkpoint to find a parent for
|
|
206
|
+
* @param cache - Cache adapter to search
|
|
207
|
+
* @returns Parent key or null if no parent found
|
|
208
|
+
*/
|
|
209
|
+
async function findPotentialParent(timelockCheckpoint, cache) {
|
|
210
|
+
if (timelockCheckpoint.input.type !== "timelock")
|
|
211
|
+
return null;
|
|
212
|
+
const keys = await getCacheKeysAsync(cache);
|
|
213
|
+
const timelockAddr = timelockCheckpoint.input.timelockAddress?.toLowerCase();
|
|
214
|
+
// Check if it's from L2 Constitutional timelock (elections schedule here)
|
|
215
|
+
const isL2ConstitutionalTimelock = timelockAddr === constants_1.ADDRESSES.L2_CONSTITUTIONAL_TIMELOCK?.toLowerCase();
|
|
216
|
+
if (isL2ConstitutionalTimelock) {
|
|
217
|
+
// Search completed elections that might have created this
|
|
218
|
+
for (const key of keys) {
|
|
219
|
+
if (!key.startsWith("election:"))
|
|
220
|
+
continue;
|
|
221
|
+
const electionCheckpoint = await cache.get(key);
|
|
222
|
+
const status = electionCheckpoint?.cachedData?.electionStatus;
|
|
223
|
+
// Completed elections with executed member proposals create timelock ops
|
|
224
|
+
if (status?.phase === "COMPLETED" && status.memberProposalId) {
|
|
225
|
+
// This election completed and may have created this timelock op
|
|
226
|
+
// Without more detailed tracking of the execution tx, we can't be 100% sure
|
|
227
|
+
// but this is a reasonable heuristic
|
|
228
|
+
return key;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// For non-constitutional timelocks or if no election found, search proposals
|
|
233
|
+
// This would require more complex tracking of proposal execution
|
|
234
|
+
// For now, return null and let the user manually link if needed
|
|
235
|
+
return null;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Auto-link orphaned timelock checkpoints to their parents
|
|
239
|
+
*
|
|
240
|
+
* Scans for timelock checkpoints without parents and attempts to find and link them.
|
|
241
|
+
*
|
|
242
|
+
* @param cache - Cache adapter to update
|
|
243
|
+
* @returns Number of newly linked checkpoints
|
|
244
|
+
*/
|
|
245
|
+
async function autoLinkOrphanedCheckpoints(cache) {
|
|
246
|
+
const keys = await getCacheKeysAsync(cache);
|
|
247
|
+
let linkedCount = 0;
|
|
248
|
+
for (const key of keys) {
|
|
249
|
+
if (!key.startsWith("tx:"))
|
|
250
|
+
continue;
|
|
251
|
+
const checkpoint = await cache.get(key);
|
|
252
|
+
if (!checkpoint)
|
|
253
|
+
continue;
|
|
254
|
+
// Skip if already linked
|
|
255
|
+
if (checkpoint.metadata?.sourceCheckpoint)
|
|
256
|
+
continue;
|
|
257
|
+
// Skip if not a timelock checkpoint
|
|
258
|
+
if (checkpoint.input.type !== "timelock")
|
|
259
|
+
continue;
|
|
260
|
+
// Try to find a parent
|
|
261
|
+
const parentKey = await findPotentialParent(checkpoint, cache);
|
|
262
|
+
if (parentKey) {
|
|
263
|
+
await linkCheckpointToChild(key, parentKey, cache);
|
|
264
|
+
linkedCount++;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
log("Auto-linked %d orphaned checkpoints", linkedCount);
|
|
268
|
+
return linkedCount;
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=deduplication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deduplication.js","sourceRoot":"","sources":["../src/deduplication.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;;AAiCH,kEAIC;AAYD,sDAiBC;AASD,kDAMC;AASD,8CAGC;AAWD,wDAEC;AAQD,kDAYC;AASD,kDAeC;AA2BD,sDAoCC;AAWD,kDAoCC;AAUD,kEA0BC;AArSD,2CAAwC;AACxC,2CAAyC;AAEzC,MAAM,GAAG,GAAG,gBAAO,CAAC,OAAO,CAAC;AAE5B,yEAAyE;AACzE,KAAK,UAAU,iBAAiB,CAAC,KAAmB;IAClD,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,EAAE,CAAC;IAEhD,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAE5B,2BAA2B;IAC3B,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,8CAA8C;IAC9C,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,OAAO,CAAC,GAAI,MAA2B,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,2BAA2B,CAAC,aAAqB;IAC/D,MAAM,gBAAgB,GAAG,qBAAS,CAAC,wBAAwB,EAAE,WAAW,EAAE,CAAC;IAC3E,IAAI,CAAC,gBAAgB;QAAE,OAAO,KAAK,CAAC;IACpC,OAAO,aAAa,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED;;;;;;;;;GASG;AACI,KAAK,UAAU,qBAAqB,CACzC,QAAgB,EAChB,SAAiB,EACjB,KAAmB;IAEnB,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,GAAG,CAAqB,QAAQ,CAAC,CAAC;IACjE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,GAAG,CAAC,6CAA6C,EAAE,QAAQ,CAAC,CAAC;QAC7D,OAAO;IACT,CAAC;IAED,gEAAgE;IAChE,UAAU,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAC1F,UAAU,CAAC,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC;IAEjD,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACtC,GAAG,CAAC,0BAA0B,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,mBAAmB,CACvC,QAAgB,EAChB,KAAmB;IAEnB,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,GAAG,CAAqB,QAAQ,CAAC,CAAC;IACjE,OAAO,UAAU,EAAE,QAAQ,EAAE,gBAAgB,IAAI,IAAI,CAAC;AACxD,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,iBAAiB,CAAC,GAAW,EAAE,KAAmB;IACtE,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACrD,OAAO,MAAM,KAAK,IAAI,CAAC;AACzB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,sBAAsB,CAAC,OAAyB;IAC9D,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,EAAE,gBAAgB,KAAK,SAAS,CAAC,CAAC;AACtF,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,mBAAmB,CAAC,KAAmB;IAC3D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE5C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,GAAG,CAAqB,GAAG,CAAC,CAAC;QAC5D,IAAI,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC;YAC3C,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACI,KAAK,UAAU,mBAAmB,CACvC,SAAiB,EACjB,KAAmB;IAEnB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE5C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,GAAG,CAAqB,GAAG,CAAC,CAAC;QAC5D,IAAI,UAAU,EAAE,QAAQ,EAAE,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACzD,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAqBD;;;;;GAKG;AACI,KAAK,UAAU,qBAAqB,CAAC,KAAmB;IAC7D,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE5C,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,gBAAgB,GAAG,CAAC,CAAC;IACzB,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,IAAI,aAAa,GAAG,CAAC,CAAC;IAEtB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,kBAAkB;QAClB,IAAI,GAAG,KAAK,sBAAsB;YAAE,SAAS;QAE7C,gBAAgB,EAAE,CAAC;QAEnB,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,GAAG,CAAqB,GAAG,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,UAAU,EAAE,QAAQ,EAAE,gBAAgB,CAAC;QAEtD,IAAI,MAAM,EAAE,CAAC;YACX,gBAAgB,EAAE,CAAC;YACnB,IAAI,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;gBACnC,aAAa,EAAE,CAAC;YAClB,CAAC;iBAAM,CAAC;gBACN,aAAa,EAAE,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,gBAAgB;QAChB,eAAe,EAAE,gBAAgB,GAAG,gBAAgB;QACpD,gBAAgB;QAChB,WAAW,EAAE;YACX,aAAa;YACb,aAAa;SACd;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACI,KAAK,UAAU,mBAAmB,CACvC,kBAAsC,EACtC,KAAmB;IAEnB,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAE9D,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,YAAY,GAAG,kBAAkB,CAAC,KAAK,CAAC,eAAe,EAAE,WAAW,EAAE,CAAC;IAE7E,0EAA0E;IAC1E,MAAM,0BAA0B,GAC9B,YAAY,KAAK,qBAAS,CAAC,0BAA0B,EAAE,WAAW,EAAE,CAAC;IAEvE,IAAI,0BAA0B,EAAE,CAAC;QAC/B,0DAA0D;QAC1D,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,CAAC;gBAAE,SAAS;YAE3C,MAAM,kBAAkB,GAAG,MAAM,KAAK,CAAC,GAAG,CAAqB,GAAG,CAAC,CAAC;YACpE,MAAM,MAAM,GAAG,kBAAkB,EAAE,UAAU,EAAE,cAAc,CAAC;YAE9D,yEAAyE;YACzE,IAAI,MAAM,EAAE,KAAK,KAAK,WAAW,IAAI,MAAM,CAAC,gBAAgB,EAAE,CAAC;gBAC7D,gEAAgE;gBAChE,4EAA4E;gBAC5E,qCAAqC;gBACrC,OAAO,GAAG,CAAC;YACb,CAAC;QACH,CAAC;IACH,CAAC;IAED,6EAA6E;IAC7E,iEAAiE;IACjE,gEAAgE;IAEhE,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,2BAA2B,CAAC,KAAmB;IACnE,MAAM,IAAI,GAAG,MAAM,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAI,WAAW,GAAG,CAAC,CAAC;IAEpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC;YAAE,SAAS;QAErC,MAAM,UAAU,GAAG,MAAM,KAAK,CAAC,GAAG,CAAqB,GAAG,CAAC,CAAC;QAC5D,IAAI,CAAC,UAAU;YAAE,SAAS;QAE1B,yBAAyB;QACzB,IAAI,UAAU,CAAC,QAAQ,EAAE,gBAAgB;YAAE,SAAS;QAEpD,oCAAoC;QACpC,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU;YAAE,SAAS;QAEnD,uBAAuB;QACvB,MAAM,SAAS,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QAC/D,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,qBAAqB,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;YACnD,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IAED,GAAG,CAAC,qCAAqC,EAAE,WAAW,CAAC,CAAC;IACxD,OAAO,WAAW,CAAC;AACrB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"governor-discovery.d.ts","sourceRoot":"","sources":["../../src/discovery/governor-discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,EACL,kBAAkB,EAClB,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,UAAU,EACV,UAAU,EAEX,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"governor-discovery.d.ts","sourceRoot":"","sources":["../../src/discovery/governor-discovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,9 @@ const rpc_utils_1 = require("../utils/rpc-utils");
|
|
|
26
26
|
const timing_1 = require("../utils/timing");
|
|
27
27
|
const abis_1 = require("../abis");
|
|
28
28
|
const election_1 = require("../election");
|
|
29
|
+
const multicall_1 = require("../utils/multicall");
|
|
29
30
|
const chain_1 = require("../utils/chain");
|
|
31
|
+
const sanitize_1 = require("../utils/sanitize");
|
|
30
32
|
/**
|
|
31
33
|
* Detect governor type from address
|
|
32
34
|
*/
|
|
@@ -55,7 +57,7 @@ function isElectionProposal(proposalType) {
|
|
|
55
57
|
async function hasTimelock(governorAddress, provider) {
|
|
56
58
|
const governor = new ethers_1.ethers.Contract(governorAddress, abis_1.GOVERNOR_ABI, provider);
|
|
57
59
|
try {
|
|
58
|
-
await governor.timelock();
|
|
60
|
+
await (0, rpc_utils_1.queryWithRetry)(() => governor.timelock());
|
|
59
61
|
return true;
|
|
60
62
|
}
|
|
61
63
|
catch {
|
|
@@ -124,7 +126,7 @@ function parseProposalCreatedEvent(log) {
|
|
|
124
126
|
calldatas: args.calldatas,
|
|
125
127
|
startBlock: args.startBlock,
|
|
126
128
|
endBlock: args.endBlock,
|
|
127
|
-
description: args.description,
|
|
129
|
+
description: (0, sanitize_1.truncateDescription)(args.description),
|
|
128
130
|
creationBlock: log.blockNumber,
|
|
129
131
|
creationTxHash: log.transactionHash,
|
|
130
132
|
};
|
|
@@ -146,7 +148,7 @@ async function findProposalCreatedEvent(governorAddress, proposalId, provider, h
|
|
|
146
148
|
const reverseDirection = hint?.direction === "backward" || !hint?.direction;
|
|
147
149
|
// Note: ProposalCreated event does NOT have indexed proposalId
|
|
148
150
|
// We filter by event topic only and use predicate for exact matching
|
|
149
|
-
return (0, log_search_1.findAndParseEvent)(provider, { address: governorAddress, topics: [constants_1.EVENT_TOPICS.PROPOSAL_CREATED], fromBlock, toBlock }, (l) => parseProposalCreatedEvent(l)?.proposalId === proposalId, parseProposalCreatedEvent, { chunkSize:
|
|
151
|
+
return (0, log_search_1.findAndParseEvent)(provider, { address: governorAddress, topics: [constants_1.EVENT_TOPICS.PROPOSAL_CREATED], fromBlock, toBlock }, (l) => parseProposalCreatedEvent(l)?.proposalId === proposalId, parseProposalCreatedEvent, { chunkSize: hint?.chunkSize ?? constants_1.CHUNK_SIZES.L2, reverseDirection });
|
|
150
152
|
}
|
|
151
153
|
/**
|
|
152
154
|
* Find ProposalCreated event by transaction hash
|
|
@@ -162,43 +164,57 @@ async function findProposalByTxHash(txHash, provider) {
|
|
|
162
164
|
* Get voting information for a proposal
|
|
163
165
|
*/
|
|
164
166
|
async function getVotingData(governorAddress, proposalId, provider) {
|
|
165
|
-
const governor = new ethers_1.ethers.Contract(governorAddress, abis_1.GOVERNOR_ABI, provider);
|
|
166
167
|
const proposalIdBN = ethers_1.BigNumber.from(proposalId);
|
|
167
|
-
//
|
|
168
|
-
const [
|
|
169
|
-
(0,
|
|
170
|
-
|
|
171
|
-
|
|
168
|
+
// First batch: proposalSnapshot, proposalDeadline, proposalVotes + optional deadlines
|
|
169
|
+
const [firstBatchResults, { blockNumber: currentBlock }] = await Promise.all([
|
|
170
|
+
(0, multicall_1.multicall)(provider, [
|
|
171
|
+
(0, multicall_1.buildCallInput)(governorAddress, abis_1.governorInterface, "proposalSnapshot", [
|
|
172
|
+
proposalIdBN,
|
|
173
|
+
]),
|
|
174
|
+
(0, multicall_1.buildCallInput)(governorAddress, abis_1.governorInterface, "proposalDeadline", [
|
|
175
|
+
proposalIdBN,
|
|
176
|
+
]),
|
|
177
|
+
// Custom decoder for proposalVotes which returns multiple values
|
|
178
|
+
{
|
|
179
|
+
targetAddr: governorAddress,
|
|
180
|
+
encoder: () => abis_1.governorInterface.encodeFunctionData("proposalVotes", [proposalIdBN]),
|
|
181
|
+
decoder: (returnData) => {
|
|
182
|
+
const result = abis_1.governorInterface.decodeFunctionResult("proposalVotes", returnData);
|
|
183
|
+
return {
|
|
184
|
+
againstVotes: result.againstVotes,
|
|
185
|
+
forVotes: result.forVotes,
|
|
186
|
+
abstainVotes: result.abstainVotes,
|
|
187
|
+
};
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
// Optional calls - may not exist on all governors
|
|
191
|
+
(0, multicall_1.buildCallInput)(governorAddress, abis_1.governorInterface, "proposalExtendedDeadline", [
|
|
192
|
+
proposalIdBN,
|
|
193
|
+
]),
|
|
194
|
+
(0, multicall_1.buildCallInput)(governorAddress, abis_1.governorInterface, "proposalVettingDeadline", [
|
|
195
|
+
proposalIdBN,
|
|
196
|
+
]),
|
|
197
|
+
]),
|
|
172
198
|
(0, timing_1.getCurrentBlockInfo)(provider),
|
|
173
199
|
]);
|
|
174
|
-
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
}
|
|
187
|
-
// Check for vetting deadline (Security Council)
|
|
188
|
-
// IMPORTANT: Vetting deadline is an L1 block number, not L2
|
|
200
|
+
const startBlock = firstBatchResults[0];
|
|
201
|
+
const deadline = firstBatchResults[1];
|
|
202
|
+
const votes = firstBatchResults[2];
|
|
203
|
+
const extendedResult = firstBatchResults[3];
|
|
204
|
+
const vettingResult = firstBatchResults[4];
|
|
205
|
+
// Second batch: quorum (needs startBlock)
|
|
206
|
+
const quorumResults = await (0, multicall_1.multicall)(provider, [
|
|
207
|
+
(0, multicall_1.buildCallInput)(governorAddress, abis_1.governorInterface, "quorum", [startBlock]),
|
|
208
|
+
]);
|
|
209
|
+
const quorum = quorumResults[0];
|
|
210
|
+
const extendedDeadline = extendedResult?.gt(0) ? extendedResult : undefined;
|
|
211
|
+
// Handle vetting deadline (L1 block number comparison)
|
|
189
212
|
let vettingDeadline;
|
|
190
213
|
let isVettingPeriod = false;
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
// Use L1 block number for comparison since vetting deadline is L1-based
|
|
196
|
-
const l1Block = await (0, timing_1.getL1BlockNumberFromL2)(provider);
|
|
197
|
-
isVettingPeriod = l1Block.lte(vetting);
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
catch {
|
|
201
|
-
// Function not available on this governor
|
|
214
|
+
if (vettingResult?.gt(0)) {
|
|
215
|
+
vettingDeadline = vettingResult;
|
|
216
|
+
const l1Block = await (0, timing_1.getL1BlockNumberFromL2)(provider);
|
|
217
|
+
isVettingPeriod = l1Block.lte(vettingResult);
|
|
202
218
|
}
|
|
203
219
|
const effectiveDeadline = extendedDeadline ?? deadline;
|
|
204
220
|
const hasReachedQuorum = votes.forVotes.gte(quorum);
|
|
@@ -249,7 +265,7 @@ async function findProposalQueuedEvent(governorAddress, proposalId, provider, hi
|
|
|
249
265
|
catch {
|
|
250
266
|
return false;
|
|
251
267
|
}
|
|
252
|
-
}, { chunkSize:
|
|
268
|
+
}, { chunkSize: hint?.chunkSize ?? constants_1.CHUNK_SIZES.L2, reverseDirection });
|
|
253
269
|
if (!log) {
|
|
254
270
|
return null;
|
|
255
271
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"governor-discovery.js","sourceRoot":"","sources":["../../src/discovery/governor-discovery.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;
|
|
1
|
+
{"version":3,"file":"governor-discovery.js","sourceRoot":"","sources":["../../src/discovery/governor-discovery.ts"],"names":[],"mappings":"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"}
|