Skip to content

Commit 014ec8e

Browse files
committed
feat: Stakefish council deamon rotation
1 parent fe09542 commit 014ec8e

File tree

4 files changed

+62
-6
lines changed

4 files changed

+62
-6
lines changed

configs/config_mainnet.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@
233233
DSM_GUARDIANS = [
234234
"0x5fd0dDbC3351d009eb3f88DE7Cd081a614C519F1",
235235
"0x7912Fa976BcDe9c2cf728e213e892AD7588E6AaF",
236-
"0xd4EF84b638B334699bcf5AF4B0410B8CCD71943f",
236+
"0x4B87F16B8d32cb5a859a4C48a88edB5adBe3498E",
237237
"0xf82D88217C249297C6037BA77CE34b3d8a90ab43",
238238
"0xa56b128Ea2Ea237052b0fA2a96a387C0E43157d8",
239239
"0x6d22aE126eB2c37F67a1391B37FF4f2863e61389",

scripts/_exec_vote.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from utils.mainnet_fork import pass_and_exec_dao_vote
2+
3+
def main():
4+
pass_and_exec_dao_vote(199)

scripts/vote_2026_04_08.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
1.21. Decrease limit from 1000 to 150 stETH per 12 months on Gas Supply AllowedRecipientsRegistry 0x49d1363016aA899bba09ae972a1BF200dDf8C55F
2626
1.22. Set spent amount to 0 on Gas Supply AllowedRecipientsRegistry 0x49d1363016aA899bba09ae972a1BF200dDf8C55F
2727
1.23. Raise CSM (MODULE_ID = 3) stake share limit from 750 BP to 850 BP and priority exit threshold from 900 BP to 1020 BP in Staking Router 0xFdDf38947aFB03C621C71b06C9C70bce73f12999
28+
1.24. Remove Stakefish council daemon 0xd4EF84b638B334699bcf5AF4B0410B8CCD71943f from Deposit Security Module 0xfFA96D84dEF2EA035c7AB153D8B991128e3d72fD and keep quorum size as 4
29+
1.25. Add new Stakefish council daemon 0xPLACEHOLDER_NEW to Deposit Security Module 0xfFA96D84dEF2EA035c7AB153D8B991128e3d72fD and keep quorum size as 4
2830
2931
=== NON-DG ITEMS ===
3032
2. Remove old Simple DVT SubmitValidatorsExitRequestHashes factory 0xB7668B5485d0f826B86a75b0115e088bB9ee03eE from Easy Track 0xF0211b7660680B49De1A7E9f25C65660F0a13Fea
@@ -53,6 +55,7 @@
5355
from utils.mainnet_fork import pass_and_exec_dao_vote
5456
from utils.dual_governance import submit_proposals
5557
from utils.agent import agent_forward
58+
from utils.dsm import encode_remove_guardian, encode_add_guardian
5659
from utils.easy_track import add_evmscript_factory, remove_evmscript_factory, create_permissions
5760
from utils.node_operators import (
5861
deactivate_node_operator,
@@ -89,6 +92,12 @@
8992
CS_HASH_CONSENSUS = "0x71093efF8D8599b5fA340D665Ad60fA7C80688e4"
9093
HASH_CONSENSUS_FOR_VEBO = "0x7FaDB6358950c5fAA66Cb5EB8eE5147De3df355a"
9194

95+
DEPOSIT_SECURITY_MODULE = "0xfFA96D84dEF2EA035c7AB153D8B991128e3d72fD"
96+
97+
STAKEFISH_DSM_GUARDIAN_OLD = "0xd4EF84b638B334699bcf5AF4B0410B8CCD71943f"
98+
STAKEFISH_DSM_GUARDIAN_NEW = "0x4B87F16B8d32cb5a859a4C48a88edB5adBe3498E"
99+
DSM_QUORUM_SIZE = 4
100+
92101
GAS_SUPPLY_ALLOWED_RECIPIENTS_REGISTRY = "0x49d1363016aA899bba09ae972a1BF200dDf8C55F"
93102

94103
OLD_SDVT_SUBMIT_EXIT_HASHES_FACTORY = "0xB7668B5485d0f826B86a75b0115e088bB9ee03eE"
@@ -154,6 +163,7 @@
154163
# ================================ Main ======================================
155164
def get_dg_items() -> List[Tuple[str, str]]:
156165
staking_router = interface.StakingRouter(STAKING_ROUTER)
166+
dsm = interface.DepositSecurityModule(DEPOSIT_SECURITY_MODULE)
157167
no_registry = interface.NodeOperatorsRegistry(CURATED_MODULE)
158168
hash_consensus_for_accounting_oracle = interface.HashConsensus(HASH_CONSENSUS_FOR_AO)
159169
cs_hash_consensus = interface.CSHashConsensus(CS_HASH_CONSENSUS)
@@ -367,6 +377,18 @@ def get_dg_items() -> List[Tuple[str, str]]:
367377
)
368378
]
369379
),
380+
# 1.24. Remove Stakefish council daemon 0xPLACEHOLDER_OLD from Deposit Security Module 0xfFA96D84dEF2EA035c7AB153D8B991128e3d72fD and keep quorum size as 4
381+
agent_forward(
382+
[
383+
encode_remove_guardian(dsm=dsm, guardian_address=STAKEFISH_DSM_GUARDIAN_OLD, quorum_size=DSM_QUORUM_SIZE),
384+
]
385+
),
386+
# 1.25. Add new Stakefish council daemon 0xPLACEHOLDER_NEW to Deposit Security Module 0xfFA96D84dEF2EA035c7AB153D8B991128e3d72fD and keep quorum size as 4
387+
agent_forward(
388+
[
389+
encode_add_guardian(dsm=dsm, guardian_address=STAKEFISH_DSM_GUARDIAN_NEW, quorum_size=DSM_QUORUM_SIZE),
390+
]
391+
),
370392
]
371393

