@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,552 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Unified Timelock Stage Tracking and Preparation
|
|
4
|
+
*
|
|
5
|
+
* Handles both L1 and L2 timelock operations with chain-specific configurations.
|
|
6
|
+
* L2-specific: Security Council detection and enrichment
|
|
7
|
+
* L1-specific: Operation ID discovery from OutBox execution
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.findL1OperationIdFromTx = findL1OperationIdFromTx;
|
|
11
|
+
exports.trackL2Timelock = trackL2Timelock;
|
|
12
|
+
exports.trackL1Timelock = trackL1Timelock;
|
|
13
|
+
exports.calculateRetryableExecutionValue = calculateRetryableExecutionValue;
|
|
14
|
+
exports.calculateBatchRetryableValues = calculateBatchRetryableValues;
|
|
15
|
+
exports.prepareTimelockOperation = prepareTimelockOperation;
|
|
16
|
+
exports.prepareTimelockBatch = prepareTimelockBatch;
|
|
17
|
+
exports.prepareTimelockStage = prepareTimelockStage;
|
|
18
|
+
const ethers_1 = require("ethers");
|
|
19
|
+
const timelock_discovery_1 = require("../discovery/timelock-discovery");
|
|
20
|
+
const security_council_1 = require("../discovery/security-council");
|
|
21
|
+
const operation_id_1 = require("../utils/operation-id");
|
|
22
|
+
const salt_computation_1 = require("../utils/salt-computation");
|
|
23
|
+
const abis_1 = require("../abis");
|
|
24
|
+
const constants_1 = require("../constants");
|
|
25
|
+
const chain_1 = require("../utils/chain");
|
|
26
|
+
const base_1 = require("./base");
|
|
27
|
+
const stage_builder_1 = require("./stage-builder");
|
|
28
|
+
const timing_1 = require("../utils/timing");
|
|
29
|
+
const stage_helpers_1 = require("../utils/stage-helpers");
|
|
30
|
+
const rpc_utils_1 = require("../utils/rpc-utils");
|
|
31
|
+
const logger_1 = require("../utils/logger");
|
|
32
|
+
const log = logger_1.loggers.stage.timelock;
|
|
33
|
+
const logExecution = logger_1.loggers.execution;
|
|
34
|
+
const L2_TIMELOCK_CONFIG = {
|
|
35
|
+
chain: "L2",
|
|
36
|
+
stageType: "L2_TIMELOCK",
|
|
37
|
+
blockTimeSeconds: constants_1.BLOCK_TIMES.L2,
|
|
38
|
+
logPrefix: "L2",
|
|
39
|
+
};
|
|
40
|
+
const L1_TIMELOCK_CONFIG = {
|
|
41
|
+
chain: "L1",
|
|
42
|
+
stageType: "L1_TIMELOCK",
|
|
43
|
+
blockTimeSeconds: constants_1.BLOCK_TIMES.L1,
|
|
44
|
+
logPrefix: "L1",
|
|
45
|
+
};
|
|
46
|
+
// ============================================================================
|
|
47
|
+
// L2-Specific: Security Council Handling
|
|
48
|
+
// ============================================================================
|
|
49
|
+
/**
|
|
50
|
+
* Get Security Council enrichment data if applicable.
|
|
51
|
+
* Returns data to merge into stage, or null if not a SC operation.
|
|
52
|
+
*/
|
|
53
|
+
async function getSecurityCouncilData(timelockState, operationId, provider) {
|
|
54
|
+
const queueTxHash = timelockState.scheduledData?.txHash;
|
|
55
|
+
if (!queueTxHash)
|
|
56
|
+
return null;
|
|
57
|
+
const receipt = await (0, rpc_utils_1.queryWithRetry)(() => provider.getTransactionReceipt(queueTxHash));
|
|
58
|
+
if (!(0, security_council_1.isSecurityCouncilOperation)(receipt))
|
|
59
|
+
return null;
|
|
60
|
+
const scParams = (0, security_council_1.extractSecurityCouncilParamsForOperation)(receipt, operationId);
|
|
61
|
+
if (!scParams)
|
|
62
|
+
return null;
|
|
63
|
+
return {
|
|
64
|
+
isSecurityCouncilOperation: true,
|
|
65
|
+
securityCouncilMembers: scParams.members,
|
|
66
|
+
securityCouncilNonce: scParams.nonce.toString(),
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
// ============================================================================
|
|
70
|
+
// L1-Specific: Operation ID Discovery
|
|
71
|
+
// ============================================================================
|
|
72
|
+
/**
|
|
73
|
+
* Find L1 operation ID from a known OutBox execution transaction.
|
|
74
|
+
*/
|
|
75
|
+
async function findL1OperationIdFromTx(outboxTxHash, outboxTxBlock, l1Provider) {
|
|
76
|
+
const receipt = await (0, rpc_utils_1.queryWithRetry)(() => l1Provider.getTransactionReceipt(outboxTxHash));
|
|
77
|
+
if (!receipt) {
|
|
78
|
+
return { l1OperationId: null, l1ScheduleTxHash: outboxTxHash, l1ScheduleBlock: outboxTxBlock };
|
|
79
|
+
}
|
|
80
|
+
for (const logEntry of receipt.logs) {
|
|
81
|
+
if ((0, chain_1.addressEquals)(logEntry.address, constants_1.ADDRESSES.L1_TIMELOCK) &&
|
|
82
|
+
logEntry.topics[0] === constants_1.EVENT_TOPICS.CALL_SCHEDULED) {
|
|
83
|
+
const parsed = (0, timelock_discovery_1.parseCallScheduledEvent)(logEntry);
|
|
84
|
+
if (parsed) {
|
|
85
|
+
return {
|
|
86
|
+
l1OperationId: parsed.operationId,
|
|
87
|
+
l1ScheduleTxHash: outboxTxHash,
|
|
88
|
+
l1ScheduleBlock: outboxTxBlock,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return { l1OperationId: null, l1ScheduleTxHash: outboxTxHash, l1ScheduleBlock: outboxTxBlock };
|
|
94
|
+
}
|
|
95
|
+
// ============================================================================
|
|
96
|
+
// Generic Tracking Function
|
|
97
|
+
// ============================================================================
|
|
98
|
+
/**
|
|
99
|
+
* Unified timelock stage tracking.
|
|
100
|
+
* Works for both L1 and L2 timelocks with configuration-driven differences.
|
|
101
|
+
*/
|
|
102
|
+
async function trackTimelock(config, timelockAddress, operationId, provider, fromBlock, options = {}) {
|
|
103
|
+
const builder = new stage_builder_1.StageBuilder(config.stageType, config.chain);
|
|
104
|
+
if (!operationId) {
|
|
105
|
+
return {
|
|
106
|
+
stage: builder.status("NOT_STARTED").build(),
|
|
107
|
+
timelockState: null,
|
|
108
|
+
operationState: null,
|
|
109
|
+
executionTxHash: null,
|
|
110
|
+
executionBlock: null,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
const operationState = await (0, timelock_discovery_1.getTimelockOperationState)(timelockAddress, operationId, provider);
|
|
114
|
+
if (!operationState.isOperation) {
|
|
115
|
+
return {
|
|
116
|
+
stage: builder
|
|
117
|
+
.status("NOT_STARTED")
|
|
118
|
+
.data({ operationId, reason: `${config.chain} operation not scheduled yet` })
|
|
119
|
+
.build(),
|
|
120
|
+
timelockState: null,
|
|
121
|
+
operationState: null,
|
|
122
|
+
executionTxHash: null,
|
|
123
|
+
executionBlock: null,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
const timelockState = await (0, timelock_discovery_1.getTimelockState)(timelockAddress, operationId, provider, {
|
|
127
|
+
fromBlock,
|
|
128
|
+
scheduledData: options.callScheduledData,
|
|
129
|
+
skipLogSearch: false,
|
|
130
|
+
});
|
|
131
|
+
const { timestamp: currentTimestamp } = await (0, timing_1.getCurrentBlockInfo)(provider);
|
|
132
|
+
const eta = await (0, stage_helpers_1.calculateTimelockEta)(timelockState, operationState, provider);
|
|
133
|
+
// Add base data
|
|
134
|
+
builder.data({ operationId, timelockAddress, state: operationState.state, eta });
|
|
135
|
+
const allData = (0, stage_helpers_1.collectAllScheduledData)(timelockState);
|
|
136
|
+
if (allData.length > 0) {
|
|
137
|
+
builder.data({ callScheduledData: (0, stage_helpers_1.serializeCallScheduledDataArray)(allData) });
|
|
138
|
+
}
|
|
139
|
+
// Check for Security Council enrichment (L2 only)
|
|
140
|
+
if (options.checkSecurityCouncil) {
|
|
141
|
+
const scData = await getSecurityCouncilData(timelockState, operationId, provider);
|
|
142
|
+
if (scData) {
|
|
143
|
+
builder.data(scData);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// Compute and cache salt and predecessor
|
|
147
|
+
if (config.stageType === "L2_TIMELOCK") {
|
|
148
|
+
// Get current stage data for salt computation
|
|
149
|
+
const currentData = builder.build().data;
|
|
150
|
+
const salt = await (0, salt_computation_1.computeL2TimelockSalt)(currentData, options.allStages, provider);
|
|
151
|
+
builder.data({ salt });
|
|
152
|
+
// Cache predecessor from CallScheduled event (usually HashZero for governor proposals)
|
|
153
|
+
if (allData.length > 0 && allData[0].predecessor) {
|
|
154
|
+
builder.data({ predecessor: allData[0].predecessor });
|
|
155
|
+
}
|
|
156
|
+
log("%s: Computed salt: %s", config.logPrefix, salt.slice(0, 10) + "...");
|
|
157
|
+
}
|
|
158
|
+
else if (config.stageType === "L1_TIMELOCK") {
|
|
159
|
+
const { salt, predecessor } = (0, salt_computation_1.computeL1TimelockSalt)(options.allStages);
|
|
160
|
+
builder.data({ salt });
|
|
161
|
+
if (predecessor) {
|
|
162
|
+
builder.data({ predecessor });
|
|
163
|
+
}
|
|
164
|
+
log("%s: Computed salt: %s", config.logPrefix, salt.slice(0, 10) + "...");
|
|
165
|
+
}
|
|
166
|
+
// Determine if operation uses scheduleBatch or schedule by trying both validations
|
|
167
|
+
if (allData.length > 0) {
|
|
168
|
+
const salt = builder.build().data.salt ?? ethers_1.ethers.constants.HashZero;
|
|
169
|
+
const predecessor = builder.build().data.predecessor ?? ethers_1.ethers.constants.HashZero;
|
|
170
|
+
// Try batch validation first (common for L2 timelock)
|
|
171
|
+
const targets = allData.map((d) => d.target);
|
|
172
|
+
const values = allData.map((d) => d.value);
|
|
173
|
+
const payloads = allData.map((d) => d.data);
|
|
174
|
+
const isBatch = await (0, operation_id_1.validateSaltBatch)(timelockAddress, operationId, { targets, values, payloads, predecessor, salt }, provider);
|
|
175
|
+
if (isBatch) {
|
|
176
|
+
builder.data({ isBatchOperation: true });
|
|
177
|
+
log("%s: Operation uses scheduleBatch", config.logPrefix);
|
|
178
|
+
}
|
|
179
|
+
else {
|
|
180
|
+
// Try single validation
|
|
181
|
+
const isSingle = await (0, operation_id_1.validateSalt)(timelockAddress, operationId, {
|
|
182
|
+
target: allData[0].target,
|
|
183
|
+
value: allData[0].value,
|
|
184
|
+
data: allData[0].data,
|
|
185
|
+
predecessor,
|
|
186
|
+
salt,
|
|
187
|
+
}, provider);
|
|
188
|
+
if (isSingle) {
|
|
189
|
+
builder.data({ isBatchOperation: false });
|
|
190
|
+
log("%s: Operation uses schedule", config.logPrefix);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
log("%s: Warning - neither schedule nor scheduleBatch validation succeeded", config.logPrefix);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
if (options.additionalPayload) {
|
|
198
|
+
builder.data(options.additionalPayload);
|
|
199
|
+
}
|
|
200
|
+
// Add queue transaction if available (for all statuses where scheduled)
|
|
201
|
+
let queueTimestamp;
|
|
202
|
+
if (timelockState.scheduledData?.txHash &&
|
|
203
|
+
timelockState.scheduledData.blockNumber !== undefined) {
|
|
204
|
+
queueTimestamp = await (0, base_1.getBlockTimestamp)(timelockState.scheduledData.blockNumber, provider);
|
|
205
|
+
builder.tx(timelockState.scheduledData.txHash, timelockState.scheduledData.blockNumber, config.chain, { timestamp: queueTimestamp, description: "queued" });
|
|
206
|
+
}
|
|
207
|
+
// Determine status based on operation state
|
|
208
|
+
// Priority: COMPLETED (isDone) > READY (isReady) > PENDING (isPending) > NOT_STARTED
|
|
209
|
+
if (operationState.isDone) {
|
|
210
|
+
let executionSearchStart = timelockState?.scheduledData?.blockNumber ?? fromBlock;
|
|
211
|
+
if (timelockState?.scheduledData) {
|
|
212
|
+
const delaySeconds = timelockState.scheduledData.delay.toNumber();
|
|
213
|
+
if (delaySeconds > 0) {
|
|
214
|
+
executionSearchStart = await (0, timing_1.blockAfterDelay)(provider, timelockState.scheduledData.blockNumber, delaySeconds, config.blockTimeSeconds);
|
|
215
|
+
log("%s execution search optimized: start=%d", config.logPrefix, executionSearchStart);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
if (options.cachedExecutionTxHash) {
|
|
219
|
+
const receipt = await provider.getTransactionReceipt(options.cachedExecutionTxHash);
|
|
220
|
+
if (receipt) {
|
|
221
|
+
const execTimestamp = await (0, base_1.getBlockTimestamp)(receipt.blockNumber, provider);
|
|
222
|
+
builder
|
|
223
|
+
.status("COMPLETED")
|
|
224
|
+
.tx(options.cachedExecutionTxHash, receipt.blockNumber, config.chain, {
|
|
225
|
+
timestamp: execTimestamp,
|
|
226
|
+
description: "executed",
|
|
227
|
+
})
|
|
228
|
+
.timing({ startedAt: queueTimestamp ?? execTimestamp })
|
|
229
|
+
.data({ operationId });
|
|
230
|
+
return {
|
|
231
|
+
stage: builder.build(),
|
|
232
|
+
timelockState,
|
|
233
|
+
operationState,
|
|
234
|
+
executionTxHash: options.cachedExecutionTxHash,
|
|
235
|
+
executionBlock: receipt.blockNumber,
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// searchAndCompleteTimelockExecution expects a stage, so build and pass
|
|
240
|
+
const executionResult = await (0, stage_helpers_1.searchAndCompleteTimelockExecution)(builder.build(), timelockAddress, operationId, provider, config.chain, executionSearchStart, undefined, queueTimestamp);
|
|
241
|
+
return {
|
|
242
|
+
stage: executionResult.stage,
|
|
243
|
+
timelockState,
|
|
244
|
+
operationState,
|
|
245
|
+
executionTxHash: executionResult.executionTxHash,
|
|
246
|
+
executionBlock: executionResult.executionBlock,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
else if (operationState.isReady) {
|
|
250
|
+
builder.status("READY");
|
|
251
|
+
if (queueTimestamp) {
|
|
252
|
+
builder.timing({ startedAt: queueTimestamp });
|
|
253
|
+
}
|
|
254
|
+
// Build execution payload
|
|
255
|
+
const executionPayload = (0, stage_helpers_1.buildExecutionPayloadData)(timelockAddress, operationId, allData);
|
|
256
|
+
builder.data(executionPayload);
|
|
257
|
+
return {
|
|
258
|
+
stage: builder.build(),
|
|
259
|
+
timelockState,
|
|
260
|
+
operationState,
|
|
261
|
+
executionTxHash: null,
|
|
262
|
+
executionBlock: null,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
else if (operationState.isPending) {
|
|
266
|
+
builder.status("PENDING");
|
|
267
|
+
if (queueTimestamp && eta) {
|
|
268
|
+
const delayRemaining = eta - currentTimestamp;
|
|
269
|
+
builder.timing({
|
|
270
|
+
startedAt: queueTimestamp,
|
|
271
|
+
eta,
|
|
272
|
+
delaySeconds: delayRemaining > 0 ? delayRemaining : 0,
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
builder.data({ waitingForDelay: true });
|
|
276
|
+
return {
|
|
277
|
+
stage: builder.build(),
|
|
278
|
+
timelockState,
|
|
279
|
+
operationState,
|
|
280
|
+
executionTxHash: null,
|
|
281
|
+
executionBlock: null,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
return {
|
|
285
|
+
stage: builder.status("NOT_STARTED").build(),
|
|
286
|
+
timelockState,
|
|
287
|
+
operationState,
|
|
288
|
+
executionTxHash: null,
|
|
289
|
+
executionBlock: null,
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
// ============================================================================
|
|
293
|
+
// Public Tracking Functions
|
|
294
|
+
// ============================================================================
|
|
295
|
+
/**
|
|
296
|
+
* Track L2 timelock stage (Stage 4)
|
|
297
|
+
*/
|
|
298
|
+
async function trackL2Timelock(timelockAddress, operationId, provider, fromBlock, callScheduledData, options = {}) {
|
|
299
|
+
return trackTimelock(L2_TIMELOCK_CONFIG, timelockAddress, operationId, provider, fromBlock, {
|
|
300
|
+
callScheduledData,
|
|
301
|
+
cachedExecutionTxHash: options.cachedExecutionTxHash,
|
|
302
|
+
checkSecurityCouncil: true,
|
|
303
|
+
allStages: options.allStages,
|
|
304
|
+
});
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Track L1 timelock stage (Stage 6)
|
|
308
|
+
*/
|
|
309
|
+
async function trackL1Timelock(l1Provider, options = {}) {
|
|
310
|
+
let l1OperationId = options.knownL1OperationId ?? null;
|
|
311
|
+
let l1ScheduleBlock = null;
|
|
312
|
+
let l1ScheduleTxHash = null;
|
|
313
|
+
if (!l1OperationId && options.outboxExecutionTx) {
|
|
314
|
+
log("using OutBox tx from previous stage: %s block=%d", options.outboxExecutionTx.hash, options.outboxExecutionTx.blockNumber);
|
|
315
|
+
const discovery = await findL1OperationIdFromTx(options.outboxExecutionTx.hash, options.outboxExecutionTx.blockNumber, l1Provider);
|
|
316
|
+
l1OperationId = discovery.l1OperationId;
|
|
317
|
+
l1ScheduleBlock = discovery.l1ScheduleBlock;
|
|
318
|
+
l1ScheduleTxHash = discovery.l1ScheduleTxHash;
|
|
319
|
+
}
|
|
320
|
+
if (!l1OperationId) {
|
|
321
|
+
const stage = new stage_builder_1.StageBuilder("L1_TIMELOCK", "L1")
|
|
322
|
+
.status("NOT_STARTED")
|
|
323
|
+
.data({
|
|
324
|
+
reason: "L1 operation ID not yet discovered (challenge period may not be complete)",
|
|
325
|
+
})
|
|
326
|
+
.build();
|
|
327
|
+
return {
|
|
328
|
+
stage,
|
|
329
|
+
timelockState: null,
|
|
330
|
+
operationState: null,
|
|
331
|
+
executionTxHash: null,
|
|
332
|
+
executionBlock: null,
|
|
333
|
+
l1OperationId: null,
|
|
334
|
+
l1ScheduleTxHash: null,
|
|
335
|
+
l1ScheduleBlock: null,
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
const fromBlock = l1ScheduleBlock ?? options.fromBlock;
|
|
339
|
+
if (fromBlock === undefined) {
|
|
340
|
+
throw new Error("fromBlock is required for L1 timelock tracking");
|
|
341
|
+
}
|
|
342
|
+
const result = await trackTimelock(L1_TIMELOCK_CONFIG, constants_1.ADDRESSES.L1_TIMELOCK, l1OperationId, l1Provider, fromBlock, { allStages: options.allStages });
|
|
343
|
+
return { ...result, l1OperationId, l1ScheduleTxHash, l1ScheduleBlock };
|
|
344
|
+
}
|
|
345
|
+
// ============================================================================
|
|
346
|
+
// Preparation Functions
|
|
347
|
+
// ============================================================================
|
|
348
|
+
/**
|
|
349
|
+
* Calculate retryable execution value for L1 timelock operations.
|
|
350
|
+
*/
|
|
351
|
+
async function calculateRetryableExecutionValue(_timelockAddress, target, data, provider) {
|
|
352
|
+
if (target.toLowerCase() !== constants_1.ADDRESSES.RETRYABLE_TICKET_MAGIC.toLowerCase()) {
|
|
353
|
+
return null;
|
|
354
|
+
}
|
|
355
|
+
let decoded;
|
|
356
|
+
try {
|
|
357
|
+
decoded = ethers_1.ethers.utils.defaultAbiCoder.decode(["address", "address", "uint256", "uint256", "uint256", "bytes"], data);
|
|
358
|
+
}
|
|
359
|
+
catch {
|
|
360
|
+
return null;
|
|
361
|
+
}
|
|
362
|
+
const inboxAddress = decoded[0];
|
|
363
|
+
const innerValue = decoded[2];
|
|
364
|
+
const innerGasLimit = decoded[3];
|
|
365
|
+
const innerMaxFeePerGas = decoded[4];
|
|
366
|
+
const innerData = decoded[5];
|
|
367
|
+
const inbox = new ethers_1.ethers.Contract(inboxAddress, abis_1.INBOX_ABI, provider);
|
|
368
|
+
const gasPrice = await (0, rpc_utils_1.queryWithRetry)(() => provider.getGasPrice());
|
|
369
|
+
const dataLength = ethers_1.ethers.utils.hexDataLength(innerData);
|
|
370
|
+
const submissionFee = await (0, rpc_utils_1.queryWithRetry)(() => inbox.callStatic.calculateRetryableSubmissionFee(dataLength, gasPrice));
|
|
371
|
+
return submissionFee.mul(2).add(innerGasLimit.mul(innerMaxFeePerGas)).add(innerValue);
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Calculate batch retryable values for L1 timelock.
|
|
375
|
+
*/
|
|
376
|
+
async function calculateBatchRetryableValues(timelockAddress, targets, values, payloads, provider) {
|
|
377
|
+
const calculatedValues = [];
|
|
378
|
+
for (let i = 0; i < targets.length; i++) {
|
|
379
|
+
const retryableValue = await calculateRetryableExecutionValue(timelockAddress, targets[i], payloads[i], provider);
|
|
380
|
+
calculatedValues.push(retryableValue ?? values[i]);
|
|
381
|
+
}
|
|
382
|
+
return calculatedValues;
|
|
383
|
+
}
|
|
384
|
+
/**
|
|
385
|
+
* Helper: Get salt from cached stage data or user override
|
|
386
|
+
*/
|
|
387
|
+
function getSalt(stageData, options) {
|
|
388
|
+
return options.salt ?? stageData.salt ?? ethers_1.ethers.constants.HashZero;
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Helper: Get predecessor from cached stage data or user override
|
|
392
|
+
*/
|
|
393
|
+
function getPredecessor(stageData, options) {
|
|
394
|
+
return (options.predecessor ?? stageData.predecessor ?? ethers_1.ethers.constants.HashZero);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Prepare a single timelock operation for execution.
|
|
398
|
+
*/
|
|
399
|
+
async function prepareTimelockOperation(timelockAddress, params, operationId, stageData, provider, options = {}) {
|
|
400
|
+
logExecution("Preparing timelock operation %s", operationId);
|
|
401
|
+
const salt = getSalt(stageData, options);
|
|
402
|
+
const predecessor = getPredecessor(stageData, options);
|
|
403
|
+
if (!options.force) {
|
|
404
|
+
const stateError = await (0, base_1.checkOperationReady)(timelockAddress, operationId, provider);
|
|
405
|
+
if (stateError)
|
|
406
|
+
return stateError;
|
|
407
|
+
}
|
|
408
|
+
// Validate the cached salt (unless skipped)
|
|
409
|
+
if (!options.skipSaltValidation) {
|
|
410
|
+
const isValid = await (0, operation_id_1.validateSalt)(timelockAddress, operationId, { target: params.target, value: params.value, data: params.data, predecessor, salt }, provider);
|
|
411
|
+
if (!isValid) {
|
|
412
|
+
return (0, base_1.failPrepare)(`Salt validation failed for operation ${operationId}. ` +
|
|
413
|
+
`Cached salt ${salt} does not produce the expected operation ID. ` +
|
|
414
|
+
`This may indicate incorrect salt computation during tracking. ` +
|
|
415
|
+
`Override with options.salt if needed.`);
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
const retryableValue = !options.skipRetryableValueCalculation
|
|
419
|
+
? await calculateRetryableExecutionValue(timelockAddress, params.target, params.data, provider)
|
|
420
|
+
: null;
|
|
421
|
+
const executionValue = retryableValue ?? params.value;
|
|
422
|
+
const chain = await (0, chain_1.getChainType)(provider);
|
|
423
|
+
const calldata = abis_1.timelockInterface.encodeFunctionData("execute", [
|
|
424
|
+
params.target,
|
|
425
|
+
params.value,
|
|
426
|
+
params.data,
|
|
427
|
+
predecessor,
|
|
428
|
+
salt,
|
|
429
|
+
]);
|
|
430
|
+
return {
|
|
431
|
+
success: true,
|
|
432
|
+
prepared: {
|
|
433
|
+
to: timelockAddress,
|
|
434
|
+
data: calldata,
|
|
435
|
+
value: executionValue.toString(),
|
|
436
|
+
chain,
|
|
437
|
+
description: `execute() on ${chain} timelock`,
|
|
438
|
+
operationId,
|
|
439
|
+
},
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Prepare a batch timelock operation for execution.
|
|
444
|
+
*/
|
|
445
|
+
async function prepareTimelockBatch(timelockAddress, params, operationId, stageData, provider, options = {}) {
|
|
446
|
+
logExecution("Preparing timelock batch %s", operationId);
|
|
447
|
+
if (!params.targets?.length) {
|
|
448
|
+
return (0, base_1.failPrepare)("Batch must have at least one target");
|
|
449
|
+
}
|
|
450
|
+
if (params.targets.length !== params.values.length ||
|
|
451
|
+
params.targets.length !== params.payloads.length) {
|
|
452
|
+
return (0, base_1.failPrepare)("Array length mismatch in batch params");
|
|
453
|
+
}
|
|
454
|
+
const salt = getSalt(stageData, options);
|
|
455
|
+
const predecessor = getPredecessor(stageData, options);
|
|
456
|
+
if (!options.force) {
|
|
457
|
+
const stateError = await (0, base_1.checkOperationReady)(timelockAddress, operationId, provider);
|
|
458
|
+
if (stateError)
|
|
459
|
+
return stateError;
|
|
460
|
+
}
|
|
461
|
+
// Validate the cached salt (unless skipped)
|
|
462
|
+
if (!options.skipSaltValidation) {
|
|
463
|
+
const isValid = await (0, operation_id_1.validateSaltBatch)(timelockAddress, operationId, {
|
|
464
|
+
targets: params.targets,
|
|
465
|
+
values: params.values,
|
|
466
|
+
payloads: params.payloads,
|
|
467
|
+
predecessor,
|
|
468
|
+
salt,
|
|
469
|
+
}, provider);
|
|
470
|
+
if (!isValid) {
|
|
471
|
+
return (0, base_1.failPrepare)(`Salt validation failed for batch operation ${operationId}. ` +
|
|
472
|
+
`Cached salt ${salt} does not produce the expected operation ID. ` +
|
|
473
|
+
`This may indicate incorrect salt computation during tracking. ` +
|
|
474
|
+
`Override with options.salt if needed.`);
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
let executionValues = params.values;
|
|
478
|
+
if (!options.skipRetryableValueCalculation) {
|
|
479
|
+
executionValues = await calculateBatchRetryableValues(timelockAddress, params.targets, params.values, params.payloads, provider);
|
|
480
|
+
}
|
|
481
|
+
const totalValue = executionValues.reduce((acc, v) => acc.add(v), ethers_1.BigNumber.from(0));
|
|
482
|
+
const chain = await (0, chain_1.getChainType)(provider);
|
|
483
|
+
const calldata = abis_1.timelockInterface.encodeFunctionData("executeBatch", [
|
|
484
|
+
params.targets,
|
|
485
|
+
params.values,
|
|
486
|
+
params.payloads,
|
|
487
|
+
predecessor,
|
|
488
|
+
salt,
|
|
489
|
+
]);
|
|
490
|
+
return {
|
|
491
|
+
success: true,
|
|
492
|
+
prepared: {
|
|
493
|
+
to: timelockAddress,
|
|
494
|
+
data: calldata,
|
|
495
|
+
value: totalValue.toString(),
|
|
496
|
+
chain,
|
|
497
|
+
description: `executeBatch() on ${chain} timelock`,
|
|
498
|
+
operationId,
|
|
499
|
+
},
|
|
500
|
+
};
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Prepare a timelock stage for execution (auto-detects single vs batch).
|
|
504
|
+
*
|
|
505
|
+
* @param stage - The timelock stage to prepare (salt should be pre-computed in stage.data)
|
|
506
|
+
* @param provider - Provider for the chain where timelock is deployed
|
|
507
|
+
* @param options - Preparation options (can override salt with options.salt)
|
|
508
|
+
*/
|
|
509
|
+
async function prepareTimelockStage(stage, provider, options = {}) {
|
|
510
|
+
const validationError = (0, stage_helpers_1.validateStageForPrepare)(stage, { force: options.force });
|
|
511
|
+
if (validationError)
|
|
512
|
+
return validationError;
|
|
513
|
+
const stageData = (0, stage_helpers_1.createTimelockStageData)(stage);
|
|
514
|
+
if (!stageData) {
|
|
515
|
+
return (0, base_1.failPrepare)("Stage is not a timelock stage");
|
|
516
|
+
}
|
|
517
|
+
const { timelockAddress, operationId } = stageData;
|
|
518
|
+
if (!timelockAddress || !operationId) {
|
|
519
|
+
return (0, base_1.failPrepare)("Missing timelock address or operation ID");
|
|
520
|
+
}
|
|
521
|
+
const { callScheduledData } = stageData;
|
|
522
|
+
if (!callScheduledData?.length) {
|
|
523
|
+
return (0, base_1.failPrepare)("Missing callScheduledData for preparation.");
|
|
524
|
+
}
|
|
525
|
+
const sortedData = [...callScheduledData].sort((a, b) => a.index.toNumber() - b.index.toNumber());
|
|
526
|
+
const targets = sortedData.map((d) => d.target);
|
|
527
|
+
const values = sortedData.map((d) => d.value.toString());
|
|
528
|
+
const payloads = sortedData.map((d) => d.data);
|
|
529
|
+
const predecessor = sortedData[0].predecessor;
|
|
530
|
+
const resolvedPredecessor = options.predecessor ?? predecessor ?? ethers_1.ethers.constants.HashZero;
|
|
531
|
+
// Use cached isBatchOperation to determine which method to use
|
|
532
|
+
// Fallback to count-based logic if not cached
|
|
533
|
+
const timelockData = stage.data;
|
|
534
|
+
const useBatch = timelockData.isBatchOperation ?? targets.length > 1;
|
|
535
|
+
if (useBatch) {
|
|
536
|
+
return prepareTimelockBatch(timelockAddress, {
|
|
537
|
+
targets,
|
|
538
|
+
values: values.map((v) => ethers_1.BigNumber.from(v)),
|
|
539
|
+
payloads,
|
|
540
|
+
predecessor: resolvedPredecessor,
|
|
541
|
+
salt: "",
|
|
542
|
+
}, operationId, stage.data, provider, options);
|
|
543
|
+
}
|
|
544
|
+
return prepareTimelockOperation(timelockAddress, {
|
|
545
|
+
target: targets[0],
|
|
546
|
+
value: ethers_1.BigNumber.from(values[0]),
|
|
547
|
+
data: payloads[0],
|
|
548
|
+
predecessor: resolvedPredecessor,
|
|
549
|
+
salt: "",
|
|
550
|
+
}, operationId, stage.data, provider, options);
|
|
551
|
+
}
|
|
552
|
+
//# sourceMappingURL=timelock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timelock.js","sourceRoot":"","sources":["../../src/stages/timelock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Voting Stage Tracking
|
|
3
|
+
*
|
|
4
|
+
* Stage 2: Track voting period including extensions and vetting
|
|
5
|
+
*
|
|
6
|
+
* IMPORTANT: Vetting deadline uses L1 block numbers, not L2 block numbers.
|
|
7
|
+
* When calculating ETA for vetting period, we must use L1 block time.
|
|
8
|
+
*/
|
|
9
|
+
import { ethers } from "ethers";
|
|
10
|
+
import { ProposalData, TrackedStage, VotingData } from "../types";
|
|
11
|
+
/**
|
|
12
|
+
* Track voting stage for a proposal
|
|
13
|
+
*/
|
|
14
|
+
export declare function trackVotingStage(governorAddress: string, proposalId: string, proposalData: ProposalData, provider: ethers.providers.Provider): Promise<{
|
|
15
|
+
stage: TrackedStage;
|
|
16
|
+
votingData: VotingData | null;
|
|
17
|
+
}>;
|
|
18
|
+
//# sourceMappingURL=voting.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"voting.d.ts","sourceRoot":"","sources":["../../src/stages/voting.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAelE;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,eAAe,EAAE,MAAM,EACvB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,EAC1B,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,QAAQ,GAClC,OAAO,CAAC;IACT,KAAK,EAAE,YAAY,CAAC;IACpB,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;CAC/B,CAAC,CAmHD"}
|