@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,143 @@
1
+ "use strict";
2
+ /**
3
+ * Stage Helpers
4
+ *
5
+ * Utility functions for timelock stage operations and validation.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.deserializeCallScheduledDataArray = exports.serializeCallScheduledDataArray = exports.deserializeCallScheduledData = exports.serializeCallScheduledData = exports.deserialize = exports.serialize = void 0;
9
+ exports.createTimelockStageData = createTimelockStageData;
10
+ exports.collectAllScheduledData = collectAllScheduledData;
11
+ exports.calculateTimelockEta = calculateTimelockEta;
12
+ exports.buildExecutionPayloadData = buildExecutionPayloadData;
13
+ exports.validateStageForPrepare = validateStageForPrepare;
14
+ exports.bulkPrepareError = bulkPrepareError;
15
+ exports.simpleBulkError = simpleBulkError;
16
+ exports.validateStageForBulkPrepare = validateStageForBulkPrepare;
17
+ exports.validateStageForSimpleBulk = validateStageForSimpleBulk;
18
+ exports.searchAndCompleteTimelockExecution = searchAndCompleteTimelockExecution;
19
+ const types_1 = require("../types");
20
+ const base_1 = require("../stages/base");
21
+ const stage_builder_1 = require("../stages/stage-builder");
22
+ const timelock_discovery_1 = require("../discovery/timelock-discovery");
23
+ // Re-export serialization from base for backwards compatibility
24
+ var base_2 = require("../stages/base");
25
+ Object.defineProperty(exports, "serialize", { enumerable: true, get: function () { return base_2.serialize; } });
26
+ Object.defineProperty(exports, "deserialize", { enumerable: true, get: function () { return base_2.deserialize; } });
27
+ Object.defineProperty(exports, "serializeCallScheduledData", { enumerable: true, get: function () { return base_2.serializeCallScheduledData; } });
28
+ Object.defineProperty(exports, "deserializeCallScheduledData", { enumerable: true, get: function () { return base_2.deserializeCallScheduledData; } });
29
+ Object.defineProperty(exports, "serializeCallScheduledDataArray", { enumerable: true, get: function () { return base_2.serializeCallScheduledDataArray; } });
30
+ Object.defineProperty(exports, "deserializeCallScheduledDataArray", { enumerable: true, get: function () { return base_2.deserializeCallScheduledDataArray; } });
31
+ /** Extract timelock execution payload from a stage. */
32
+ function createTimelockStageData(stage) {
33
+ let stageData = null;
34
+ for (const stageType of base_1.TIMELOCK_STAGE_TYPES) {
35
+ stageData = (0, types_1.getStageData)(stage, stageType);
36
+ if (stageData)
37
+ break;
38
+ }
39
+ if (!stageData?.timelockAddress ||
40
+ !stageData?.operationId ||
41
+ !stageData?.callScheduledData?.length) {
42
+ return null;
43
+ }
44
+ const payload = {
45
+ timelockAddress: stageData.timelockAddress,
46
+ operationId: stageData.operationId,
47
+ callScheduledData: (0, base_1.deserializeCallScheduledDataArray)(stageData.callScheduledData),
48
+ };
49
+ if (stageData.isSecurityCouncilOperation) {
50
+ payload.isSecurityCouncilOperation = true;
51
+ payload.securityCouncilMembers = stageData.securityCouncilMembers;
52
+ payload.securityCouncilNonce = stageData.securityCouncilNonce;
53
+ }
54
+ return payload;
55
+ }
56
+ // ============================================================================
57
+ // Timelock State Helpers
58
+ // ============================================================================
59
+ /** Collect all CallScheduledData from a timelock state. */
60
+ function collectAllScheduledData(timelockState) {
61
+ return (timelockState.allScheduledData ??
62
+ (timelockState.scheduledData ? [timelockState.scheduledData] : []));
63
+ }
64
+ /** Calculate ETA for a timelock operation. */
65
+ async function calculateTimelockEta(timelockState, operationState, provider) {
66
+ if (timelockState.scheduledData) {
67
+ return (0, base_1.calculateEtaFromScheduledData)(timelockState.scheduledData.blockNumber, timelockState.scheduledData.delay.toNumber(), provider);
68
+ }
69
+ const contractTimestamp = operationState.timestamp.toNumber();
70
+ return !operationState.isDone && contractTimestamp > 1 ? contractTimestamp : undefined;
71
+ }
72
+ /** Build serialized execution payload data for stage storage. */
73
+ function buildExecutionPayloadData(timelockAddress, operationId, allScheduledData) {
74
+ const payload = { timelockAddress, operationId };
75
+ if (allScheduledData.length > 0) {
76
+ payload.callScheduledData = (0, base_1.serializeCallScheduledDataArray)(allScheduledData);
77
+ }
78
+ return payload;
79
+ }
80
+ /** Validate stage for preparation. Returns error or null if valid. */
81
+ function validateStageForPrepare(stage, options = {}) {
82
+ if (!options.force && stage.status !== "READY") {
83
+ return (0, base_1.failPrepare)(`Stage is not ready. Current status: ${stage.status}`);
84
+ }
85
+ if (options.expectedTypes?.length && !options.expectedTypes.includes(stage.type)) {
86
+ return (0, base_1.failPrepare)(`Unexpected stage type: ${stage.type}. Expected: ${options.expectedTypes.join(", ")}`);
87
+ }
88
+ return null;
89
+ }
90
+ function bulkPrepareError(error, targetChain) {
91
+ return { total: 0, results: [{ success: false, error }], targetChain };
92
+ }
93
+ function simpleBulkError(error) {
94
+ return { total: 0, results: [{ success: false, error }] };
95
+ }
96
+ function validateStageForBulkPrepare(stage, targetChain, options = {}) {
97
+ const error = validateStageForPrepare(stage, options);
98
+ return error ? { total: 0, results: [error], targetChain } : null;
99
+ }
100
+ function validateStageForSimpleBulk(stage, options = {}) {
101
+ const error = validateStageForPrepare(stage, options);
102
+ return error ? { total: 0, results: [error] } : null;
103
+ }
104
+ // ============================================================================
105
+ // Execution Search Helper
106
+ // ============================================================================
107
+ /** Search for timelock execution event and complete stage. */
108
+ async function searchAndCompleteTimelockExecution(stage, timelockAddress, operationId, provider, chain, fromBlock, toBlock, queueTimestamp) {
109
+ const event = await (0, timelock_discovery_1.findCallExecutedEvent)(timelockAddress, operationId, provider, {
110
+ startBlock: fromBlock,
111
+ endBlock: toBlock,
112
+ });
113
+ const builder = new stage_builder_1.StageBuilder(stage.type, stage.chain)
114
+ .data(stage.data)
115
+ .transactions(stage.transactions);
116
+ if (stage.timing)
117
+ builder.timing(stage.timing);
118
+ if (event) {
119
+ const execTimestamp = await (0, base_1.getBlockTimestamp)(event.blockNumber, provider);
120
+ builder
121
+ .status("COMPLETED")
122
+ .tx(event.txHash, event.blockNumber, chain, {
123
+ timestamp: execTimestamp,
124
+ description: "executed",
125
+ })
126
+ .timing({ startedAt: queueTimestamp ?? execTimestamp })
127
+ .data({ operationId });
128
+ return {
129
+ stage: builder.build(),
130
+ executionTxHash: event.txHash,
131
+ executionBlock: event.blockNumber,
132
+ };
133
+ }
134
+ return {
135
+ stage: builder
136
+ .status("COMPLETED")
137
+ .data({ operationId, note: "Execution confirmed by state, event not found" })
138
+ .build(),
139
+ executionTxHash: null,
140
+ executionBlock: null,
141
+ };
142
+ }
143
+ //# sourceMappingURL=stage-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage-helpers.js","sourceRoot":"","sources":["../../src/utils/stage-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Stage Metadata - Human-readable stage information for UI display
3
+ *
4
+ * Provides titles, descriptions, and timing info for governance stages.
5
+ */
6
+ import type { StageType, ProposalType } from "../types";
7
+ /**
8
+ * Metadata for a governance stage
9
+ */
10
+ export interface StageMetadata {
11
+ /** Short human-readable title */
12
+ title: string;
13
+ /** Longer description of what happens in this stage */
14
+ description: string;
15
+ /** Which chain this stage occurs on */
16
+ chain: "L1" | "L2" | "NOVA" | "CROSS_CHAIN";
17
+ /** Estimated duration in days (may vary by governor type) */
18
+ estimatedDays: number;
19
+ /** Whether this stage requires user action to proceed */
20
+ requiresAction: boolean;
21
+ }
22
+ /**
23
+ * Get metadata for a specific stage
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const meta = getStageMetadata("VOTING_ACTIVE");
28
+ * console.log(`${meta.title}: ${meta.description}`);
29
+ * // => "Voting Active: Token holders are voting on the proposal"
30
+ * ```
31
+ */
32
+ export declare function getStageMetadata(stageType: StageType, _proposalType?: ProposalType): StageMetadata;
33
+ /**
34
+ * Get metadata for all stages in order
35
+ *
36
+ * @example
37
+ * ```typescript
38
+ * const allMeta = getAllStageMetadata();
39
+ * for (const [type, meta] of Object.entries(allMeta)) {
40
+ * console.log(`${meta.title} (${meta.estimatedDays}d)`);
41
+ * }
42
+ * ```
43
+ */
44
+ export declare function getAllStageMetadata(proposalType?: ProposalType): Record<StageType, StageMetadata>;
45
+ /**
46
+ * Get stages that require user action (executable stages)
47
+ */
48
+ export declare function getActionableStages(): StageType[];
49
+ /**
50
+ * Format stage type as human-readable title
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * formatStageTitle("L2_TIMELOCK") // => "L2 Timelock"
55
+ * ```
56
+ */
57
+ export declare function formatStageTitle(stageType: StageType): string;
58
+ /**
59
+ * Get total expected duration for the full governance lifecycle in days
60
+ */
61
+ export declare function getTotalExpectedDuration(): number;
62
+ //# sourceMappingURL=stage-metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage-metadata.d.ts","sourceRoot":"","sources":["../../src/utils/stage-metadata.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAGxD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,GAAG,aAAa,CAAC;IAC5C,6DAA6D;IAC7D,aAAa,EAAE,MAAM,CAAC;IACtB,yDAAyD;IACzD,cAAc,EAAE,OAAO,CAAC;CACzB;AA+DD;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,SAAS,EACpB,aAAa,CAAC,EAAE,YAAY,GAC3B,aAAa,CAQf;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,YAAY,CAAC,EAAE,YAAY,GAAG,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,CAiBjG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,SAAS,EAAE,CAIjD;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAE7D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,CAEjD"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ /**
3
+ * Stage Metadata - Human-readable stage information for UI display
4
+ *
5
+ * Provides titles, descriptions, and timing info for governance stages.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.getStageMetadata = getStageMetadata;
9
+ exports.getAllStageMetadata = getAllStageMetadata;
10
+ exports.getActionableStages = getActionableStages;
11
+ exports.formatStageTitle = formatStageTitle;
12
+ exports.getTotalExpectedDuration = getTotalExpectedDuration;
13
+ const constants_1 = require("../constants");
14
+ const BASE_METADATA = {
15
+ PROPOSAL_CREATED: {
16
+ title: "Proposal Created",
17
+ description: "Proposal submitted on-chain and awaiting voting period to begin",
18
+ chain: "L2",
19
+ requiresAction: false,
20
+ },
21
+ VOTING_ACTIVE: {
22
+ title: "Voting Active",
23
+ description: "Token holders are voting on the proposal",
24
+ chain: "L2",
25
+ requiresAction: false,
26
+ },
27
+ PROPOSAL_QUEUED: {
28
+ title: "Proposal Queued",
29
+ description: "Voting succeeded, proposal queued in L2 timelock",
30
+ chain: "L2",
31
+ requiresAction: false,
32
+ },
33
+ L2_TIMELOCK: {
34
+ title: "L2 Timelock",
35
+ description: "L2 timelock delay and execution. Status: PENDING (waiting for delay), READY (can execute), COMPLETED (executed)",
36
+ chain: "L2",
37
+ requiresAction: true,
38
+ },
39
+ L2_TO_L1_MESSAGE: {
40
+ title: "L2→L1 Message",
41
+ description: "Cross-chain message with challenge period. Status: PENDING (in challenge period), READY (can execute outbox), COMPLETED (confirmed on L1)",
42
+ chain: "CROSS_CHAIN",
43
+ requiresAction: true,
44
+ },
45
+ L1_TIMELOCK: {
46
+ title: "L1 Timelock",
47
+ description: "L1 timelock delay and execution. Status: PENDING (waiting for delay), READY (can execute), COMPLETED (executed)",
48
+ chain: "L1",
49
+ requiresAction: true,
50
+ },
51
+ RETRYABLE_EXECUTED: {
52
+ title: "Retryable Executed",
53
+ description: "Retryable ticket(s) executed on target chain",
54
+ chain: "CROSS_CHAIN",
55
+ requiresAction: true,
56
+ },
57
+ };
58
+ const DEFAULT_DURATIONS = {
59
+ PROPOSAL_CREATED: 0,
60
+ VOTING_ACTIVE: constants_1.GOVERNANCE_STAGE_DURATION_DAYS.VOTING,
61
+ PROPOSAL_QUEUED: 0,
62
+ // L2_TIMELOCK combines delay (8 days for Core, 3 for Treasury) + execution (0 days)
63
+ L2_TIMELOCK: constants_1.GOVERNANCE_STAGE_DURATION_DAYS.L2_CONSTITUTIONAL_TIMELOCK,
64
+ // L2_TO_L1_MESSAGE combines sent (0 days) + challenge period (6.4 days)
65
+ L2_TO_L1_MESSAGE: constants_1.GOVERNANCE_STAGE_DURATION_DAYS.CHALLENGE_PERIOD,
66
+ // L1_TIMELOCK combines delay (3 days) + execution (0 days)
67
+ L1_TIMELOCK: constants_1.GOVERNANCE_STAGE_DURATION_DAYS.L1_TIMELOCK,
68
+ RETRYABLE_EXECUTED: 0,
69
+ };
70
+ /**
71
+ * Get metadata for a specific stage
72
+ *
73
+ * @example
74
+ * ```typescript
75
+ * const meta = getStageMetadata("VOTING_ACTIVE");
76
+ * console.log(`${meta.title}: ${meta.description}`);
77
+ * // => "Voting Active: Token holders are voting on the proposal"
78
+ * ```
79
+ */
80
+ function getStageMetadata(stageType, _proposalType) {
81
+ const base = BASE_METADATA[stageType];
82
+ const estimatedDays = DEFAULT_DURATIONS[stageType];
83
+ return {
84
+ ...base,
85
+ estimatedDays,
86
+ };
87
+ }
88
+ /**
89
+ * Get metadata for all stages in order
90
+ *
91
+ * @example
92
+ * ```typescript
93
+ * const allMeta = getAllStageMetadata();
94
+ * for (const [type, meta] of Object.entries(allMeta)) {
95
+ * console.log(`${meta.title} (${meta.estimatedDays}d)`);
96
+ * }
97
+ * ```
98
+ */
99
+ function getAllStageMetadata(proposalType) {
100
+ const stages = [
101
+ "PROPOSAL_CREATED",
102
+ "VOTING_ACTIVE",
103
+ "PROPOSAL_QUEUED",
104
+ "L2_TIMELOCK",
105
+ "L2_TO_L1_MESSAGE",
106
+ "L1_TIMELOCK",
107
+ "RETRYABLE_EXECUTED",
108
+ ];
109
+ const result = {};
110
+ for (const stage of stages) {
111
+ result[stage] = getStageMetadata(stage, proposalType);
112
+ }
113
+ return result;
114
+ }
115
+ /**
116
+ * Get stages that require user action (executable stages)
117
+ */
118
+ function getActionableStages() {
119
+ return Object.entries(BASE_METADATA)
120
+ .filter(([, meta]) => meta.requiresAction)
121
+ .map(([type]) => type);
122
+ }
123
+ /**
124
+ * Format stage type as human-readable title
125
+ *
126
+ * @example
127
+ * ```typescript
128
+ * formatStageTitle("L2_TIMELOCK") // => "L2 Timelock"
129
+ * ```
130
+ */
131
+ function formatStageTitle(stageType) {
132
+ return BASE_METADATA[stageType].title;
133
+ }
134
+ /**
135
+ * Get total expected duration for the full governance lifecycle in days
136
+ */
137
+ function getTotalExpectedDuration() {
138
+ return Object.values(DEFAULT_DURATIONS).reduce((sum, d) => sum + d, 0);
139
+ }
140
+ //# sourceMappingURL=stage-metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stage-metadata.js","sourceRoot":"","sources":["../../src/utils/stage-metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,115 @@
1
+ /**
2
+ * Timing utilities for ETA calculations
3
+ *
4
+ * Handles block-based timing across L1 and L2
5
+ */
6
+ import { BigNumber, ethers } from "ethers";
7
+ import type { TrackedStage } from "../types";
8
+ /**
9
+ * Convert block number to estimated timestamp
10
+ */
11
+ export declare function estimateTimestampFromBlock(blockNumber: number, currentBlock: number, currentTimestamp: number, blockTime?: number): number;
12
+ /**
13
+ * Calculate ETA for a future block
14
+ */
15
+ export declare function calculateEta(targetBlock: number, currentBlock: number, currentTimestamp: number, blockTime?: number): number | null;
16
+ /**
17
+ * Calculate remaining time in seconds
18
+ */
19
+ export declare function calculateRemainingSeconds(targetBlock: number, currentBlock: number, blockTime?: number): number;
20
+ /**
21
+ * Get current block info from a provider
22
+ *
23
+ * Results are cached for 2 seconds to reduce redundant RPC calls during a single
24
+ * tracking operation. The cache is per-provider.
25
+ */
26
+ export declare function getCurrentBlockInfo(provider: ethers.providers.Provider): Promise<{
27
+ blockNumber: number;
28
+ timestamp: number;
29
+ }>;
30
+ /**
31
+ * Get current L1 block number as seen from L2
32
+ *
33
+ * Arbitrum L2 blocks include the L1 block number in their metadata.
34
+ * This returns the L1 block number from the latest L2 block.
35
+ *
36
+ * IMPORTANT: This returns the actual L1 block number, not the L2 block number.
37
+ * Use this for comparing against vetting deadlines which are in L1 blocks.
38
+ */
39
+ export declare function getL1BlockNumberFromL2(l2Provider: ethers.providers.Provider): Promise<BigNumber>;
40
+ /**
41
+ * Get the corresponding L1 block number for an L2 block.
42
+ *
43
+ * Arbitrum L2 blocks include the L1 block number at the time they were created.
44
+ * This is exposed via the `l1BlockNumber` field in the raw block data.
45
+ *
46
+ * This is useful for determining search ranges when looking for L1 events
47
+ * that correspond to L2 actions.
48
+ *
49
+ * Note: This relies on Arbitrum-specific block metadata and requires a
50
+ * JsonRpcProvider that supports the `send` method for raw RPC calls.
51
+ */
52
+ export declare function getL1BlockForL2Block(l2Provider: ethers.providers.Provider, l2BlockNumber: number): Promise<number>;
53
+ /**
54
+ * Get the first L2 block for a given L1 block number using Arbitrum SDK.
55
+ *
56
+ * Arbitrum governors use L1 block numbers for voting deadlines. This function
57
+ * finds the corresponding L2 block for searching L2 logs.
58
+ *
59
+ * Uses binary search via the SDK's getFirstBlockForL1Block which queries
60
+ * NodeInterface.l2BlockRangeForL1() internally.
61
+ *
62
+ * @param l2Provider - L2 provider (must be JsonRpcProvider)
63
+ * @param targetL1Block - Target L1 block number
64
+ * @param options.minL2Block - Minimum L2 block to search from (speeds up binary search)
65
+ * @param options.maxL2Block - Maximum L2 block to search to (speeds up binary search)
66
+ * @returns First L2 block for the given L1 block, or undefined if not found
67
+ */
68
+ export declare function getFirstL2BlockForL1Block(l2Provider: ethers.providers.Provider, targetL1Block: number, options?: {
69
+ minL2Block?: number;
70
+ maxL2Block?: number;
71
+ }): Promise<number | undefined>;
72
+ /**
73
+ * Find a block number shortly after a delay expires.
74
+ *
75
+ * Instead of using a hardcoded block time which can overshoot or undershoot,
76
+ * this function checks actual block timestamps and adjusts iteratively.
77
+ *
78
+ * IMPORTANT: This function errs on the side of being EARLY rather than late.
79
+ * When searching for events, it's better to start searching a bit before the
80
+ * target time than to miss the event by starting too late.
81
+ *
82
+ * @param provider - Provider to fetch block data
83
+ * @param startBlock - The block number where the delay started
84
+ * @param delaySeconds - The delay duration in seconds
85
+ * @param estimatedBlockTime - Estimated seconds per block (default: 12 for L1)
86
+ * @returns A block number at or shortly before timestamp >= startTimestamp + delaySeconds
87
+ */
88
+ export declare function blockAfterDelay(provider: ethers.providers.Provider, startBlock: number, delaySeconds: number, estimatedBlockTime?: number): Promise<number>;
89
+ /**
90
+ * Calculate expected ETA for a stage that hasn't started yet
91
+ *
92
+ * Estimates when a future stage will complete based on:
93
+ * 1. Finding a reference point (completed stage timestamp or existing ETA)
94
+ * 2. Calculating cumulative delays from that reference to the target stage
95
+ *
96
+ * @param stages - Array of tracked stages from a TrackingResult
97
+ * @param stageIndex - Index of the stage to calculate ETA for
98
+ * @returns Estimated completion timestamp in seconds, or undefined if cannot calculate
99
+ *
100
+ * @example
101
+ * ```typescript
102
+ * const result = await tracker.trackFromGovernor(governor, proposalId);
103
+ * for (let i = 0; i < result.stages.length; i++) {
104
+ * const stage = result.stages[i];
105
+ * if (stage.status === "NOT_STARTED") {
106
+ * const eta = calculateExpectedEta(result.stages, i);
107
+ * if (eta) {
108
+ * console.log(`${stage.type}: Expected ~${new Date(eta * 1000).toISOString()}`);
109
+ * }
110
+ * }
111
+ * }
112
+ * ```
113
+ */
114
+ export declare function calculateExpectedEta(stages: TrackedStage[], stageIndex: number): number | undefined;
115
+ //# sourceMappingURL=timing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/utils/timing.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAE3C,OAAO,KAAK,EAAa,YAAY,EAAE,MAAM,UAAU,CAAC;AAyBxD;;GAEG;AACH,wBAAgB,0BAA0B,CACxC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,SAAS,GAAE,MAA6B,GACvC,MAAM,CAIR;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC1B,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,MAAM,EACxB,SAAS,GAAE,MAA6B,GACvC,MAAM,GAAG,IAAI,CAMf;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,MAAM,EACnB,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,MAA6B,GACvC,MAAM,CAMR;AAUD;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,GAClC,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBrD;AAED;;;;;;;;GAQG;AACH,wBAAsB,sBAAsB,CAC1C,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,GACpC,OAAO,CAAC,SAAS,CAAC,CAkBpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CAkBjB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,yBAAyB,CAC7C,UAAU,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACrC,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAO,GACzD,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAsB7B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,EACnC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,kBAAkB,GAAE,MAA6B,GAChD,OAAO,CAAC,MAAM,CAAC,CAoFjB;AAcD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,YAAY,EAAE,EACtB,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,SAAS,CAmCpB"}