@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
package/dist/election.js
ADDED
|
@@ -0,0 +1,464 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Security Council Election Tracking
|
|
4
|
+
*
|
|
5
|
+
* Provides functions to check election status and prepare election creation transactions.
|
|
6
|
+
* Based on SecurityCouncilElectionTracker from governance repo.
|
|
7
|
+
*
|
|
8
|
+
* @module election
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.checkElectionStatus = checkElectionStatus;
|
|
12
|
+
exports.prepareElectionCreation = prepareElectionCreation;
|
|
13
|
+
exports.hasVettingPeriod = hasVettingPeriod;
|
|
14
|
+
exports.trackElectionProposal = trackElectionProposal;
|
|
15
|
+
exports.getElectionProposalId = getElectionProposalId;
|
|
16
|
+
exports.getElectionProposalParams = getElectionProposalParams;
|
|
17
|
+
exports.prepareMemberElectionTrigger = prepareMemberElectionTrigger;
|
|
18
|
+
const ethers_1 = require("ethers");
|
|
19
|
+
const constants_1 = require("./constants");
|
|
20
|
+
const rpc_utils_1 = require("./utils/rpc-utils");
|
|
21
|
+
const timing_1 = require("./utils/timing");
|
|
22
|
+
const logger_1 = require("./utils/logger");
|
|
23
|
+
const log = logger_1.loggers.election;
|
|
24
|
+
const abis_1 = require("./abis");
|
|
25
|
+
// Helper functions
|
|
26
|
+
/** Create a nominee election governor contract instance */
|
|
27
|
+
function getNomineeGovernor(address = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR, provider) {
|
|
28
|
+
return new ethers_1.ethers.Contract(address, abis_1.NOMINEE_ELECTION_GOVERNOR_ABI, provider);
|
|
29
|
+
}
|
|
30
|
+
/** Create a member election governor contract instance */
|
|
31
|
+
function getMemberGovernor(address = constants_1.ADDRESSES.ELECTION_MEMBER_GOVERNOR, provider) {
|
|
32
|
+
return new ethers_1.ethers.Contract(address, abis_1.MEMBER_ELECTION_GOVERNOR_ABI, provider);
|
|
33
|
+
}
|
|
34
|
+
// Core Functions
|
|
35
|
+
/**
|
|
36
|
+
* Check the status of the Security Council election
|
|
37
|
+
*
|
|
38
|
+
* Determines if a new election can be created and when the next one is scheduled.
|
|
39
|
+
*
|
|
40
|
+
* @param l2Provider - Arbitrum One provider
|
|
41
|
+
* @param l1Provider - Ethereum mainnet provider (for L1 timestamp)
|
|
42
|
+
* @param nomineeGovernorAddress - Optional override for nominee election governor address
|
|
43
|
+
* @returns Election status information
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```typescript
|
|
47
|
+
* const status = await checkElectionStatus(l2Provider, l1Provider);
|
|
48
|
+
*
|
|
49
|
+
* if (status.canCreateElection) {
|
|
50
|
+
* console.log("Election ready to create!");
|
|
51
|
+
* } else {
|
|
52
|
+
* console.log(`Next election in ${status.timeUntilElection}`);
|
|
53
|
+
* }
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
async function checkElectionStatus(l2Provider, l1Provider, nomineeGovernorAddress = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR) {
|
|
57
|
+
log("checkElectionStatus for %s", nomineeGovernorAddress);
|
|
58
|
+
const governor = getNomineeGovernor(nomineeGovernorAddress, l2Provider);
|
|
59
|
+
// Get L1 block number as seen from L2
|
|
60
|
+
const l1BlockNumber = await (0, timing_1.getL1BlockNumberFromL2)(l2Provider);
|
|
61
|
+
log("L1 block number from L2: %s", l1BlockNumber.toString());
|
|
62
|
+
// Get L1 timestamp for that block
|
|
63
|
+
const l1Block = await (0, rpc_utils_1.queryWithRetry)(() => l1Provider.getBlock(l1BlockNumber.toNumber()));
|
|
64
|
+
if (!l1Block) {
|
|
65
|
+
throw new Error(`L1 block ${l1BlockNumber.toString()} not found. ` +
|
|
66
|
+
`If using a fork, ensure L1 is forked at a block >= ${l1BlockNumber.toString()}`);
|
|
67
|
+
}
|
|
68
|
+
const currentL1Timestamp = l1Block.timestamp;
|
|
69
|
+
log("L1 timestamp: %d", currentL1Timestamp);
|
|
70
|
+
// Get election count, cohort, and next election timestamp
|
|
71
|
+
const electionCount = await (0, rpc_utils_1.queryWithRetry)(() => governor.electionCount());
|
|
72
|
+
const [nextElectionTimestamp, cohort] = await Promise.all([
|
|
73
|
+
(0, rpc_utils_1.queryWithRetry)(() => governor.electionToTimestamp(electionCount)),
|
|
74
|
+
(0, rpc_utils_1.queryWithRetry)(() => governor.electionIndexToCohort(electionCount)),
|
|
75
|
+
]);
|
|
76
|
+
log("electionCount=%s nextTimestamp=%s cohort=%d", electionCount.toString(), nextElectionTimestamp.toString(), cohort);
|
|
77
|
+
const secondsUntilElection = Math.max(0, nextElectionTimestamp.toNumber() - currentL1Timestamp);
|
|
78
|
+
const canCreateElection = secondsUntilElection === 0;
|
|
79
|
+
return {
|
|
80
|
+
electionCount: electionCount.toNumber(),
|
|
81
|
+
cohort: cohort,
|
|
82
|
+
nextElectionTimestamp: nextElectionTimestamp.toNumber(),
|
|
83
|
+
currentL1Timestamp,
|
|
84
|
+
canCreateElection,
|
|
85
|
+
secondsUntilElection,
|
|
86
|
+
timeUntilElection: formatDuration(secondsUntilElection),
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Prepare a transaction to create a new Security Council election
|
|
91
|
+
*
|
|
92
|
+
* Only call this if checkElectionStatus indicates canCreateElection is true.
|
|
93
|
+
*
|
|
94
|
+
* @param electionStatus - Status from checkElectionStatus (provides current election count)
|
|
95
|
+
* @param nomineeGovernorAddress - Optional override for nominee election governor address
|
|
96
|
+
* @returns Prepared transaction for creating the election
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```typescript
|
|
100
|
+
* const status = await checkElectionStatus(l2Provider, l1Provider);
|
|
101
|
+
*
|
|
102
|
+
* if (status.canCreateElection) {
|
|
103
|
+
* const { transaction, electionIndex } = prepareElectionCreation(status);
|
|
104
|
+
* console.log(`Creating election #${electionIndex}`);
|
|
105
|
+
* // Execute with your signer
|
|
106
|
+
* const tx = await signer.sendTransaction({
|
|
107
|
+
* to: transaction.to,
|
|
108
|
+
* data: transaction.data,
|
|
109
|
+
* });
|
|
110
|
+
* await tx.wait();
|
|
111
|
+
* }
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
function prepareElectionCreation(electionStatus, nomineeGovernorAddress = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR) {
|
|
115
|
+
const governor = getNomineeGovernor(nomineeGovernorAddress);
|
|
116
|
+
const calldata = governor.interface.encodeFunctionData("createElection", []);
|
|
117
|
+
return {
|
|
118
|
+
transaction: {
|
|
119
|
+
to: nomineeGovernorAddress,
|
|
120
|
+
data: calldata,
|
|
121
|
+
value: "0",
|
|
122
|
+
chain: "L2",
|
|
123
|
+
description: `createElection() on SecurityCouncilNomineeElectionGovernor for election #${electionStatus.electionCount}`,
|
|
124
|
+
},
|
|
125
|
+
electionIndex: electionStatus.electionCount,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Check if a governor has a vetting period (is a nominee election governor)
|
|
130
|
+
*
|
|
131
|
+
* @param governorAddress - Address of the governor to check
|
|
132
|
+
* @param provider - Provider for the chain the governor is on
|
|
133
|
+
* @returns True if the governor has a vetting period
|
|
134
|
+
*/
|
|
135
|
+
async function hasVettingPeriod(governorAddress, provider) {
|
|
136
|
+
const governor = getNomineeGovernor(governorAddress, provider);
|
|
137
|
+
try {
|
|
138
|
+
await governor.nomineeVetter();
|
|
139
|
+
return true;
|
|
140
|
+
}
|
|
141
|
+
catch {
|
|
142
|
+
return false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
// Helpers
|
|
146
|
+
/**
|
|
147
|
+
* Format a duration in seconds to a human-readable string
|
|
148
|
+
*/
|
|
149
|
+
function formatDuration(seconds) {
|
|
150
|
+
if (seconds <= 0)
|
|
151
|
+
return "now";
|
|
152
|
+
// Ensure we're working with integers for clean display
|
|
153
|
+
const totalSeconds = Math.floor(seconds);
|
|
154
|
+
const days = Math.floor(totalSeconds / 86400);
|
|
155
|
+
const hours = Math.floor((totalSeconds % 86400) / 3600);
|
|
156
|
+
const minutes = Math.floor((totalSeconds % 3600) / 60);
|
|
157
|
+
const secs = totalSeconds % 60;
|
|
158
|
+
const parts = [];
|
|
159
|
+
if (days > 0)
|
|
160
|
+
parts.push(`${days}d`);
|
|
161
|
+
if (hours > 0)
|
|
162
|
+
parts.push(`${hours}h`);
|
|
163
|
+
if (minutes > 0)
|
|
164
|
+
parts.push(`${minutes}m`);
|
|
165
|
+
if (secs > 0 && parts.length < 2)
|
|
166
|
+
parts.push(`${secs}s`);
|
|
167
|
+
return parts.join(" ") || "0s";
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Convert numeric proposal state to string
|
|
171
|
+
*/
|
|
172
|
+
function stateToString(state) {
|
|
173
|
+
const states = [
|
|
174
|
+
"Pending",
|
|
175
|
+
"Active",
|
|
176
|
+
"Canceled",
|
|
177
|
+
"Defeated",
|
|
178
|
+
"Succeeded",
|
|
179
|
+
"Queued",
|
|
180
|
+
"Expired",
|
|
181
|
+
"Executed",
|
|
182
|
+
];
|
|
183
|
+
const result = states[state];
|
|
184
|
+
if (!result) {
|
|
185
|
+
throw new Error(`Unknown proposal state number: ${state}`);
|
|
186
|
+
}
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
// Election Proposal Tracking
|
|
190
|
+
/**
|
|
191
|
+
* Track the status of a Security Council election by its index
|
|
192
|
+
*
|
|
193
|
+
* This function provides detailed tracking of an election's progress through
|
|
194
|
+
* the nominee selection, vetting, and member election phases.
|
|
195
|
+
*
|
|
196
|
+
* @param electionIndex - The election index to track
|
|
197
|
+
* @param l2Provider - Arbitrum One provider
|
|
198
|
+
* @param l1Provider - Ethereum mainnet provider (for L1 block number)
|
|
199
|
+
* @param options - Optional address overrides
|
|
200
|
+
* @returns Detailed election proposal status
|
|
201
|
+
*
|
|
202
|
+
* @example
|
|
203
|
+
* ```typescript
|
|
204
|
+
* const status = await trackElectionProposal(
|
|
205
|
+
* 5, // election index
|
|
206
|
+
* l2Provider,
|
|
207
|
+
* l1Provider
|
|
208
|
+
* );
|
|
209
|
+
*
|
|
210
|
+
* if (status.phase === "VETTING_PERIOD") {
|
|
211
|
+
* console.log(`${status.compliantNomineeCount}/6 nominees compliant`);
|
|
212
|
+
* }
|
|
213
|
+
* ```
|
|
214
|
+
*/
|
|
215
|
+
async function trackElectionProposal(electionIndex, l2Provider, _l1Provider, options = {}) {
|
|
216
|
+
const nomineeGovernorAddress = options.nomineeGovernorAddress ?? constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR;
|
|
217
|
+
const memberGovernorAddress = options.memberGovernorAddress ?? constants_1.ADDRESSES.ELECTION_MEMBER_GOVERNOR;
|
|
218
|
+
log("trackElectionProposal for index %d", electionIndex);
|
|
219
|
+
const nomineeGovernor = getNomineeGovernor(nomineeGovernorAddress, l2Provider);
|
|
220
|
+
const memberGovernor = getMemberGovernor(memberGovernorAddress, l2Provider);
|
|
221
|
+
// Get cohort for this election
|
|
222
|
+
const cohort = (await (0, rpc_utils_1.queryWithRetry)(() => nomineeGovernor.electionIndexToCohort(electionIndex)));
|
|
223
|
+
// Get nominee proposal ID for this election
|
|
224
|
+
const nomineeProposalId = await getElectionProposalId(electionIndex, l2Provider, nomineeGovernorAddress);
|
|
225
|
+
// If no nominee proposal, election hasn't started
|
|
226
|
+
if (!nomineeProposalId) {
|
|
227
|
+
return {
|
|
228
|
+
electionIndex,
|
|
229
|
+
phase: "NOT_STARTED",
|
|
230
|
+
cohort,
|
|
231
|
+
nomineeProposalId: null,
|
|
232
|
+
memberProposalId: null,
|
|
233
|
+
nomineeProposalState: null,
|
|
234
|
+
memberProposalState: null,
|
|
235
|
+
compliantNomineeCount: 0,
|
|
236
|
+
targetNomineeCount: constants_1.TIMING.SECURITY_COUNCIL_TARGET_NOMINEES,
|
|
237
|
+
vettingDeadline: null,
|
|
238
|
+
isInVettingPeriod: false,
|
|
239
|
+
canProceedToMemberPhase: false,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
// Get nominee proposal state
|
|
243
|
+
const nomineeState = await (0, rpc_utils_1.queryWithRetry)(() => nomineeGovernor.state(nomineeProposalId));
|
|
244
|
+
const nomineeProposalState = stateToString(nomineeState);
|
|
245
|
+
// Get vetting deadline
|
|
246
|
+
const vettingDeadlineBN = await (0, rpc_utils_1.queryWithRetry)(() => nomineeGovernor.proposalVettingDeadline(nomineeProposalId));
|
|
247
|
+
const vettingDeadline = vettingDeadlineBN.toNumber();
|
|
248
|
+
// Get current L1 block number
|
|
249
|
+
const currentL1Block = await (0, timing_1.getL1BlockNumberFromL2)(l2Provider);
|
|
250
|
+
// Determine if in vetting period
|
|
251
|
+
const isInVettingPeriod = nomineeProposalState === "Succeeded" && currentL1Block.lte(vettingDeadlineBN);
|
|
252
|
+
// Get compliant nominee count
|
|
253
|
+
let compliantNomineeCount = 0;
|
|
254
|
+
try {
|
|
255
|
+
const count = await (0, rpc_utils_1.queryWithRetry)(() => nomineeGovernor.compliantNomineeCount(nomineeProposalId));
|
|
256
|
+
compliantNomineeCount = count.toNumber();
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// May fail if no nominees yet
|
|
260
|
+
}
|
|
261
|
+
// Check for member proposal
|
|
262
|
+
let memberProposalId = null;
|
|
263
|
+
let memberProposalState = null;
|
|
264
|
+
try {
|
|
265
|
+
const memberPropId = await (0, rpc_utils_1.queryWithRetry)(() => memberGovernor.electionIndexToProposalId(electionIndex));
|
|
266
|
+
if (!memberPropId.isZero()) {
|
|
267
|
+
memberProposalId = memberPropId.toString();
|
|
268
|
+
const memberState = await (0, rpc_utils_1.queryWithRetry)(() => memberGovernor.state(memberProposalId));
|
|
269
|
+
memberProposalState = stateToString(memberState);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
// Member election not yet created
|
|
274
|
+
}
|
|
275
|
+
// Determine phase
|
|
276
|
+
let phase;
|
|
277
|
+
if (memberProposalState === "Executed") {
|
|
278
|
+
phase = "COMPLETED";
|
|
279
|
+
}
|
|
280
|
+
else if (memberProposalId) {
|
|
281
|
+
if (memberProposalState === "Succeeded" || memberProposalState === "Queued") {
|
|
282
|
+
phase = "PENDING_EXECUTION";
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
phase = "MEMBER_ELECTION";
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
else if (isInVettingPeriod) {
|
|
289
|
+
phase = "VETTING_PERIOD";
|
|
290
|
+
}
|
|
291
|
+
else if (nomineeProposalState === "Active" || nomineeProposalState === "Pending") {
|
|
292
|
+
phase = "NOMINEE_SELECTION";
|
|
293
|
+
}
|
|
294
|
+
else if (nomineeProposalState === "Succeeded") {
|
|
295
|
+
// Past vetting, waiting for member election creation
|
|
296
|
+
phase = "PENDING_EXECUTION";
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
phase = "NOT_STARTED";
|
|
300
|
+
}
|
|
301
|
+
// Can proceed if vetting ended and has enough compliant nominees
|
|
302
|
+
const canProceedToMemberPhase = nomineeProposalState === "Succeeded" &&
|
|
303
|
+
!isInVettingPeriod &&
|
|
304
|
+
compliantNomineeCount >= constants_1.TIMING.SECURITY_COUNCIL_TARGET_NOMINEES &&
|
|
305
|
+
!memberProposalId;
|
|
306
|
+
return {
|
|
307
|
+
electionIndex,
|
|
308
|
+
phase,
|
|
309
|
+
cohort,
|
|
310
|
+
nomineeProposalId,
|
|
311
|
+
memberProposalId,
|
|
312
|
+
nomineeProposalState,
|
|
313
|
+
memberProposalState,
|
|
314
|
+
compliantNomineeCount,
|
|
315
|
+
targetNomineeCount: constants_1.TIMING.SECURITY_COUNCIL_TARGET_NOMINEES,
|
|
316
|
+
vettingDeadline,
|
|
317
|
+
isInVettingPeriod,
|
|
318
|
+
canProceedToMemberPhase,
|
|
319
|
+
};
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Get the proposal ID for a given election index
|
|
323
|
+
*
|
|
324
|
+
* Uses getProposeArgs to get proposal parameters and hashProposal to calculate the proposal ID.
|
|
325
|
+
*
|
|
326
|
+
* @param electionIndex - Election index
|
|
327
|
+
* @param provider - L2 provider
|
|
328
|
+
* @param nomineeGovernorAddress - Optional governor address override
|
|
329
|
+
* @returns Proposal ID or null if election not yet created
|
|
330
|
+
*/
|
|
331
|
+
async function getElectionProposalId(electionIndex, provider, nomineeGovernorAddress = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR) {
|
|
332
|
+
const governor = getNomineeGovernor(nomineeGovernorAddress, provider);
|
|
333
|
+
// Get proposal arguments for this election
|
|
334
|
+
// getProposeArgs returns: [targets, values, calldatas, description]
|
|
335
|
+
const proposeArgs = (await (0, rpc_utils_1.queryWithRetry)(() => governor.getProposeArgs(electionIndex)));
|
|
336
|
+
const [targets, values, calldatas, description] = proposeArgs;
|
|
337
|
+
// Hash the description to get descriptionHash
|
|
338
|
+
const descriptionHash = ethers_1.ethers.utils.id(description);
|
|
339
|
+
// Calculate proposal ID using hashProposal
|
|
340
|
+
const proposalId = await (0, rpc_utils_1.queryWithRetry)(() => governor.hashProposal(targets, values, calldatas, descriptionHash));
|
|
341
|
+
// Convert bytes32 to decimal string
|
|
342
|
+
return ethers_1.BigNumber.from(proposalId).toString();
|
|
343
|
+
}
|
|
344
|
+
// Member Election Trigger Functions
|
|
345
|
+
/**
|
|
346
|
+
* Get the proposal parameters for an election proposal
|
|
347
|
+
*
|
|
348
|
+
* Searches for the ProposalCreated event to extract targets, values, calldatas,
|
|
349
|
+
* and description needed for execute() call.
|
|
350
|
+
*
|
|
351
|
+
* @param electionIndex - Election index
|
|
352
|
+
* @param provider - L2 provider
|
|
353
|
+
* @param nomineeGovernorAddress - Optional governor address override
|
|
354
|
+
* @returns Election proposal params or null if not found
|
|
355
|
+
*/
|
|
356
|
+
async function getElectionProposalParams(electionIndex, provider, nomineeGovernorAddress = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR) {
|
|
357
|
+
log("getElectionProposalParams for index %d", electionIndex);
|
|
358
|
+
const proposalId = await getElectionProposalId(electionIndex, provider, nomineeGovernorAddress);
|
|
359
|
+
if (!proposalId) {
|
|
360
|
+
log("No proposal ID found for election %d", electionIndex);
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
// Search for ProposalCreated event
|
|
364
|
+
const topic = abis_1.proposalCreatedInterface.getEventTopic("ProposalCreated");
|
|
365
|
+
// Get proposal snapshot to narrow search range
|
|
366
|
+
const governor = getNomineeGovernor(nomineeGovernorAddress, provider);
|
|
367
|
+
let startBlock;
|
|
368
|
+
try {
|
|
369
|
+
const snapshot = await governor.proposalSnapshot(proposalId);
|
|
370
|
+
// Search from ~1000 blocks before snapshot (proposal is created before snapshot)
|
|
371
|
+
startBlock = Math.max(0, snapshot.toNumber() - 1000);
|
|
372
|
+
}
|
|
373
|
+
catch {
|
|
374
|
+
// Fallback: search last 10000 blocks
|
|
375
|
+
const currentBlock = await provider.getBlockNumber();
|
|
376
|
+
startBlock = Math.max(0, currentBlock - 10000);
|
|
377
|
+
}
|
|
378
|
+
const currentBlock = await provider.getBlockNumber();
|
|
379
|
+
const logs = await (0, rpc_utils_1.queryWithRetry)(() => provider.getLogs({
|
|
380
|
+
address: nomineeGovernorAddress,
|
|
381
|
+
topics: [topic],
|
|
382
|
+
fromBlock: startBlock,
|
|
383
|
+
toBlock: currentBlock,
|
|
384
|
+
}));
|
|
385
|
+
// Find the log matching our proposal ID
|
|
386
|
+
for (const eventLog of logs) {
|
|
387
|
+
try {
|
|
388
|
+
const parsed = abis_1.proposalCreatedInterface.parseLog(eventLog);
|
|
389
|
+
// Cast through unknown required due to ethers' Result type structure
|
|
390
|
+
const args = parsed.args;
|
|
391
|
+
if (args.proposalId.toString() === proposalId) {
|
|
392
|
+
log("Found ProposalCreated event for proposal %s", proposalId);
|
|
393
|
+
return {
|
|
394
|
+
targets: args.targets,
|
|
395
|
+
values: args.values,
|
|
396
|
+
calldatas: args.calldatas,
|
|
397
|
+
description: args.description,
|
|
398
|
+
descriptionHash: ethers_1.ethers.utils.id(args.description),
|
|
399
|
+
};
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
catch {
|
|
403
|
+
continue;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
log("ProposalCreated event not found for proposal %s", proposalId);
|
|
407
|
+
return null;
|
|
408
|
+
}
|
|
409
|
+
/**
|
|
410
|
+
* Prepare a transaction to trigger member election creation
|
|
411
|
+
*
|
|
412
|
+
* After the vetting period ends with 6+ compliant nominees, calling execute()
|
|
413
|
+
* on the NomineeElectionGovernor creates the member election proposal.
|
|
414
|
+
*
|
|
415
|
+
* @param electionStatus - Status from trackElectionProposal (must have canProceedToMemberPhase=true)
|
|
416
|
+
* @param provider - L2 provider
|
|
417
|
+
* @param nomineeGovernorAddress - Optional governor address override
|
|
418
|
+
* @returns Prepared transaction or null if not ready
|
|
419
|
+
*
|
|
420
|
+
* @example
|
|
421
|
+
* ```typescript
|
|
422
|
+
* const status = await trackElectionProposal(5, l2Provider, l1Provider);
|
|
423
|
+
*
|
|
424
|
+
* if (status.canProceedToMemberPhase) {
|
|
425
|
+
* const prepared = await prepareMemberElectionTrigger(status, l2Provider);
|
|
426
|
+
* if (prepared) {
|
|
427
|
+
* const tx = await signer.sendTransaction({
|
|
428
|
+
* to: prepared.to,
|
|
429
|
+
* data: prepared.data,
|
|
430
|
+
* });
|
|
431
|
+
* await tx.wait();
|
|
432
|
+
* console.log("Member election created!");
|
|
433
|
+
* }
|
|
434
|
+
* }
|
|
435
|
+
* ```
|
|
436
|
+
*/
|
|
437
|
+
async function prepareMemberElectionTrigger(electionStatus, provider, nomineeGovernorAddress = constants_1.ADDRESSES.ELECTION_NOMINEE_GOVERNOR) {
|
|
438
|
+
log("prepareMemberElectionTrigger for election %d", electionStatus.electionIndex);
|
|
439
|
+
if (!electionStatus.canProceedToMemberPhase) {
|
|
440
|
+
log("Cannot proceed to member phase - not ready");
|
|
441
|
+
return null;
|
|
442
|
+
}
|
|
443
|
+
// Get proposal params
|
|
444
|
+
const params = await getElectionProposalParams(electionStatus.electionIndex, provider, nomineeGovernorAddress);
|
|
445
|
+
if (!params) {
|
|
446
|
+
log("Could not find proposal params for election %d", electionStatus.electionIndex);
|
|
447
|
+
return null;
|
|
448
|
+
}
|
|
449
|
+
// Build execute calldata using governor interface
|
|
450
|
+
const calldata = abis_1.governorInterface.encodeFunctionData("execute", [
|
|
451
|
+
params.targets,
|
|
452
|
+
params.values,
|
|
453
|
+
params.calldatas,
|
|
454
|
+
params.descriptionHash,
|
|
455
|
+
]);
|
|
456
|
+
return {
|
|
457
|
+
to: nomineeGovernorAddress,
|
|
458
|
+
data: calldata,
|
|
459
|
+
value: "0",
|
|
460
|
+
chain: "L2",
|
|
461
|
+
description: `execute() on NomineeElectionGovernor to trigger member election #${electionStatus.electionIndex}`,
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
//# sourceMappingURL=election.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"election.js","sourceRoot":"","sources":["../src/election.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Arbitrum Governance Stage Tracking SDK
|
|
3
|
+
*
|
|
4
|
+
* A lightweight, high-performance library for tracking Arbitrum DAO
|
|
5
|
+
* governance proposal lifecycle stages.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* import { createTracker, findExecutableStage } from "@gzeoneth/gov-tracker";
|
|
10
|
+
*
|
|
11
|
+
* const tracker = createTracker({
|
|
12
|
+
* l2Provider: new ethers.providers.JsonRpcProvider(ARB1_RPC),
|
|
13
|
+
* l1Provider: new ethers.providers.JsonRpcProvider(ETH_RPC),
|
|
14
|
+
* });
|
|
15
|
+
*
|
|
16
|
+
* const results = await tracker.trackByTxHash(proposalCreationTxHash);
|
|
17
|
+
* const readyStage = findExecutableStage(results[0].stages);
|
|
18
|
+
* if (readyStage) {
|
|
19
|
+
* const prep = await tracker.prepareTransaction(readyStage);
|
|
20
|
+
* if (prep.success) {
|
|
21
|
+
* const tx = await signer.sendTransaction(prep.prepared);
|
|
22
|
+
* }
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
* @packageDocumentation
|
|
26
|
+
*/
|
|
27
|
+
export { ProposalStageTracker, createTracker, extractTimelockLink } from "./tracker";
|
|
28
|
+
export type { StageType, StageStatus, ChainType, TrackedStage, StageTransaction, StageTiming, StageDataMap, TypedTrackedStage, StageTrackingContext, NextStageHints, StageTrackResult, StageTrackResultWith, TrackingResult, TrackingInput, GovernorTrackingInput, TimelockTrackingInput, TrackingCheckpoint, TrackerStats, TrackingProgress, OnProgressCallback, DiscoveryWatermarks, DiscoveryTargets, ExecutionResult, PreparedTransaction, PrepareResult, PrepareOptions, TrackerOptions, CacheAdapter, ChunkingConfig, ProposalType, GovernorCapability, ProposalState, ProposalData, TimelockState, TimelockParams, TimelockBatchParams, CallScheduledData, TimelockLink, L2ToL1MessageStatus, L2ToL1MessageData, RetryableStatus, RetryableData, EstimatedTimesResult, EstimatedTimeRange, ProposalCreatedData, VotingActiveData, ProposalQueuedData, TimelockStageData, L2TimelockData, L1TimelockData, L2ToL1MessageStageData, RetryableStageData, CohortType, ElectionPhase, ElectionProposalStatus, ElectionStatus, GovernorProposalState, ElectionCheckResult, } from "./types";
|
|
29
|
+
export { isStageType, getStageData } from "./types";
|
|
30
|
+
export { ADDRESSES, CHAIN_IDS, DEFAULT_RPC_URLS, CHUNK_SIZES, isElectionGovernor, buildDefaultTargets, } from "./constants";
|
|
31
|
+
export { findExecutableStage, findAllExecutableStages, needsAction, getTrackingStatusSummary, getCurrentStage, areAllStagesComplete, extractOperationId, isTimelockStage, } from "./stages/base";
|
|
32
|
+
export { detectProposalType, isElectionProposal, detectGovernorCapabilities, getTimelockAddress, getProposalState, discoverProposalByTxHash, } from "./discovery/governor-discovery";
|
|
33
|
+
export type { DiscoveredProposal } from "./discovery/governor-discovery";
|
|
34
|
+
export { isKnownL2Timelock, isL1Timelock, getTimelockOperationState, getTimelockState, findCallScheduledByTxHash, } from "./discovery/timelock-discovery";
|
|
35
|
+
export type { DiscoveredTimelockOp } from "./discovery/timelock-discovery";
|
|
36
|
+
export { isSecurityCouncilOperation, isSecurityCouncilElectionProposal, extractSecurityCouncilParams, extractSecurityCouncilParamsForOperation, checkVettingPeriod, } from "./discovery/security-council";
|
|
37
|
+
export type { SecurityCouncilOperationParams, SecurityCouncilBatchParams, } from "./discovery/security-council";
|
|
38
|
+
export { calculateEta, calculateExpectedEta, calculateRemainingSeconds, estimateTimestampFromBlock, getL1BlockNumberFromL2, } from "./utils/timing";
|
|
39
|
+
export { saltFromDescription, generateSecurityCouncilSalt, decodeL1TimelockSchedule, } from "./utils/salt-computation";
|
|
40
|
+
export type { DecodedTimelockSchedule } from "./utils/salt-computation";
|
|
41
|
+
export { validateSalt, validateSaltBatch, computeAndValidateOperationHash, tryFindSalt, } from "./utils/operation-id";
|
|
42
|
+
export { prepareTimelockOperation, prepareTimelockBatch, prepareTimelockStage, calculateRetryableExecutionValue, calculateBatchRetryableValues, } from "./stages/timelock";
|
|
43
|
+
export { prepareL2ToL1Message, prepareL2ToL1MessageStage, getL2ToL1Messages, } from "./stages/l2-to-l1-message";
|
|
44
|
+
export type { OutboxPrepareOptions } from "./stages/l2-to-l1-message";
|
|
45
|
+
export { prepareRetryableRedemption, prepareAllRetryables, prepareRetryableStage, } from "./stages/retryables";
|
|
46
|
+
export type { RetryablePrepareOptions } from "./stages/retryables";
|
|
47
|
+
export { prepareGovernorQueue } from "./stages/proposal-queued";
|
|
48
|
+
export type { GovernorProposalParams } from "./stages/proposal-queued";
|
|
49
|
+
export { getTxUrl, getStageTransactionUrl, chainTypeToId } from "./utils/urls";
|
|
50
|
+
export { getStageMetadata, getAllStageMetadata, getActionableStages, formatStageTitle, getTotalExpectedDuration, } from "./utils/stage-metadata";
|
|
51
|
+
export type { StageMetadata } from "./utils/stage-metadata";
|
|
52
|
+
export { addressEquals, isAddressIn, getChainType } from "./utils/chain";
|
|
53
|
+
export { checkElectionStatus, prepareElectionCreation, hasVettingPeriod, trackElectionProposal, getElectionProposalId, getElectionProposalParams, prepareMemberElectionTrigger, } from "./election";
|
|
54
|
+
export type { PreparedElectionCreation, ElectionProposalParams } from "./election";
|
|
55
|
+
export { createCheckpoint, createTrackingContext } from "./tracker/context";
|
|
56
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAOH,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAGrF,YAAY,EAEV,SAAS,EACT,WAAW,EACX,SAAS,EACT,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,YAAY,EACZ,iBAAiB,EAEjB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,EAElB,mBAAmB,EACnB,gBAAgB,EAEhB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,cAAc,EAEd,cAAc,EACd,YAAY,EACZ,cAAc,EAEd,YAAY,EACZ,kBAAkB,EAClB,aAAa,EACb,YAAY,EAEZ,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,YAAY,EAEZ,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,aAAa,EAEb,oBAAoB,EACpB,kBAAkB,EAElB,mBAAmB,EACnB,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,sBAAsB,EACtB,kBAAkB,EAElB,UAAU,EACV,aAAa,EACb,sBAAsB,EACtB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGpD,OAAO,EACL,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,WAAW,EACX,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,aAAa,CAAC;AAGrB,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,WAAW,EACX,wBAAwB,EACxB,eAAe,EACf,oBAAoB,EACpB,kBAAkB,EAClB,eAAe,GAChB,MAAM,eAAe,CAAC;AAOvB,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,0BAA0B,EAC1B,kBAAkB,EAClB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAGzE,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,yBAAyB,EACzB,gBAAgB,EAChB,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC;AACxC,YAAY,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAG3E,OAAO,EACL,0BAA0B,EAC1B,iCAAiC,EACjC,4BAA4B,EAC5B,wCAAwC,EACxC,kBAAkB,GACnB,MAAM,8BAA8B,CAAC;AACtC,YAAY,EACV,8BAA8B,EAC9B,0BAA0B,GAC3B,MAAM,8BAA8B,CAAC;AAGtC,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,yBAAyB,EACzB,0BAA0B,EAC1B,sBAAsB,GACvB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,mBAAmB,EACnB,2BAA2B,EAC3B,wBAAwB,GACzB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAGxE,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,+BAA+B,EAC/B,WAAW,GACZ,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EACL,wBAAwB,EACxB,oBAAoB,EACpB,oBAAoB,EACpB,gCAAgC,EAChC,6BAA6B,GAC9B,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAGtE,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAGnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,YAAY,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAOvE,OAAO,EAAE,QAAQ,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG/E,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,wBAAwB,GACzB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAG5D,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAMzE,OAAO,EACL,mBAAmB,EACnB,uBAAuB,EACvB,gBAAgB,EAChB,qBAAqB,EACrB,qBAAqB,EACrB,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAMnF,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC"}
|