Skip to content

Commit a8749ab

Browse files
authored
Merge pull request #575 from lidofinance/vote-197
Omnibus 27.12.2025 (#197 Redistribute LDO)
2 parents b03ec2b + a18a24f commit a8749ab

File tree

5 files changed

+802
-11
lines changed

5 files changed

+802
-11
lines changed

archive/scripts/vote_2025_12_27.py

Lines changed: 293 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,293 @@
1+
"""
2+
Vote 2025_12_27
3+
4+
1. Revoke vesting (ID = 0) of 48,934,690.0011 LDO from 0xa8107de483f9623390d543b77c8e4bbb6f7af752 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249
5+
2. Vest 10,000,000 LDO to 0xED3D9bAC1B26610A6f8C42F4Fd2c741a16647056 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)
6+
3. Vest 5,000,000 LDO to 0x7bd77405a7c28F50a1010e2185297A25165FD5C6 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)
7+
4. Vest 5,000,000 LDO to 0x7E363142293cc25F96F94d5621ea01bCCe2890E8 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)
8+
5. Vest 5,000,000 LDO to 0xECE4e341EbcC2B57c40FCf74f47bc61DfDC87fe2 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)
9+
6. Vest 5,000,000 LDO to 0x7F514FC631Cca86303e20575592143DD2E253175 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)
10+
7. Vest 5,000,000 LDO to 0xdCdeC1fce45e76fE82E036344DE19061d1f0aA31 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)
11+
8. Vest 5,000,000 LDO to 0x3d56d86a60b92132b37f226EA5A23F84C805Ce29 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)
12+
9. Vest 5,000,000 LDO to 0x28562FBe6d078d2526A0A8d1489245fF74fcA7eB via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)
13+
10. Vest 2,000,000 LDO to 0xf930e6d88ecd10788361517fc45C986c0a1b10e5 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)
14+
11. Vest 1,934,690.0011 LDO to 0x00E78b7770D8a41A0f37f2d206e65f9Cd391cf0a via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)
15+
12. Revoke role 0xe97b137254058bd94f28d2f3eb79e2d34074ffb488d042e3bc958e0a57d2fa22 on TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 from contract 0xc2f50d3277539fbd54346278e7b92faa76dc7364
16+
13. Revoke role 0x2406f1e99f79cea012fb88c5c36566feaeefee0f4b98d3a376b49310222b53c4 on TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 from contract 0xc2f50d3277539fbd54346278e7b92faa76dc7364
17+
14. Revoke role 0xf5a08927c847d7a29dc35e105208dbde5ce951392105d712761cc5d17440e2ff on TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 from contract 0xc2f50d3277539fbd54346278e7b92faa76dc7364
18+
19+
Vote #197 passed & executed on Jan-01-2026 02:10:47 PM UTC, block 24140293.
20+
"""
21+
22+
from typing import Dict, List, Tuple
23+
from brownie import interface
24+
25+
from utils.voting import bake_vote_items, confirm_vote_script, create_vote
26+
from utils.ipfs import upload_vote_ipfs_description, calculate_vote_ipfs_description
27+
from utils.config import get_deployer_account, get_is_live, get_priority_fee
28+
from utils.mainnet_fork import pass_and_exec_dao_vote
29+
from utils.permissions import encode_permission_revoke
30+
31+
32+
# ============================== Addresses ===================================
33+
VOTING = "0x2e59A20f205bB85a89C53f1936454680651E618e"
34+
TOKEN_MANAGER = "0xf73a1260d222f447210581DDf212D915c09a3249"
35+
REVESTING_CONTRACT = "0xc2f50d3277539fbd54346278e7b92faa76dc7364"
36+
37+
SOURCE_ADDRESS = "0xa8107de483f9623390d543b77c8e4bbb6f7af752"
38+
SOURCE_ADDRESS_VESTING_ID = 0
39+
SOURCE_LDO = 48_934_690_0011 * 10**14 # 48,934,690.0011 LDO
40+
41+
TARGET_ADDRESSES = [
42+
"0xED3D9bAC1B26610A6f8C42F4Fd2c741a16647056",
43+
"0x7bd77405a7c28F50a1010e2185297A25165FD5C6",
44+
"0x7E363142293cc25F96F94d5621ea01bCCe2890E8",
45+
"0xECE4e341EbcC2B57c40FCf74f47bc61DfDC87fe2",
46+
"0x7F514FC631Cca86303e20575592143DD2E253175",
47+
"0xdCdeC1fce45e76fE82E036344DE19061d1f0aA31",
48+
"0x3d56d86a60b92132b37f226EA5A23F84C805Ce29",
49+
"0x28562FBe6d078d2526A0A8d1489245fF74fcA7eB",
50+
"0xf930e6d88ecd10788361517fc45C986c0a1b10e5",
51+
"0x00E78b7770D8a41A0f37f2d206e65f9Cd391cf0a",
52+
]
53+
TARGET_LDOS = [
54+
10_000_000 * 10**18,
55+
5_000_000 * 10**18,
56+
5_000_000 * 10**18,
57+
5_000_000 * 10**18,
58+
5_000_000 * 10**18,
59+
5_000_000 * 10**18,
60+
5_000_000 * 10**18,
61+
5_000_000 * 10**18,
62+
2_000_000 * 10**18,
63+
1_934_690_0011 * 10**14,
64+
]
65+
66+
VESTING_START = 1767225600 # Thu Jan 01 2026 00:00:00 GMT+0000
67+
VESTING_CLIFF = 1798761600 # Fri Jan 01 2027 00:00:00 GMT+0000
68+
VESTING_TOTAL = VESTING_CLIFF
69+
IS_REVOKABLE = True
70+
71+
72+
# ============================= Description ==================================
73+
IPFS_DESCRIPTION = "Execute asset recovery proposal with a 1-year long cliff"
74+
75+
76+
# ================================ Main ======================================
77+
def get_vote_items() -> Tuple[List[str], List[Tuple[str, str]]]:
78+
79+
token_manager = interface.TokenManager(TOKEN_MANAGER)
80+
81+
vote_desc_items, call_script_items = zip(
82+
(
83+
"1. Revoke vesting (ID = 0) of 48,934,690.0011 LDO from 0xa8107de483f9623390d543b77c8e4bbb6f7af752 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249",
84+
(
85+
token_manager.address,
86+
token_manager.revokeVesting.encode_input(
87+
SOURCE_ADDRESS,
88+
SOURCE_ADDRESS_VESTING_ID,
89+
)
90+
)
91+
),
92+
(
93+
"2. Vest 10,000,000 LDO to 0xED3D9bAC1B26610A6f8C42F4Fd2c741a16647056 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)",
94+
(
95+
token_manager.address,
96+
token_manager.assignVested.encode_input(
97+
TARGET_ADDRESSES[0],
98+
TARGET_LDOS[0],
99+
VESTING_START,
100+
VESTING_CLIFF,
101+
VESTING_TOTAL,
102+
IS_REVOKABLE
103+
)
104+
),
105+
),
106+
(
107+
"3. Vest 5,000,000 LDO to 0x7bd77405a7c28F50a1010e2185297A25165FD5C6 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)",
108+
(
109+
token_manager.address,
110+
token_manager.assignVested.encode_input(
111+
TARGET_ADDRESSES[1],
112+
TARGET_LDOS[1],
113+
VESTING_START,
114+
VESTING_CLIFF,
115+
VESTING_TOTAL,
116+
IS_REVOKABLE
117+
)
118+
),
119+
),
120+
(
121+
"4. Vest 5,000,000 LDO to 0x7E363142293cc25F96F94d5621ea01bCCe2890E8 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)",
122+
(
123+
token_manager.address,
124+
token_manager.assignVested.encode_input(
125+
TARGET_ADDRESSES[2],
126+
TARGET_LDOS[2],
127+
VESTING_START,
128+
VESTING_CLIFF,
129+
VESTING_TOTAL,
130+
IS_REVOKABLE
131+
)
132+
),
133+
),
134+
(
135+
"5. Vest 5,000,000 LDO to 0xECE4e341EbcC2B57c40FCf74f47bc61DfDC87fe2 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)",
136+
(
137+
token_manager.address,
138+
token_manager.assignVested.encode_input(
139+
TARGET_ADDRESSES[3],
140+
TARGET_LDOS[3],
141+
VESTING_START,
142+
VESTING_CLIFF,
143+
VESTING_TOTAL,
144+
IS_REVOKABLE
145+
)
146+
),
147+
),
148+
(
149+
"6. Vest 5,000,000 LDO to 0x7F514FC631Cca86303e20575592143DD2E253175 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)",
150+
(
151+
token_manager.address,
152+
token_manager.assignVested.encode_input(
153+
TARGET_ADDRESSES[4],
154+
TARGET_LDOS[4],
155+
VESTING_START,
156+
VESTING_CLIFF,
157+
VESTING_TOTAL,
158+
IS_REVOKABLE
159+
)
160+
),
161+
),
162+
(
163+
"7. Vest 5,000,000 LDO to 0xdCdeC1fce45e76fE82E036344DE19061d1f0aA31 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)",
164+
(
165+
token_manager.address,
166+
token_manager.assignVested.encode_input(
167+
TARGET_ADDRESSES[5],
168+
TARGET_LDOS[5],
169+
VESTING_START,
170+
VESTING_CLIFF,
171+
VESTING_TOTAL,
172+
IS_REVOKABLE
173+
)
174+
),
175+
),
176+
(
177+
"8. Vest 5,000,000 LDO to 0x3d56d86a60b92132b37f226EA5A23F84C805Ce29 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)",
178+
(
179+
token_manager.address,
180+
token_manager.assignVested.encode_input(
181+
TARGET_ADDRESSES[6],
182+
TARGET_LDOS[6],
183+
VESTING_START,
184+
VESTING_CLIFF,
185+
VESTING_TOTAL,
186+
IS_REVOKABLE
187+
)
188+
),
189+
),
190+
(
191+
"9. Vest 5,000,000 LDO to 0x28562FBe6d078d2526A0A8d1489245fF74fcA7eB via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)",
192+
(
193+
token_manager.address,
194+
token_manager.assignVested.encode_input(
195+
TARGET_ADDRESSES[7],
196+
TARGET_LDOS[7],
197+
VESTING_START,
198+
VESTING_CLIFF,
199+
VESTING_TOTAL,
200+
IS_REVOKABLE
201+
)
202+
),
203+
),
204+
(
205+
"10. Vest 2,000,000 LDO to 0xf930e6d88ecd10788361517fc45C986c0a1b10e5 via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)",
206+
(
207+
token_manager.address,
208+
token_manager.assignVested.encode_input(
209+
TARGET_ADDRESSES[8],
210+
TARGET_LDOS[8],
211+
VESTING_START,
212+
VESTING_CLIFF,
213+
VESTING_TOTAL,
214+
IS_REVOKABLE
215+
)
216+
),
217+
),
218+
(
219+
"11. Vest 1,934,690.0011 LDO to 0x00E78b7770D8a41A0f37f2d206e65f9Cd391cf0a via TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 (start = Jan 01 2026 00:00:00 GMT+0; cliff = total = Jan 01 2027 00:00:00 GMT+0; revokable)",
220+
(
221+
token_manager.address,
222+
token_manager.assignVested.encode_input(
223+
TARGET_ADDRESSES[9],
224+
TARGET_LDOS[9],
225+
VESTING_START,
226+
VESTING_CLIFF,
227+
VESTING_TOTAL,
228+
IS_REVOKABLE
229+
)
230+
),
231+
),
232+
(
233+
"12. Revoke role 0xe97b137254058bd94f28d2f3eb79e2d34074ffb488d042e3bc958e0a57d2fa22 on TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 from contract 0xc2f50d3277539fbd54346278e7b92faa76dc7364",
234+
encode_permission_revoke(
235+
target_app=TOKEN_MANAGER,
236+
permission_name="BURN_ROLE",
237+
revoke_from=REVESTING_CONTRACT,
238+
),
239+
),
240+
(
241+
"13. Revoke role 0x2406f1e99f79cea012fb88c5c36566feaeefee0f4b98d3a376b49310222b53c4 on TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 from contract 0xc2f50d3277539fbd54346278e7b92faa76dc7364",
242+
encode_permission_revoke(
243+
target_app=TOKEN_MANAGER,
244+
permission_name="ISSUE_ROLE",
245+
revoke_from=REVESTING_CONTRACT,
246+
),
247+
),
248+
(
249+
"14. Revoke role 0xf5a08927c847d7a29dc35e105208dbde5ce951392105d712761cc5d17440e2ff on TokenManager 0xf73a1260d222f447210581DDf212D915c09a3249 from contract 0xc2f50d3277539fbd54346278e7b92faa76dc7364",
250+
encode_permission_revoke(
251+
target_app=TOKEN_MANAGER,
252+
permission_name="ASSIGN_ROLE",
253+
revoke_from=REVESTING_CONTRACT,
254+
),
255+
),
256+
)
257+
258+
return vote_desc_items, call_script_items
259+
260+
261+
def start_vote(tx_params: Dict[str, str], silent: bool = False):
262+
vote_desc_items, call_script_items = get_vote_items()
263+
vote_items = bake_vote_items(list(vote_desc_items), list(call_script_items))
264+
265+
desc_ipfs = (
266+
calculate_vote_ipfs_description(IPFS_DESCRIPTION)
267+
if silent else upload_vote_ipfs_description(IPFS_DESCRIPTION)
268+
)
269+
270+
vote_id, tx = confirm_vote_script(vote_items, silent, desc_ipfs) and list(
271+
create_vote(vote_items, tx_params, desc_ipfs=desc_ipfs)
272+
)
273+
274+
return vote_id, tx
275+
276+
277+
def main():
278+
tx_params: Dict[str, str] = {"from": get_deployer_account().address}
279+
if get_is_live():
280+
tx_params["priority_fee"] = get_priority_fee()
281+
282+
vote_id, _ = start_vote(tx_params=tx_params, silent=False)
283+
vote_id >= 0 and print(f"Vote created: {vote_id}.")
284+
285+
286+
def start_and_execute_vote_on_fork_manual():
287+
if get_is_live():
288+
raise Exception("This script is for local testing only.")
289+
290+
tx_params = {"from": get_deployer_account()}
291+
vote_id, _ = start_vote(tx_params=tx_params, silent=True)
292+
print(f"Vote created: {vote_id}.")
293+
pass_and_exec_dao_vote(int(vote_id), step_by_step=True)

0 commit comments

Comments
 (0)