Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
6752b45
Revert "Revert "HOODI - CSM v2 + Triggerable Withdrawals""
iamnp Aug 7, 2025
ffe2c21
Vote for exit hashes
hweawer Aug 7, 2025
8794b7d
Update test_permissions.py
iamnp Aug 7, 2025
ee20e34
Update test_permissions.py
iamnp Aug 7, 2025
9d2dac4
Changes
hweawer Aug 8, 2025
44e93ca
Update
hweawer Aug 8, 2025
99599eb
Revert
hweawer Aug 8, 2025
6c9f306
Update
hweawer Aug 8, 2025
1895deb
wip: initial voting scripts
eddort Aug 8, 2025
dc69058
wip: and todos from madlabman
eddort Aug 8, 2025
5d8b706
Vote for exit hashes (#464)
hweawer Aug 11, 2025
37e803c
Voting to exit validators on Hoodi in test NO (#467)
hweawer Aug 14, 2025
c5ccda8
Upgrade verifier (#471)
hweawer Sep 2, 2025
5986074
Fix old addresses mainnet
hweawer Sep 11, 2025
a288c42
Remove redundant vote
hweawer Sep 15, 2025
0bc1a74
Allign with vote template
hweawer Sep 15, 2025
c275e5e
Remove redundant function from the vote
hweawer Sep 15, 2025
28e9885
Update voting tests structure
hweawer Sep 15, 2025
d9ce3d3
feat: addresses for voting. regression, acceptance tests for CSM
vgorkavenko Jul 14, 2025
aa7ddb5
Nethermind voting
hweawer Sep 18, 2025
1e4c70a
dg_proposal_calls in tests
hweawer Sep 18, 2025
cc4149e
Fix prevoting checks
hweawer Sep 18, 2025
ba439c8
Fix: voting changes verification, dg event submition
hweawer Sep 18, 2025
fd2845f
Rearrange validations
hweawer Sep 18, 2025
19ae128
Merge branch 'feat/next-vote' into feat/mainnet-tw-and-csmv2
hweawer Sep 18, 2025
8db95bd
feat: CSM Set Vetted Gate Tree address
vgorkavenko Sep 18, 2025
a0c1ca8
Fix tests
hweawer Sep 18, 2025
4d41b32
Merge branch 'feat/mainnet-tw-and-csmv2' of https://github.com/lidofi…
hweawer Sep 18, 2025
1386702
Update Kiln address
hweawer Sep 19, 2025
af47df4
Merge pull request #465 from lidofinance/feat/mainnet-tw-and-csmv2
iamnp Sep 19, 2025
90aee1c
Merge branch 'master' of github.com:lidofinance/scripts into revert-4…
eddort Sep 19, 2025
dd1f817
Merge branch 'feat/next-vote' of github.com:lidofinance/scripts into …
eddort Sep 19, 2025
de537fc
Revert "Merge branch 'feat/next-vote' of github.com:lidofinance/scrip…
F4ever Sep 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
105 changes: 105 additions & 0 deletions archive/scripts/vote_dg_easy_track_tw_holesky.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
"""
Vote XX/06/2025 [HOLESKY]

1. Grant SUBMIT_REPORT_HASH_ROLE role to the EasyTrack EVM Script Executor
2. Connect TRIGGERABLE_WITHDRAWALS_GATEWAY to Dual Governance tiebreaker
3. Add `SubmitValidatorsExitRequestHashes` (SDVT) EVM script factory to Easy Track
4. Add `SubmitValidatorsExitRequestHashes` (Curated Module) EVM script factory to Easy Track
"""
import time

from typing import Any, Dict
from typing import Tuple, Optional
from utils.config import (
AGENT,
contracts,
get_deployer_account,
get_priority_fee,
get_is_live
)
from utils.dg_decorators import forward_agent, forward_dg_admin, forward_voting, process_voting_items
from utils.ipfs import upload_vote_ipfs_description, calculate_vote_ipfs_description
from utils.voting import confirm_vote_script, create_vote, bake_vote_items
from utils.permissions import encode_oz_grant_role
from utils.easy_track import (
add_evmscript_factory,
create_permissions,
)
from typing import Optional, Tuple, Dict
from utils.config import contracts



TRIGGERABLE_WITHDRAWALS_GATEWAY = "0x4FD4113f2B92856B59BC3be77f2943B7F4eaa9a5"

EASYTRACK_EVMSCRIPT_EXECUTOR = "0x2819B65021E13CEEB9AC33E77DB32c7e64e7520D"

EASYTRACK_SDVT_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY = "0x4aB23f409F8F6EdeF321C735e941E4670804a1B4"
EASYTRACK_CURATED_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY = "0x7A1c5af4625dc1160a7c67d00335B6Ad492bE53f"

DESCRIPTION = "Add Triggerable Withdrawals Gateway to Dual Governance and new Easy Tracks (HOLESKY)"

def start_vote(tx_params: Dict[str, str], silent: bool) -> Tuple[int, Optional[Any]]:
voting_unprepared_items = [
(
f"Grant SUBMIT_REPORT_HASH_ROLE on Validator Exit Bus Oracle to the EasyTrack EVM Script Executor",
forward_agent(
*encode_oz_grant_role(
contract=contracts.validators_exit_bus_oracle,
role_name="SUBMIT_REPORT_HASH_ROLE",
grant_to=EASYTRACK_EVMSCRIPT_EXECUTOR,
),
),
),
(
"Connect TRIGGERABLE_WITHDRAWALS_GATEWAY to Dual Governance tiebreaker",
forward_dg_admin(
contracts.dual_governance.address,
contracts.dual_governance.addTiebreakerSealableWithdrawalBlocker.encode_input(
TRIGGERABLE_WITHDRAWALS_GATEWAY
),
)
),
(
f"Add `SubmitValidatorsExitRequestHashes` (SDVT) EVM script factory with address `{EASYTRACK_SDVT_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY}` to Easy Track `{contracts.easy_track.address}`",
forward_voting(
*add_evmscript_factory(
factory=EASYTRACK_SDVT_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY,
permissions=(create_permissions(contracts.validators_exit_bus_oracle, "submitExitRequestsHash")),
)
)
),
(
f"Add `SubmitValidatorsExitRequestHashes` (Curated Module) EVM script factory with address `{EASYTRACK_CURATED_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY}` to Easy Track `{contracts.easy_track.address}`",
forward_voting(
*add_evmscript_factory(
factory=EASYTRACK_CURATED_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY,
permissions=(create_permissions(contracts.validators_exit_bus_oracle, "submitExitRequestsHash")),
)
)
)
]

if silent:
desc_ipfs = calculate_vote_ipfs_description(DESCRIPTION)
else:
desc_ipfs = upload_vote_ipfs_description(DESCRIPTION)


vote_items = process_voting_items(voting_unprepared_items)
assert confirm_vote_script(vote_items, silent, desc_ipfs)

return create_vote(vote_items, tx_params, desc_ipfs=desc_ipfs)



def main():
tx_params = {"from": get_deployer_account()}
if get_is_live():
tx_params["priority_fee"] = get_priority_fee()

vote_id, _ = start_vote(tx_params=tx_params, silent=False)

vote_id >= 0 and print(f"Vote created: {vote_id}.")

time.sleep(5) # hack for waiting thread #2.
136 changes: 136 additions & 0 deletions archive/scripts/vote_hoodi_exit_hashes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
"""
Vote 2025-08-11 - Submit Exit Requests Hash to ValidatorsExitBus Oracle

1. Upgrade Lido Locator implementation
2. Grant REPORT_VALIDATOR_EXITING_STATUS_ROLE to new validator exit verifier
3. Revoke REPORT_VALIDATOR_EXITING_STATUS_ROLE from old validator exit verifier
4. Grant SUBMIT_REPORT_HASH_ROLE to the agent
5. Submit exit requests hash to ValidatorsExitBus Oracle
6. Revoke SUBMIT_REPORT_HASH_ROLE from the agent

Vote passed & executed on 2025-08-11 04:09 PM GMT+2, block 985695
"""

import time
from typing import Any, Dict, Tuple, Optional
from brownie import interface
from brownie.network.transaction import TransactionReceipt

from utils.config import contracts
from utils.voting import confirm_vote_script, create_vote
from archive.scripts.vote_tw_csm2_hoodi import prepare_proposal
from utils.config import get_deployer_account, get_is_live, get_priority_fee
from utils.agent import agent_forward
from utils.ipfs import upload_vote_ipfs_description, calculate_vote_ipfs_description
from utils.permissions import encode_oz_grant_role, encode_oz_revoke_role

OLD_VALIDATOR_EXIT_VERIFIER = "0xFd4386A8795956f4B6D01cbb6dB116749731D7bD"
# CID: bafkreidetdrrl3zjxer6tv6qqnsxdqrldntydluorllmetpsozl4yr7pva - validators data
EXIT_HASH_TO_SUBMIT = "0x4e72449ac50f5fa83bc2d642f2c95a63f72f1b87ad292f52c0fe5c28f3cf6e47"
LIDO_LOCATOR_IMPL = "0xA656983a6686615850BE018b7d42a7C3E46DcD71"

DESCRIPTION = "TW Upgrade & Test for Validators Exiting via Voting (HOODI)"


def encode_proxy_upgrade_to(proxy: Any, implementation: str) -> Tuple[str, str]:
proxy = interface.OssifiableProxy(proxy)
return proxy.address, proxy.proxy__upgradeTo.encode_input(implementation)


def start_vote(tx_params: Dict[str, str], silent: bool = False) -> Tuple[int, Optional[TransactionReceipt]]:
"""Prepare and run voting."""

validators_exit_bus = interface.ValidatorsExitBusOracle(contracts.validators_exit_bus_oracle)

vote_desc_items, call_script_items = zip(
(
"1. Upgrade Lido Locator implementation",
agent_forward([encode_proxy_upgrade_to(contracts.lido_locator, LIDO_LOCATOR_IMPL)]),
),
(
"2. Grant REPORT_VALIDATOR_EXITING_STATUS_ROLE to new validator exit verifier",
agent_forward(
[
encode_oz_grant_role(
contract=contracts.staking_router,
role_name="REPORT_VALIDATOR_EXITING_STATUS_ROLE",
grant_to=contracts.validator_exit_verifier,
)
]
),
),
(
"3. Revoke REPORT_VALIDATOR_EXITING_STATUS_ROLE from old validator exit verifier",
agent_forward(
[
encode_oz_revoke_role(
contract=contracts.staking_router,
role_name="REPORT_VALIDATOR_EXITING_STATUS_ROLE",
revoke_from=OLD_VALIDATOR_EXIT_VERIFIER,
)
]
),
),
(
"4. Grant SUBMIT_REPORT_HASH_ROLE to the agent",
agent_forward(
[
encode_oz_grant_role(
contract=validators_exit_bus,
role_name="SUBMIT_REPORT_HASH_ROLE",
grant_to=contracts.agent,
)
]
),
),
(
"5. Submit exit requests hash to ValidatorsExitBus Oracle",
agent_forward(
[
(
contracts.validators_exit_bus_oracle.address,
validators_exit_bus.submitExitRequestsHash.encode_input(EXIT_HASH_TO_SUBMIT),
)
]
),
),
(
"6. Revoke SUBMIT_REPORT_HASH_ROLE from the agent",
agent_forward(
[
encode_oz_revoke_role(
contract=validators_exit_bus,
role_name="SUBMIT_REPORT_HASH_ROLE",
revoke_from=contracts.agent,
)
]
),
),
)

if silent:
desc_ipfs = calculate_vote_ipfs_description(DESCRIPTION)
else:
desc_ipfs = upload_vote_ipfs_description(DESCRIPTION)

dg_vote = prepare_proposal(call_script_items, DESCRIPTION)
vote_items = {DESCRIPTION: dg_vote}

assert confirm_vote_script(vote_items, silent, desc_ipfs)
return create_vote(vote_items, tx_params, desc_ipfs=desc_ipfs)


def main():
tx_params = {"from": get_deployer_account()}
if get_is_live():
tx_params["priority_fee"] = get_priority_fee()

vote_id, _ = start_vote(tx_params=tx_params, silent=False)

vote_id >= 0 and print(f"Vote created: {vote_id}.")

time.sleep(5) # hack for waiting thread #2.


if __name__ == "__main__":
main()
98 changes: 98 additions & 0 deletions archive/scripts/vote_hoodi_exit_hashes_2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
"""
Vote August 14, 2025 at 11:09 GMT+2 - Submit Exit Requests Hash to ValidatorsExitBus Oracle

1. Grant SUBMIT_REPORT_HASH_ROLE to the agent
2. Submit exit requests hash to ValidatorsExitBus Oracle
3. Revoke SUBMIT_REPORT_HASH_ROLE from the agent

Vote passed & executed on August 14, 2025 at 11:09 GMT+2, block 1003997
"""

import time
from typing import Any, Dict, Tuple, Optional
from brownie import interface
from brownie.network.transaction import TransactionReceipt

from utils.config import contracts
from utils.voting import confirm_vote_script, create_vote
from archive.scripts.vote_tw_csm2_hoodi import prepare_proposal
from utils.config import get_deployer_account, get_is_live, get_priority_fee
from utils.agent import agent_forward
from utils.ipfs import upload_vote_ipfs_description, calculate_vote_ipfs_description
from utils.permissions import encode_oz_grant_role, encode_oz_revoke_role

# CID: bafkreihtr6nlijylmesqmsp3v2h7c3zbkx7bqwt5qu3jbahojnrt2qm2vy - validators data
EXIT_HASH_TO_SUBMIT = "0xd76d7dd9cb2f102583d2bafbd6deb12473838e444d0d7226773895333fe32beb"

DESCRIPTION = "Test for Validators Exiting via Voting (HOODI)"


def start_vote(tx_params: Dict[str, str], silent: bool = False) -> Tuple[int, Optional[TransactionReceipt]]:
"""Prepare and run voting."""

validators_exit_bus = interface.ValidatorsExitBusOracle(contracts.validators_exit_bus_oracle)

vote_desc_items, call_script_items = zip(
(
"1. Grant SUBMIT_REPORT_HASH_ROLE to the agent",
agent_forward(
[
encode_oz_grant_role(
contract=validators_exit_bus,
role_name="SUBMIT_REPORT_HASH_ROLE",
grant_to=contracts.agent,
)
]
),
),
(
"2. Submit exit requests hash to ValidatorsExitBus Oracle",
agent_forward(
[
(
contracts.validators_exit_bus_oracle.address,
validators_exit_bus.submitExitRequestsHash.encode_input(EXIT_HASH_TO_SUBMIT),
)
]
),
),
(
"3. Revoke SUBMIT_REPORT_HASH_ROLE from the agent",
agent_forward(
[
encode_oz_revoke_role(
contract=validators_exit_bus,
role_name="SUBMIT_REPORT_HASH_ROLE",
revoke_from=contracts.agent,
)
]
),
),
)

if silent:
desc_ipfs = calculate_vote_ipfs_description(DESCRIPTION)
else:
desc_ipfs = upload_vote_ipfs_description(DESCRIPTION)

dg_vote = prepare_proposal(call_script_items, DESCRIPTION)
vote_items = {DESCRIPTION: dg_vote}

assert confirm_vote_script(vote_items, silent, desc_ipfs)
return create_vote(vote_items, tx_params, desc_ipfs=desc_ipfs)


def main():
tx_params = {"from": get_deployer_account()}
if get_is_live():
tx_params["priority_fee"] = get_priority_fee()

vote_id, _ = start_vote(tx_params=tx_params, silent=False)

vote_id >= 0 and print(f"Vote created: {vote_id}.")

time.sleep(5) # hack for waiting thread #2.


if __name__ == "__main__":
main()
Loading
Loading