@gzeoneth/gov-tracker 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/LICENSE +191 -0
  2. package/README.md +201 -0
  3. package/dist/abis.d.ts +79 -0
  4. package/dist/abis.d.ts.map +1 -0
  5. package/dist/abis.js +159 -0
  6. package/dist/abis.js.map +1 -0
  7. package/dist/cli/lib/cli.d.ts +92 -0
  8. package/dist/cli/lib/cli.d.ts.map +1 -0
  9. package/dist/cli/lib/cli.js +562 -0
  10. package/dist/cli/lib/cli.js.map +1 -0
  11. package/dist/cli/lib/election-check.d.ts +46 -0
  12. package/dist/cli/lib/election-check.d.ts.map +1 -0
  13. package/dist/cli/lib/election-check.js +136 -0
  14. package/dist/cli/lib/election-check.js.map +1 -0
  15. package/dist/cli/lib/json-state.d.ts +100 -0
  16. package/dist/cli/lib/json-state.d.ts.map +1 -0
  17. package/dist/cli/lib/json-state.js +225 -0
  18. package/dist/cli/lib/json-state.js.map +1 -0
  19. package/dist/cli/monitor.d.ts +3 -0
  20. package/dist/cli/monitor.d.ts.map +1 -0
  21. package/dist/cli/monitor.js +442 -0
  22. package/dist/cli/monitor.js.map +1 -0
  23. package/dist/constants.d.ts +235 -0
  24. package/dist/constants.d.ts.map +1 -0
  25. package/dist/constants.js +293 -0
  26. package/dist/constants.js.map +1 -0
  27. package/dist/discovery/governor-discovery.d.ts +84 -0
  28. package/dist/discovery/governor-discovery.d.ts.map +1 -0
  29. package/dist/discovery/governor-discovery.js +310 -0
  30. package/dist/discovery/governor-discovery.js.map +1 -0
  31. package/dist/discovery/security-council.d.ts +68 -0
  32. package/dist/discovery/security-council.d.ts.map +1 -0
  33. package/dist/discovery/security-council.js +181 -0
  34. package/dist/discovery/security-council.js.map +1 -0
  35. package/dist/discovery/timelock-discovery.d.ts +99 -0
  36. package/dist/discovery/timelock-discovery.d.ts.map +1 -0
  37. package/dist/discovery/timelock-discovery.js +322 -0
  38. package/dist/discovery/timelock-discovery.js.map +1 -0
  39. package/dist/election.d.ts +172 -0
  40. package/dist/election.d.ts.map +1 -0
  41. package/dist/election.js +464 -0
  42. package/dist/election.js.map +1 -0
  43. package/dist/index.d.ts +56 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +164 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/stages/base.d.ts +127 -0
  48. package/dist/stages/base.d.ts.map +1 -0
  49. package/dist/stages/base.js +280 -0
  50. package/dist/stages/base.js.map +1 -0
  51. package/dist/stages/l2-to-l1-message.d.ts +108 -0
  52. package/dist/stages/l2-to-l1-message.d.ts.map +1 -0
  53. package/dist/stages/l2-to-l1-message.js +422 -0
  54. package/dist/stages/l2-to-l1-message.js.map +1 -0
  55. package/dist/stages/proposal-created.d.ts +20 -0
  56. package/dist/stages/proposal-created.d.ts.map +1 -0
  57. package/dist/stages/proposal-created.js +62 -0
  58. package/dist/stages/proposal-created.js.map +1 -0
  59. package/dist/stages/proposal-queued.d.ts +39 -0
  60. package/dist/stages/proposal-queued.d.ts.map +1 -0
  61. package/dist/stages/proposal-queued.js +131 -0
  62. package/dist/stages/proposal-queued.js.map +1 -0
  63. package/dist/stages/retryables.d.ts +79 -0
  64. package/dist/stages/retryables.d.ts.map +1 -0
  65. package/dist/stages/retryables.js +307 -0
  66. package/dist/stages/retryables.js.map +1 -0
  67. package/dist/stages/stage-builder.d.ts +46 -0
  68. package/dist/stages/stage-builder.d.ts.map +1 -0
  69. package/dist/stages/stage-builder.js +87 -0
  70. package/dist/stages/stage-builder.js.map +1 -0
  71. package/dist/stages/timelock.d.ts +100 -0
  72. package/dist/stages/timelock.d.ts.map +1 -0
  73. package/dist/stages/timelock.js +552 -0
  74. package/dist/stages/timelock.js.map +1 -0
  75. package/dist/stages/voting.d.ts +18 -0
  76. package/dist/stages/voting.d.ts.map +1 -0
  77. package/dist/stages/voting.js +109 -0
  78. package/dist/stages/voting.js.map +1 -0
  79. package/dist/tracker/context.d.ts +111 -0
  80. package/dist/tracker/context.d.ts.map +1 -0
  81. package/dist/tracker/context.js +264 -0
  82. package/dist/tracker/context.js.map +1 -0
  83. package/dist/tracker/discovery.d.ts +89 -0
  84. package/dist/tracker/discovery.d.ts.map +1 -0
  85. package/dist/tracker/discovery.js +228 -0
  86. package/dist/tracker/discovery.js.map +1 -0
  87. package/dist/tracker/execute.d.ts +44 -0
  88. package/dist/tracker/execute.d.ts.map +1 -0
  89. package/dist/tracker/execute.js +126 -0
  90. package/dist/tracker/execute.js.map +1 -0
  91. package/dist/tracker/index.d.ts +18 -0
  92. package/dist/tracker/index.d.ts.map +1 -0
  93. package/dist/tracker/index.js +70 -0
  94. package/dist/tracker/index.js.map +1 -0
  95. package/dist/tracker/pipeline.d.ts +47 -0
  96. package/dist/tracker/pipeline.d.ts.map +1 -0
  97. package/dist/tracker/pipeline.js +299 -0
  98. package/dist/tracker/pipeline.js.map +1 -0
  99. package/dist/tracker/query.d.ts +45 -0
  100. package/dist/tracker/query.d.ts.map +1 -0
  101. package/dist/tracker/query.js +159 -0
  102. package/dist/tracker/query.js.map +1 -0
  103. package/dist/tracker/state.d.ts +104 -0
  104. package/dist/tracker/state.d.ts.map +1 -0
  105. package/dist/tracker/state.js +287 -0
  106. package/dist/tracker/state.js.map +1 -0
  107. package/dist/tracker.d.ts +261 -0
  108. package/dist/tracker.d.ts.map +1 -0
  109. package/dist/tracker.js +556 -0
  110. package/dist/tracker.js.map +1 -0
  111. package/dist/types/config.d.ts +81 -0
  112. package/dist/types/config.d.ts.map +1 -0
  113. package/dist/types/config.js +6 -0
  114. package/dist/types/config.js.map +1 -0
  115. package/dist/types/core.d.ts +51 -0
  116. package/dist/types/core.d.ts.map +1 -0
  117. package/dist/types/core.js +6 -0
  118. package/dist/types/core.js.map +1 -0
  119. package/dist/types/cross-chain.d.ts +80 -0
  120. package/dist/types/cross-chain.d.ts.map +1 -0
  121. package/dist/types/cross-chain.js +6 -0
  122. package/dist/types/cross-chain.js.map +1 -0
  123. package/dist/types/election.d.ts +59 -0
  124. package/dist/types/election.d.ts.map +1 -0
  125. package/dist/types/election.js +6 -0
  126. package/dist/types/election.js.map +1 -0
  127. package/dist/types/governor.d.ts +71 -0
  128. package/dist/types/governor.d.ts.map +1 -0
  129. package/dist/types/governor.js +6 -0
  130. package/dist/types/governor.js.map +1 -0
  131. package/dist/types/index.d.ts +22 -0
  132. package/dist/types/index.d.ts.map +1 -0
  133. package/dist/types/index.js +21 -0
  134. package/dist/types/index.js.map +1 -0
  135. package/dist/types/stages.d.ts +189 -0
  136. package/dist/types/stages.d.ts.map +1 -0
  137. package/dist/types/stages.js +23 -0
  138. package/dist/types/stages.js.map +1 -0
  139. package/dist/types/timelock.d.ts +108 -0
  140. package/dist/types/timelock.d.ts.map +1 -0
  141. package/dist/types/timelock.js +6 -0
  142. package/dist/types/timelock.js.map +1 -0
  143. package/dist/types/tracking.d.ts +180 -0
  144. package/dist/types/tracking.d.ts.map +1 -0
  145. package/dist/types/tracking.js +6 -0
  146. package/dist/types/tracking.js.map +1 -0
  147. package/dist/types.d.ts +6 -0
  148. package/dist/types.d.ts.map +1 -0
  149. package/dist/types.js +22 -0
  150. package/dist/types.js.map +1 -0
  151. package/dist/utils/chain.d.ts +18 -0
  152. package/dist/utils/chain.d.ts.map +1 -0
  153. package/dist/utils/chain.js +34 -0
  154. package/dist/utils/chain.js.map +1 -0
  155. package/dist/utils/log-filters.d.ts +67 -0
  156. package/dist/utils/log-filters.d.ts.map +1 -0
  157. package/dist/utils/log-filters.js +116 -0
  158. package/dist/utils/log-filters.js.map +1 -0
  159. package/dist/utils/log-search.d.ts +76 -0
  160. package/dist/utils/log-search.d.ts.map +1 -0
  161. package/dist/utils/log-search.js +142 -0
  162. package/dist/utils/log-search.js.map +1 -0
  163. package/dist/utils/logger.d.ts +41 -0
  164. package/dist/utils/logger.d.ts.map +1 -0
  165. package/dist/utils/logger.js +50 -0
  166. package/dist/utils/logger.js.map +1 -0
  167. package/dist/utils/operation-id.d.ts +48 -0
  168. package/dist/utils/operation-id.d.ts.map +1 -0
  169. package/dist/utils/operation-id.js +102 -0
  170. package/dist/utils/operation-id.js.map +1 -0
  171. package/dist/utils/rpc-utils.d.ts +30 -0
  172. package/dist/utils/rpc-utils.d.ts.map +1 -0
  173. package/dist/utils/rpc-utils.js +99 -0
  174. package/dist/utils/rpc-utils.js.map +1 -0
  175. package/dist/utils/salt-computation.d.ts +78 -0
  176. package/dist/utils/salt-computation.d.ts.map +1 -0
  177. package/dist/utils/salt-computation.js +132 -0
  178. package/dist/utils/salt-computation.js.map +1 -0
  179. package/dist/utils/salt-resolver.d.ts +63 -0
  180. package/dist/utils/salt-resolver.d.ts.map +1 -0
  181. package/dist/utils/salt-resolver.js +144 -0
  182. package/dist/utils/salt-resolver.js.map +1 -0
  183. package/dist/utils/scoped-logger.d.ts +43 -0
  184. package/dist/utils/scoped-logger.d.ts.map +1 -0
  185. package/dist/utils/scoped-logger.js +72 -0
  186. package/dist/utils/scoped-logger.js.map +1 -0
  187. package/dist/utils/stage-helpers.d.ts +51 -0
  188. package/dist/utils/stage-helpers.d.ts.map +1 -0
  189. package/dist/utils/stage-helpers.js +143 -0
  190. package/dist/utils/stage-helpers.js.map +1 -0
  191. package/dist/utils/stage-metadata.d.ts +62 -0
  192. package/dist/utils/stage-metadata.d.ts.map +1 -0
  193. package/dist/utils/stage-metadata.js +140 -0
  194. package/dist/utils/stage-metadata.js.map +1 -0
  195. package/dist/utils/timing.d.ts +115 -0
  196. package/dist/utils/timing.d.ts.map +1 -0
  197. package/dist/utils/timing.js +303 -0
  198. package/dist/utils/timing.js.map +1 -0
  199. package/dist/utils/urls.d.ts +20 -0
  200. package/dist/utils/urls.d.ts.map +1 -0
  201. package/dist/utils/urls.js +51 -0
  202. package/dist/utils/urls.js.map +1 -0
  203. package/package.json +72 -0
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ /**
3
+ * Voting Stage Tracking
4
+ *
5
+ * Stage 2: Track voting period including extensions and vetting
6
+ *
7
+ * IMPORTANT: Vetting deadline uses L1 block numbers, not L2 block numbers.
8
+ * When calculating ETA for vetting period, we must use L1 block time.
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.trackVotingStage = trackVotingStage;
12
+ const governor_discovery_1 = require("../discovery/governor-discovery");
13
+ const security_council_1 = require("../discovery/security-council");
14
+ const stage_builder_1 = require("./stage-builder");
15
+ const timing_1 = require("../utils/timing");
16
+ const constants_1 = require("../constants");
17
+ /**
18
+ * Track voting stage for a proposal
19
+ */
20
+ async function trackVotingStage(governorAddress, proposalId, proposalData, provider) {
21
+ const builder = new stage_builder_1.StageBuilder("VOTING_ACTIVE", "L2");
22
+ // Get current block info
23
+ const { blockNumber: currentBlock, timestamp: currentTimestamp } = await (0, timing_1.getCurrentBlockInfo)(provider);
24
+ // Check if voting has started
25
+ if (proposalData.startBlock.gt(currentBlock)) {
26
+ // Voting not started yet
27
+ const remainingSeconds = (0, timing_1.calculateRemainingSeconds)(proposalData.startBlock.toNumber(), currentBlock, constants_1.BLOCK_TIMES.L2);
28
+ builder
29
+ .status("NOT_STARTED")
30
+ .timing({ startedAt: currentTimestamp, eta: currentTimestamp + remainingSeconds })
31
+ .data({
32
+ startBlock: proposalData.startBlock.toString(),
33
+ currentBlock: currentBlock.toString(),
34
+ });
35
+ return { stage: builder.build(), votingData: null };
36
+ }
37
+ // Get voting data from governor
38
+ const votingData = await (0, governor_discovery_1.getVotingData)(governorAddress, proposalId, provider);
39
+ // Check for vetting period - only Security Council governors have vetting
40
+ const proposalType = (0, governor_discovery_1.detectProposalType)(governorAddress);
41
+ const isElectionProposal = proposalType === "ELECTION_NOMINEE" || proposalType === "ELECTION_MEMBER";
42
+ const vettingInfo = isElectionProposal
43
+ ? await (0, security_council_1.checkVettingPeriod)(governorAddress, proposalId, provider)
44
+ : {
45
+ hasVettingPeriod: false,
46
+ vettingDeadline: null,
47
+ isVettingActive: false,
48
+ vetterAddress: null,
49
+ };
50
+ // Check if voting was extended
51
+ const wasExtended = votingData.extendedDeadline !== undefined &&
52
+ !votingData.extendedDeadline.eq(votingData.deadline);
53
+ const extensionPossible = !votingData.isVotingPeriodOver && !votingData.hasReachedQuorum;
54
+ // Add voting statistics
55
+ builder.data({
56
+ forVotes: votingData.forVotes.toString(),
57
+ againstVotes: votingData.againstVotes.toString(),
58
+ abstainVotes: votingData.abstainVotes.toString(),
59
+ quorum: votingData.quorum.toString(),
60
+ quorumReached: votingData.hasReachedQuorum,
61
+ deadline: votingData.deadline.toString(),
62
+ extendedDeadline: votingData.extendedDeadline?.toString(),
63
+ wasExtended,
64
+ extensionPossible,
65
+ hasVettingPeriod: vettingInfo.hasVettingPeriod,
66
+ vettingDeadline: vettingInfo.vettingDeadline?.toString(),
67
+ isVettingActive: vettingInfo.isVettingActive,
68
+ });
69
+ // Determine voting status
70
+ const proposalState = await (0, governor_discovery_1.getProposalState)(governorAddress, proposalId, provider);
71
+ builder.data({ proposalState });
72
+ if (proposalState === "Active") {
73
+ const remainingSeconds = (0, timing_1.calculateRemainingSeconds)(votingData.deadline.toNumber(), currentBlock, constants_1.BLOCK_TIMES.L2);
74
+ builder.status("PENDING").timing({
75
+ startedAt: currentTimestamp,
76
+ eta: currentTimestamp + remainingSeconds,
77
+ delaySeconds: remainingSeconds,
78
+ });
79
+ }
80
+ else if (proposalState === "Succeeded" ||
81
+ proposalState === "Queued" ||
82
+ proposalState === "Executed") {
83
+ // Check vetting period first
84
+ if (vettingInfo.isVettingActive && vettingInfo.vettingDeadline) {
85
+ const currentL1Block = await (0, timing_1.getL1BlockNumberFromL2)(provider);
86
+ const remainingSeconds = (0, timing_1.calculateRemainingSeconds)(vettingInfo.vettingDeadline.toNumber(), currentL1Block.toNumber(), constants_1.BLOCK_TIMES.L1);
87
+ builder
88
+ .status("PENDING")
89
+ .data({ waitingForVetting: true })
90
+ .timing({
91
+ eta: currentTimestamp + remainingSeconds,
92
+ delaySeconds: remainingSeconds,
93
+ });
94
+ }
95
+ else {
96
+ builder.status("COMPLETED");
97
+ }
98
+ }
99
+ else if (proposalState === "Defeated" ||
100
+ proposalState === "Canceled" ||
101
+ proposalState === "Expired") {
102
+ builder.status("FAILED");
103
+ }
104
+ else if (proposalState === "Pending") {
105
+ builder.status("NOT_STARTED");
106
+ }
107
+ return { stage: builder.build(), votingData };
108
+ }
109
+ //# sourceMappingURL=voting.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voting.js","sourceRoot":"","sources":["../../src/stages/voting.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * TrackingContext - Functional state management for pipeline tracking
3
+ *
4
+ * This module provides a purely functional approach to tracking context:
5
+ * - TrackingContext interface defines the immutable state shape
6
+ * - Pure functions transform state and derive values
7
+ * - No classes, no mutation, no hidden state
8
+ *
9
+ * Benefits:
10
+ * - Easy testing: just create plain objects
11
+ * - Transparent: can log/inspect full state anytime
12
+ * - Predictable: same input → same output
13
+ * - Composable: mix and match functions freely
14
+ * - Debuggable: save/restore state snapshots
15
+ */
16
+ import { ethers } from "ethers";
17
+ import { TrackedStage, TrackingCheckpoint, TrackingInput, StageType, CallScheduledData, ProposalData, ProposalType, ProposalState, OnProgressCallback, ChunkingConfig } from "../types";
18
+ /**
19
+ * Providers for multi-chain operations
20
+ */
21
+ export interface Providers {
22
+ readonly l2: ethers.providers.Provider;
23
+ readonly l1: ethers.providers.Provider;
24
+ readonly nova: ethers.providers.Provider;
25
+ }
26
+ /**
27
+ * Options for creating a TrackingContext
28
+ */
29
+ export interface CreateTrackingContextOptions {
30
+ providers: Providers;
31
+ input: TrackingInput;
32
+ onProgress?: OnProgressCallback;
33
+ chunkingConfig?: ChunkingConfig;
34
+ checkpoint?: TrackingCheckpoint;
35
+ cacheKey?: string;
36
+ /** Bootstrap data for timelock-only tracking */
37
+ callScheduledData?: CallScheduledData[];
38
+ }
39
+ /**
40
+ * TrackingContext - Immutable state for pipeline tracking
41
+ *
42
+ * All values are derived from stages. This interface represents
43
+ * a snapshot of the pipeline at a point in time.
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * let ctx = createTrackingContext({ providers, input });
48
+ * ctx = await addStage(ctx, proposalCreatedStage);
49
+ * const opId = getOperationId(ctx);
50
+ * ```
51
+ */
52
+ export interface TrackingContext {
53
+ readonly providers: Providers;
54
+ readonly chunkingConfig: ChunkingConfig;
55
+ readonly onProgress?: OnProgressCallback;
56
+ readonly cacheKey?: string;
57
+ readonly input: TrackingInput;
58
+ readonly callScheduledData?: CallScheduledData[];
59
+ readonly stages: TrackedStage[];
60
+ readonly stageIndex: number;
61
+ }
62
+ /**
63
+ * Create a new TrackingContext.
64
+ */
65
+ export declare function createTrackingContext(options: CreateTrackingContextOptions): TrackingContext;
66
+ /**
67
+ * Add or update a stage. Returns new context.
68
+ */
69
+ export declare function addStage(ctx: TrackingContext, stage: TrackedStage): Promise<TrackingContext>;
70
+ /** Check if a stage is completed (COMPLETED or SKIPPED). */
71
+ export declare function isStageCompleted(ctx: TrackingContext, type: StageType): boolean;
72
+ /** Get a completed stage for zero-RPC resume. */
73
+ export declare function getCompletedStage(ctx: TrackingContext, type: StageType): TrackedStage | undefined;
74
+ /** Get a cached stage (any status). */
75
+ export declare function getCachedStage(ctx: TrackingContext, type: StageType): TrackedStage | undefined;
76
+ /**
77
+ * Check if all stages are complete.
78
+ */
79
+ export declare function isComplete(ctx: TrackingContext): boolean;
80
+ export declare const getGovernorAddress: (ctx: TrackingContext) => string | undefined;
81
+ export declare const getProposalId: (ctx: TrackingContext) => string | undefined;
82
+ export declare function getTimelockAddress(ctx: TrackingContext): string | undefined;
83
+ export declare function getOperationId(ctx: TrackingContext): string | undefined;
84
+ export declare function getCallScheduledData(ctx: TrackingContext): CallScheduledData[] | undefined;
85
+ export declare const getFirstCallScheduledData: (ctx: TrackingContext) => CallScheduledData | undefined;
86
+ export declare const getQueueBlockNumber: (ctx: TrackingContext) => number | undefined;
87
+ /** Proposal data from PROPOSAL_CREATED stage */
88
+ export declare function getProposalData(ctx: TrackingContext): ProposalData | undefined;
89
+ export declare function getProposalType(ctx: TrackingContext): ProposalType | undefined;
90
+ export declare const getIsElection: (ctx: TrackingContext) => boolean;
91
+ export declare const getProposalState: (ctx: TrackingContext) => ProposalState | undefined;
92
+ export declare function getVotingEndBlock(ctx: TrackingContext): number | undefined;
93
+ export declare function getL2ExecutionTxHash(ctx: TrackingContext): string | undefined;
94
+ export declare const getFirstExecutableBlock: (ctx: TrackingContext) => number | undefined;
95
+ export declare function getOutboxExecutionTx(ctx: TrackingContext): {
96
+ hash: string;
97
+ blockNumber: number;
98
+ } | undefined;
99
+ export declare function getL1ExecutionTxHash(ctx: TrackingContext): string | undefined;
100
+ export declare function createCheckpoint(ctx: TrackingContext): TrackingCheckpoint;
101
+ export declare function toResult(ctx: TrackingContext): {
102
+ input: TrackingInput;
103
+ stages: TrackedStage[];
104
+ checkpoint: TrackingCheckpoint;
105
+ isComplete: boolean;
106
+ proposalType: ProposalType | undefined;
107
+ proposalData: ProposalData | undefined;
108
+ currentState: ProposalState | undefined;
109
+ isElection: boolean;
110
+ };
111
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/tracker/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ /**
3
+ * TrackingContext - Functional state management for pipeline tracking
4
+ *
5
+ * This module provides a purely functional approach to tracking context:
6
+ * - TrackingContext interface defines the immutable state shape
7
+ * - Pure functions transform state and derive values
8
+ * - No classes, no mutation, no hidden state
9
+ *
10
+ * Benefits:
11
+ * - Easy testing: just create plain objects
12
+ * - Transparent: can log/inspect full state anytime
13
+ * - Predictable: same input → same output
14
+ * - Composable: mix and match functions freely
15
+ * - Debuggable: save/restore state snapshots
16
+ */
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ exports.getFirstExecutableBlock = exports.getProposalState = exports.getIsElection = exports.getQueueBlockNumber = exports.getFirstCallScheduledData = exports.getProposalId = exports.getGovernorAddress = void 0;
19
+ exports.createTrackingContext = createTrackingContext;
20
+ exports.addStage = addStage;
21
+ exports.isStageCompleted = isStageCompleted;
22
+ exports.getCompletedStage = getCompletedStage;
23
+ exports.getCachedStage = getCachedStage;
24
+ exports.isComplete = isComplete;
25
+ exports.getTimelockAddress = getTimelockAddress;
26
+ exports.getOperationId = getOperationId;
27
+ exports.getCallScheduledData = getCallScheduledData;
28
+ exports.getProposalData = getProposalData;
29
+ exports.getProposalType = getProposalType;
30
+ exports.getVotingEndBlock = getVotingEndBlock;
31
+ exports.getL2ExecutionTxHash = getL2ExecutionTxHash;
32
+ exports.getOutboxExecutionTx = getOutboxExecutionTx;
33
+ exports.getL1ExecutionTxHash = getL1ExecutionTxHash;
34
+ exports.createCheckpoint = createCheckpoint;
35
+ exports.toResult = toResult;
36
+ const ethers_1 = require("ethers");
37
+ const logger_1 = require("../utils/logger");
38
+ const base_1 = require("../stages/base");
39
+ const governor_discovery_1 = require("../discovery/governor-discovery");
40
+ const constants_1 = require("../constants");
41
+ const { tracker: logTracker } = logger_1.loggers;
42
+ // State Creation
43
+ /**
44
+ * Create a new TrackingContext.
45
+ */
46
+ function createTrackingContext(options) {
47
+ // Initialize stages based on tracking path
48
+ const includeProposal = options.input.type === "governor";
49
+ const addressForPath = options.input.type === "governor"
50
+ ? options.input.governorAddress
51
+ : options.input.type === "timelock"
52
+ ? options.input.timelockAddress
53
+ : "";
54
+ const initialStages = (0, base_1.initializeStagesForPath)(addressForPath, includeProposal);
55
+ let ctx = {
56
+ providers: options.providers,
57
+ chunkingConfig: options.chunkingConfig ?? constants_1.DEFAULT_CHUNKING_CONFIG,
58
+ onProgress: options.onProgress,
59
+ cacheKey: options.cacheKey,
60
+ input: options.input,
61
+ callScheduledData: options.callScheduledData,
62
+ stages: initialStages,
63
+ stageIndex: 0,
64
+ };
65
+ // Load from checkpoint if provided
66
+ if (options.checkpoint?.cachedData.completedStages?.length) {
67
+ ctx = loadFromCheckpoint(ctx, options.checkpoint);
68
+ }
69
+ return ctx;
70
+ }
71
+ /**
72
+ * Load stages from a checkpoint.
73
+ */
74
+ function loadFromCheckpoint(ctx, checkpoint) {
75
+ const completedStages = checkpoint.cachedData.completedStages;
76
+ if (!completedStages?.length)
77
+ return ctx;
78
+ logTracker("RESUME: loading %d completed stages from checkpoint", completedStages.length);
79
+ let stages = ctx.stages;
80
+ for (const stage of completedStages) {
81
+ stages = (0, base_1.updateStageInList)(stages, stage);
82
+ }
83
+ return { ...ctx, stages, stageIndex: completedStages.length };
84
+ }
85
+ // Stage Management
86
+ /**
87
+ * Add or update a stage. Returns new context.
88
+ */
89
+ async function addStage(ctx, stage) {
90
+ const newStages = (0, base_1.updateStageInList)(ctx.stages, stage);
91
+ const newCtx = {
92
+ ...ctx,
93
+ stages: newStages,
94
+ stageIndex: ctx.stageIndex + 1,
95
+ };
96
+ await emitProgress(newCtx, stage);
97
+ return newCtx;
98
+ }
99
+ // Stage lookup helper (defined early for use in stage management functions)
100
+ const findStage = (ctx, type) => ctx.stages.find((s) => s.type === type);
101
+ /** Check if a stage is completed (COMPLETED or SKIPPED). */
102
+ function isStageCompleted(ctx, type) {
103
+ const s = findStage(ctx, type);
104
+ return s?.status === "COMPLETED" || s?.status === "SKIPPED";
105
+ }
106
+ /** Get a completed stage for zero-RPC resume. */
107
+ function getCompletedStage(ctx, type) {
108
+ const s = findStage(ctx, type);
109
+ return s?.status === "COMPLETED" || s?.status === "SKIPPED" ? s : undefined;
110
+ }
111
+ /** Get a cached stage (any status). */
112
+ function getCachedStage(ctx, type) {
113
+ return findStage(ctx, type);
114
+ }
115
+ /**
116
+ * Check if all stages are complete.
117
+ */
118
+ function isComplete(ctx) {
119
+ return (0, base_1.areAllStagesComplete)(ctx.stages);
120
+ }
121
+ // Stage data helpers
122
+ const stageData = (ctx, type) => findStage(ctx, type)?.data;
123
+ const execTx = (s) => s?.transactions?.find((tx) => tx.description === "executed");
124
+ const chainTx = (s, chain) => s?.transactions?.find((tx) => tx.chain === chain);
125
+ // Derived Getters - Input-based
126
+ const getGovernorAddress = (ctx) => ctx.input.type === "governor" ? ctx.input.governorAddress : undefined;
127
+ exports.getGovernorAddress = getGovernorAddress;
128
+ const getProposalId = (ctx) => ctx.input.type === "governor" ? ctx.input.proposalId : undefined;
129
+ exports.getProposalId = getProposalId;
130
+ // Derived Getters - Multi-source lookups
131
+ function getTimelockAddress(ctx) {
132
+ if (ctx.input.type === "timelock")
133
+ return ctx.input.timelockAddress;
134
+ return (stageData(ctx, "PROPOSAL_QUEUED")?.timelockAddress ??
135
+ stageData(ctx, "L2_TIMELOCK")?.timelockAddress);
136
+ }
137
+ function getOperationId(ctx) {
138
+ if (ctx.input.type === "timelock")
139
+ return ctx.input.operationId;
140
+ return (stageData(ctx, "PROPOSAL_QUEUED")?.operationId ??
141
+ stageData(ctx, "L2_TIMELOCK")?.operationId);
142
+ }
143
+ function getCallScheduledData(ctx) {
144
+ if (ctx.callScheduledData)
145
+ return ctx.callScheduledData;
146
+ const qData = stageData(ctx, "PROPOSAL_QUEUED")?.callScheduledData;
147
+ if (qData?.length)
148
+ return (0, base_1.deserializeCallScheduledDataArray)(qData);
149
+ const l2Data = stageData(ctx, "L2_TIMELOCK")?.callScheduledData;
150
+ return l2Data?.length ? (0, base_1.deserializeCallScheduledDataArray)(l2Data) : undefined;
151
+ }
152
+ const getFirstCallScheduledData = (ctx) => getCallScheduledData(ctx)?.[0];
153
+ exports.getFirstCallScheduledData = getFirstCallScheduledData;
154
+ const getQueueBlockNumber = (ctx) => (0, exports.getFirstCallScheduledData)(ctx)?.blockNumber;
155
+ exports.getQueueBlockNumber = getQueueBlockNumber;
156
+ /** Proposal data from PROPOSAL_CREATED stage */
157
+ function getProposalData(ctx) {
158
+ const s = findStage(ctx, "PROPOSAL_CREATED");
159
+ if (!s || s.status === "NOT_STARTED")
160
+ return undefined;
161
+ const data = s.data;
162
+ const tx = s.transactions?.[0];
163
+ if (!data.proposalId ||
164
+ !data.startBlock ||
165
+ !data.endBlock ||
166
+ !data.proposer ||
167
+ !data.targets ||
168
+ !data.values ||
169
+ !data.signatures ||
170
+ !data.calldatas ||
171
+ !tx)
172
+ return undefined;
173
+ return {
174
+ proposalId: data.proposalId,
175
+ proposer: data.proposer,
176
+ description: data.description,
177
+ targets: data.targets,
178
+ values: data.values.map((v) => ethers_1.BigNumber.from(v)),
179
+ signatures: data.signatures,
180
+ calldatas: data.calldatas,
181
+ startBlock: ethers_1.BigNumber.from(data.startBlock),
182
+ endBlock: ethers_1.BigNumber.from(data.endBlock),
183
+ creationBlock: tx.blockNumber,
184
+ creationTxHash: tx.hash,
185
+ };
186
+ }
187
+ function getProposalType(ctx) {
188
+ const data = stageData(ctx, "PROPOSAL_CREATED");
189
+ if (data?.proposalType)
190
+ return data.proposalType;
191
+ const addr = (0, exports.getGovernorAddress)(ctx);
192
+ return addr ? (0, governor_discovery_1.detectProposalType)(addr) : undefined;
193
+ }
194
+ const getIsElection = (ctx) => {
195
+ const type = getProposalType(ctx);
196
+ return type ? (0, governor_discovery_1.isElectionProposal)(type) : false;
197
+ };
198
+ exports.getIsElection = getIsElection;
199
+ const getProposalState = (ctx) => stageData(ctx, "VOTING_ACTIVE")?.proposalState;
200
+ exports.getProposalState = getProposalState;
201
+ function getVotingEndBlock(ctx) {
202
+ const data = stageData(ctx, "VOTING_ACTIVE");
203
+ if (!data?.deadline)
204
+ return undefined;
205
+ const deadline = parseInt(data.deadline, 10);
206
+ const extended = data.extendedDeadline ? parseInt(data.extendedDeadline, 10) : 0;
207
+ return extended > deadline ? extended : deadline;
208
+ }
209
+ function getL2ExecutionTxHash(ctx) {
210
+ const s = findStage(ctx, "L2_TIMELOCK");
211
+ return s?.status === "COMPLETED" ? execTx(s)?.hash : undefined;
212
+ }
213
+ const getFirstExecutableBlock = (ctx) => stageData(ctx, "L2_TO_L1_MESSAGE")?.firstExecutableBlock;
214
+ exports.getFirstExecutableBlock = getFirstExecutableBlock;
215
+ function getOutboxExecutionTx(ctx) {
216
+ const s = findStage(ctx, "L2_TO_L1_MESSAGE");
217
+ if (s?.status !== "COMPLETED")
218
+ return undefined;
219
+ const tx = chainTx(s, "L1");
220
+ return tx ? { hash: tx.hash, blockNumber: tx.blockNumber } : undefined;
221
+ }
222
+ function getL1ExecutionTxHash(ctx) {
223
+ const s = findStage(ctx, "L1_TIMELOCK");
224
+ return s?.status === "COMPLETED" ? execTx(s)?.hash : undefined;
225
+ }
226
+ // Checkpoint & Result
227
+ function createCheckpoint(ctx) {
228
+ const completedStages = ctx.stages.filter((s) => s.status !== "NOT_STARTED");
229
+ const lastProcessedStage = [...ctx.stages].reverse().find((s) => s.status !== "NOT_STARTED")?.type ?? null;
230
+ return {
231
+ version: 1,
232
+ createdAt: Date.now(),
233
+ input: ctx.input,
234
+ lastProcessedStage,
235
+ lastProcessedBlock: { l1: 0, l2: 0, nova: 0 },
236
+ cachedData: { completedStages },
237
+ metadata: { errorCount: 0, lastTrackedAt: Date.now() },
238
+ };
239
+ }
240
+ async function emitProgress(ctx, s) {
241
+ if (!ctx.onProgress)
242
+ return;
243
+ const idx = ctx.stages.findIndex((x) => x.type === s.type);
244
+ await ctx.onProgress({
245
+ stage: s,
246
+ stages: ctx.stages,
247
+ currentIndex: idx >= 0 ? idx : ctx.stageIndex,
248
+ totalStages: ctx.stages.length,
249
+ isComplete: isComplete(ctx),
250
+ });
251
+ }
252
+ function toResult(ctx) {
253
+ return {
254
+ input: ctx.input,
255
+ stages: ctx.stages,
256
+ checkpoint: createCheckpoint(ctx),
257
+ isComplete: isComplete(ctx),
258
+ proposalType: getProposalType(ctx),
259
+ proposalData: getProposalData(ctx),
260
+ currentState: (0, exports.getProposalState)(ctx),
261
+ isElection: (0, exports.getIsElection)(ctx),
262
+ };
263
+ }
264
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/tracker/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Tracker Discovery Module
3
+ *
4
+ * Handles discovery of proposals and timelock operations.
5
+ * Provides unified discovery API with watermark management.
6
+ */
7
+ import { ethers } from "ethers";
8
+ import { DiscoveryWatermarks, DiscoveryTargets, CacheAdapter } from "../types";
9
+ import { DiscoveredProposal } from "../discovery/governor-discovery";
10
+ import { DiscoveredTimelockOp } from "../discovery/timelock-discovery";
11
+ export { DiscoveredProposal, DiscoveredTimelockOp };
12
+ /**
13
+ * Cache key for discovery watermarks checkpoint.
14
+ * Uses "discovery:" prefix to follow checkpoint pattern.
15
+ */
16
+ export declare const WATERMARKS_KEY = "discovery:watermarks";
17
+ /**
18
+ * Load discovery watermarks from cache.
19
+ * Watermarks are stored as a TrackingCheckpoint for unified cache format.
20
+ * Returns empty object if no watermarks are cached.
21
+ */
22
+ export declare function loadWatermarks(cache: CacheAdapter | undefined): Promise<DiscoveryWatermarks>;
23
+ /**
24
+ * Save discovery watermarks to cache.
25
+ * Watermarks are stored as TrackingCheckpoint with proper metadata,
26
+ * following the same pattern as proposal/timelock checkpoints.
27
+ */
28
+ export declare function saveWatermarks(watermarks: DiscoveryWatermarks, cache: CacheAdapter | undefined): Promise<void>;
29
+ /**
30
+ * Discover proposals from a governor in a block range.
31
+ *
32
+ * @param governorAddress - Governor contract address
33
+ * @param fromBlock - Start block (exclusive - searches from fromBlock + 1)
34
+ * @param toBlock - End block (inclusive)
35
+ * @param l2Provider - L2 provider
36
+ * @param options.chunkSize - Optional chunk size for log searches
37
+ * @returns Array of discovered proposals
38
+ */
39
+ export declare function discoverProposals(governorAddress: string, fromBlock: number, toBlock: number, l2Provider: ethers.providers.Provider, options?: {
40
+ chunkSize?: number;
41
+ }): Promise<DiscoveredProposal[]>;
42
+ /**
43
+ * Discover timelock operations from a timelock in a block range.
44
+ *
45
+ * @param timelockAddress - Timelock contract address
46
+ * @param fromBlock - Start block (exclusive - searches from fromBlock + 1)
47
+ * @param toBlock - End block (inclusive)
48
+ * @param l2Provider - L2 provider
49
+ * @param options.chunkSize - Optional chunk size for log searches
50
+ * @returns Array of discovered timelock operations
51
+ */
52
+ export declare function discoverTimelockOps(timelockAddress: string, fromBlock: number, toBlock: number, l2Provider: ethers.providers.Provider, options?: {
53
+ chunkSize?: number;
54
+ }): Promise<DiscoveredTimelockOp[]>;
55
+ /**
56
+ * Create pending checkpoints for discovered proposals.
57
+ * This ensures they can be retracked even if the current run times out.
58
+ *
59
+ * Note: We don't create pending checkpoints for timelock ops because:
60
+ * 1. Most timelock ops are tracked as part of governor proposals
61
+ * 2. The monitor-loop skips timelock ops that were tracked via governor
62
+ * 3. Creating pending checkpoints for all timelock ops causes double-counting
63
+ */
64
+ export declare function createPendingCheckpoints(proposals: DiscoveredProposal[], _timelockOps: DiscoveredTimelockOp[], cache: CacheAdapter | undefined): Promise<void>;
65
+ /**
66
+ * Discover all proposals and timelock operations with auto-watermark management.
67
+ *
68
+ * This is the unified discovery API that handles everything internally:
69
+ * - Loads watermarks from provided watermarks or starts from governance deployment
70
+ * - Discovers from all enabled targets in parallel (with scoped logging)
71
+ * - Creates pending checkpoints for discovered items
72
+ * - Returns updated watermarks for saving
73
+ *
74
+ * @param targets - Which governors/timelocks to scan
75
+ * @param toBlock - End block for discovery
76
+ * @param l2Provider - L2 provider
77
+ * @param cache - Cache adapter for pending checkpoint creation
78
+ * @param fromWatermarks - Starting watermarks
79
+ * @param options.chunkSize - Optional chunk size for log searches
80
+ * @returns Discovered proposals, timelock ops, and updated watermarks
81
+ */
82
+ export declare function discoverAll(targets: DiscoveryTargets, toBlock: number, l2Provider: ethers.providers.Provider, cache: CacheAdapter | undefined, fromWatermarks: DiscoveryWatermarks, options?: {
83
+ chunkSize?: number;
84
+ }): Promise<{
85
+ proposals: DiscoveredProposal[];
86
+ timelockOps: DiscoveredTimelockOp[];
87
+ watermarks: DiscoveryWatermarks;
88
+ }>;
89
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +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,EAAsB,mBAAmB,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEnG,OAAO,EAEL,kBAAkB,EACnB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAEL,oBAAoB,EACrB,MAAM,iCAAiC,CAAC;AAKzC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,CAAC;AAEpD;;;GAGG;AACH,eAAO,MAAM,cAAc,yBAAyB,CAAC;AAErD;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,YAAY,GAAG,SAAS,GAC9B,OAAO,CAAC,mBAAmB,CAAC,CAI9B;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAClC,UAAU,EAAE,mBAAmB,EAC/B,KAAK,EAAE,YAAY,GAAG,SAAS,GAC9B,OAAO,CAAC,IAAI,CAAC,CAgCf;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,YAAY,EAAE,oBAAoB,EAAE,EACpC,KAAK,EAAE,YAAY,GAAG,SAAS,GAC9B,OAAO,CAAC,IAAI,CAAC,CAiCf;AAED;;;;;;;;;;;;;;;;GAgBG;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,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GACnC,OAAO,CAAC;IACT,SAAS,EAAE,kBAAkB,EAAE,CAAC;IAChC,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACpC,UAAU,EAAE,mBAAmB,CAAC;CACjC,CAAC,CA6HD"}