372394

@@ -380,14 +402,14 @@ def get_vote_items() -> Tuple[List[str], List[Tuple[str, str]]]:
380402
[
381403
(
382404
dg_items,
383-
"Deactivate A41, change name and reward address for Stakin, upgrade Lazy Oracle, Vault Hub and ZKSync Bridge, rotate addresses for Chorus One and Stakefish oracle set members, set Chorus One target validators limit, decrease Gas Supply ET limit and reset spent amount, raise CSM stake share limit and priority exit threshold",
405+
"Deactivate A41, change name and reward address for Stakin, upgrade Lazy Oracle, Vault Hub and ZKSync Bridge, rotate addresses for Chorus One and Stakefish oracle set members, set Chorus One target validators limit, decrease Gas Supply ET limit and reset spent amount, raise CSM stake share limit and priority exit threshold, rotate Stakefish council daemon in DSM",
384406
)
385407
]
386408
)
387409

388410
vote_desc_items, call_script_items = zip(
389411
(
390-
"1. Submit a Dual Governance proposal to deactivate A41, change name and reward address for Stakin, upgrade Lazy Oracle, Vault Hub and ZKSync Bridge, rotate addresses for Chorus One and Stakefish oracle set members, set Chorus One target validators limit, decrease Gas Supply ET limit and reset spent amount, raise CSM stake share limit and priority exit threshold",
412+
"1. Submit a Dual Governance proposal to deactivate A41, change name and reward address for Stakin, upgrade Lazy Oracle, Vault Hub and ZKSync Bridge, rotate addresses for Chorus One and Stakefish oracle set members, set Chorus One target validators limit, decrease Gas Supply ET limit and reset spent amount, raise CSM stake share limit and priority exit threshold, rotate Stakefish council daemon in DSM",
391413
dg_call_script[0],
392414
),
393415
(

tests/test_2026_04_08.py

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,12 @@
105105
STAKEFISH_ORACLE_MEMBER_OLD = "0x946D3b081ed19173dC83Cd974fC69e1e760B7d78"
106106
STAKEFISH_ORACLE_MEMBER_NEW = "0x042a9e5acCfa17e28300F1b5967f20891E973922"
107107

108+
# Stakefish DSM council daemon rotation
109+
DEPOSIT_SECURITY_MODULE = "0xfFA96D84dEF2EA035c7AB153D8B991128e3d72fD"
110+
STAKEFISH_DSM_GUARDIAN_OLD = "0xd4EF84b638B334699bcf5AF4B0410B8CCD71943f"
111+
STAKEFISH_DSM_GUARDIAN_NEW = "0x4B87F16B8d32cb5a859a4C48a88edB5adBe3498E"
112+
DSM_QUORUM_SIZE = 4
113+
108114
# Node operators
109115
A41_NO_ID = 32
110116
A41_NAME = "A41"
@@ -178,10 +184,10 @@
178184
EXPECTED_VOTE_ID = 199
179185
EXPECTED_DG_PROPOSAL_ID = 9
180186
EXPECTED_VOTE_EVENTS_COUNT = 11 # 1 DG submit + 5 factory removes + 5 factory adds
181-
EXPECTED_DG_EVENTS_FROM_AGENT = 23
182-
EXPECTED_DG_EVENTS_COUNT = 23
187+
EXPECTED_DG_EVENTS_FROM_AGENT = 25
188+
EXPECTED_DG_EVENTS_COUNT = 25
183189
IPFS_DESCRIPTION_HASH = "bafkreic2fhcjelgdwpiiy7vxm7kf4g3kuhmmbaerfyoxkns2x5jzovqvaa"
184-
DG_PROPOSAL_METADATA = "Deactivate A41, change name and reward address for Stakin, upgrade Lazy Oracle, Vault Hub and ZKSync Bridge, rotate addresses for Chorus One and Stakefish oracle set members, set Chorus One target validators limit, decrease Gas Supply ET limit and reset spent amount, raise CSM stake share limit and priority exit threshold"
190+
DG_PROPOSAL_METADATA = "Deactivate A41, change name and reward address for Stakin, upgrade Lazy Oracle, Vault Hub and ZKSync Bridge, rotate addresses for Chorus One and Stakefish oracle set members, set Chorus One target validators limit, decrease Gas Supply ET limit and reset spent amount, raise CSM stake share limit and priority exit threshold, rotate Stakefish council daemon in DSM"
185191

186192

187193
@pytest.fixture(scope="module")
@@ -489,6 +495,7 @@ def test_vote(helpers, accounts, ldo_holder, vote_ids_from_env, stranger, dual_g
489495
gas_supply_registry = interface.AllowedRecipientRegistry(GAS_SUPPLY_ALLOWED_RECIPIENTS_REGISTRY)
490496
staking_router = interface.StakingRouter(STAKING_ROUTER)
491497
vebo = interface.ValidatorsExitBusOracle(VEBO)
498+
dsm = interface.DepositSecurityModule(DEPOSIT_SECURITY_MODULE)
492499

493500
# =========================================================================
494501
# ======================== Identify or Create vote ========================
@@ -728,6 +735,12 @@ def test_vote(helpers, accounts, ldo_holder, vote_ids_from_env, stranger, dual_g
728735
assert csm_module_before["maxDepositsPerBlock"] == CSM_MAX_DEPOSITS_PER_BLOCK
729736
assert csm_module_before["minDepositBlockDistance"] == CSM_MIN_DEPOSIT_BLOCK_DISTANCE
730737

738+
# 1.24-1.25. Stakefish DSM guardian rotation before
739+
assert dsm.isGuardian(STAKEFISH_DSM_GUARDIAN_OLD)
740+
assert not dsm.isGuardian(STAKEFISH_DSM_GUARDIAN_NEW)
741+
dsm_guardians_before = dsm.getGuardians()
742+
dsm_quorum_before = dsm.getGuardianQuorum()
743+
731744
ao_quorum_before = hash_consensus_for_ao.getQuorum()
732745
ao_members_before = len(hash_consensus_for_ao.getMembers()[0])
733746
csm_quorum_before = cs_hash_consensus.getQuorum()
@@ -936,6 +949,16 @@ def test_vote(helpers, accounts, ldo_holder, vote_ids_from_env, stranger, dual_g
936949
emitted_by=STAKING_ROUTER,
937950
)
938951

952+
# 1.24. Remove Stakefish council daemon from DSM
953+
assert "GuardianRemoved" in dg_events[23]
954+
assert dg_events[23]["GuardianRemoved"]["guardian"].lower() == STAKEFISH_DSM_GUARDIAN_OLD.lower()
955+
assert dg_events[23]["GuardianRemoved"]["_emitted_by"].lower() == DEPOSIT_SECURITY_MODULE.lower()
956+
957+
# 1.25. Add new Stakefish council daemon to DSM
958+
assert "GuardianAdded" in dg_events[24]
959+
assert dg_events[24]["GuardianAdded"]["guardian"].lower() == STAKEFISH_DSM_GUARDIAN_NEW.lower()
960+
assert dg_events[24]["GuardianAdded"]["_emitted_by"].lower() == DEPOSIT_SECURITY_MODULE.lower()
961+
939962
# =========================================================================
940963
# ==================== After DG proposal executed checks ==================
941964
# =========================================================================
@@ -1015,6 +1038,13 @@ def test_vote(helpers, accounts, ldo_holder, vote_ids_from_env, stranger, dual_g
10151038
assert csm_module_after["maxDepositsPerBlock"] == CSM_MAX_DEPOSITS_PER_BLOCK
10161039
assert csm_module_after["minDepositBlockDistance"] == CSM_MIN_DEPOSIT_BLOCK_DISTANCE
10171040

1041+
# 1.24-1.25. Stakefish DSM guardian rotation after
1042+
assert not dsm.isGuardian(STAKEFISH_DSM_GUARDIAN_OLD)
1043+
assert dsm.isGuardian(STAKEFISH_DSM_GUARDIAN_NEW)
1044+
assert len(dsm.getGuardians()) == len(dsm_guardians_before)
1045+
assert dsm.getGuardianQuorum() == dsm_quorum_before
1046+
assert dsm.getGuardianQuorum() == DSM_QUORUM_SIZE
1047+
10181048
ao_quorum_after = hash_consensus_for_ao.getQuorum()
10191049
ao_members_after = len(hash_consensus_for_ao.getMembers()[0])
10201050
csm_quorum_after = cs_hash_consensus.getQuorum()

0 commit comments

Comments
 (0)