@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.
- package/LICENSE +191 -0
- package/README.md +201 -0
- package/dist/abis.d.ts +79 -0
- package/dist/abis.d.ts.map +1 -0
- package/dist/abis.js +159 -0
- package/dist/abis.js.map +1 -0
- package/dist/cli/lib/cli.d.ts +92 -0
- package/dist/cli/lib/cli.d.ts.map +1 -0
- package/dist/cli/lib/cli.js +562 -0
- package/dist/cli/lib/cli.js.map +1 -0
- package/dist/cli/lib/election-check.d.ts +46 -0
- package/dist/cli/lib/election-check.d.ts.map +1 -0
- package/dist/cli/lib/election-check.js +136 -0
- package/dist/cli/lib/election-check.js.map +1 -0
- package/dist/cli/lib/json-state.d.ts +100 -0
- package/dist/cli/lib/json-state.d.ts.map +1 -0
- package/dist/cli/lib/json-state.js +225 -0
- package/dist/cli/lib/json-state.js.map +1 -0
- package/dist/cli/monitor.d.ts +3 -0
- package/dist/cli/monitor.d.ts.map +1 -0
- package/dist/cli/monitor.js +442 -0
- package/dist/cli/monitor.js.map +1 -0
- package/dist/constants.d.ts +235 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +293 -0
- package/dist/constants.js.map +1 -0
- package/dist/discovery/governor-discovery.d.ts +84 -0
- package/dist/discovery/governor-discovery.d.ts.map +1 -0
- package/dist/discovery/governor-discovery.js +310 -0
- package/dist/discovery/governor-discovery.js.map +1 -0
- package/dist/discovery/security-council.d.ts +68 -0
- package/dist/discovery/security-council.d.ts.map +1 -0
- package/dist/discovery/security-council.js +181 -0
- package/dist/discovery/security-council.js.map +1 -0
- package/dist/discovery/timelock-discovery.d.ts +99 -0
- package/dist/discovery/timelock-discovery.d.ts.map +1 -0
- package/dist/discovery/timelock-discovery.js +322 -0
- package/dist/discovery/timelock-discovery.js.map +1 -0
- package/dist/election.d.ts +172 -0
- package/dist/election.d.ts.map +1 -0
- package/dist/election.js +464 -0
- package/dist/election.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +164 -0
- package/dist/index.js.map +1 -0
- package/dist/stages/base.d.ts +127 -0
- package/dist/stages/base.d.ts.map +1 -0
- package/dist/stages/base.js +280 -0
- package/dist/stages/base.js.map +1 -0
- package/dist/stages/l2-to-l1-message.d.ts +108 -0
- package/dist/stages/l2-to-l1-message.d.ts.map +1 -0
- package/dist/stages/l2-to-l1-message.js +422 -0
- package/dist/stages/l2-to-l1-message.js.map +1 -0
- package/dist/stages/proposal-created.d.ts +20 -0
- package/dist/stages/proposal-created.d.ts.map +1 -0
- package/dist/stages/proposal-created.js +62 -0
- package/dist/stages/proposal-created.js.map +1 -0
- package/dist/stages/proposal-queued.d.ts +39 -0
- package/dist/stages/proposal-queued.d.ts.map +1 -0
- package/dist/stages/proposal-queued.js +131 -0
- package/dist/stages/proposal-queued.js.map +1 -0
- package/dist/stages/retryables.d.ts +79 -0
- package/dist/stages/retryables.d.ts.map +1 -0
- package/dist/stages/retryables.js +307 -0
- package/dist/stages/retryables.js.map +1 -0
- package/dist/stages/stage-builder.d.ts +46 -0
- package/dist/stages/stage-builder.d.ts.map +1 -0
- package/dist/stages/stage-builder.js +87 -0
- package/dist/stages/stage-builder.js.map +1 -0
- package/dist/stages/timelock.d.ts +100 -0
- package/dist/stages/timelock.d.ts.map +1 -0
- package/dist/stages/timelock.js +552 -0
- package/dist/stages/timelock.js.map +1 -0
- package/dist/stages/voting.d.ts +18 -0
- package/dist/stages/voting.d.ts.map +1 -0
- package/dist/stages/voting.js +109 -0
- package/dist/stages/voting.js.map +1 -0
- package/dist/tracker/context.d.ts +111 -0
- package/dist/tracker/context.d.ts.map +1 -0
- package/dist/tracker/context.js +264 -0
- package/dist/tracker/context.js.map +1 -0
- package/dist/tracker/discovery.d.ts +89 -0
- package/dist/tracker/discovery.d.ts.map +1 -0
- package/dist/tracker/discovery.js +228 -0
- package/dist/tracker/discovery.js.map +1 -0
- package/dist/tracker/execute.d.ts +44 -0
- package/dist/tracker/execute.d.ts.map +1 -0
- package/dist/tracker/execute.js +126 -0
- package/dist/tracker/execute.js.map +1 -0
- package/dist/tracker/index.d.ts +18 -0
- package/dist/tracker/index.d.ts.map +1 -0
- package/dist/tracker/index.js +70 -0
- package/dist/tracker/index.js.map +1 -0
- package/dist/tracker/pipeline.d.ts +47 -0
- package/dist/tracker/pipeline.d.ts.map +1 -0
- package/dist/tracker/pipeline.js +299 -0
- package/dist/tracker/pipeline.js.map +1 -0
- package/dist/tracker/query.d.ts +45 -0
- package/dist/tracker/query.d.ts.map +1 -0
- package/dist/tracker/query.js +159 -0
- package/dist/tracker/query.js.map +1 -0
- package/dist/tracker/state.d.ts +104 -0
- package/dist/tracker/state.d.ts.map +1 -0
- package/dist/tracker/state.js +287 -0
- package/dist/tracker/state.js.map +1 -0
- package/dist/tracker.d.ts +261 -0
- package/dist/tracker.d.ts.map +1 -0
- package/dist/tracker.js +556 -0
- package/dist/tracker.js.map +1 -0
- package/dist/types/config.d.ts +81 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +6 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/core.d.ts +51 -0
- package/dist/types/core.d.ts.map +1 -0
- package/dist/types/core.js +6 -0
- package/dist/types/core.js.map +1 -0
- package/dist/types/cross-chain.d.ts +80 -0
- package/dist/types/cross-chain.d.ts.map +1 -0
- package/dist/types/cross-chain.js +6 -0
- package/dist/types/cross-chain.js.map +1 -0
- package/dist/types/election.d.ts +59 -0
- package/dist/types/election.d.ts.map +1 -0
- package/dist/types/election.js +6 -0
- package/dist/types/election.js.map +1 -0
- package/dist/types/governor.d.ts +71 -0
- package/dist/types/governor.d.ts.map +1 -0
- package/dist/types/governor.js +6 -0
- package/dist/types/governor.js.map +1 -0
- package/dist/types/index.d.ts +22 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/stages.d.ts +189 -0
- package/dist/types/stages.d.ts.map +1 -0
- package/dist/types/stages.js +23 -0
- package/dist/types/stages.js.map +1 -0
- package/dist/types/timelock.d.ts +108 -0
- package/dist/types/timelock.d.ts.map +1 -0
- package/dist/types/timelock.js +6 -0
- package/dist/types/timelock.js.map +1 -0
- package/dist/types/tracking.d.ts +180 -0
- package/dist/types/tracking.d.ts.map +1 -0
- package/dist/types/tracking.js +6 -0
- package/dist/types/tracking.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +22 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/chain.d.ts +18 -0
- package/dist/utils/chain.d.ts.map +1 -0
- package/dist/utils/chain.js +34 -0
- package/dist/utils/chain.js.map +1 -0
- package/dist/utils/log-filters.d.ts +67 -0
- package/dist/utils/log-filters.d.ts.map +1 -0
- package/dist/utils/log-filters.js +116 -0
- package/dist/utils/log-filters.js.map +1 -0
- package/dist/utils/log-search.d.ts +76 -0
- package/dist/utils/log-search.d.ts.map +1 -0
- package/dist/utils/log-search.js +142 -0
- package/dist/utils/log-search.js.map +1 -0
- package/dist/utils/logger.d.ts +41 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +50 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/operation-id.d.ts +48 -0
- package/dist/utils/operation-id.d.ts.map +1 -0
- package/dist/utils/operation-id.js +102 -0
- package/dist/utils/operation-id.js.map +1 -0
- package/dist/utils/rpc-utils.d.ts +30 -0
- package/dist/utils/rpc-utils.d.ts.map +1 -0
- package/dist/utils/rpc-utils.js +99 -0
- package/dist/utils/rpc-utils.js.map +1 -0
- package/dist/utils/salt-computation.d.ts +78 -0
- package/dist/utils/salt-computation.d.ts.map +1 -0
- package/dist/utils/salt-computation.js +132 -0
- package/dist/utils/salt-computation.js.map +1 -0
- package/dist/utils/salt-resolver.d.ts +63 -0
- package/dist/utils/salt-resolver.d.ts.map +1 -0
- package/dist/utils/salt-resolver.js +144 -0
- package/dist/utils/salt-resolver.js.map +1 -0
- package/dist/utils/scoped-logger.d.ts +43 -0
- package/dist/utils/scoped-logger.d.ts.map +1 -0
- package/dist/utils/scoped-logger.js +72 -0
- package/dist/utils/scoped-logger.js.map +1 -0
- package/dist/utils/stage-helpers.d.ts +51 -0
- package/dist/utils/stage-helpers.d.ts.map +1 -0
- package/dist/utils/stage-helpers.js +143 -0
- package/dist/utils/stage-helpers.js.map +1 -0
- package/dist/utils/stage-metadata.d.ts +62 -0
- package/dist/utils/stage-metadata.d.ts.map +1 -0
- package/dist/utils/stage-metadata.js +140 -0
- package/dist/utils/stage-metadata.js.map +1 -0
- package/dist/utils/timing.d.ts +115 -0
- package/dist/utils/timing.d.ts.map +1 -0
- package/dist/utils/timing.js +303 -0
- package/dist/utils/timing.js.map +1 -0
- package/dist/utils/urls.d.ts +20 -0
- package/dist/utils/urls.d.ts.map +1 -0
- package/dist/utils/urls.js +51 -0
- package/dist/utils/urls.js.map +1 -0
- 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"}
|