diff --git a/archive/scripts/vote_dg_easy_track_tw_holesky.py b/archive/scripts/vote_dg_easy_track_tw_holesky.py new file mode 100644 index 000000000..bf54075b3 --- /dev/null +++ b/archive/scripts/vote_dg_easy_track_tw_holesky.py @@ -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. diff --git a/archive/scripts/vote_hoodi_exit_hashes.py b/archive/scripts/vote_hoodi_exit_hashes.py new file mode 100644 index 000000000..7eba452b2 --- /dev/null +++ b/archive/scripts/vote_hoodi_exit_hashes.py @@ -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() diff --git a/archive/scripts/vote_hoodi_exit_hashes_2.py b/archive/scripts/vote_hoodi_exit_hashes_2.py new file mode 100755 index 000000000..1c28a9aa7 --- /dev/null +++ b/archive/scripts/vote_hoodi_exit_hashes_2.py @@ -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() diff --git a/archive/scripts/vote_tw_csm2_holesky.py b/archive/scripts/vote_tw_csm2_holesky.py new file mode 100644 index 000000000..d05351b79 --- /dev/null +++ b/archive/scripts/vote_tw_csm2_holesky.py @@ -0,0 +1,722 @@ +""" +Vote XX/06/2025 [HOLESKY] + +--- Locator +1. Update locator implementation +--- VEB +2. Update VEBO implementation +3. Call finalizeUpgrade_v2(maxValidatorsPerReport, maxExitRequestsLimit, exitsPerFrame, frameDurationInSec) on VEBO +4. Grant VEBO role MANAGE_CONSENSUS_VERSION_ROLE to the AGENT +5. Bump VEBO consensus version to `4` +6. Revoke VEBO role MANAGE_CONSENSUS_VERSION_ROLE from the AGENT +--- Triggerable Withdrawals Gateway (TWG) +7. Grant TWG role ADD_FULL_WITHDRAWAL_REQUEST_ROLE to the CS Ejector +8. Grant TWG role ADD_FULL_WITHDRAWAL_REQUEST_ROLE to the VEB +--- WV +9. Update WithdrawalVault implementation +10. Call finalizeUpgrade_v2() on WithdrawalVault +--- AO +11. Update Accounting Oracle implementation +12. Grant AO MANAGE_CONSENSUS_VERSION_ROLE to the AGENT +13. Bump AO consensus version to `4` +14. Revoke AO MANAGE_CONSENSUS_VERSION_ROLE from the AGENT +--- SR +15. Update SR implementation +16. Grant SR role REPORT_VALIDATOR_EXITING_STATUS_ROLE to ValidatorExitVerifier +17. Grant SR role REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE to TWG +--- NOR +18. Grant APP_MANAGER_ROLE role to the AGENT on Kernel +19. Update `NodeOperatorsRegistry` implementation +20. Call finalizeUpgrade_v4 on NOR +--- sDVT +21. Update `SimpleDVT` implementation +22. Call finalizeUpgrade_v4 on sDVT +23. Revoke APP_MANAGER_ROLE role from the AGENT on Kernel +--- Oracle configs --- +24. Grant CONFIG_MANAGER_ROLE role to the AGENT +25. Remove NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP variable from OracleDaemonConfig +26. Remove VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS variable from OracleDaemonConfig +27. Remove VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS variable from OracleDaemonConfig +28. Add EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS variable to OracleDaemonConfig +--- CSM --- +29. Upgrade CSM implementation on proxy +30. Call `finalizeUpgradeV2()` on CSM contract +31. Upgrade CSAccounting implementation on proxy +32. Call `finalizeUpgradeV2(bondCurves)` on CSAccounting contract +33. Upgrade CSFeeOracle implementation on proxy +34. Call `finalizeUpgradeV2(consensusVersion)` on CSFeeOracle contract +35. Upgrade CSFeeDistributor implementation on proxy +36. Call `finalizeUpgradeV2(admin)` on CSFeeDistributor contract +37. Revoke CSAccounting role SET_BOND_CURVE_ROLE from the CSM contract +38. Revoke CSAccounting role RESET_BOND_CURVE_ROLE from the CSM contract +39. Revoke CSAccounting role RESET_BOND_CURVE_ROLE from the CSM committee +40. Grant CSM role CREATE_NODE_OPERATOR_ROLE for the permissionless gate +41. Grant CSM role CREATE_NODE_OPERATOR_ROLE for the vetted gate +42. Grant CSAccounting role SET_BOND_CURVE_ROLE for the vetted gate +43. Revoke role VERIFIER_ROLE from the previous instance of the Verifier contract +44. Grant role VERIFIER_ROLE to the new instance of the Verifier contract +45. Revoke CSM role PAUSE_ROLE from the previous GateSeal instance +46. Revoke CSAccounting role PAUSE_ROLE from the previous GateSeal instance +47. Revoke CSFeeOracle role PAUSE_ROLE from the previous GateSeal instance +48. Grant CSM role PAUSE_ROLE for the new GateSeal instance +49. Grant CSAccounting role PAUSE_ROLE for the new GateSeal instance +50. Grant CSFeeOracle role PAUSE_ROLE for the new GateSeal instance +51. Grant MANAGE_BOND_CURVES_ROLE to the AGENT +52. Add Identified Community Stakers Gate Bond Curve +53. Revoke MANAGE_BOND_CURVES_ROLE from the AGENT +54. Increase CSM share in Staking Router from 15% to 20% +--- Gate Seals --- +55. Revoke PAUSE_ROLE on WithdrawalQueue from the old GateSeal +56. Revoke PAUSE_ROLE on ValidatorsExitBusOracle from the old GateSeal +57. Grant PAUSE_ROLE on WithdrawalQueue to the new WithdrawalQueue GateSeal +58. Grant PAUSE_ROLE on ValidatorsExitBusOracle to the new Triggerable Withdrawals GateSeal +59. Grant PAUSE_ROLE on TriggerableWithdrawalsGateway to the new Triggerable Withdrawals GateSeal +--- ResealManager --- +60. Grant PAUSE_ROLE on TriggerableWithdrawalsGateway to ResealManager +61. Grant RESUME_ROLE on TriggerableWithdrawalsGateway to ResealManager +62. Call finalizeUpgrade_v3 on AO contract (TODO: move to beginning of the vote in Hoodi script) +63. Add CSSetVettedGateTree factory to EasyTrack with permissions +""" +import time + +from typing import TYPE_CHECKING, Any, Dict +from typing import Tuple, Optional, Sequence +from brownie import interface, web3, convert, ZERO_ADDRESS # type: ignore +from utils.config import ( + CSM_COMMITTEE_MS, + CS_MODULE_ID, + CS_MODULE_MODULE_FEE_BP, + CS_MODULE_TREASURY_FEE_BP, + CS_MODULE_MAX_DEPOSITS_PER_BLOCK, + CS_MODULE_MIN_DEPOSIT_BLOCK_DISTANCE, + CS_GATE_SEAL_ADDRESS, + NODE_OPERATORS_REGISTRY_ARAGON_APP_ID, + SIMPLE_DVT_ARAGON_APP_ID, + ARAGON_KERNEL, + AGENT, + contracts, +) +from utils.ipfs import upload_vote_ipfs_description, calculate_vote_ipfs_description +from utils.permissions import encode_oz_grant_role, encode_oz_revoke_role +from utils.easy_track import ( + add_evmscript_factory, + create_permissions, +) +from utils.agent import dual_governance_agent_forward +from utils.voting import confirm_vote_script, create_vote +from utils.config import get_deployer_account, get_priority_fee, get_is_live + +DESCRIPTION = "Triggerable withdrawals and CSM v2 upgrade voting (HOLESKY)" + +# New core contracts implementations +LIDO_LOCATOR_IMPL = "0xa437ab5614033d071493C88Fd351aFEbc802521f" +ACCOUNTING_ORACLE_IMPL = "0xE63267AAaC507A329213593e8A9bCa37e2994F1C" +VALIDATORS_EXIT_BUS_ORACLE_IMPL = "0xeCE105ABd3F2653398BE75e680dB033A238E2aD6" +WITHDRAWAL_VAULT_IMPL = "0x6aAA28C515E02ED0fe1B51e74323e14E910eA7d7" +STAKING_ROUTER_IMPL = "0xE6E775C6AdF8753588237b1De32f61937bC54341" +NODE_OPERATORS_REGISTRY_IMPL = "0x834aa47DCd21A32845099a78B4aBb17A7f0bD503" + +TRIGGERABLE_WITHDRAWALS_GATEWAY = "0x4FD4113f2B92856B59BC3be77f2943B7F4eaa9a5" +VALIDATOR_EXIT_VERIFIER = "0x9c5da60e54fcae8592132Fc9a67511e686b52BE8" + +# Oracle consensus versions +AO_CONSENSUS_VERSION = 4 +VEBO_CONSENSUS_VERSION = 4 +CSM_CONSENSUS_VERSION = 3 + +EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS = 7 * 7200 + +NOR_EXIT_DEADLINE_IN_SEC = 172800 + +MAX_VALIDATORS_PER_REPORT = 600 +MAX_EXIT_REQUESTS_LIMIT = 13000 +EXITS_PER_FRAME = 1 +FRAME_DURATION_IN_SEC = 48 + +# CSM +CS_MODULE_NEW_TARGET_SHARE_BP = 2000 # 20% +CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP = 2500 # 25% + +CS_ACCOUNTING_IMPL_V2_ADDRESS = "0xbd78207826CfdBE125cFf0a7075EaB90F5f9FCbb" +CS_FEE_DISTRIBUTOR_IMPL_V2_ADDRESS = "0x6e00A87690A1CAF4abb135B549408cEfca2fd6f5" +CS_FEE_ORACLE_IMPL_V2_ADDRESS = "0xD6F44e196A5b4A1C3863Bdd87233465ef42aBB40" +CSM_IMPL_V2_ADDRESS = "0xaF370636f618bC97c8Af2aBC33aAD426b1f4164A" + +CS_GATE_SEAL_V2_ADDRESS = "0x86E4aFE068f30A41f650601Df9A097bc7CddFb76" +CS_SET_VETTED_GATE_TREE_FACTORY = "0x26CDa8f9D84956efC743c8432658Ae9a5B7939da" +CS_EJECTOR_ADDRESS = "0x477589D5A8cB67Bd6682AF3612f99ADB72d09582" +CS_PERMISSIONLESS_GATE_ADDRESS = "0x676626c3940ae32eF1e4F609938F785fF064ee22" +CS_VETTED_GATE_ADDRESS = "0x92A5aB5e4f98e67Fb7295fe439A652d0E51033bf" +CS_VERIFIER_V2_ADDRESS = "0xBC88b4b56A58b33716C3C2e879b4B1F964152AD4" + +CS_DEFAULT_BOND_CURVE = ( + [1, 2 * 10**18], [2, 1.9 * 10**18], [3, 1.8 * 10**18], [4, 1.7 * 10**18], [5, 1.6 * 10**18], [6, 1.5 * 10**18] +) +CS_LEGACY_EA_BOND_CURVE = ( + ([1, 1.5 * 10**18], [2, 1.9 * 10**18], [3, 1.8 * 10**18], [4, 1.7 * 10**18], [5, 1.6 * 10**18], [6, 1.5 * 10**18]) +) +CS_EXTRA_CURVES = [ + ([1, 3 * 10**18], [2, 1.9 * 10**18], [3, 1.8 * 10**18], [4, 1.7 * 10**18], [5, 1.6 * 10**18], [6, 1.5 * 10**18]), + ([1, 4 * 10**18], [2, 1 * 10**18]) +] +CS_CURVES = [CS_DEFAULT_BOND_CURVE, CS_LEGACY_EA_BOND_CURVE, *CS_EXTRA_CURVES] +CS_ICS_GATE_BOND_CURVE = ([1, 1.5 * 10**18], [2, 1.3 * 10**18]) # Identified Community Stakers Gate Bond Curve + +OLD_GATE_SEAL_ADDRESS = "0xAE6eCd77DCC656c5533c4209454Fd56fB46e1778" + +NEW_WQ_GATE_SEAL = "0xE900BC859EB750562E1009e912B63743BC877662" +NEW_TW_GATE_SEAL = "0xaEEF47C61f2A9CCe4C4D0363911C5d49e2cFb6f1" + +RESEAL_MANAGER = "0x9dE2273f9f1e81145171CcA927EFeE7aCC64c9fb" + +def encode_staking_router_proxy_update(implementation: str) -> Tuple[str, str]: + proxy = interface.OssifiableProxy(contracts.staking_router) + return proxy.address, proxy.proxy__upgradeTo.encode_input(implementation) + + +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 encode_wv_proxy_upgrade_to(proxy: Any, implementation: str) -> Tuple[str, str]: + proxy = interface.WithdrawalContractProxy(proxy) + + return proxy.address, proxy.proxy_upgradeTo.encode_input(implementation, b'') + + +def encode_oracle_upgrade_consensus(proxy: Any, consensus_version: int) -> Tuple[str, str]: + oracle = interface.BaseOracle(proxy) + return oracle.address, oracle.setConsensusVersion.encode_input(consensus_version) + + +def encode_staking_router_update_csm_module_share() -> Tuple[str, str]: + """Encode call to update CSM share limit""" + return ( + contracts.staking_router.address, + contracts.staking_router.updateStakingModule.encode_input( + CS_MODULE_ID, + CS_MODULE_NEW_TARGET_SHARE_BP, + CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP, + CS_MODULE_MODULE_FEE_BP, + CS_MODULE_TREASURY_FEE_BP, + CS_MODULE_MAX_DEPOSITS_PER_BLOCK, + CS_MODULE_MIN_DEPOSIT_BLOCK_DISTANCE, + ) + ) + + +def start_vote(tx_params: Dict[str, str], silent: bool) -> Tuple[int, Optional[Any]]: + vote_desc_items, call_script_items = zip( + # --- locator + ( + f"1. Update locator implementation", + encode_proxy_upgrade_to(contracts.lido_locator, LIDO_LOCATOR_IMPL) + ), + # --- VEB + ( + f"2. Update VEBO implementation", + encode_proxy_upgrade_to(contracts.validators_exit_bus_oracle, VALIDATORS_EXIT_BUS_ORACLE_IMPL) + ), + ( + f"3. Call finalizeUpgrade_v2 on VEBO", + ( + contracts.validators_exit_bus_oracle.address, + contracts.validators_exit_bus_oracle.finalizeUpgrade_v2.encode_input(MAX_VALIDATORS_PER_REPORT, MAX_EXIT_REQUESTS_LIMIT, EXITS_PER_FRAME, FRAME_DURATION_IN_SEC), + ) + ), + ( + f"4. Grant VEBO role MANAGE_CONSENSUS_VERSION_ROLE to the AGENT", + encode_oz_grant_role( + contract=contracts.validators_exit_bus_oracle, + role_name="MANAGE_CONSENSUS_VERSION_ROLE", + grant_to=contracts.agent, + ) + ), + ( + f"5. Bump VEBO consensus version to `{VEBO_CONSENSUS_VERSION}`", + encode_oracle_upgrade_consensus(contracts.validators_exit_bus_oracle, VEBO_CONSENSUS_VERSION) + ), + ( + f"6. Revoke VEBO role MANAGE_CONSENSUS_VERSION_ROLE from the AGENT", + encode_oz_revoke_role( + contract=contracts.validators_exit_bus_oracle, + role_name="MANAGE_CONSENSUS_VERSION_ROLE", + revoke_from=contracts.agent, + ) + ), + # --- Triggerable Withdrawals Gateway (TWG) + ( + f"7. Grant TWG role ADD_FULL_WITHDRAWAL_REQUEST_ROLE to the CS Ejector", + encode_oz_grant_role( + contract=interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY), + role_name="ADD_FULL_WITHDRAWAL_REQUEST_ROLE", + grant_to=CS_EJECTOR_ADDRESS, + ) + ), + ( + f"8. Grant TWG role ADD_FULL_WITHDRAWAL_REQUEST_ROLE to the VEB", + encode_oz_grant_role( + contract=interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY), + role_name="ADD_FULL_WITHDRAWAL_REQUEST_ROLE", + grant_to=contracts.validators_exit_bus_oracle, + ) + ), + # --- WV + ( + f"9. Update WithdrawalVault implementation", + encode_wv_proxy_upgrade_to(contracts.withdrawal_vault, WITHDRAWAL_VAULT_IMPL) + ), + ( + f"10. Call finalizeUpgrade_v2 on WithdrawalVault", + ( + contracts.withdrawal_vault.address, + contracts.withdrawal_vault.finalizeUpgrade_v2.encode_input(), + ) + ), + # --- AO + ( + f"11. Update Accounting Oracle implementation", + encode_proxy_upgrade_to(contracts.accounting_oracle, ACCOUNTING_ORACLE_IMPL), + ), + ( + f"12. Grant AO MANAGE_CONSENSUS_VERSION_ROLE to the AGENT", + encode_oz_grant_role( + contract=contracts.accounting_oracle, + role_name="MANAGE_CONSENSUS_VERSION_ROLE", + grant_to=contracts.agent, + ) + ), + ( + f"13. Bump AO consensus version to `{AO_CONSENSUS_VERSION}`", + encode_oracle_upgrade_consensus(contracts.accounting_oracle, AO_CONSENSUS_VERSION) + ), + ( + f"14. Revoke AO MANAGE_CONSENSUS_VERSION_ROLE from the AGENT", + encode_oz_revoke_role( + contract=contracts.accounting_oracle, + role_name="MANAGE_CONSENSUS_VERSION_ROLE", + revoke_from=contracts.agent, + ) + ), + # --- SR + ( + f"15. Update SR implementation", + encode_staking_router_proxy_update(STAKING_ROUTER_IMPL) + ), + ( + f"16. Grant SR role REPORT_VALIDATOR_EXITING_STATUS_ROLE to ValidatorExitDelayVerifier", + encode_oz_grant_role( + contract=contracts.staking_router, + role_name="REPORT_VALIDATOR_EXITING_STATUS_ROLE", + grant_to=VALIDATOR_EXIT_VERIFIER, + ) + ), + ( + f"17. Grant SR role REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE to TWG", + encode_oz_grant_role( + contract=contracts.staking_router, + role_name="REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE", + grant_to=interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY), + ) + ), + # --- NOR and sDVT + ( + f"18. Grant APP_MANAGER_ROLE role to the AGENT", + ( + contracts.acl.address, + contracts.acl.grantPermission.encode_input( + AGENT, + ARAGON_KERNEL, + convert.to_uint(web3.keccak(text="APP_MANAGER_ROLE")) + ) + ) + ), + ( + f"19. Update `NodeOperatorsRegistry` implementation", + ( + contracts.kernel.address, + contracts.kernel.setApp.encode_input( + contracts.kernel.APP_BASES_NAMESPACE(), + NODE_OPERATORS_REGISTRY_ARAGON_APP_ID, + NODE_OPERATORS_REGISTRY_IMPL + ) + ) + ), + ( + f"20. Call finalizeUpgrade_v4 on NOR", + ( + interface.NodeOperatorsRegistry(contracts.node_operators_registry).address, + interface.NodeOperatorsRegistry(contracts.node_operators_registry).finalizeUpgrade_v4.encode_input( + NOR_EXIT_DEADLINE_IN_SEC + ) + ) + ), + ( + f"21. Update `SDVT` implementation", + ( + contracts.kernel.address, + contracts.kernel.setApp.encode_input( + contracts.kernel.APP_BASES_NAMESPACE(), + SIMPLE_DVT_ARAGON_APP_ID, + NODE_OPERATORS_REGISTRY_IMPL + ) + ) + ), + ( + f"22. Call finalizeUpgrade_v4 on SDVT", + ( + interface.NodeOperatorsRegistry(contracts.simple_dvt).address, + interface.NodeOperatorsRegistry(contracts.simple_dvt).finalizeUpgrade_v4.encode_input( + NOR_EXIT_DEADLINE_IN_SEC + ) + ) + ), + ( + f"23. Revoke APP_MANAGER_ROLE role from the AGENT", + ( + contracts.acl.address, + contracts.acl.revokePermission.encode_input( + AGENT, + ARAGON_KERNEL, + convert.to_uint(web3.keccak(text="APP_MANAGER_ROLE")) + ) + ) + ), + # --- Oracle configs --- + ( + f"24. Grant CONFIG_MANAGER_ROLE role to the AGENT", + encode_oz_grant_role( + contract=contracts.oracle_daemon_config, + role_name="CONFIG_MANAGER_ROLE", + grant_to=contracts.agent, + ) + ), + ( + f"25. Remove NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP variable from OracleDaemonConfig", + ( + contracts.oracle_daemon_config.address, + contracts.oracle_daemon_config.unset.encode_input('NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP'), + ), + ), + ( + f"26. Remove VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS variable from OracleDaemonConfig", + ( + contracts.oracle_daemon_config.address, + contracts.oracle_daemon_config.unset.encode_input('VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS'), + ), + ), + ( + f"27. Remove VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS variable from OracleDaemonConfig", + ( + contracts.oracle_daemon_config.address, + contracts.oracle_daemon_config.unset.encode_input('VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS'), + ), + ), + ( + f"28. Add EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS variable to OracleDaemonConfig", + ( + contracts.oracle_daemon_config.address, + contracts.oracle_daemon_config.set.encode_input('EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS', EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS), + ), + ), + # --- CSM + ( + f"29. Upgrade CSM implementation on proxy", + encode_proxy_upgrade_to( + contracts.csm, + CSM_IMPL_V2_ADDRESS, + ) + ), + ( + f"30. Call `finalizeUpgradeV2()` on CSM contract", + ( + contracts.csm.address, + contracts.csm.finalizeUpgradeV2.encode_input(), + ), + ), + ( + f"31. Upgrade CSAccounting implementation on proxy", + encode_proxy_upgrade_to( + contracts.cs_accounting, + CS_ACCOUNTING_IMPL_V2_ADDRESS, + ) + ), + ( + f"32. Call `finalizeUpgradeV2(bondCurves)` on CSAccounting contract", + ( + contracts.cs_accounting.address, + contracts.cs_accounting.finalizeUpgradeV2.encode_input(CS_CURVES), + ), + ), + ( + f"33. Upgrade CSFeeOracle implementation on proxy", + encode_proxy_upgrade_to( + contracts.cs_fee_oracle, + CS_FEE_ORACLE_IMPL_V2_ADDRESS, + ) + ), + ( + f"34. Call `finalizeUpgradeV2(consensusVersion)` on CSFeeOracle contract", + ( + contracts.cs_fee_oracle.address, + contracts.cs_fee_oracle.finalizeUpgradeV2.encode_input(CSM_CONSENSUS_VERSION), + ) + ), + ( + f"35. Upgrade CSFeeDistributor implementation on proxy", + encode_proxy_upgrade_to( + contracts.cs_fee_distributor, + CS_FEE_DISTRIBUTOR_IMPL_V2_ADDRESS, + ) + ), + ( + f"36. Call `finalizeUpgradeV2(admin)` on CSFeeDistributor contract", + ( + contracts.cs_fee_distributor.address, + contracts.cs_fee_distributor.finalizeUpgradeV2.encode_input(contracts.agent), + ) + ), + ( + f"37. Revoke CSAccounting role SET_BOND_CURVE_ROLE from the CSM contract", + encode_oz_revoke_role( + contract=contracts.cs_accounting, + role_name="SET_BOND_CURVE_ROLE", + revoke_from=contracts.csm, + ) + ), + ( + f"38. Revoke CSAccounting role RESET_BOND_CURVE_ROLE from the CSM contract", + encode_oz_revoke_role( + contract=contracts.cs_accounting, + role_name="RESET_BOND_CURVE_ROLE", + revoke_from=contracts.csm, + ) + ), + ( + f"39. Revoke CSAccounting role RESET_BOND_CURVE_ROLE from the CSM committee", + encode_oz_revoke_role( + contract=contracts.cs_accounting, + role_name="RESET_BOND_CURVE_ROLE", + revoke_from=CSM_COMMITTEE_MS, + ) + ), + ( + f"40. Grant CSM role CREATE_NODE_OPERATOR_ROLE for the permissionless gate", + encode_oz_grant_role( + contract=contracts.csm, + role_name="CREATE_NODE_OPERATOR_ROLE", + grant_to=CS_PERMISSIONLESS_GATE_ADDRESS, + ) + ), + ( + f"41. Grant CSM role CREATE_NODE_OPERATOR_ROLE for the vetted gate", + encode_oz_grant_role( + contract=contracts.csm, + role_name="CREATE_NODE_OPERATOR_ROLE", + grant_to=CS_VETTED_GATE_ADDRESS, + ) + ), + ( + f"42. Grant CSAccounting role SET_BOND_CURVE_ROLE for the vetted gate", + encode_oz_grant_role( + contract=contracts.cs_accounting, + role_name="SET_BOND_CURVE_ROLE", + grant_to=CS_VETTED_GATE_ADDRESS, + ) + ), + ( + f"43. Revoke role VERIFIER_ROLE from the previous instance of the Verifier contract", + encode_oz_revoke_role( + contract=contracts.csm, + role_name="VERIFIER_ROLE", + revoke_from=contracts.cs_verifier, + ) + ), + ( + f"44. Grant role VERIFIER_ROLE to the new instance of the Verifier contract", + encode_oz_grant_role( + contract=contracts.csm, + role_name="VERIFIER_ROLE", + grant_to=CS_VERIFIER_V2_ADDRESS, + ) + ), + ( + f"45. Revoke CSM role PAUSE_ROLE from the previous GateSeal instance", + encode_oz_revoke_role( + contract=contracts.csm, + role_name="PAUSE_ROLE", + revoke_from=CS_GATE_SEAL_ADDRESS, + ) + ), + ( + f"46. Revoke CSAccounting role PAUSE_ROLE from the previous GateSeal instance", + encode_oz_revoke_role( + contract=contracts.cs_accounting, + role_name="PAUSE_ROLE", + revoke_from=CS_GATE_SEAL_ADDRESS, + ) + ), + ( + f"47. Revoke CSFeeOracle role PAUSE_ROLE from the previous GateSeal instance", + encode_oz_revoke_role( + contract=contracts.cs_fee_oracle, + role_name="PAUSE_ROLE", + revoke_from=CS_GATE_SEAL_ADDRESS, + ) + ), + ( + f"48. Grant CSM role PAUSE_ROLE for the new GateSeal instance", + encode_oz_grant_role( + contract=contracts.csm, + role_name="PAUSE_ROLE", + grant_to=CS_GATE_SEAL_V2_ADDRESS, + ) + ), + ( + f"49. Grant CSAccounting role PAUSE_ROLE for the new GateSeal instance", + encode_oz_grant_role( + contract=contracts.cs_accounting, + role_name="PAUSE_ROLE", + grant_to=CS_GATE_SEAL_V2_ADDRESS, + ) + ), + ( + f"50. Grant CSFeeOracle role PAUSE_ROLE for the new GateSeal instance", + encode_oz_grant_role( + contract=contracts.cs_fee_oracle, + role_name="PAUSE_ROLE", + grant_to=CS_GATE_SEAL_V2_ADDRESS, + ) + ), + ( + "51. Grant MANAGE_BOND_CURVES_ROLE to the AGENT", + encode_oz_grant_role( + contract=contracts.cs_accounting, + role_name="MANAGE_BOND_CURVES_ROLE", + grant_to=contracts.agent, + ) + ), + ( + "52. Add Identified Community Stakers Gate Bond Curve", + ( + contracts.cs_accounting.address, + contracts.cs_accounting.addBondCurve.encode_input(CS_ICS_GATE_BOND_CURVE), + ), + ), + ( + "53. Revoke MANAGE_BOND_CURVES_ROLE from the AGENT", + encode_oz_revoke_role( + contract=contracts.cs_accounting, + role_name="MANAGE_BOND_CURVES_ROLE", + revoke_from=contracts.agent, + ) + ), + ( + "54. Increase CSM share in Staking Router from 3% to 5%", + encode_staking_router_update_csm_module_share() + ), + # --- Core Gate seals --- + # Revoke old GateSeal + ( + "55. Revoke PAUSE_ROLE on WithdrawalQueue 0xc7cc160b58F8Bb0baC94b80847E2CF2800565C50 from the old GateSeal 0xA34d620EA9F3e86bf8B8a7699B4dE44CD9D3202d", + encode_oz_revoke_role( + contract=contracts.withdrawal_queue, + role_name="PAUSE_ROLE", + revoke_from=OLD_GATE_SEAL_ADDRESS, + ), + ), + ( + "56. Revoke PAUSE_ROLE on ValidatorsExitBusOracle 0xffDDF7025410412deaa05E3E1cE68FE53208afcb from the old GateSeal 0xA34d620EA9F3e86bf8B8a7699B4dE44CD9D3202d", + encode_oz_revoke_role( + contract=contracts.validators_exit_bus_oracle, + role_name="PAUSE_ROLE", + revoke_from=OLD_GATE_SEAL_ADDRESS, + ) + ), + # Add new GateSeal + # Now we have two GateSeals: one for WithdrawalQueue and one for ValidatorsExitBusOracle and TriggerableWithdrawalsGateway. + ( + "57. Grant PAUSE_ROLE on WithdrawalQueue to the new GateSeal", + encode_oz_grant_role( + contract=contracts.withdrawal_queue, + role_name="PAUSE_ROLE", + grant_to=NEW_WQ_GATE_SEAL, + ) + ), + ( + "58. Grant PAUSE_ROLE on ValidatorsExitBusOracle to the new GateSeal", + encode_oz_grant_role( + contract=contracts.validators_exit_bus_oracle, + role_name="PAUSE_ROLE", + grant_to=NEW_TW_GATE_SEAL, + ) + ), + ( + "59. Grant PAUSE_ROLE on TWG to the new GateSeal", + encode_oz_grant_role( + contract=interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY), + role_name="PAUSE_ROLE", + grant_to=NEW_TW_GATE_SEAL, + ) + ), + # --- ResealManager --- + # Grant ResealManager PAUSE_ROLE on WithdrawalQueue, ValidatorsExitBusOracle and TWG + ( + "60. Grant PAUSE_ROLE on TWG to the new GateSeal", + encode_oz_grant_role( + contract=interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY), + role_name="PAUSE_ROLE", + grant_to=RESEAL_MANAGER, + ) + ), + # Grant ResealManager RESUME_ROLE on WithdrawalQueue, ValidatorsExitBusOracle and TWG + ( + "61. Grant PAUSE_ROLE on TWG to the new GateSeal", + encode_oz_grant_role( + contract=interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY), + role_name="RESUME_ROLE", + grant_to=RESEAL_MANAGER, + ) + ), + ( + "62. Call finalizeUpgrade_v3 on AO contract", + ( + contracts.accounting_oracle.address, + contracts.accounting_oracle.finalizeUpgrade_v3.encode_input(), + ) + ) + ) + + + dg_bypass_item = { + "63. Add CSSetVettedGateTree factory to EasyTrack with permissions": add_evmscript_factory( + factory=CS_SET_VETTED_GATE_TREE_FACTORY, + permissions=(create_permissions(interface.CSVettedGate(CS_VETTED_GATE_ADDRESS), "setTreeParams")), + ) + } + + if silent: + desc_ipfs = calculate_vote_ipfs_description(DESCRIPTION) + else: + desc_ipfs = upload_vote_ipfs_description(DESCRIPTION) + + dg_desc = "\n".join(vote_desc_items) + dg_vote = dual_governance_agent_forward(call_script_items, dg_desc) + vote_items = {dg_desc: dg_vote, **dg_bypass_item} + + 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. diff --git a/archive/scripts/vote_tw_csm2_hoodi.py b/archive/scripts/vote_tw_csm2_hoodi.py new file mode 100644 index 000000000..da0f3bd32 --- /dev/null +++ b/archive/scripts/vote_tw_csm2_hoodi.py @@ -0,0 +1,901 @@ +""" +Vote 23/07/2025 [HOODI] + +--- Locator +1. Update locator implementation +--- VEB +2. Update VEBO implementation +3. Call finalizeUpgrade_v2(maxValidatorsPerReport, maxExitRequestsLimit, exitsPerFrame, frameDurationInSec) on VEBO +4. Grant VEBO role MANAGE_CONSENSUS_VERSION_ROLE to the AGENT +5. Bump VEBO consensus version to `4` +6. Revoke VEBO role MANAGE_CONSENSUS_VERSION_ROLE from the AGENT +7. Grant SUBMIT_REPORT_HASH_ROLE on Validator Exit Bus Oracle to the EasyTrack EVM Script Executor +--- Triggerable Withdrawals Gateway (TWG) +8. Grant TWG role ADD_FULL_WITHDRAWAL_REQUEST_ROLE to the CS Ejector +9. Grant TWG role ADD_FULL_WITHDRAWAL_REQUEST_ROLE to the VEB +10. Connect TRIGGERABLE_WITHDRAWALS_GATEWAY to Dual Governance tiebreaker +--- WV +11. Update WithdrawalVault implementation +12. Call finalizeUpgrade_v2() on WithdrawalVault +--- AO +13. Update Accounting Oracle implementation +14. Grant AO MANAGE_CONSENSUS_VERSION_ROLE to the AGENT +15. Bump AO consensus version to `4` +16. Revoke AO MANAGE_CONSENSUS_VERSION_ROLE from the AGENT +17. Call finalizeUpgrade_v3() on AO +--- SR +18. Update SR implementation +19. Call finalizeUpgrade_v3() on SR +20. Grant SR role REPORT_VALIDATOR_EXITING_STATUS_ROLE to ValidatorExitVerifier +21. Grant SR role REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE to TWG +--- Curated Staking Module +22. Grant APP_MANAGER_ROLE role to the AGENT on Kernel +23. Update `NodeOperatorsRegistry` implementation +24. Call finalizeUpgrade_v4 on Curated Staking Module +--- sDVT +25. Update `SimpleDVT` implementation +26. Call finalizeUpgrade_v4 on sDVT +27. Revoke APP_MANAGER_ROLE role from the AGENT on Kernel +--- Oracle configs --- +28. Grant CONFIG_MANAGER_ROLE role to the AGENT +29. Remove NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP variable from OracleDaemonConfig +30. Remove VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS variable from OracleDaemonConfig +31. Remove VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS variable from OracleDaemonConfig +32. Add EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS variable to OracleDaemonConfig +33. Revoke CONFIG_MANAGER_ROLE role from the AGENT +--- CSM --- +34. Upgrade CSM implementation on proxy +35. Call `finalizeUpgradeV2()` on CSM contract +36. Upgrade CSAccounting implementation on proxy +37. Call `finalizeUpgradeV2(bondCurves)` on CSAccounting contract +38. Upgrade CSFeeOracle implementation on proxy +39. Call `finalizeUpgradeV2(consensusVersion)` on CSFeeOracle contract +40. Upgrade CSFeeDistributor implementation on proxy +41. Call `finalizeUpgradeV2(admin)` on CSFeeDistributor contract +42. Revoke CSAccounting role SET_BOND_CURVE_ROLE from the CSM contract +43. Revoke CSAccounting role RESET_BOND_CURVE_ROLE from the CSM contract +44. Revoke CSAccounting role RESET_BOND_CURVE_ROLE from the CSM committee +45. Grant CSM role CREATE_NODE_OPERATOR_ROLE for the permissionless gate +46. Grant CSM role CREATE_NODE_OPERATOR_ROLE for the vetted gate +47. Grant CSAccounting role SET_BOND_CURVE_ROLE for the vetted gate +48. Revoke role VERIFIER_ROLE from the previous instance of the Verifier contract +49. Grant role VERIFIER_ROLE to the new instance of the Verifier contract +50. Revoke CSM role PAUSE_ROLE from the previous GateSeal instance +51. Revoke CSAccounting role PAUSE_ROLE from the previous GateSeal instance +52. Revoke CSFeeOracle role PAUSE_ROLE from the previous GateSeal instance +53. Grant CSM role PAUSE_ROLE for the new GateSeal instance +54. Grant CSAccounting role PAUSE_ROLE for the new GateSeal instance +55. Grant CSFeeOracle role PAUSE_ROLE for the new GateSeal instance +56. Grant MANAGE_BOND_CURVES_ROLE to the AGENT +57. Add Identified Community Stakers Gate Bond Curve +58. Revoke MANAGE_BOND_CURVES_ROLE from the AGENT +59. Increase CSM share in Staking Router from 15% to 16% +--- Gate Seals --- +60. Revoke PAUSE_ROLE on WithdrawalQueue from the old GateSeal +61. Revoke PAUSE_ROLE on ValidatorsExitBusOracle from the old GateSeal +62. Grant PAUSE_ROLE on WithdrawalQueue to the new WithdrawalQueue GateSeal +63. Grant PAUSE_ROLE on ValidatorsExitBusOracle to the new Triggerable Withdrawals GateSeal +64. Grant PAUSE_ROLE on TriggerableWithdrawalsGateway to the new Triggerable Withdrawals GateSeal +--- ResealManager --- +65. Grant PAUSE_ROLE on TriggerableWithdrawalsGateway to ResealManager +66. Grant RESUME_ROLE on TriggerableWithdrawalsGateway to ResealManager +--- EasyTrack --- +67. Add CSSetVettedGateTree factory to EasyTrack with permissions +68. Add `SubmitValidatorsExitRequestHashes` (SDVT) EVM script factory to Easy Track +69. Add `SubmitValidatorsExitRequestHashes` (Curated Module) EVM script factory to Easy Track + +Vote passed & executed on Jul-23-2025 12:54:36 PM UTC, block 862608 +""" +import time + +from typing import TYPE_CHECKING, Any, Dict +from typing import Tuple, Optional, Sequence +from brownie import interface, web3, convert, ZERO_ADDRESS # type: ignore +from utils.agent import agent_forward +from utils.config import ( + CSM_COMMITTEE_MS, + CS_MODULE_ID, + CS_MODULE_MODULE_FEE_BP, + CS_MODULE_TREASURY_FEE_BP, + CS_MODULE_MAX_DEPOSITS_PER_BLOCK, + CS_MODULE_MIN_DEPOSIT_BLOCK_DISTANCE, + CS_MODULE_TARGET_SHARE_BP, + CS_GATE_SEAL_ADDRESS, + NODE_OPERATORS_REGISTRY_ARAGON_APP_ID, + SIMPLE_DVT_ARAGON_APP_ID, + ARAGON_KERNEL, + AGENT, + contracts, +) +from utils.ipfs import upload_vote_ipfs_description, calculate_vote_ipfs_description +from utils.permissions import encode_oz_grant_role, encode_oz_revoke_role +from utils.easy_track import ( + add_evmscript_factory, + create_permissions, +) +from utils.voting import confirm_vote_script, create_vote +from utils.config import get_deployer_account, get_priority_fee, get_is_live + +DESCRIPTION = "Triggerable withdrawals and CSM v2 upgrade voting (HOODI)" + +# New core contracts implementations +LIDO_LOCATOR_IMPL = "0x003f20CD17e7683A7F88A7AfF004f0C44F0cfB31" +ACCOUNTING_ORACLE_IMPL = "0x2341c9BE0E639f262f8170f9ef1efeCC92cCF617" +VALIDATORS_EXIT_BUS_ORACLE_IMPL = "0x7E6d9C9C44417bf2EaF69685981646e9752D623A" +WITHDRAWAL_VAULT_IMPL = "0xfe7A58960Af333eAdeAeC39149F9d6A71dc3E668" +STAKING_ROUTER_IMPL = "0xd5F04A81ac472B2cB32073CE9dDABa6FaF022827" +NODE_OPERATORS_REGISTRY_IMPL = "0x95F00b016bB31b7182D96D25074684518246E42a" + +TRIGGERABLE_WITHDRAWALS_GATEWAY = "0x6679090D92b08a2a686eF8614feECD8cDFE209db" +VALIDATOR_EXIT_VERIFIER = "0xFd4386A8795956f4B6D01cbb6dB116749731D7bD" + +# Oracle consensus versions +AO_CONSENSUS_VERSION = 4 +VEBO_CONSENSUS_VERSION = 4 +CSM_CONSENSUS_VERSION = 3 + +# Fixed constants from Holesky version +EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS = 14 * 7200 # 14 days in slots (assuming 12 seconds per slot) +NOR_EXIT_DEADLINE_IN_SEC = 172800 # 172800 + +# VEB parameters from Holesky +MAX_VALIDATORS_PER_REPORT = 600 +MAX_EXIT_REQUESTS_LIMIT = 11200 +EXITS_PER_FRAME = 1 +FRAME_DURATION_IN_SEC = 48 + +# CSM +CS_MODULE_NEW_TARGET_SHARE_BP = 1600 # 16% +CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP = 2100 # 21% + +CS_ACCOUNTING_IMPL_V2_ADDRESS = "0x9483b34504292a0E4f6509e5887D2c68f7129638" +CS_FEE_DISTRIBUTOR_IMPL_V2_ADDRESS = "0xe05F7Aab7177D73f26e62a5296120583F5F18031" +CS_FEE_ORACLE_IMPL_V2_ADDRESS = "0x752fF00fcacdB66Bc512a067F15A5E0B0b50EADB" +CSM_IMPL_V2_ADDRESS = "0x9aE387EB2abA80B9B1ebc145597D593EFAE61f31" + +CS_GATE_SEAL_V2_ADDRESS = "0x94a3aEB0E9148F64CB453Be2BDe2Bc0148f6AC24" +CS_EJECTOR_ADDRESS = "0x21e271cBa32672B106737AbeB3a45E53Fe9a0df4" +CS_PERMISSIONLESS_GATE_ADDRESS = "0x5553077102322689876A6AdFd48D75014c28acfb" +CS_VETTED_GATE_ADDRESS = "0x10a254E724fe2b7f305F76f3F116a3969c53845f" +CS_VERIFIER_V2_ADDRESS = "0xf805b3711cBB48F15Ae2bb27095ddC38c5339968" + +CS_CURVES = [ + ([1, 2.4 * 10**18], [2, 1.3 * 10**18]), # Default Curve + ([1, 1.5 * 10**18], [2, 1.3 * 10**18]), # Legacy EA Curve +] +CS_ICS_GATE_BOND_CURVE = ([1, 1.5 * 10**18], [2, 1.3 * 10**18]) # Identified Community Stakers Gate Bond Curve + +# Add missing constants +OLD_GATE_SEAL_ADDRESS = "0x2168Ea6D948Ab49c3D34c667A7e02F92369F3A9C" +NEW_WQ_GATE_SEAL = "0x73d76Bd3D589B2b2185c402da82cdAfbc18b958D" +NEW_TW_GATE_SEAL = "0x368f2fcb593170823cc844F1B29e75E3d26879A1" +RESEAL_MANAGER = "0x05172CbCDb7307228F781436b327679e4DAE166B" + +# Add EasyTrack constants +EASYTRACK_EVMSCRIPT_EXECUTOR = "0x79a20FD0FA36453B2F45eAbab19bfef43575Ba9E" +EASYTRACK_SDVT_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY = "0xAa3D6A8B52447F272c1E8FAaA06EA06658bd95E2" +EASYTRACK_CURATED_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY = "0x397206ecdbdcb1A55A75e60Fc4D054feC72E5f63" +EASYTRACK_CS_SET_VETTED_GATE_TREE_FACTORY = "0xa890fc73e1b771Ee6073e2402E631c312FF92Cd9" + + +def encode_staking_router_proxy_update(implementation: str) -> Tuple[str, str]: + proxy = interface.OssifiableProxy(contracts.staking_router) + return proxy.address, proxy.proxy__upgradeTo.encode_input(implementation) + + +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 encode_wv_proxy_upgrade_to(proxy: Any, implementation: str) -> Tuple[str, str]: + proxy = interface.WithdrawalContractProxy(proxy) + + return proxy.address, proxy.proxy_upgradeTo.encode_input(implementation, b'') + + +def encode_oracle_upgrade_consensus(proxy: Any, consensus_version: int) -> Tuple[str, str]: + oracle = interface.BaseOracle(proxy) + return oracle.address, oracle.setConsensusVersion.encode_input(consensus_version) + + +def encode_staking_router_update_csm_module_share() -> Tuple[str, str]: + """Encode call to update CSM share limit""" + return ( + contracts.staking_router.address, + contracts.staking_router.updateStakingModule.encode_input( + CS_MODULE_ID, + CS_MODULE_NEW_TARGET_SHARE_BP, + CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP, + CS_MODULE_MODULE_FEE_BP, + CS_MODULE_TREASURY_FEE_BP, + CS_MODULE_MAX_DEPOSITS_PER_BLOCK, + CS_MODULE_MIN_DEPOSIT_BLOCK_DISTANCE, + ) + ) + + +def to_percent(bp: int) -> float: + """ + Convert basis points to percentage. + """ + return bp / 10000 * 100 + + +def start_vote(tx_params: Dict[str, str], silent: bool) -> Tuple[int, Optional[Any]]: + vote_desc_items, call_script_items = zip( + # --- locator + ( + "1. Update locator implementation", + agent_forward([encode_proxy_upgrade_to(contracts.lido_locator, LIDO_LOCATOR_IMPL)]) + ), + # --- VEB + ( + "2. Update VEBO implementation", + agent_forward([encode_proxy_upgrade_to(contracts.validators_exit_bus_oracle, VALIDATORS_EXIT_BUS_ORACLE_IMPL)]) + ), + ( + "3. Call finalizeUpgrade_v2 on VEBO", + agent_forward([ + ( + contracts.validators_exit_bus_oracle.address, + contracts.validators_exit_bus_oracle.finalizeUpgrade_v2.encode_input( + MAX_VALIDATORS_PER_REPORT, MAX_EXIT_REQUESTS_LIMIT, EXITS_PER_FRAME, FRAME_DURATION_IN_SEC + ), + ) + ]) + ), + ( + "4. Grant VEBO role MANAGE_CONSENSUS_VERSION_ROLE to the AGENT", + agent_forward([ + encode_oz_grant_role( + contract=contracts.validators_exit_bus_oracle, + role_name="MANAGE_CONSENSUS_VERSION_ROLE", + grant_to=contracts.agent, + ) + ]) + ), + ( + "5. Bump VEBO consensus version to `4`", + agent_forward([encode_oracle_upgrade_consensus(contracts.validators_exit_bus_oracle, VEBO_CONSENSUS_VERSION)]) + ), + ( + "6. Revoke VEBO role MANAGE_CONSENSUS_VERSION_ROLE from the AGENT", + agent_forward([ + encode_oz_revoke_role( + contract=contracts.validators_exit_bus_oracle, + role_name="MANAGE_CONSENSUS_VERSION_ROLE", + revoke_from=contracts.agent, + ) + ]) + ), + ( + "7. Grant SUBMIT_REPORT_HASH_ROLE on Validator Exit Bus Oracle to the EasyTrack EVM Script Executor", + agent_forward([ + encode_oz_grant_role( + contract=contracts.validators_exit_bus_oracle, + role_name="SUBMIT_REPORT_HASH_ROLE", + grant_to=EASYTRACK_EVMSCRIPT_EXECUTOR, + ) + ]) + ), + # --- Triggerable Withdrawals Gateway (TWG) + ( + "8. Grant TWG role ADD_FULL_WITHDRAWAL_REQUEST_ROLE to the CS Ejector", + agent_forward([ + encode_oz_grant_role( + contract=interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY), + role_name="ADD_FULL_WITHDRAWAL_REQUEST_ROLE", + grant_to=CS_EJECTOR_ADDRESS, + ) + ]) + ), + ( + "9. Grant TWG role ADD_FULL_WITHDRAWAL_REQUEST_ROLE to the VEB", + agent_forward([ + encode_oz_grant_role( + contract=interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY), + role_name="ADD_FULL_WITHDRAWAL_REQUEST_ROLE", + grant_to=contracts.validators_exit_bus_oracle, + ) + ]) + ), + ( + "10. Connect TRIGGERABLE_WITHDRAWALS_GATEWAY to Dual Governance tiebreaker", + ( + contracts.dual_governance.address, + contracts.dual_governance.addTiebreakerSealableWithdrawalBlocker.encode_input( + TRIGGERABLE_WITHDRAWALS_GATEWAY + ), + ) + ), + # --- WV + ( + "11. Update WithdrawalVault implementation", + agent_forward([encode_wv_proxy_upgrade_to(contracts.withdrawal_vault, WITHDRAWAL_VAULT_IMPL)]) + ), + ( + "12. Call finalizeUpgrade_v2 on WithdrawalVault", + agent_forward([ + ( + contracts.withdrawal_vault.address, + contracts.withdrawal_vault.finalizeUpgrade_v2.encode_input(), + ) + ]) + ), + # --- AO + ( + "13. Update Accounting Oracle implementation", + agent_forward([encode_proxy_upgrade_to(contracts.accounting_oracle, ACCOUNTING_ORACLE_IMPL)]) + ), + ( + "14. Grant AO MANAGE_CONSENSUS_VERSION_ROLE to the AGENT", + agent_forward([ + encode_oz_grant_role( + contract=contracts.accounting_oracle, + role_name="MANAGE_CONSENSUS_VERSION_ROLE", + grant_to=contracts.agent, + ) + ]) + ), + ( + "15. Bump AO consensus version to `4`", + agent_forward([encode_oracle_upgrade_consensus(contracts.accounting_oracle, AO_CONSENSUS_VERSION)]) + ), + ( + "16. Revoke AO MANAGE_CONSENSUS_VERSION_ROLE from the AGENT", + agent_forward([ + encode_oz_revoke_role( + contract=contracts.accounting_oracle, + role_name="MANAGE_CONSENSUS_VERSION_ROLE", + revoke_from=contracts.agent, + ) + ]) + ), + ( + "17. Call finalizeUpgrade_v3() on AO", + agent_forward([ + ( + contracts.accounting_oracle.address, + contracts.accounting_oracle.finalizeUpgrade_v3.encode_input(), + ) + ]) + ), + # --- SR + ( + "18. Update SR implementation", + agent_forward([encode_staking_router_proxy_update(STAKING_ROUTER_IMPL)]) + ), + ( + "19. Call finalizeUpgrade_v3() on SR", + agent_forward([( + contracts.staking_router.address, + contracts.staking_router.finalizeUpgrade_v3.encode_input(), + )]) + ), + ( + "20. Grant SR role REPORT_VALIDATOR_EXITING_STATUS_ROLE to ValidatorExitDelayVerifier", + agent_forward([ + encode_oz_grant_role( + contract=contracts.staking_router, + role_name="REPORT_VALIDATOR_EXITING_STATUS_ROLE", + grant_to=VALIDATOR_EXIT_VERIFIER, + ) + ]) + ), + ( + "21. Grant SR role REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE to TWG", + agent_forward([ + encode_oz_grant_role( + contract=contracts.staking_router, + role_name="REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE", + grant_to=interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY), + ) + ]) + ), + # --- Curated Staking Module and sDVT + ( + "22. Grant APP_MANAGER_ROLE role to the AGENT", + agent_forward([ + ( + contracts.acl.address, + contracts.acl.grantPermission.encode_input( + AGENT, + ARAGON_KERNEL, + convert.to_uint(web3.keccak(text="APP_MANAGER_ROLE")) + ) + ) + ]) + ), + ( + "23. Update `NodeOperatorsRegistry` implementation", + agent_forward([ + ( + contracts.kernel.address, + contracts.kernel.setApp.encode_input( + contracts.kernel.APP_BASES_NAMESPACE(), + NODE_OPERATORS_REGISTRY_ARAGON_APP_ID, + NODE_OPERATORS_REGISTRY_IMPL + ) + ) + ]) + ), + ( + "24. Call finalizeUpgrade_v4 on Curated Staking Module", + agent_forward([ + ( + interface.NodeOperatorsRegistry(contracts.node_operators_registry).address, + interface.NodeOperatorsRegistry(contracts.node_operators_registry).finalizeUpgrade_v4.encode_input( + NOR_EXIT_DEADLINE_IN_SEC + ) + ) + ]) + ), + ( + "25. Update `SDVT` implementation", + agent_forward([ + ( + contracts.kernel.address, + contracts.kernel.setApp.encode_input( + contracts.kernel.APP_BASES_NAMESPACE(), + SIMPLE_DVT_ARAGON_APP_ID, + NODE_OPERATORS_REGISTRY_IMPL + ) + ) + ]) + ), + ( + "26. Call finalizeUpgrade_v4 on SDVT", + agent_forward([ + ( + interface.NodeOperatorsRegistry(contracts.simple_dvt).address, + interface.NodeOperatorsRegistry(contracts.simple_dvt).finalizeUpgrade_v4.encode_input( + NOR_EXIT_DEADLINE_IN_SEC + ) + ) + ]) + ), + ( + "27. Revoke APP_MANAGER_ROLE role from the AGENT", + agent_forward([ + ( + contracts.acl.address, + contracts.acl.revokePermission.encode_input( + AGENT, + ARAGON_KERNEL, + convert.to_uint(web3.keccak(text="APP_MANAGER_ROLE")) + ) + ) + ]) + ), + # --- Oracle configs + ( + "28. Grant CONFIG_MANAGER_ROLE role to the AGENT", + agent_forward([ + encode_oz_grant_role( + contract=contracts.oracle_daemon_config, + role_name="CONFIG_MANAGER_ROLE", + grant_to=contracts.agent, + ) + ]) + ), + ( + "29. Remove NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP variable from OracleDaemonConfig", + agent_forward([ + ( + contracts.oracle_daemon_config.address, + contracts.oracle_daemon_config.unset.encode_input('NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP'), + ) + ]) + ), + ( + "30. Remove VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS variable from OracleDaemonConfig", + agent_forward([ + ( + contracts.oracle_daemon_config.address, + contracts.oracle_daemon_config.unset.encode_input('VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS'), + ) + ]) + ), + ( + "31. Remove VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS variable from OracleDaemonConfig", + agent_forward([ + ( + contracts.oracle_daemon_config.address, + contracts.oracle_daemon_config.unset.encode_input('VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS'), + ) + ]) + ), + ( + "32. Add EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS variable to OracleDaemonConfig", + agent_forward([ + ( + contracts.oracle_daemon_config.address, + contracts.oracle_daemon_config.set.encode_input('EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS', EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS), + ) + ]) + ), + ( + "33. Revoke CONFIG_MANAGER_ROLE role from the AGENT", + agent_forward([ + encode_oz_revoke_role( + contract=contracts.oracle_daemon_config, + role_name="CONFIG_MANAGER_ROLE", + revoke_from=contracts.agent, + ) + ]) + ), + # --- CSM + ( + "34. Upgrade CSM implementation on proxy", + agent_forward([ + encode_proxy_upgrade_to( + contracts.csm, + CSM_IMPL_V2_ADDRESS, + ) + ]) + ), + ( + "35. Call `finalizeUpgradeV2()` on CSM contract", + agent_forward([ + ( + contracts.csm.address, + contracts.csm.finalizeUpgradeV2.encode_input(), + ) + ]) + ), + ( + "36. Upgrade CSAccounting implementation on proxy", + agent_forward([ + encode_proxy_upgrade_to( + contracts.cs_accounting, + CS_ACCOUNTING_IMPL_V2_ADDRESS, + ) + ]) + ), + ( + "37. Call `finalizeUpgradeV2(bondCurves)` on CSAccounting contract", + agent_forward([ + ( + contracts.cs_accounting.address, + contracts.cs_accounting.finalizeUpgradeV2.encode_input(CS_CURVES), + ) + ]) + ), + ( + "38. Upgrade CSFeeOracle implementation on proxy", + agent_forward([ + encode_proxy_upgrade_to( + contracts.cs_fee_oracle, + CS_FEE_ORACLE_IMPL_V2_ADDRESS, + ) + ]) + ), + ( + "39. Call `finalizeUpgradeV2(consensusVersion)` on CSFeeOracle contract", + agent_forward([ + ( + contracts.cs_fee_oracle.address, + contracts.cs_fee_oracle.finalizeUpgradeV2.encode_input(CSM_CONSENSUS_VERSION), + ) + ]) + ), + ( + "40. Upgrade CSFeeDistributor implementation on proxy", + agent_forward([ + encode_proxy_upgrade_to( + contracts.cs_fee_distributor, + CS_FEE_DISTRIBUTOR_IMPL_V2_ADDRESS, + ) + ]) + ), + ( + "41. Call `finalizeUpgradeV2(admin)` on CSFeeDistributor contract", + agent_forward([ + ( + contracts.cs_fee_distributor.address, + contracts.cs_fee_distributor.finalizeUpgradeV2.encode_input(contracts.agent), + ) + ]) + ), + ( + "42. Revoke CSAccounting role SET_BOND_CURVE_ROLE from the CSM contract", + agent_forward([ + encode_oz_revoke_role( + contract=contracts.cs_accounting, + role_name="SET_BOND_CURVE_ROLE", + revoke_from=contracts.csm, + ) + ]) + ), + ( + "43. Revoke CSAccounting role RESET_BOND_CURVE_ROLE from the CSM contract", + agent_forward([ + encode_oz_revoke_role( + contract=contracts.cs_accounting, + role_name="RESET_BOND_CURVE_ROLE", + revoke_from=contracts.csm, + ) + ]) + ), + ( + "44. Revoke CSAccounting role RESET_BOND_CURVE_ROLE from the CSM committee", + agent_forward([ + encode_oz_revoke_role( + contract=contracts.cs_accounting, + role_name="RESET_BOND_CURVE_ROLE", + revoke_from=CSM_COMMITTEE_MS, + ) + ]) + ), + ( + "45. Grant CSM role CREATE_NODE_OPERATOR_ROLE for the permissionless gate", + agent_forward([ + encode_oz_grant_role( + contract=contracts.csm, + role_name="CREATE_NODE_OPERATOR_ROLE", + grant_to=CS_PERMISSIONLESS_GATE_ADDRESS, + ) + ]) + ), + ( + "46. Grant CSM role CREATE_NODE_OPERATOR_ROLE for the vetted gate", + agent_forward([ + encode_oz_grant_role( + contract=contracts.csm, + role_name="CREATE_NODE_OPERATOR_ROLE", + grant_to=CS_VETTED_GATE_ADDRESS, + ) + ]) + ), + ( + "47. Grant CSAccounting role SET_BOND_CURVE_ROLE for the vetted gate", + agent_forward([ + encode_oz_grant_role( + contract=contracts.cs_accounting, + role_name="SET_BOND_CURVE_ROLE", + grant_to=CS_VETTED_GATE_ADDRESS, + ) + ]) + ), + ( + "48. Revoke role VERIFIER_ROLE from the previous instance of the Verifier contract", + agent_forward([ + encode_oz_revoke_role( + contract=contracts.csm, + role_name="VERIFIER_ROLE", + revoke_from=contracts.cs_verifier, + ) + ]) + ), + ( + "49. Grant role VERIFIER_ROLE to the new instance of the Verifier contract", + agent_forward([ + encode_oz_grant_role( + contract=contracts.csm, + role_name="VERIFIER_ROLE", + grant_to=CS_VERIFIER_V2_ADDRESS, + ) + ]) + ), + ( + "50. Revoke CSM role PAUSE_ROLE from the previous GateSeal instance", + agent_forward([ + encode_oz_revoke_role( + contract=contracts.csm, + role_name="PAUSE_ROLE", + revoke_from=CS_GATE_SEAL_ADDRESS, + ) + ]) + ), + ( + "51. Revoke CSAccounting role PAUSE_ROLE from the previous GateSeal instance", + agent_forward([ + encode_oz_revoke_role( + contract=contracts.cs_accounting, + role_name="PAUSE_ROLE", + revoke_from=CS_GATE_SEAL_ADDRESS, + ) + ]) + ), + ( + "52. Revoke CSFeeOracle role PAUSE_ROLE from the previous GateSeal instance", + agent_forward([ + encode_oz_revoke_role( + contract=contracts.cs_fee_oracle, + role_name="PAUSE_ROLE", + revoke_from=CS_GATE_SEAL_ADDRESS, + ) + ]) + ), + ( + "53. Grant CSM role PAUSE_ROLE for the new GateSeal instance", + agent_forward([ + encode_oz_grant_role( + contract=contracts.csm, + role_name="PAUSE_ROLE", + grant_to=CS_GATE_SEAL_V2_ADDRESS, + ) + ]) + ), + ( + "54. Grant CSAccounting role PAUSE_ROLE for the new GateSeal instance", + agent_forward([ + encode_oz_grant_role( + contract=contracts.cs_accounting, + role_name="PAUSE_ROLE", + grant_to=CS_GATE_SEAL_V2_ADDRESS, + ) + ]) + ), + ( + "55. Grant CSFeeOracle role PAUSE_ROLE for the new GateSeal instance", + agent_forward([ + encode_oz_grant_role( + contract=contracts.cs_fee_oracle, + role_name="PAUSE_ROLE", + grant_to=CS_GATE_SEAL_V2_ADDRESS, + ) + ]) + ), + ( + "56. Grant MANAGE_BOND_CURVES_ROLE to the AGENT", + agent_forward([ + encode_oz_grant_role( + contract=contracts.cs_accounting, + role_name="MANAGE_BOND_CURVES_ROLE", + grant_to=contracts.agent, + ) + ]) + ), + ( + "57. Add Identified Community Stakers Gate Bond Curve", + agent_forward([ + ( + contracts.cs_accounting.address, + contracts.cs_accounting.addBondCurve.encode_input(CS_ICS_GATE_BOND_CURVE), + ) + ]) + ), + ( + "58. Revoke MANAGE_BOND_CURVES_ROLE from the AGENT", + agent_forward([ + encode_oz_revoke_role( + contract=contracts.cs_accounting, + role_name="MANAGE_BOND_CURVES_ROLE", + revoke_from=contracts.agent, + ) + ]) + ), + ( + "59. Increase CSM share in Staking Router from 15% to 16%", + agent_forward([encode_staking_router_update_csm_module_share()]) + ), + # --- Gate Seals + ( + "60. Revoke PAUSE_ROLE on WithdrawalQueue from the old GateSeal", + agent_forward([ + encode_oz_revoke_role( + contract=contracts.withdrawal_queue, + role_name="PAUSE_ROLE", + revoke_from=OLD_GATE_SEAL_ADDRESS, + ) + ]) + ), + ( + "61. Revoke PAUSE_ROLE on ValidatorsExitBusOracle from the old GateSeal", + agent_forward([ + encode_oz_revoke_role( + contract=contracts.validators_exit_bus_oracle, + role_name="PAUSE_ROLE", + revoke_from=OLD_GATE_SEAL_ADDRESS, + ) + ]) + ), + ( + "62. Grant PAUSE_ROLE on WithdrawalQueue to the new WithdrawalQueue GateSeal", + agent_forward([ + encode_oz_grant_role( + contract=contracts.withdrawal_queue, + role_name="PAUSE_ROLE", + grant_to=NEW_WQ_GATE_SEAL, + ) + ]) + ), + ( + "63. Grant PAUSE_ROLE on ValidatorsExitBusOracle to the new Triggerable Withdrawals GateSeal", + agent_forward([ + encode_oz_grant_role( + contract=contracts.validators_exit_bus_oracle, + role_name="PAUSE_ROLE", + grant_to=NEW_TW_GATE_SEAL, + ) + ]) + ), + ( + "64. Grant PAUSE_ROLE on TriggerableWithdrawalsGateway to the new Triggerable Withdrawals GateSeal", + agent_forward([ + encode_oz_grant_role( + contract=interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY), + role_name="PAUSE_ROLE", + grant_to=NEW_TW_GATE_SEAL, + ) + ]) + ), + ( + "65. Grant PAUSE_ROLE on TriggerableWithdrawalsGateway to ResealManager", + agent_forward([ + encode_oz_grant_role( + contract=interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY), + role_name="PAUSE_ROLE", + grant_to=RESEAL_MANAGER, + ) + ]) + ), + ( + "66. Grant RESUME_ROLE on TriggerableWithdrawalsGateway to ResealManager", + agent_forward([ + encode_oz_grant_role( + contract=interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY), + role_name="RESUME_ROLE", + grant_to=RESEAL_MANAGER, + ) + ]) + ), + ) + + dg_bypass_item = { + "67. Add CSSetVettedGateTree factory to EasyTrack with permissions": add_evmscript_factory( + factory=EASYTRACK_CS_SET_VETTED_GATE_TREE_FACTORY, + permissions=(create_permissions(interface.CSVettedGate(CS_VETTED_GATE_ADDRESS), "setTreeParams")), + ), + "68. Add `SubmitValidatorsExitRequestHashes` (SDVT) EVM script factory to Easy Track": add_evmscript_factory( + factory=EASYTRACK_SDVT_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY, + permissions=(create_permissions(contracts.validators_exit_bus_oracle, "submitExitRequestsHash")), + ), + "69. Add `SubmitValidatorsExitRequestHashes` (Curated Module) EVM script factory to Easy Track": 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) + + dg_desc = "\n".join(vote_desc_items) + + dg_vote = prepare_proposal(call_script_items, dg_desc) + vote_items = {dg_desc: dg_vote, **dg_bypass_item} + + assert confirm_vote_script(vote_items, silent, desc_ipfs) + + return create_vote(vote_items, tx_params, desc_ipfs=desc_ipfs) + +def prepare_proposal( + call_script: Sequence[Tuple], + description: Optional[str] = "", +) -> Tuple[str, str]: + dual_governance = contracts.dual_governance + forwarded = [] + + for _call in call_script: + forwarded.append((_call[0], _call[1])) + + print(f"Forwarding call script to dual governance: {forwarded}") + return ( + contracts.dual_governance.address, + dual_governance.submitProposal.encode_input([(_call[0], 0, _call[1]) for _call in forwarded], description), + ) + +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. diff --git a/archive/scripts/vote_tw_upgrade_verifier_hoodi.py b/archive/scripts/vote_tw_upgrade_verifier_hoodi.py new file mode 100644 index 000000000..4ede84c06 --- /dev/null +++ b/archive/scripts/vote_tw_upgrade_verifier_hoodi.py @@ -0,0 +1,94 @@ +""" +Vote 2025-09-02 - TW Upgrade Validator Exit Verifier + +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 + +Vote passed & executed on Sep 02, 2025, 03:47 PM GMT+2, block 1130827 +""" + +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 = "0x7990A2F4E16E3c0D651306D26084718DB5aC9947" +LIDO_LOCATOR_IMPL = "0x47975A61067a4CE41BeB730cf6c57378E55b849A" + +DESCRIPTION = "TW Upgrade Validator Exit Verifier (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.""" + + 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, + ) + ] + ), + ), + ) + + if silent: + desc_ipfs = calculate_vote_ipfs_description(DESCRIPTION) + else: + desc_ipfs = upload_vote_ipfs_description(DESCRIPTION) + + dg_desc = "\n".join(vote_desc_items) + dg_vote = prepare_proposal(call_script_items, dg_desc) + vote_items = {dg_desc: 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() diff --git a/archive/scripts/vote_update_sandbox_impl_holesky.py b/archive/scripts/vote_update_sandbox_impl_holesky.py new file mode 100644 index 000000000..00d0bbf34 --- /dev/null +++ b/archive/scripts/vote_update_sandbox_impl_holesky.py @@ -0,0 +1,102 @@ +""" +Vote XX/06/2025 [HOLESKY] + +1. Grant APP_MANAGER_ROLE role to the AGENT +2. Update `Sandbox Module` implementation +3. Call finalizeUpgrade_v4 on `Sandbox Module` +4. Revoke APP_MANAGER_ROLE role from the AGENT +""" +import time + +from typing import Any, Dict +from typing import Tuple, Optional +from brownie import interface, web3, convert # type: ignore +from utils.config import ( + ARAGON_KERNEL, + AGENT, + contracts, + get_deployer_account, + get_priority_fee, + get_is_live +) +from utils.ipfs import upload_vote_ipfs_description, calculate_vote_ipfs_description +from utils.agent import dual_governance_agent_forward +from utils.voting import confirm_vote_script, create_vote + +SANDBOX_APP_ID = "0x85d2fceef13a6c14c43527594f79fb91a8ef8f15024a43486efac8df2b11e632" +NODE_OPERATORS_REGISTRY_IMPL = "0x834aa47DCd21A32845099a78B4aBb17A7f0bD503" +NOR_EXIT_DEADLINE_IN_SEC = 172800 + +DESCRIPTION = "Update Sanbox Module Implementation (HOLESKY)" + +def start_vote(tx_params: Dict[str, str], silent: bool) -> Tuple[int, Optional[Any]]: + vote_desc_items, call_script_items = zip( + # --- Update Sanbox Module implementation [TESTNET ONLY] --- + ( + f"1. Grant APP_MANAGER_ROLE role to the AGENT", + ( + contracts.acl.address, + contracts.acl.grantPermission.encode_input( + AGENT, + ARAGON_KERNEL, + convert.to_uint(web3.keccak(text="APP_MANAGER_ROLE")) + ) + ) + ), + ( + f"2. Update `Sandbox Module` implementation", + ( + contracts.kernel.address, + contracts.kernel.setApp.encode_input( + contracts.kernel.APP_BASES_NAMESPACE(), + SANDBOX_APP_ID, + NODE_OPERATORS_REGISTRY_IMPL + ) + ) + ), + ( + f"3. Call finalizeUpgrade_v4 on `Sandbox Module`", + ( + interface.NodeOperatorsRegistry(contracts.sandbox).address, + interface.NodeOperatorsRegistry(contracts.sandbox).finalizeUpgrade_v4.encode_input( + NOR_EXIT_DEADLINE_IN_SEC + ) + ) + ), + ( + f"4. Revoke APP_MANAGER_ROLE role from the AGENT", + ( + contracts.acl.address, + contracts.acl.revokePermission.encode_input( + AGENT, + ARAGON_KERNEL, + convert.to_uint(web3.keccak(text="APP_MANAGER_ROLE")) + ) + ) + ), + ) + + if silent: + desc_ipfs = calculate_vote_ipfs_description(DESCRIPTION) + else: + desc_ipfs = upload_vote_ipfs_description(DESCRIPTION) + + dg_desc = "\n".join(vote_desc_items) + dg_vote = dual_governance_agent_forward(call_script_items, dg_desc) + vote_items = {dg_desc: 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. diff --git a/archive/scripts/vote_update_sandbox_impl_hoodi.py b/archive/scripts/vote_update_sandbox_impl_hoodi.py new file mode 100644 index 000000000..7489916d0 --- /dev/null +++ b/archive/scripts/vote_update_sandbox_impl_hoodi.py @@ -0,0 +1,105 @@ +""" +Vote 23/07/2025 [HOODI] + +1. Grant APP_MANAGER_ROLE role to the AGENT +2. Update `Sandbox Module` implementation +3. Call finalizeUpgrade_v4 on `Sandbox Module` +4. Revoke APP_MANAGER_ROLE role from the AGENT + +Vote passed & executed on Jul-23-2025 01:29:48 PM UTC, block 862773 +""" +import time + +from typing import Any, Dict +from typing import Tuple, Optional +from brownie import interface, web3, convert # type: ignore +from scripts.vote_tw_csm2_hoodi import prepare_proposal +from utils.agent import agent_forward +from utils.config import ( + ARAGON_KERNEL, + AGENT, + contracts, + get_deployer_account, + get_priority_fee, + get_is_live +) +from utils.ipfs import upload_vote_ipfs_description, calculate_vote_ipfs_description +from utils.voting import confirm_vote_script, create_vote + +SANDBOX_APP_ID = "0x85d2fceef13a6c14c43527594f79fb91a8ef8f15024a43486efac8df2b11e632" +NODE_OPERATORS_REGISTRY_IMPL = "0x95F00b016bB31b7182D96D25074684518246E42a" # Updated for Hoodi +NOR_EXIT_DEADLINE_IN_SEC = 172800 # 48 hours in seconds + +DESCRIPTION = "Update Sandbox Module Implementation (HOODI)" + +def start_vote(tx_params: Dict[str, str], silent: bool) -> Tuple[int, Optional[Any]]: + vote_desc_items, call_script_items = zip( + # --- Update Sandbox Module implementation [TESTNET ONLY] --- + ( + f"1. Grant APP_MANAGER_ROLE role to the AGENT", + agent_forward([( + contracts.acl.address, + contracts.acl.grantPermission.encode_input( + AGENT, + ARAGON_KERNEL, + convert.to_uint(web3.keccak(text="APP_MANAGER_ROLE")) + ) + )]) + ), + ( + f"2. Update `Sandbox Module` implementation", + agent_forward([( + contracts.kernel.address, + contracts.kernel.setApp.encode_input( + contracts.kernel.APP_BASES_NAMESPACE(), + SANDBOX_APP_ID, + NODE_OPERATORS_REGISTRY_IMPL + ) + )]) + ), + ( + f"3. Call finalizeUpgrade_v4 on `Sandbox Module`", + agent_forward([( + interface.NodeOperatorsRegistry(contracts.sandbox).address, + interface.NodeOperatorsRegistry(contracts.sandbox).finalizeUpgrade_v4.encode_input( + NOR_EXIT_DEADLINE_IN_SEC + ) + )]), + ), + ( + f"4. Revoke APP_MANAGER_ROLE role from the AGENT", + agent_forward([( + contracts.acl.address, + contracts.acl.revokePermission.encode_input( + AGENT, + ARAGON_KERNEL, + convert.to_uint(web3.keccak(text="APP_MANAGER_ROLE")) + ) + )]), + ), + ) + + if silent: + desc_ipfs = calculate_vote_ipfs_description(DESCRIPTION) + else: + desc_ipfs = upload_vote_ipfs_description(DESCRIPTION) + + dg_desc = "\n".join(vote_desc_items) + dg_vote = prepare_proposal(call_script_items, dg_desc) + vote_items = {dg_desc: 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. diff --git a/archive/tests/test_vote_dg_easy_track_tw_holesky.py b/archive/tests/test_vote_dg_easy_track_tw_holesky.py new file mode 100644 index 000000000..1e04cdfa7 --- /dev/null +++ b/archive/tests/test_vote_dg_easy_track_tw_holesky.py @@ -0,0 +1,78 @@ +from typing import Optional +from scripts.vote_dg_easy_track_tw_holesky import start_vote +from brownie import interface, chain, web3 # type: ignore +from utils.dual_governance import wait_for_noon_utc_to_satisfy_time_constrains +from utils.config import ( + DUAL_GOVERNANCE, + TIMELOCK, + LDO_HOLDER_ADDRESS_FOR_TESTS, + contracts, +) + +# Implementation address from vote script +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" + + +def test_vote(helpers, accounts, vote_ids_from_env, stranger): + triggerable_withdrawals_gateway = interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY) + + timelock = interface.EmergencyProtectedTimelock(TIMELOCK) + dual_governance = interface.DualGovernance(DUAL_GOVERNANCE) + submit_exit_hashes_role = web3.keccak(text="SUBMIT_REPORT_HASH_ROLE") + initial_factories = contracts.easy_track.getEVMScriptFactories() + DG_OLD_WITHDRAWAL_BLOCKERS = ( + contracts.withdrawal_queue.address, + contracts.validators_exit_bus_oracle.address, + ) + + DG_NEW_WITHDRAWAL_BLOCKERS = ( + contracts.withdrawal_queue.address, + contracts.validators_exit_bus_oracle.address, + triggerable_withdrawals_gateway.address, + ) + + tiebreaker_details = contracts.dual_governance.getTiebreakerDetails() + assert tiebreaker_details[3] == DG_OLD_WITHDRAWAL_BLOCKERS, "Old withdrawal blockers should be set in Dual Governance before vote" + + + assert not contracts.validators_exit_bus_oracle.hasRole(submit_exit_hashes_role, EASYTRACK_EVMSCRIPT_EXECUTOR) + # SDVT EVM script factory is not in Easy Track + assert EASYTRACK_SDVT_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY not in initial_factories, "EasyTrack should not have SDVT Submit Validator Exit Request Hashes factory before vote" + # Curated EVM script factory is not in Easy Track + assert EASYTRACK_CURATED_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY not in initial_factories, "EasyTrack should not have Curated Submit Validator Exit Request Hashes factory before vote" + # START VOTE + if len(vote_ids_from_env) > 0: + (vote_id,) = vote_ids_from_env + else: + tx_params = {"from": LDO_HOLDER_ADDRESS_FOR_TESTS} + vote_id, _ = start_vote(tx_params, silent=True) + + vote_tx = helpers.execute_vote(accounts, vote_id, contracts.voting) + print(f"voteId = {vote_id}") + + proposal_id = vote_tx.events["ProposalSubmitted"][1]["proposalId"] + print(f"proposalId = {proposal_id}") + + chain.sleep(timelock.getAfterSubmitDelay() + 1) + dual_governance.scheduleProposal(proposal_id, {"from": stranger}) + + chain.sleep(timelock.getAfterScheduleDelay() + 1) + wait_for_noon_utc_to_satisfy_time_constrains() + + dg_tx = timelock.execute(proposal_id, {"from": stranger}) + # Check DG WITHDRAWAL_BLOCKERS + tiebreaker_details = contracts.dual_governance.getTiebreakerDetails() + print(f"tiebreaker_details = {tiebreaker_details[3]}") + assert tiebreaker_details[3] == DG_NEW_WITHDRAWAL_BLOCKERS, "New withdrawal blockers should be set in Dual Governance after vote" + + assert contracts.validators_exit_bus_oracle.hasRole(submit_exit_hashes_role, EASYTRACK_EVMSCRIPT_EXECUTOR) + new_factories = contracts.easy_track.getEVMScriptFactories() + # SDVT EVM script factory is added to Easy Track + assert EASYTRACK_SDVT_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY in new_factories, "EasyTrack should have SDVT Submit Validator Exit Request Hashes factory after vote" + # Curated EVM script factory is added to Easy Track + assert EASYTRACK_CURATED_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY in new_factories, "EasyTrack should have Curated Submit Validator Exit Request Hashes factory after vote" diff --git a/archive/tests/test_vote_hoodi_exit_hashes.py b/archive/tests/test_vote_hoodi_exit_hashes.py new file mode 100644 index 000000000..3b97e40be --- /dev/null +++ b/archive/tests/test_vote_hoodi_exit_hashes.py @@ -0,0 +1,188 @@ +from typing import Optional +from archive.scripts.vote_hoodi_exit_hashes import start_vote, EXIT_HASH_TO_SUBMIT, OLD_VALIDATOR_EXIT_VERIFIER, LIDO_LOCATOR_IMPL +from brownie import interface, chain, convert, web3 # type: ignore +from brownie.network.event import EventDict +from utils.test.tx_tracing_helpers import group_voting_events_from_receipt, group_dg_events_from_receipt +from utils.test.event_validators.dual_governance import validate_dual_governance_submit_event +from utils.dual_governance import wait_for_noon_utc_to_satisfy_time_constrains +from utils.config import ( + DUAL_GOVERNANCE, + TIMELOCK, + DUAL_GOVERNANCE_EXECUTORS, + LDO_HOLDER_ADDRESS_FOR_TESTS, + AGENT, + VOTING, + contracts, +) + + +def validate_role_grant_event(event: EventDict, role_hash: str, account: str, emitted_by: Optional[str] = None): + """Validates an OpenZeppelin AccessControl role grant event""" + assert "RoleGranted" in event, "No RoleGranted event found" + assert event["RoleGranted"][0]["role"] == role_hash, f"Wrong role hash. Expected: {role_hash}, Got: {event['RoleGranted'][0]['role']}" + assert event["RoleGranted"][0]["account"] == convert.to_address(account), f"Wrong account. Expected: {account}, Got: {event['RoleGranted'][0]['account']}" + + if emitted_by is not None: + assert convert.to_address(event["RoleGranted"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_role_revoke_event(event: EventDict, role_hash: str, account: str, emitted_by: Optional[str] = None): + """Validates an OpenZeppelin AccessControl role revoke event""" + assert "RoleRevoked" in event, "No RoleRevoked event found" + assert event["RoleRevoked"][0]["role"] == role_hash, f"Wrong role hash. Expected: {role_hash}, Got: {event['RoleRevoked'][0]['role']}" + assert event["RoleRevoked"][0]["account"] == convert.to_address(account), f"Wrong account. Expected: {account}, Got: {event['RoleRevoked'][0]['account']}" + + if emitted_by is not None: + assert convert.to_address(event["RoleRevoked"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_submit_exit_requests_hash_event(event: EventDict, expected_hash: str, emitted_by: Optional[str] = None): + """Validates RequestsHashSubmitted event from ValidatorsExitBus""" + assert "RequestsHashSubmitted" in event, "No RequestsHashSubmitted event found" + assert event["RequestsHashSubmitted"][0]["exitRequestsHash"] == expected_hash, f"Wrong hash. Expected: {expected_hash}, Got: {event['RequestsHashSubmitted'][0]['exitRequestsHash']}" + + if emitted_by is not None: + assert convert.to_address(event["RequestsHashSubmitted"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_proxy_upgrade_event(event: EventDict, expected_implementation: str, emitted_by: Optional[str] = None): + """Validates Upgraded event from OssifiableProxy""" + assert "Upgraded" in event, "No Upgraded event found" + assert event["Upgraded"][0]["implementation"] == convert.to_address(expected_implementation), f"Wrong implementation. Expected: {expected_implementation}, Got: {event['Upgraded'][0]['implementation']}" + + if emitted_by is not None: + assert convert.to_address(event["Upgraded"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def test_vote_hoodi_exit_hashes(helpers, accounts, vote_ids_from_env, stranger): + """Test the comprehensive vote that grants validator roles, submits exit hash, and manages permissions""" + + # Calculate role hashes + SUBMIT_REPORT_HASH_ROLE = web3.keccak(text="SUBMIT_REPORT_HASH_ROLE") + REPORT_VALIDATOR_EXITING_STATUS_ROLE = web3.keccak(text="REPORT_VALIDATOR_EXITING_STATUS_ROLE") + + # Get contracts + validators_exit_bus = interface.ValidatorsExitBusOracle(contracts.validators_exit_bus_oracle) + staking_router = interface.StakingRouter(contracts.staking_router) + lido_locator_proxy = interface.OssifiableProxy(contracts.lido_locator) + timelock = interface.EmergencyProtectedTimelock(TIMELOCK) + dual_governance = interface.DualGovernance(DUAL_GOVERNANCE) + + # Check initial state + initial_implementation = lido_locator_proxy.proxy__getImplementation() + assert not validators_exit_bus.hasRole(SUBMIT_REPORT_HASH_ROLE, AGENT), "Agent should not have SUBMIT_REPORT_HASH_ROLE before vote" + + # Check if old verifier currently has the role (to be revoked) + old_verifier_has_role_before = staking_router.hasRole(REPORT_VALIDATOR_EXITING_STATUS_ROLE, OLD_VALIDATOR_EXIT_VERIFIER) + new_verifier_has_role_before = staking_router.hasRole(REPORT_VALIDATOR_EXITING_STATUS_ROLE, contracts.validator_exit_verifier) + + # START VOTE + if len(vote_ids_from_env) > 0: + (vote_id,) = vote_ids_from_env + else: + tx_params = {"from": LDO_HOLDER_ADDRESS_FOR_TESTS} + vote_id, _ = start_vote(tx_params, silent=True) + + vote_tx = helpers.execute_vote(accounts, vote_id, contracts.voting) + print(f"voteId = {vote_id}") + + proposal_id = vote_tx.events["ProposalSubmitted"][1]["proposalId"] + print(f"proposalId = {proposal_id}") + + chain.sleep(timelock.getAfterSubmitDelay() + 1) + dual_governance.scheduleProposal(proposal_id, {"from": stranger}) + + chain.sleep(timelock.getAfterScheduleDelay() + 1) + wait_for_noon_utc_to_satisfy_time_constrains() + + dg_tx = timelock.execute(proposal_id, {"from": stranger}) + + # --- VALIDATE EXECUTION RESULTS --- + + # 1. Verify Lido Locator was upgraded + final_implementation = lido_locator_proxy.proxy__getImplementation() + assert final_implementation == LIDO_LOCATOR_IMPL, f"Locator implementation not upgraded. Expected: {LIDO_LOCATOR_IMPL}, Got: {final_implementation}" + assert final_implementation != initial_implementation, "Implementation should have changed" + + # 2. Verify validator roles were updated + assert staking_router.hasRole(REPORT_VALIDATOR_EXITING_STATUS_ROLE, contracts.validator_exit_verifier), "New verifier should have role after vote" + assert not staking_router.hasRole(REPORT_VALIDATOR_EXITING_STATUS_ROLE, OLD_VALIDATOR_EXIT_VERIFIER), "Old verifier should not have role after vote" + + # 3. Verify SUBMIT_REPORT_HASH_ROLE was granted and then revoked (final state is revoked) + assert not validators_exit_bus.hasRole(SUBMIT_REPORT_HASH_ROLE, AGENT), "Agent should not have SUBMIT_REPORT_HASH_ROLE after vote" + + # --- VALIDATE EVENTS --- + voting_events = group_voting_events_from_receipt(vote_tx) + assert len(voting_events) >= 1, "No voting events found" + + validate_dual_governance_submit_event( + voting_events[0], + proposal_id, + proposer=VOTING, + executor=DUAL_GOVERNANCE_EXECUTORS[0], + ) + + dg_execution_events = group_dg_events_from_receipt(dg_tx, timelock=TIMELOCK, admin_executor=DUAL_GOVERNANCE_EXECUTORS[0]) + expected_events = 6 # 1 proxy upgrade + 2 role grants + 1 role grant for agent + 1 hash submission + 1 role revoke + assert len(dg_execution_events) == expected_events, f"Expected {expected_events} dual governance events, got {len(dg_execution_events)}" + + event_idx = 0 + + # Step 1: Upgrade Lido Locator implementation + validate_proxy_upgrade_event( + dg_execution_events[event_idx], + expected_implementation=LIDO_LOCATOR_IMPL, + emitted_by=contracts.lido_locator + ) + event_idx += 1 + + # Step 2: Grant REPORT_VALIDATOR_EXITING_STATUS_ROLE to new validator exit verifier + validate_role_grant_event( + dg_execution_events[event_idx], + role_hash=REPORT_VALIDATOR_EXITING_STATUS_ROLE.hex(), + account=contracts.validator_exit_verifier, + emitted_by=contracts.staking_router + ) + event_idx += 1 + + # Step 3: Revoke REPORT_VALIDATOR_EXITING_STATUS_ROLE from old validator exit verifier + validate_role_revoke_event( + dg_execution_events[event_idx], + role_hash=REPORT_VALIDATOR_EXITING_STATUS_ROLE.hex(), + account=OLD_VALIDATOR_EXIT_VERIFIER, + emitted_by=contracts.staking_router + ) + event_idx += 1 + + # Step 4: Grant SUBMIT_REPORT_HASH_ROLE to agent + validate_role_grant_event( + dg_execution_events[event_idx], + role_hash=SUBMIT_REPORT_HASH_ROLE.hex(), + account=AGENT, + emitted_by=contracts.validators_exit_bus_oracle + ) + event_idx += 1 + + # Step 5: Submit exit requests hash + validate_submit_exit_requests_hash_event( + dg_execution_events[event_idx], + expected_hash=EXIT_HASH_TO_SUBMIT, + emitted_by=contracts.validators_exit_bus_oracle + ) + event_idx += 1 + + # Step 6: Revoke SUBMIT_REPORT_HASH_ROLE from agent + validate_role_revoke_event( + dg_execution_events[event_idx], + role_hash=SUBMIT_REPORT_HASH_ROLE.hex(), + account=AGENT, + emitted_by=contracts.validators_exit_bus_oracle + ) + + print("✅ Vote executed successfully:") + print(f" - Lido Locator upgraded to implementation: {LIDO_LOCATOR_IMPL}") + print(f" - REPORT_VALIDATOR_EXITING_STATUS_ROLE granted to new verifier: {contracts.validator_exit_verifier}") + print(f" - REPORT_VALIDATOR_EXITING_STATUS_ROLE revoked from old verifier: {OLD_VALIDATOR_EXIT_VERIFIER}") + print(f" - SUBMIT_REPORT_HASH_ROLE granted and revoked to/from agent") + print(f" - Exit hash {EXIT_HASH_TO_SUBMIT} submitted") + print(f" - All {expected_events} events validated correctly") diff --git a/archive/tests/test_vote_hoodi_exit_hashes_2.py b/archive/tests/test_vote_hoodi_exit_hashes_2.py new file mode 100644 index 000000000..1eaac09a7 --- /dev/null +++ b/archive/tests/test_vote_hoodi_exit_hashes_2.py @@ -0,0 +1,156 @@ +from typing import Optional + +from eth_abi import encode + +from archive.scripts.vote_hoodi_exit_hashes_2 import start_vote, EXIT_HASH_TO_SUBMIT +from brownie import interface, chain, convert, web3 # type: ignore +from brownie.network.event import EventDict +from utils.test.tx_tracing_helpers import group_voting_events_from_receipt, group_dg_events_from_receipt +from utils.test.event_validators.dual_governance import validate_dual_governance_submit_event +from utils.dual_governance import wait_for_noon_utc_to_satisfy_time_constrains +from utils.config import ( + DUAL_GOVERNANCE, + TIMELOCK, + DUAL_GOVERNANCE_EXECUTORS, + LDO_HOLDER_ADDRESS_FOR_TESTS, + AGENT, + VOTING, + contracts, +) + + +def validate_role_grant_event(event: EventDict, role_hash: str, account: str, emitted_by: Optional[str] = None): + """Validates an OpenZeppelin AccessControl role grant event""" + assert "RoleGranted" in event, "No RoleGranted event found" + assert event["RoleGranted"][0]["role"] == role_hash, f"Wrong role hash. Expected: {role_hash}, Got: {event['RoleGranted'][0]['role']}" + assert event["RoleGranted"][0]["account"] == convert.to_address(account), f"Wrong account. Expected: {account}, Got: {event['RoleGranted'][0]['account']}" + + if emitted_by is not None: + assert convert.to_address(event["RoleGranted"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_role_revoke_event(event: EventDict, role_hash: str, account: str, emitted_by: Optional[str] = None): + """Validates an OpenZeppelin AccessControl role revoke event""" + assert "RoleRevoked" in event, "No RoleRevoked event found" + assert event["RoleRevoked"][0]["role"] == role_hash, f"Wrong role hash. Expected: {role_hash}, Got: {event['RoleRevoked'][0]['role']}" + assert event["RoleRevoked"][0]["account"] == convert.to_address(account), f"Wrong account. Expected: {account}, Got: {event['RoleRevoked'][0]['account']}" + + if emitted_by is not None: + assert convert.to_address(event["RoleRevoked"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_submit_exit_requests_hash_event(event: EventDict, expected_hash: str, emitted_by: Optional[str] = None): + """Validates RequestsHashSubmitted event from ValidatorsExitBus""" + assert "RequestsHashSubmitted" in event, "No RequestsHashSubmitted event found" + assert event["RequestsHashSubmitted"][0]["exitRequestsHash"] == expected_hash, f"Wrong hash. Expected: {expected_hash}, Got: {event['RequestsHashSubmitted'][0]['exitRequestsHash']}" + + if emitted_by is not None: + assert convert.to_address(event["RequestsHashSubmitted"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def test_vote_hoodi_exit_hashes(helpers, accounts, vote_ids_from_env, stranger): + """Test the comprehensive vote that grants validator roles, submits exit hash, and manages permissions""" + # Calculate role hashes + SUBMIT_REPORT_HASH_ROLE = web3.keccak(text="SUBMIT_REPORT_HASH_ROLE") + + # Get contracts + validators_exit_bus = interface.ValidatorsExitBusOracle(contracts.validators_exit_bus_oracle) + timelock = interface.EmergencyProtectedTimelock(TIMELOCK) + dual_governance = interface.DualGovernance(DUAL_GOVERNANCE) + + # Check initial state + assert not validators_exit_bus.hasRole(SUBMIT_REPORT_HASH_ROLE, AGENT), "Agent should not have SUBMIT_REPORT_HASH_ROLE before vote" + + # START VOTE + if len(vote_ids_from_env) > 0: + (vote_id,) = vote_ids_from_env + else: + tx_params = {"from": LDO_HOLDER_ADDRESS_FOR_TESTS} + vote_id, _ = start_vote(tx_params, silent=True) + + vote_tx = helpers.execute_vote(accounts, vote_id, contracts.voting) + print(f"voteId = {vote_id}") + + proposal_id = vote_tx.events["ProposalSubmitted"][1]["proposalId"] + print(f"proposalId = {proposal_id}") + + chain.sleep(timelock.getAfterSubmitDelay() + 1) + dual_governance.scheduleProposal(proposal_id, {"from": stranger}) + + chain.sleep(timelock.getAfterScheduleDelay() + 1) + wait_for_noon_utc_to_satisfy_time_constrains() + + dg_tx = timelock.execute(proposal_id, {"from": stranger}) + + # --- VALIDATE EXECUTION RESULTS --- + + # 1. Verify SUBMIT_REPORT_HASH_ROLE was granted and then revoked (final state is revoked) + assert not validators_exit_bus.hasRole(SUBMIT_REPORT_HASH_ROLE, AGENT), "Agent should not have SUBMIT_REPORT_HASH_ROLE after vote" + + # --- VALIDATE EVENTS --- + voting_events = group_voting_events_from_receipt(vote_tx) + assert len(voting_events) >= 1, "No voting events found" + + validate_dual_governance_submit_event( + voting_events[0], + proposal_id, + proposer=VOTING, + executor=DUAL_GOVERNANCE_EXECUTORS[0], + ) + + dg_execution_events = group_dg_events_from_receipt(dg_tx, timelock=TIMELOCK, admin_executor=DUAL_GOVERNANCE_EXECUTORS[0]) + expected_events = 3 # 1 proxy upgrade + 2 role grants + 1 role grant for agent + 1 hash submission + 1 role revoke + assert len(dg_execution_events) == expected_events, f"Expected {expected_events} dual governance events, got {len(dg_execution_events)}" + + event_idx = 0 + + # Step 1: Grant SUBMIT_REPORT_HASH_ROLE to agent + validate_role_grant_event( + dg_execution_events[event_idx], + role_hash=SUBMIT_REPORT_HASH_ROLE.hex(), + account=AGENT, + emitted_by=contracts.validators_exit_bus_oracle + ) + event_idx += 1 + + # Step 2: Submit exit requests hash + validate_submit_exit_requests_hash_event( + dg_execution_events[event_idx], + expected_hash=EXIT_HASH_TO_SUBMIT, + emitted_by=contracts.validators_exit_bus_oracle + ) + event_idx += 1 + + # Step 3: Revoke SUBMIT_REPORT_HASH_ROLE from agent + validate_role_revoke_event( + dg_execution_events[event_idx], + role_hash=SUBMIT_REPORT_HASH_ROLE.hex(), + account=AGENT, + emitted_by=contracts.validators_exit_bus_oracle + ) + + predefined_data = "0x00000100000000260000000000125241a78696e5b09b8e5b5e61a49ff531b3804bd16b1f994540f40540c65605cf08ce957ad0b94e8440cbdf7f9a81444954d700000100000000260000000000125242b8a44217a0c245759175ff7aa0c06544dc88ea65ae1b4adb74607a82f91aad1c6e4b20ba609059e2e6dbd2687a43b73600000100000000260000000000125243a5fba2933049078b3b8841d6ff435004e8fe8b13e2ea166b16195eb6599a82e9f9fe737d0c6d67a25e135ea60402e7a400000100000000260000000000125244acc5a6cad5513f0a8ad300a94ffee73e0045ce9ffc91bd241724fb537c970a7584d74a8c0488d38f8cceef185a8d5383000001000000002600000000001252458fbe581b43bc4bd2e60839e0c93a3bb719aa1ff2783459efd566ea544d16537a430b4efebfb354c67c9997a8937e64a700000100000000260000000000125246812dc595e8aa81ac1abf03fedb706a9eca674c8b166c7876b3682832c55882ba72231a14164d9eece517bbd3d34e2a5200000100000000260000000000125247a2d1cbccd91f15a89738cdc6d91c167f4bec5d02f5b0887a426c6c08a5811153cadfaeaa642258791f12beeba47f27c7000001000000002600000000001252488dcfbb614f08369db636c9e3c0c827b70646022b0922a02f3d4a09e0705510d1f2a674687cc34c6603a52065cc62bdda0000010000000026000000000012524980c5f60c6636a250bd84c8e831dc359d24385fc3981d77e1c912893a3418f16aa9bf2732fc3939dae59a3b82c34ea1720000010000000026000000000012524aa20a4943ca567ec1e26e472538aa81aac2f48f6a259296d601161f54382ef61c8b2e6f96b09886713f57d0e65c59f17f0000010000000026000000000012524b8e7127fb3f799ea4ee0da058eebdfaa7f59a2db523bd20d83c25e04127ec18427229c9ff70ca0869ced0a0373e4f9b200000010000000026000000000012524ca49fda2222e09fb8281c13431fab799657d8a0410d927e52436cc3f1e62ad7c0e6296eae6ed0579b909cf587187dddc70000010000000026000000000012524db8d5df6025bba5fbbb505719d593e94b06044b73e65cd4ee8cb81a6476b4b2fe64b2b4c7a55743222548d020fed1c82c0000010000000026000000000012524e8b1a3fd059496f27bc92c3fbafd0fe1eaa8f7b4ffd02a09ec267093f3d11239268c3da08fac2f1980f7c569fb0e0d8530000010000000026000000000012524fae093eb7fb3fe5b0609148d572053b980e96dd6aa0d9612e51c9a14bbbc4b2e6958247733257879c9f64be09772bae9f00000100000000260000000000125250ab1e5e65b50e661fa6d8579d4d9067fd496feea53470442c1597c4bb8c9a24d212ef436adfa5c5421eebc5df90ca7ef100000100000000260000000000125251a0d3c6255d1f2e91f74b8faaced586142a77a87b114dca129e60695abd81b6e00f7cf88db79a9d6f570d9d44e7e732df00000100000000260000000000125252b39cfc781b9e35d6cf56860cc1630ecd5ab9e433b2c2a0efeb0dac7876ddba98d45aae8f6e79840aaf8569c43065cb45000001000000002600000000001252538c444803f6c62bd61d12db2038b1514b4e6d7130ef765df7afff590ab8580563f08aecf198b73e27c0e614b01de0b64600000100000000260000000000125254a66bc354c6763abb40b2ebbaad1d395b995f8a49c344048c277f42597bbafef474f8938e0e251ecdae6c1acf350beadf00000100000000260000000000125255896fb7e9569da617a9e21776a09ba877eca17a7cd030320f22c4613e9b5d73a64ba73ae9094e80117008406466c1583300000100000000260000000000125256b8ee455a0851ccad89d9a3dc84a49c5cd7f6984ff70352ccfa19db7b3ffe18c939cee1da80501a52f9e980f9d2412b11000001000000002600000000001252579270e84c303514095f050c8eadb67fb9f0ef1e497046ee78481cf1a52a748b0d08c539ec3ad1e718bcd4667bb04b6be500000100000000260000000000125258a72cfaa622199a84e48d59ff6531417f29d443f4d540d0627c8c740bb565d02556be7c7911e0936b667e7267d321c19900000100000000260000000000125259a077184595ade55f894aee536772c8707aba379e19db33fbe9b58c7af2604edb49eb5e940ba3e633613329040648ac1a0000010000000026000000000012525a88cd229f5d9d262e1c544504fec49b4ce161d47080962c0ba2899dc5fbfadc38bfe65e2ae079d662d4a26430b1193aa40000010000000026000000000012525b83c65d891c370600ec8d51ec12e589c01058bf2307d3e598f84b06f3df5b2cb5346e9168444afb1a49bb61f52cc671b50000010000000026000000000012525ca177be81452f6ed7d08238f14a039828fd782b2af7a3ee44852155fc3d0207bc814ad71806033886facef72a5229290e0000010000000026000000000012525d8ea55869a848900c80d73ac04cac42d918a9055f86133617b00558e2399c650d30feb4cfec3e7fcf07221d588f871d1a0000010000000026000000000012525e82778dd394c065c3d9427f181d24619c440ada4391f51bb0a307823d2d8d2880c569480bdf842fec75be529ee56ff1870000010000000026000000000012525f9256b688a3aa0efa2aee7bcf940a213576ec20dfd62d6708998d24ee5feff9136da12ed34202f45f94f3b5cd808a361500000100000000260000000000125260b30380f7fa48c163c76101abb64312925a94af3b1b3d6be493fb68acc84188341cb1c89f5a8ff4822042be0ec050142d00000100000000260000000000125261ad919b76beaf87853b1c3df4b564112e60a273cc0cc9e4a989408e496be4427ca4a50cce8d7d59ba3ae22fb5140a7ef800000100000000260000000000125262b98a4396a14edd3b6f130710903024d2871dcf9fc6daa9644237bb150533df0c545e161fa85160d48941b75f22f75b02000001000000002600000000001252638832a99211494d215bc9e0276b877ce52ed3658f8dc9bcd1258a07c3c788c6c5d4ccc61bdcbc44c1c4ed8039601ba15f00000100000000260000000000125264810340c10905d93b5cdd2031f2b104e1267f047b35c849b33ddfb7b119144c39c905fb8a1534a5070686abb42c7db2a00000010000000026000000000012526582e09256e880437f9e46cd7ef02409c2837f647a9c839a296fff91181cd00e5b719925ec4cbb114c9b5ba9a0cae6f2cf0000010000000026000000000012526684fac01191fc77d3e8f750c05a1a13923c76d5608fb2bd2567475f5df939f6d2250e06b17cac2799e632528841505274000001000000002600000000001252679987b0c13046f1de8413cdd4d33e9ff91c02381b99bcf071872cf590a0a64c62284d512ee913bb28625b302cdc53629700000100000000260000000000125268a50e1b3bd1c26c9c8d66c9980c1783bb1d0f29433e4f92059b167e35ab74fe965f2d30b5d7276e49ed0d0891c4c4ea4b0000010000000026000000000012526994d200a31d1fed7935a1335a8fac8aa7f8cfebd3e3de0c13f7144dc4ff8f973921e39db25020b4d1c65ecf5565068bed0000010000000026000000000012526ab01e220f652a6b6f9cafe8d108197de6c9c897f0f876d09a5aa235adc4358f6e6f3af14eb17c24fbbee069a6242acc630000010000000026000000000012526ba8834293737e445210aa5dfe0346d6cde463782a7f7e206810fcff42154fa86b78f36d0100c2f80390f22a5607023d110000010000000026000000000012526c83fbc633a6388244d4129ea10ccc539c689976ff1b4fecc80c4d36f9e2e0a4ac969136e478ccb1811fbf859ac38d41550000010000000026000000000012526d93be7eee97de6c0c4e562daa75aac2cc90e4ffefd4164effa9d90eff4a21c17b3bed7469701a0249c27798a3600589e00000010000000026000000000012526eb82f51c3a521e5bcc8dc0d7e7a4e2b9aa62e52686c44bd88056b4f1f7726988b50dfc4b1b623ed3c6186a5044e4e318a0000010000000026000000000012526fb66fd1cf3e2932ef26a9311c757377c12039ef65ac662a7862752e747b0b6166748dac83e6ff802b468f547fd02f251600000100000000260000000000125270b06871f106ccd62756397b225c7fde7e06fe2ba553621f19dfe7f7cd64c034aeb844f0e390caaf41fb0023c790c4520700000100000000260000000000125271ae8c39361d488067ca653ecb91c5f7403ee757d0724a074009ffbde7edcdac74f10f1509ac25aaab479a7e78d35a892b0000010000000026000000000012527281115c980926984afd742f49546c67a4433053257033ebb40e36a8c217822c7b977e3cd3b5d11739cf7de65cb1ce10da0000010000000026000000000012527391fe01afb5487303728fb5f381ec7fa5a8b194e5abf9712eb387e001da961e170aa4c34472f2c4272c383a82bdfae90900000100000000260000000000125274958533da6603bd473fedb65c418de855c71046e3c881d447278dea581fc20fb6bfd94668aebd519807ad656c83be05db000001000000002600000000001252758e4db1d403229fc8c90e374c7406ccf2d6d0e4f424bfe921bad579df183fb044bb9c5b55b9c89044357c4234c6e1cd3e00000100000000260000000000125276aabf438f83008dcd1379be449439996de274d060f80b7056fe950af9c71ae3a318a558968b4f003837debc840692711b00000100000000260000000000125277b6a063833ff1a16d4055a8db7d3cb0026f360e77134bf6a6b40f666b920e186a66139c7f77dcd13f0f2d5f8b9f24cb28000001000000002600000000001252789887ffcdcd77b56419913d22e70dbaac36b4fe6404f80c4cf2ef7cf03162bb2db49b2ce7cc3a8018104eac2f8eb6624600000100000000260000000000125279a548e8a5b434c503e682063bb4498c6e021112c2b44d6d77de4b2513e776816afef3ea21cb23ee290e4fc98008ff18cc0000010000000026000000000012527a8ab88b88bf4c93b1030e2de4ee09ee9947ec24f6fe323e8e1b1da45783a029febd91bed68ddc6f95a38d3a8b0cc620120000010000000026000000000012527bb743f4378eb045adf3a05377215c603ae42d81c4279723ae10f831606ba6a6ed77832e4a1436341c8a0b5874d78b9bf70000010000000026000000000012527c93d3ecb4efcb9bc0ea7a7b9f40a05b54d74a71a3ff9c59ab6a810039f10351ef2c86497552f99594792acf2e03b4d8060000010000000026000000000012527d8b68cf65c3f5492374b12e96383481d296fa0b7ac84859e12426b657115b039d411edf4c0de05b9343e69334330a33030000010000000026000000000012527ea71d99b3ed80c4554d2957833ee0cdf1d8b3d194772c255ebb1ac12f4fa28d0b56f90ceb1a38337e39f57474dff4359e0000010000000026000000000012527fa19f21c2f734e752d5894141966cd1cf4f14d7be6b302a0aa62050c0b0670b8ed70631e5d04bc0b18189b2b71627707400000100000000260000000000125280a575663dae8c4d447a7b5fc8969c5a9baf1fa0fb6eb629bae6177c54c66ef0edde1c9b3ea6be14939e35c56fafc4c8ae00000100000000260000000000125281a032b503d019690a723d63ca473e12522d4c533a2ca34e0cc3e880a2e208194b09c28ef5bd466dc4f130a0ef5fefa675000001000000002600000000001252829165f4cad0680fd2686255c767518b377bd1f80ce86011131f766de73198cf4cd0b36f883f9ecd1774d67b394f5cb30300000100000000260000000000125283aee2e274baa7b4e004bdb549bf10a79ee68c639c7992ff3242fe7590404bff0ec789a9a341ac534278e8c4ffe484e27200000100000000260000000000125284a4ec7c7d6984d8f3ec676ff8b8e1bca670684e322cf38e325c947091546548365bba1c07321ea76d1517d26f0c291330000001000000002600000000001252858fa51e4a642995bec93fa4bdb9c2807396c3a2de6712f69a45b5c8b3244212ee63323bf2bbd9768484ba1402f19f59a500000100000000260000000000125286b2d478d8a947d0543becc23e940cd973a33f0813bb8170be045afc8fe969ea8c0d2bcb4623ee7c06a43369a3b4383f3c00000100000000260000000000125287b080c2fc4d24aa183dd0dc8b08aebfc738d2e3a7123d8550e41f84ea54e70753fe315c6f9a39cc8b10687cb8683039e400000100000000260000000000125288838867d06185facdcc54bc7c856641f88c2ad943de3341132f38144744257a4816f83340f0ea8db2567716ec960a626d00000100000000260000000000125289a0803ca700aaf5f125e42f4f63f671cb9e035498713655b904ca4115d591ae88a5c7a169d82f1e257ee88e23490e0f7d000001000000002600000000001252d58da4818a14c457c6d57c278d7ca10c9eb82d4c3771a5fc7328e632e54a03572685844f5f43b3e40176e0bcae54327066000001000000002600000000001252d6a8ad8e507ae56926f290062069b552c24ec447f4a6381ac6afee56afb61f44de74c0c8fd6f3d1d3e2198fd01e1e1d241000001000000002600000000001252d7b68e7a1821d635e4bf3f1eb32bfc44290d632bf7d218fece3094aaf19249a500e4c6978e6eb9ec5dac220456c0d3a45a000001000000002600000000001252d8b2e96c236e58e5aa86f242e095d52a0518a78282e68df7d9852f55b540f9512d7fb91aa6337897361779494e1ca70b5e000001000000002600000000001252d993330f01ec76a986e7f8a3c0862582ffc360d42fa5befbe73970d8c7296bc30ce6b97f4793198630f909bdf5645703fa000001000000002600000000001252da871034b209a52088db33a69940c54ac0b734cc0aa1dedccceda35c86b1f22703c692fd9933f2ab34174d3076ea1c4562000001000000002600000000001252dbb517d8d04e03f6edef580380755a0328392739a94660752501e24ce3411381421ae223e81077047d3805b78fa840e165000001000000002600000000001252dcb84fe16379f2911be8fc3e47db5cce44f58a385eaf35e892c94a9b12c5b886fdd44c88ad00eac99c6e4c29255cbcd751000001000000002600000000001252ddb48c17e8da8c00923f6e6f0f5dd17f609f737eef059046bd413b4a69e5e26c25c59ca653d7d0876648d41f8407a33c15000001000000002600000000001252deb9d6487457b5d0dc6a3683b3e7e1f0d763869a69a06233d3b58d89286f52a2189d015a4e5c9b8c73ffc438051fe5812b000001000000002600000000001252df8ef70f0e8b0e8baea62288799fe2385c56604400d69682debc0014c456c74fe525a331008a3a12df5b5ff1bd67c29455000001000000002600000000001252e090b669b215f3a4dde3e56ea873d44ff57c337cbfec1867e3968be6ff2f6021254a5d6560eea88e602d1a871fdeb26e1a000001000000002600000000001252e1abe99cf4ef475b5923b27dd6e65bd5f1bc2da262bc890edc146e297b0577c6bdbadc8658186ef5335ee1bfda32766849000001000000002600000000001252e2b57d322af5dc24555f8d350375467a0555e150c7ae88c9390f516c4d5fc4d2a2acd5ef8a9fa12e60ef2d976056012ef9000001000000002600000000001252e38b3fd0cfacb06c7cd570801339ceeaea0740ac7c0b8d048784581dbb7df38cffdd8f63ba21a2bc3b6a14fda984272178000001000000002600000000001252e4a1276ccf8034214fcd2c1853af3032c778dad657b56be69dcbb8476f2fda3e33ff88ebf5c06c66758d614ebabaab2784000001000000002600000000001252e58fd3278d4cd8e5a34c3e313d31001e32b863213f7376e393c05d17be5cbdf5a2f17e2c7febcb436862ae9a8641ca8ded000001000000002600000000001252e6b9f5ab24bdaa786028b99f666184a16eb004f58fbc7470b800718a50114e2f7ba0a03a32eb8611e7f124fc378d60478f000001000000002600000000001252e78e8af884dd599351a7b6df911bffbb683a7276fb16a16565174972b01e2d20f7d8e841cd0d14bcf5d2758add730ffaac000001000000002600000000001252e8b3938a498f3793893882400b32b063b1089cc1e7feea3b7d3c41c0a2a8ce7b908e0eb3a8582fe203aa9b53755e844319000001000000002600000000001252e9a6d73751d7e509d2444fe933d910efe3d4c915d1ef338aa9314ee3e4104fdbca4fbee1eaf97fdd7a8c1142bcbaea5fd3000001000000002600000000001252ea842955a6544ce0b48988ec10bf8125642cb0afd32161a8cf3e0af3c9b8fe2c0c06a6e1094f0dbee9f235a70e93837ef5000001000000002600000000001252eb810c9cec83ef31f9da5fe44c3bbbc151d3626ab36320fcc6ee0ff013bb18451f10aeb0241157d592760d1f25782504d3000001000000002600000000001252ec95ed9ca18967a86b92018a17e0f7a5623c5ca48c2f7d9332d4a0ce27f856908fe0ee82097be8ea05d8726f72d2911579000001000000002600000000001252ed967b4d723e0be401347d26fd46600c9d4b45b85bf5f7de7bac0010bb5168424382e721bed78fb1273e640bd20f15a2a6000001000000002600000000001252ee81ffbcb1b8039361e70703a9925ac819eca6f1fbcae8dbbda31b8fa9450682351bb43c4c669a1cbb876be0bb989be9fe000001000000002600000000001252efab6375c8d70ab886861cecda83c4fde95b10c501a8ab8d0ecfc501e6fa96f598e0525cbe5c871fe7d79be42421cb81d0000001000000002600000000001252f0b212a4feab71963596686095fd1021a0cf9962d308615f54629813b14bc05524d912e1ceae98f23f8b8b38c8d4625c49000001000000002600000000001252f1b4621b66673e7cd80cbbf5b7a7a8779f5d5b763d4f1312f50a58467073bb78c898c3363f3d0d52262ec4fdccfb98aa5c000001000000002600000000001252f28a279fb389afefd8fe5b590f40e7f9c5e0b0f5b0dd056547bf2d04034fef97d42ea77bea8c211fcd4b20d76e70fa9b3f000001000000002600000000001252f3ac84b36a7c336631caf27a4ee8c1799eb3c922c4a4fa057499bd95a620b66ef42ff894875a31fd72fb3fbb97bb92633d000001000000002600000000001252f4a02da670cffbc3e6c48120b3bf9f0599b14580ee2acc20908d39f4e9b966d3e4dfa1b8db884ed67718b1e18ce85a79cb000001000000002600000000001252f5952b150bca7507cbf235b5bd4060f5ca98b387a09ee94507a4a46894c424d42db5560cde6f824021d5bddfc2773b3c99000001000000002600000000001252f69036a3f72b0d31bef883199eb026cc64b1ecb3c5d50e30f3ad833a2c15267b874eda53c77a9fcd6389f9764d40e34a77000001000000002600000000001252f7b2ecb3d145de2a21f5a59e841e353f596d0d9407151bf1ec0e08ce4818de1e509ebc4e9cf8bdc3b12032c39047db01fc000001000000002600000000001252f88610e1fc4d141d31cc60af272a5d5f2f4620d13106504f09f8e32139f3f30e20606034a3787cc6bbadc3d48689f1e611000001000000002600000000001252f9abb41acc13110a844e57a20b4d717453473460b2953cf033bb88709faa21d693a3c11e14bfd3e427f22fefbc37abf54b000001000000002600000000001252fab66a6d42a4d14348265437ddcd53a0d06ccfe93a9accb3d0667ea870c088253adfb672b585d8673c5e65f84264fa0a0f000001000000002600000000001252fb8d79e117680127c48ecfb72f6afacb9380dca7458dbc03c3e260e8bc8a22e3ebfb82161da36cffb9911925f56b7562c8000001000000002600000000001252fc90d4c053996b3eb8f9970a7b9aa125e5515b688c62d80c10bf856dbf3ed91efcb0e012eab94038cf5b1dffc33c919589000001000000002600000000001252fdab4513986d61aaa94a6bcc12ae198e786fd9d6b8a1f8b1724a5e3f994a14ccfaec06686ee0aab188fa3456547841877f000001000000002600000000001252fe866baa0d4c82a48d4750c48f28dc5405d107df0c3a2678f2ff6a7a72eaa1373f22cb64f0e60786cb238a3b4be2f5225f000001000000002600000000001252ff8b8d5192e62acdd4fc158ab83a359bef91a348c9bb57fddad2ab6bbdd4ece0d22455af700008b82967bc8b30fc68e32f00000100000000260000000000125300993f0a3ee8b26bf8c2855acc7016a7ec96b006278943b914a3c05b7998412a18546ad92231b2c7c571863d442fc3a6290000010000000026000000000012530190e93e18e232cda4b41c5dda5e1d79c701f0582c0ad981cf9c9c941784b0d597e200ea744e41c9ea3b1367339261905c00000100000000260000000000125302a6fade2e8fbb02066893893465590d5fd592797e7146a96a0629b67a7a67a05ff3a9b7d26aefef9b1f60caf993f7c744000001000000002600000000001253039930f3ef547d97f7eb7d739f1f211d16839a0864acdda100a152f8a9d7ca0d86f78079f58cec5830297e1ca599852cdf000001000000002600000000001253048a0e572061c69dd79fad173ece7d48e06a1b447a84374b3442c36912dc6b896d37808e4e8f9cd9852986ee486571dbf000000100000000260000000000125305b533dea629513eb97d16e86addb53a3137b91f2f9aac9dcd4f6341d3d51807157c92b7e91b82a93833197aecfd20283000000100000000260000000000125306a5f1e37cde85836dad93867c5a6d452558324069b68091cf619e5dcbbd26fc4212ae0377f3433fb07dd48632d19f0d02000001000000002600000000001253078557563c860785bfe3fb875dfec9e9d9968ea522898ae5ac3231750f9748dabab7fd5c66e6b22705b96786137c23736900000100000000260000000000125308a2bef14758607e02ee4ed50fcf3ea4903b942fa66e49e4a8657a6e8afbe8b2980ef3d0befbd80eb8ce211a97ef779d680000010000000026000000000012530993e2edcb9fe9c402529f7a574c0581cb3b259a941ebe36d80bdfb96fb5787683f1a16d8cbe8bc09597bfb71ee9bc8b360000010000000026000000000012530aa37b30a822e209bfd728fdaa62fa187da7946b020146730af1095d990bda30381fe9b7e808d4ab06613c4ac98be5a9a60000010000000026000000000012530bb4d2be2b22e124fd1d9ac1c71e41eaf875975491e76d1073f68bdfdfef1da2d932afe8e6883950b9c6e569b2059b9bdf0000010000000026000000000012530c96e8acf32ba89254332a831e677688358663f4bf2a227f1df295810ebf9f6ced75b3e75edfef5bcbf12a082d710c3e200000010000000026000000000012530d83a974e99dafa6b7c2a19fdaf30ddf3f8d1201ec1b0d7077705dc3bad50387d073a5ec4585040077dd31242f2af1cf890000010000000026000000000012530ea4e0044e366626dc73ca779cf1b1d76abb68b3788b1a6b66d8253eb251b07d8ae9ff548c54cfc0b8a6e5c1bc7a2349000000010000000026000000000012530fa4dbb33efa6c170797a7266822741f8d8b044bf7baa5e02c5e5c645f137a26608d3263c060107d4eb843841ce5a880ce0000010000000026000000000012531099abe403f0861ed6e9be8870522dff95f79f0d1a0dd5f5ac5fc4dbe797d75b9bea2c16b06f359e1ee20304f5c76f08220000010000000026000000000012531192d991602bc888eae305688522de28bd208af4ad1f0a50682afd0343880d374616b4f9afb734a132750d5085f0fbe8ac00000100000000260000000000125312a0658465922e8e6a15d1202c01250d8cee5f0f9a2081178e00770555a2f720d101691ce2a5d70daa79e11fe9a1e03f9c00000100000000260000000000125313afef1123260dd615f6c1e178e39041c3c6527f9ead919ac2c296d6a549d759fdc0158cf5cc734b1a04e449fb513fb5280000010000000026000000000012531497e957c69c4975f5bc08644381ed43f7cb4c5c741944d5ccbc3a312a71471d63c24e9037e1c0dfde3fd6d857821d2a870000010000000026000000000012531593a4f32fe66be5a4b23f70484a5540b9d9576fbdf59e9ad9df579625e2c1a3a1008d7c7107d5f078da1d8bc713b524750000010000000026000000000012531680c41e0b3d02df3f182039a71869563b0e90114e60f70a029d028d13fad4e52a3ded858ccf137f936d9468a7a7300b9300000100000000260000000000125317a3dd2a397f55e3e67b8e39f73d3e94fcd77a43348bef6b60647dbc0a36917fb241374038caba0850684ea4c4d715a28c00000100000000260000000000125318b71965e8b0ef9b4702af5bc26a18c50ac7143953eb08ad8fc9758fcc4b375801d63081f0bc80fdc13f502c4b7020ce480000010000000026000000000012531996b9a68023ba1d801192585fabfe4581fe21c43e9b638d9edc8f1601e0ac0a74bac89ebda386aa374ba5fab3bdc3c1180000010000000026000000000012531a8ec90a68ad2b4b0daa88e376acec3dd5b7e25f38dd8b4ad8db50c502d42fdf44739e251b6224801b1c06829ef7a7eb720000010000000026000000000012531bb00b7d10d1079fb411b6bc09b6a61c47a84063e43fc28ee43c7241368451c249624f1c28bf5ec9ac2ae3dadffff5381e0000010000000026000000000012531c9290e3cdac716fbaa130803738d3f641dad19c902acb721994671e8a682fc9ca6f5ccba79201150a93975e248b6ff99e0000010000000026000000000012531da914956195cebeed7928298f274e1b573b842d3b9d82d432c3fa59734fc163c733bc5fa22bccf37d14387e5fee15563a0000010000000026000000000012531eb9cdf3a87fb344a1884e29156c8d1d3b6e7f41cc265575ca95918df9ff5d65e5a570274ecabf3bd66c3642a789de26090000010000000026000000000012531f8fc84a7f1a6b3574a784f53fa3a044277d1f3631a1d800df2141154424f61f1a1869836305b1e4a6a7d29ad484ccbc400000010000000026000000000012536ba41ed3cb258e2c38db6e1646ab8cda121bc80b9e6a2be68a8b051e2fa8a46aea79055557551bcd407f5537a8c3ca597e0000010000000026000000000012536ca5b4df6b47b9236b1cbb16bace7210da26c08e68ae78b98572d5f55ec5d90a90069d76d59166f3cd3e93fbda5ff0f38c0000010000000026000000000012536da398f2f24c767ac2773a7d376e8a1c70930171c925640874c836c2ed009860466722ccc756155bcd7235bd460dbe14db0000010000000026000000000012536eb145f878984b71dab654e2c3395c6ea7f5d368d3c71cde818d7de6f142e8c26d8e4a92c234f6dee17ad101a124e307b70000010000000026000000000012536fb441ef22d54fdf3229b44c64138dbc6aa42fc0cdb6d49c39595a8abceaab010f242159ae8d04c42a1f54cc24a5d39d0400000100000000260000000000125370978e3802fd36e469dc56d0f7e54c69a81d065a964f2b3da829b5f70e8bc45dfd9adaaf764c26fda8a53ccf8d4caffdd100000100000000260000000000125371a5a4b7f63691f6cd60c2095c220aa3366cfb824f801a7588a5bbd6d549bb3e45df989bc678df8bf2b816101242b57a8d00000100000000260000000000125372813d1155a185812ab5d7387c10e2699a68b7d6c6466b7e60e3af4f202cda1e5be7b963d1a27b6882e10d97d0b782f29900000100000000260000000000125373ab88e1684b3e301c6124e243ecec4bda5707fa32e2eba855db76b22ae5e38fb8a929bce45ad1c03899b4a6050528209200000100000000260000000000125374a7f67f303548e467b3e9584c72a38b44223cb67d30aa2fa5a5ff52cf316e856770770cc9a83399fda8bb0a28b66956fe000001000000002600000000001253759115d220d9a9d4c4c8bc5b658404115db571e388041f60a5b95fc8bb59a0d7bc2b6ab98332ca015e1d048e2a1e63f49e0000010000000026000000000012537685b6aafb4c061ec026b9e19d24dd2e1eb7b99060a9b7acc107e40604c62e66311a66633138a94a8901cf6ba5e1d3198400000100000000260000000000125377969ea527c3daf826d344a18410abd910a1b5dc3047a6ff1a3544aa28a3ca64c6836149bba18752bbf166a85d5f73338b00000100000000260000000000125378884f9fa82facb8d5e1432c80cb8600dad663259aacf0d1fae0dca6fd40b9857d0aca3f1c3d0c5e15b489e8356184588800000100000000260000000000125379868c12072d9f59f1919e13a24ab6ae29a147a4bddab7707db0259144c60365daed03dc29b6789e457603b84b991776d90000010000000026000000000012537a8dc8b9ee7291a4c813133fac04062845e070f6e2f549429289909c295dc94381b320b39e9b5f07489ba2a2066cbbfc280000010000000026000000000012537b95e673d8044e88cf729cf1adcae60e5bdae743a3dac242292c80bca2d40a3cb2ad8d3ce4db3e1e37567070e12231cff90000010000000026000000000012537c992939aeb33b0c20b959e487a4a15fbbf915c21f68d9255ea2afbb731fa7aa50ff881a6e53a72d832cd2aa1d0fc2a3a60000010000000026000000000012537db35022a8df87733f4c727c833611f6a71dad923dcacafae7c8f1832133440d47d4be9ba9b0f6f60c10e498a0a83790db0000010000000026000000000012537eaf90ba3fe882574df9bad08ada5d65f27918d8168252a5c1d1c2247c3f4178a7b699c348fc249b6dbd42ca81618298330000010000000026000000000012537fb7bead53a247e16df6ee5bf5075b608c4b91cdb36bf644765ce46afd84a1d88e51126ac84edb82b3d1b855d8ed83dc5f00000100000000260000000000125380b90a7101ce7e6daa5ef6ff44c73411ab4d3b58f0f9d017fcc6156cc12b5fccd772a7c289847e5db98f0966390832ad3600000100000000260000000000125381b7d9ed530f3b95546799d1b76102d98d52cbaac57e0d4ef30c07317e0874a55bb55b675249e8c559b06cee5c4f4a1cd900000100000000260000000000125382a2c4c57915f591c61ace00d255912c182944736e2aa14d2db955cf49b0d622b6214c2885e03c28adaf9b7ac37d15d2470000010000000026000000000012538393faa2e95d3863de843700295301c06bedc90b6c2e0dabf82f9ecd67640580f6997a227619f6d16573c54f4c209e472d00000100000000260000000000125384a0177fb6201cf752bfe136fffb7060e1e6bca7bcbb3a0197e950c5df1a44cd0ede00c7e40c41e8844a20428b56a845810000010000000026000000000012538592b41260af27ed932cafe353cc13f76771b22a164953ef4324dfd0babe52e0634ba266754713ab0a979e6354335f391c000001000000002600000000001253868ea8505a936579d19ba604a28ead4848fd9482b4f28b9583b71babc86923f2e8a9e73b4117babfafb67ad9137c53530800000100000000260000000000125387819278a7097131d1a4d946f148f9fcc72f0fccdee8b0bc8c499cd585d11e3644957d844944c88e7f6f8a2ecd1c3e5fda00000100000000260000000000125388ad7ca88c0c39d6220d0aa7aec6f250d15f8c3a28899a416cb68110dcf9c0a0e102e91a7e638a61037b6e7b3329084bd000000100000000260000000000125389a0c2f85679dc8a106d3e49917f1f4dedeef46509c6d794e0918e438865790a8cfca40c4adb856c165f44956f3917a5490000010000000026000000000012538a8204a664ad52fb72d6c319873755fa3d84300a4f7361305069684902ef968e5b3e71bd701b08a9bccd4084b8c969078e0000010000000026000000000012538b953b83eddf635e2ff37ea7c33f286f27827068039a650fbd3d2831f6a9ae3e46a23a66a0eb8f2a84d8fafc4c7b4b78f60000010000000026000000000012538c829e482b083370a195663218c0aad3c62a5d3738b580e685cf2b8a1bc4b71584312b226977fe67091978cbf5eaa83e4e0000010000000026000000000012538da4f872fe9112b71535d3861e4ef21c4a491a8153766a09732410d10a67766989fed20aa5e82400ccd59a2a724c7a7caa0000010000000026000000000012538eb2fb15a9510e6f34a0a3a856496fa7c5dc7124656571d66aa98648f9c57dc4fb12b7549d42784e2da098aecd47ca04d70000010000000026000000000012538f8b6ddf077dc6cb847f62026e734420527d767ea17ccfd649986515298b7665b1113c1e3ed20e970acbd14647137155f40000010000000026000000000012539089baac2c151854774a0c24504f13b9c7f016474b51a3133b347a47b1d6db3922931ada37050f6339020798c6e1498988000001000000002600000000001253918128c6eae35338d2737f940a32f5cf32ffe1c9fec24c691e4a4abcfcd95bcc91afee777c7d24bdfd77e0424a2b365a5f000001000000002600000000001253928e4625362db0994c2a334e9ff17b82bd93367480a4ecd6ed9c31bf9b2fa9137ef3de782c4ad78e3dd13ead4d35752aa200000100000000260000000000125393a5bbaec0e7a10b5a25c3e9bdce2d9cb657acb07fccced27f68d4a8d10af3d67705e7a0b51301c843281df2fa2820e47a00000100000000260000000000125394a8467e87b2f2e551f16e38495d95c24ab3ad510d62cd2fa6411121f0b95de2099c3712a1c26fbe838d5751acaa24293200000100000000260000000000125395b16c66d949a116145486d3788a2fdf97026bda69aeec7707d1c607f4fe2c68cff34f9b00ea950d34e8f1a6fffed183d60000010000000026000000000012539692d0f778470936826d14d51ca1b8aecdbadd531c5e7fe300c6d4e240d2351bd65122e3d3f7c24d34c54cab4bf8c57eb500000100000000260000000000125397a6388fecea629844d79ed6a3b15ecdd4f042669bc740deef25f340efc6ac8862225e8585008644fdae8ce40939487dc100000100000000260000000000125398b8032433a7023d80c3b0c26977d6251d80fd8db6987bfb1ed881564e84d77dcdc9aadfded45ad6e2a4539361d47043e400000100000000260000000000125399b8e4da452d5f33ff2e54454542fad711cf1eea9b9c8f15e03b72af6f8f7a4ea3314ba28482d218f30e672d6c481a49e50000010000000026000000000012539a8e5ed67a580b751d42fa372077ea1196f45f2c90e02956d7421f86f09f2b34248e8ca630be35cedbc7e27e3571fbaab40000010000000026000000000012539b8c46c1d0aaa0947fe9dda1f6da325d4849d7b27bd473808121cfa763229a8119364b5e80bee904bbcdabe96faada77a10000010000000026000000000012539caf279599c0c592ccae11685bd5c525985f475474261423ee90e0b5f014cb8003d7fcefbbaa0828dfeed6a6dfa7814d590000010000000026000000000012539d8b68661d07bd11cc371da4691c6c858f540952bbfeeaa561b7c10f8c2f7992d6ba63b51f93429bfd23330bec8c712d410000010000000026000000000012539eadf816c2386f6554c1d6cec874de7a7beabbfd2ed7b6550e25586f9fec41a6a13eb719c241aa8b48d59b979a8957197f0000010000000026000000000012539fad0cccb3a61ac475bb20afe3563cad24e041121dd1668cf28cdc6bb0d5998c5002cf511f23da19240c9c33ce71cf0c30000001000000002600000000001253a08669ab1a36ec42c5b8c5bd0c6319a2fad6ad7f0221634cb8142d45c14a3bb0cee46f4ed5dcc905031969075ceb13e7a7000001000000002600000000001253a1b5a08348792adbc84674eb8a776bffca397711efece3ef2e55eac2575f6e3757f882c6a662b4e1aeccd3b0b95b096eaa000001000000002600000000001253a28a1bfd5056efd86f348e9c781c0d038fa71476ca23eebcd31a4eb6308c2c38a72ea3bcf532770c9ae02c8d0fe064cf35000001000000002600000000001253a38b33de08aba83c3dd1b812970307d5dd260e57cf94a9ea8e7c12a36cf0c1e792cbfef9ecae147b0dc2c6d858717c0127000001000000002600000000001253a4a86e1184a57b98610860a36906bbe7217caed69ebcb69f548d80372adb2301650c170fc5d4be05120aa5be367321ddd5000001000000002600000000001253a5ab9a4310b9c75dcde8946715497cb923637f6d117dfc102113c17244aabc798d880daa3ab59aefb4b5cd15cc23aed945000001000000002600000000001253a6ac475546aca8b6b1f4601a6c8f43e788189871f9b3ea4ebc45e5d07e86724871aa5522ff99436dc42a6ad89997315591000001000000002600000000001253a7aa4fa9adccee325fe16d359c72a152783ef93f2c228fcf7a6df04c25ef307b910944ab9c2863e7d8b302a9c20f17bfac000001000000002600000000001253a8a526972c7c11404f4dcb0cbf83b515e313689d73069010373600639b62bb211dfe357e882096fc83345b3e741d325cde000001000000002600000000001253a9853e34d6b0d78bf059430ec46a4399f7de035d3ff2a73ebe24ce9b1b1135350a52133cfecd6066ae5af3603f83113758000001000000002600000000001253aa9182e2549164c4247cdafb8d2399f24c1bb5a1afd3384ebe928d7c8abd0bb059e11c302f3fbe1af5208b0fffaa8780f0000001000000002600000000001253ab94ca6cb61182885770cca517562d6fba26f79667b2c6a59b73cda31e3d9ac0075d6ee4dce6ddd9b47d34562b87178f3d000001000000002600000000001253aca9fadd9e1bdae121432cbc2150fae65a993e740ee10cec8db8108d410fef6b2e66bbc8c1b6f2a623dad8586f20c4274b000001000000002600000000001253adacf620f53d5b878e032aa907a734236865d8971b2c47e059007b2d852a92d202b61180ba737eae8876572840414afdd0000001000000002600000000001253ae98d650e83ed9f7b9af693888338286ea2ffc8716cba4c2f51980f54fcbb35e03c00bb947db8a211045e4dfabd858c111000001000000002600000000001253af9340b90e1985c7c0a42e1ac73bc26acfcb9dd6aab738069d5cbba3bdbf7776323e9911f10041ece6de8952d55b31cc0b000001000000002600000000001253b08c12ab4c408e74ec3bed5fa2aabb7ad0913e410e29a9140f9d052dd9f2483a78962dcda7dce07b6d2701a2f89c92dc76000001000000002600000000001253b1b62ecca984d7fcc086bbcbb5bbab3a9a208ce275cd91fa27716b88a60ff31ab2c80a3fb37ab3bf4f8304a387ab32bcaf000001000000002600000000001253b2a1f8e86762b40e8495c83b5b515c8b5750376871bbed3f0737323d4168592c28a08ce3fe59644cb4c79e4004a0d0b2ad000001000000002600000000001253b3b5ecb24743103565a804401a3073c6f4370508c880ebcfaab3b431a13b76a68bb363ba18da428c233479d964919d3136000001000000002600000000001253b4927ec20bd63e9e1a5336634b03263b15172b5e28f5c86336651221031bdfc8368f5a2e3dec088436d78cc13bb2e43e93000001000000002600000000001253b5aa59153933922f6ff46b1cdd1b61fc728355effd3566aff9c7bfbc8779eb2bb72303c9b94ec4a2afd41e7ed586b1cca90000010000000026000000000012540181a9575808cf495823a9f87e55f1eeda10fdeafe59d8a91cd75bcfa23cd3f7e0137fd80a6726bdecaeaf20619dd27f2c00000100000000260000000000125402a4f7a30dfee8b8ea40a19f15e07632b29d53b7ebd160b5433f365aa3267944e3feda161ca1e1c78dd984a9505118a55200000100000000260000000000125403a9f316bc3e207a5b406c8ddb9c1d9882b3649a3b7eb8a6603d7400e4fb8536f96be4a74474e3fd6b6a9aacb9b3c53484000001000000002600000000001254048bbe717af81bc5f585bd28f310d71141bc135693b5ed5c731ec96a03e8765d2f05e922c35e4227e61656fabe04d4a84800000100000000260000000000125405b5c4895431d9204190bad05f697a1761c4e9f865204e53a546e9f46763f8cea076ba6bf464315a890b810348ea4eea530000010000000026000000000012540694c4f519da9abdd90e14a591f4531dc29014e4d39c69d2dbdbe9d74cfbf471792ff3407ded6c545223cb0837c3b0d83100000100000000260000000000125407abfac725ab93aa99f910628f8aee5d93d39b76e1b65b2952c09ae05c475d88f806559a928541e5ba7bc672b0cbe30821000001000000002600000000001254088c5bd11eafa0bd3b06d994532c107288cba2999fd397e6bf87f653ca12b42ec4d113ea5a2e6b429249ee94a39d949741000001000000002600000000001254098f31331bbf81101124ffd64a5759507b82f9bd090c96d0cf0cc7cd4f9bc9eb2b29a7c7e5a3d06a04dc35df9d5f6153710000010000000026000000000012540ab8d4d296caab8b8f803270279e21624d6b6101821cfe279ea588da3283a9d65d8e52801a5d6851fcb7fd4d3ecba8ad0c0000010000000026000000000012540ba8bbe18a52037a3cc96870c4aa2f96ce505df0217d9dc8c2210fc9fe33f16285a74da0461b6b2eefe7881a456c987d220000010000000026000000000012540ca0c1a8804f85ac54fc9bc7a74f588a955735bf98114b75c19e46ac353414360c4c2af575c3bb98e47bc3de3935dd4e570000010000000026000000000012540db368e50f3c76bc7a80ff7f60903260f6f8194c6fd8e513af92a0cb4f4d5f4ca2766ce819f91d15b5082cb394bcaed4c70000010000000026000000000012540eb83abf1d1ac8769efea5f31bd0b4ff5e4d8a1e2c8b4c2539acefcccc8165bf8631bbd5dfbf0cf375f813cfe8d2d15b3c0000010000000026000000000012540f87527a0ff7135a05b6fa54fb7dd2728a17b04a99b564c56de33fba9d00ab8c0dadbe166a797b879615313af4251ad5f7000001000000002600000000001254108a898a2393753acfe388238c125367499ba5c50039a01bcd95366d66948375fbe9b3f2ece7ad07bf2dd68b391d81cfd600000100000000260000000000125411ac9450d470fba74fae27e4a0f4351ed83d0ec369f33bcfd98c64030196d316b1ce7dd35f78278ab92f8868b7211a791500000100000000260000000000125412861c3888729f5b533c99bd5dfee0249cb1335fc3db39ba83527197299d5551f13b6249acac162d6c0db3758ca87619d800000100000000260000000000125413b31a1748c123370360046564aebe43a536ef68caae41230c6534e5197ccc5e65363dfe82990606c5b85c19439d7575c000000100000000260000000000125414a9ac731120d82ad7dddac5d85fe326d734021f1926a8609ba2b96336f3879a77d0440d1afd472a51e30d1d36b2aaa63f0000010000000026000000000012541587fede409841144870524f19145229e3795286ad1db13dbd5d9144ce3024f276443aef3454f6ef22e978a8260c8ff067000001000000002600000000001254168f1092aec5e6bf58cad03801148b3b2a9a59eb42e61d98ce812ae2284010a986f43867afef8a65dd55f55658b99da190000001000000002600000000001254178352daddba0c1ae104290e657fa330d85d589dbf13f17dadb37455a6d87a60071da7eb93db2a3acf5bb3a83db669d0d600000100000000260000000000125418a7cc7ee8ad8c59a3998d36495f219dc9e4631ff6256c97bf91edd29536873b3d5910a6be1333373302d0c174baa34547000001000000002600000000001254198f08dacb75d16448bfc094d18c74d8fd91de11f3dedfde085e5f18c96a2568483c22b15ee0ec85ce2d0f7f5136eac71b0000010000000026000000000012541a84cd8aec48a289dc628d355dd68622cb6a7c9c8926a1333b35470d9ae831f7ca1d10bde244f3bc9e01176d75630bd7fe0000010000000026000000000012541b9447e07c302302c36f17b5841e891a10bcb29fea4bf7da46dbc56de237aa0294567f90878253e48088d54d15c9d4f4880000010000000026000000000012541cae16e40da4d05d7beb33d1034cb9ab5cb95cc5532eb72ca6789c7d34d6769110fc0468eeee77635b2cb023648c3e19d00000010000000026000000000012541d90710706acc05561b33093fab5628290cd453a3da2da91e5df6f0ba869fdf65533173da65b940ae675b314db491f33740000010000000026000000000012541eb89fddaa66b7e4213c7f29749dd0b49dd02c2e11d9a6fd189fe591bad68c6d54bf9c68f8d91a9fa801b9f628f3cad0a50000010000000026000000000012541f8dac4152116994d4f8d53202792daf9f454391f7fcefbfef800d0011633c5130e18ca8a77801063eaf8cdab2942f060a00000100000000260000000000125420816b73170c6895746a800f49ed854c90f05a6000eb8ea7ac73122cedcc0667cb44e3b950e3424146ce335827b366624200000100000000260000000000125421a42a618b4b4aa66e0e683c9e0e75de7175b3eb9ebad79deaa140ee183cfb580a8b9d49d528a68edb2c1a1b25514e77fb0000010000000026000000000012542286238a917777a354e5db95621a8ae6b52b7342597add52da805fb4370f1bb473eb75e97a4219aee7908928cab78e1762000001000000002600000000001254238d28800b512702289839ee4066b45333813cb193ecd280999aceb955bc41dae8e0507e28964a29284c6645a3803dbd2600000100000000260000000000125424b4b2c903f5abeed19f5dea72ad28857dacff854ee1a0f12ba907432b577739b69dbb2ccb08e819fec694274e8f745d0b000001000000002600000000001254258e9f6a142bdf0d7d06425965ab334ba4ae06c649fcc31cc52e0561eadcc394f0c67a3f9961e2ae9261323639e8453a190000010000000026000000000012542692f9975759ba65cd4d0e63a94e913a8211ee349455dac2b5ccaffd6ee00eecd2c048c01fd37d663d3c83644e3616c15d00000100000000260000000000125427abaf9d1b9e6400a64b708c79fb0d2dbe918e7ff879ff06a31f446fde4f0357df099a690c77e3530033987cd29691c3fc0000010000000026000000000012542880edf81c57be4a43f268e3d1225e4916475c20f89d37798d02659ef3bac040196172cd9ed630165838fa0c24a713033400000100000000260000000000125429888ac2e9ca43d147f12e183edc30ac72e1870161a253371e18fd3b3f43169f1ee148f6aba4308d912b19d60d9d0a3e420000010000000026000000000012542a8b6dbfb35397e2ce05927f9c8eab1ef4179b80fa50b6667e24d8e143ac6553479c819c9022a0aabf1352dfcb66985a940000010000000026000000000012542bad4ec33fabbb4f5931c04b268ca7ad74c4589443dd89e0e49b028681f9f2e2eacfb18183ce148a8dfbdc9ff3cb73fe6d0000010000000026000000000012542cb92e1b3ab0f6da31817c5ddcdf2f374853e4c31eeeda834044efb02f7961c696521e6e48e2423937f5d40d3c4acf9b4a0000010000000026000000000012542d807fc1a925b4648d740d0c275075e8f3f2f24a28cfca56aa4993ee345862f0ea6b83ee3318300f5ec42d41006e779cdd0000010000000026000000000012542e8b93afdc10c3bb9f5c02008b41601a777b71594e8dbb23b2be42cab8a321575177b0b93d0a9a868401cc15b77f531adf0000010000000026000000000012542fb1d0d1bf0b7a6e13f495737516dd3c49037efa2e97beabb67be0e4838e7fbc86b4b416c0fcf485eed931e55aee1571c600000100000000260000000000125430857c3f55d0159e00dc5d0a9abc11b442c63f528fe1c4a3cbba0a8ff88bf70e8abf3a83f6332680078e2ccd0450d8cb7c00000100000000260000000000125431a8f014e13a3acc41b8989bbc713187638e054d2e0eb3a104c7b1fb2f958db9b6a831cec39c6e41b6725c3ed0b33decf900000100000000260000000000125432b0e79d3d7d25d1f6f9a912dbdd451d36b76ebc7149ac56811e62e082ffd0b40fe067decee9d3c6ac319e79e18a9103d600000100000000260000000000125433842092872417a46c893d71f78d6b04877d8686fbdcd896084a081a76c6866dd5b8bec07b4afc038257679f64dac0548700000100000000260000000000125434b58e1b30ca7d6c7ed8bebe9aee4a6f43aa91647fa803cc393788da55f4aedb0599c47d8e831395971733846c4132567a00000100000000260000000000125435b747466e6fbf93625f4f2561072dc7cdde65fc5fb31a74b07ca47ba4846b734cde2ac47259ad90ad024670ff0f5ed63500000100000000260000000000125436a1e8bb25cf7fd429f15ee5ef4e93731fe9e6efaa349daec5e8e6d92b63050616e54f3997d72d26fb6f84035ba780a3bc000001000000002600000000001254378cc1ac486df576c65bcadbe60f72e3e4d723896b31ae99621a985e677663aa13e2dddcf133f614415ad56713d0c8edc3000001000000002600000000001254388027e3c5f52f6b9916f863ccc92e43406eef45d1d63037951f945629e28b2f233840757f2bad642a2cd59151a7d7c25d00000100000000260000000000125439b0bb597e685498d8f33f096a22f2cd5f940b3db0e061a5a949f9acaeaa3f9df102efc085dbd5d68e43b5354acdec628f0000010000000026000000000012543aa65a60e2eaddcc5a7eeef21675f0510644c85e30ec3ef079b75eb988d468e5385b8a6ca6887d662ea29503ff5d8f79c00000010000000026000000000012543b98c7ae2e4ad41856807040348ca2ea8f0645971a07a09d5d4e890d8826d2ec1bfc9f6b16f157bfca960a0bc2dcf4d1190000010000000026000000000012543cb966e6718bf9a3e1d1c60d26751c68c869025ea782f69c5c233ca49e85de7c458c78cd0558c33ab26300238fdb5c19500000010000000026000000000012543da1bf66d3837a22eff43da051ff05364e593104ff862360b5947a3cd5478ac6ffd052df0d512e5f901a18ee87aab2edd50000010000000026000000000012543e89e4852346a2744b2ac1f45edde8ed8d24994384972fe8831fd6e18e3fdf20a61d614bd9e01621048d6e05a537f7bc630000010000000026000000000012543fb11ebd65a16c755d290909d1b0ed567bc2c5ecb9b66da4fc7565a2c8dacbebc0ba67c54336dcfe37c869aaf76609ce1d00000100000000260000000000125440ae7c5b5152240e5e15196bac030213fbabf4d5bd319630ccd6ce9199ee089dbe38d94120d51501cf78c4b5c9bdb0fa9f0000010000000026000000000012544194ec9629b3401bf404bffc15397cf79c9b68881789d18f8077cfa24d7d142999ea4c26c3b92c7900decb33bc26312ccd0000010000000026000000000012544288072b56333c6eee547145df28620868b062a6cae98412a0aae55142bae38fbf48724536323873ec172593095e1ee2ed00000100000000260000000000125443b6cacd593811770048f4e655138cf744bfe1e0603f7168f83cd66e3ff0a6d04963084da4e8751b11fb9764de6747b82d0000010000000026000000000012544494c510f254868cdfe5bf14688bb23f70eaf6a29273ec0961f12e9c1e849489f6d9e3902881b0ce3297e9d3dbe7c60bbc0000010000000026000000000012544580b9451f159feb7d55035ff60dfa363db55968641505f25e39a6e429387f6282fd6674aec570cd3fb661fb6d9c7300a700000100000000260000000000125446a89f681f74b6e94b4117b9cc84e036aff81dcbb69498901d1a806655090a303315d16dbcbde7ce1569d09804b0c3918100000100000000260000000000125447a741f5c5e26b348b7a3ce164a7a57e665efeb9bf385f24ac5644e7dc0442b2b90309a28d4c1205bf3888271571679562000001000000002600000000001254488ef19ade7caf3d38a505489b01d8f44835d0ea9626e91dbf58498221f8e9f15c932de1751f817e0ac422c7f19045b2a70000010000000026000000000012544980eeeb731a5acdbd44bd847e2472031f9ce9b4cae8da69290ef9989c5f66dcf6b3c167d99369f681753df44461a7d9e90000010000000026000000000012544ab343122f001c8f83e0c1c644b0762e815dd93b15b7bde17a17a6bed23aba1436510b7bfb3f090d0ad32b83f2e1552c6f0000010000000026000000000012544b91a20f52e7f3f873518388f8f3f0da4a0ff20c0655ae86d380f62d890de61a566250eed392215bd97fca310a0cda0ba40000010000000026000000000012549797c26c80b1dfc5495cca4acdf5c1e7f1a24c646395c29e1fba6f0aa0811a0d66d11578a995a180353bb8b569925b7b2600000100000000260000000000125498b3b465a5573ed57483ce3d6d9ee96c828cd8c582355f5144fffef24710f1a4e1ba0c813adf74d914a0969ef973a0ed5a0000010000000026000000000012549992316c48e9c8170cd2f3c82a9e6acf8b26e8dc06f13730598c87185905fdaa4af1d0067d483282d1c6237d885db654c00000010000000026000000000012549a88651d98dc7c0d6349c87793ab4763e39c681f095ebeb2a5c589e0a0dff6dd14f93376dacdabda173d24b49f361e9b830000010000000026000000000012549b85ad2e2fd8a4e4098c6e5db626034b1b4f204096510119a28e4294fead35573fc4384c5581789be494024cfdd7279ed40000010000000026000000000012549c92bad5d2256c09cebe8b147432a8ef381f09138b12fa0a0f77806e3f8eda715878804746c5215eb3bd8a45929c3b8fc10000010000000026000000000012549db46aa3ca6b7aa40a7c2f4c29458eab81ca8efef99b83544ddb89007b97af474ea8907bce5a71af9936a53a975cb091500000010000000026000000000012549e8282c26c2962f9593cf85ecce6ce464b8a07d66d5f1881ef1089f207b036f731ecbc1484001bc47e6428667e29ec40d30000010000000026000000000012549f97dff96873c94ecb8bd747be38ffcb7ccb349425331e3a6b6f8bf7cdf6b7c2e3c6eba37a2f7ae97fe26820a4f6d25d85000001000000002600000000001254a0a6a8a5afc37a329c97446e5649fa149a7b2757ef72a4bae3e628b162477727a836ee380ebbd131f167cd533cd7a75ca4000001000000002600000000001254a1a4367605b0ef4503951b46f4054c4708561cbec0392ade4e54ae850b918b18092ba929d9437a342a897dc7f45066d6a4000001000000002600000000001254a2b0d87cecb4f4e95b86f2736a581db3b2f9db669644dd3eef1f5b740982d7c4d3266ad837b9d62d1ec6c85ef2bb33ca70000001000000002600000000001254a380b19eea655ee3d2cf8ed6d793f5296c9ee3deb73a5e3f85eed9a3f832ce6a3bef11c691a876dd16798c6def74d2da65000001000000002600000000001254a4a581656447de1e7ced921ded1c8a873328b1e4ce1225a770d711453eb144a1ebf1848ac063f597429594513df4d57d17000001000000002600000000001254a59721b2273b07dcc46a6581e04f27e425c58a50462b15149c0903a526e01c86fd4b4c74aca952a8b871887d93b00e4bf7000001000000002600000000001254a690e98b9817009213f8d15f4455952f0991574df70f2781302d9592b8c6714451213151affe541ee35ae502b20e2311bd000001000000002600000000001254a7b46a6095180acbc982422857afe3eb1e57d13e6eaa9da9bdc3d37f5913a8a2803f33e18ef2bf071bf88d4136037d0a77000001000000002600000000001254a8a500b239769c9e23115d131d90c6cb2983a6b126a7a8f1296dff8984a8ae6072b679b637e0e6fdf89d1d7cb36a12a51a000001000000002600000000001254a98c5915361bae2c75d7b2a4db5752386e4a5d54ce92294b0af5044f4ed203f0846e8fde34e4b77c789220aa4e4aa460d1000001000000002600000000001254aab8744d02b427c98e2ccbd2a51c688e9c3038ab1ffd0bc6043b1cc29ef8f04213e6aa4d92ff6071ffed8334b2a534bfbb000001000000002600000000001254ab8d5e2ee30af57fb3e9c4828907a9dd50d93a93154f988b6f9ad5bc3909344833c322a9517d56cc6b585e10696fadf98d000001000000002600000000001254ac859965580b0c32c4c6cf936c6ba5e2754d9e4527e7e76ace0b142626e63fb4e4a59483ad00799005eb5c6865b45cd4b2000001000000002600000000001254ad966e2bfecbc7a44a3b297140d4f5eef2e0b7a2ae0908e25894acb7e0722d26412e4a67c86864ac164092ea719d16fc04000001000000002600000000001254aea32b1cba7d40d57d21028b3b2df3dce52ab696935dc889663695787ecb4846a11dc26049997f1769cbcd74cab86dfc2f000001000000002600000000001254af8725a974c6f5d7b7b9e5f09c2b539d61b9920aaa6a0e9dcedfe3a9c9fc23fa08bb39e267b5ac769bb1f2ac8f27956979000001000000002600000000001254b0a1bbd29f5931e75a3e6a74d2fbd9c661582780c27da20112c236e4b167b58e85b1431b698a90e6a3a9152eb2949911a1000001000000002600000000001254b1b354ba8802d070d55a34d67105a41931fbb9ef6b893c92ad5cfa051967e5a2618b072ce34cf2aa4316a81a953dfff7c0000001000000002600000000001254b29187d20881e6cc3dd3fdadf014f2ed4c29f55736519bc6c400b907a2a6915256c8c0ca29d042cdf14b7589170e563dcd000001000000002600000000001254b3ab08733b8437e052113decacff8fd0c09a0f84ec56c8b67244a14e89e577b5f7c18bc6ce225131081bcdd29583657c53000001000000002600000000001254b4956c4b15abb52637959ca3eb6f826b782681009c8dd33bd3f6eeffa69b7d9291ca68eb7751cb56ba8f8c88945ed7bc92000001000000002600000000001254b5a6963ab073a0291e02ae49115ede0aa187dc22f2370c77332bc01efb7bed12a5ea40e44daa3d87df55c097fd7a2011b0000001000000002600000000001254b69441c1ee1774aed9485c3b977bb86dce05fe4f96167100db25d435986964a57f41f72511ab401d56a8a3e9a93a7fb29f000001000000002600000000001254b7a2089e1261401ff3b0f3a74ff09a66eae8c1aeff89e7b44129e205217e31b76975e32f73e092651f8fb04cc93164ce21000001000000002600000000001254b8923690cc080f16deab4e059dd8e8c4a6fce954b138d333acf5ad8f0dc157dad22d869ac04fa02c7564bf4a82d0d783a2000001000000002600000000001254b9b980448431b96f849a2283b4ae73342a97f07f9b83f109b4b4bfc207950346b5870ecc2485de712c99c3f662c67b715a000001000000002600000000001254baa9d7507b8161b41db1b946dcfcd7c9bba04739b6d175191cf431ee880b75f238f28760ee076dcebf5c410f87d19b2120000001000000002600000000001254bb8d40d98f2cc491e09531e32d9f7d50ff7073a651593a54d1a4ac91c18d13a932fd3e4cc1b12387179844484d8901c725000001000000002600000000001254bca75f4c2d85dc9b72a7fef4b6c4b90b52f1dabd453092b7c4891078a8348d807415709be9a25b164d06d90c9b1c90d97d000001000000002600000000001254bd82e6908ce6d783413d41c572f9f44140be8eebf14562c3e3e800665f9815839dc0b890ec257f7f5f422990dff5c2d124000001000000002600000000001254beb33d556c842ede1bf2ed96c44a68fe85a85a1056af629864c3f0717ae186bfe7b7faf3ac92e16c42069566f0d6390d4f000001000000002600000000001254bf89d6a64ef94fb4903342abe24c096b429df4e1eb3d3ae9dbe0c848a5f3bcd2bda86c8e2fbfd5a0cbd4c297ceabfcd0d3000001000000002600000000001254c0ae78c0124cd6a0406fae222f6c5a8115b5d5b15a78cf64f89460c79cdb16d36e7b2f019e2b581646be225eddb8d4819b000001000000002600000000001254c1932179f1ceb853487122bf3696cfffea2a61fd33768fe6710e32a03886181481ba1acd4ffa2402e3a7e6c3767813cf3c000001000000002600000000001254c291281814932f8125a67f796291dd6a2d39a3b1be7265da6a766a0b44074eaf4aa3952116c0780dbeb55127ab85d6fbc7000001000000002600000000001254c385ea846bb74d508b03a81786e54952c0229eca487946d552334d114e7be35da09b759660f879d0ae575914dbfcb7713b000001000000002600000000001254c49896638a1c341d7fa823aed1c76aa59204a56f017c232cc082d783a0fcdce190314b86ee8590793da807c3c8fdab67dd000001000000002600000000001254c5ade628b8fe85f0a283f296663af388cc1c7ebe79f4bb0625c9ca4837bed53dca9be120c61a0778cd9332d425f2a82bfd000001000000002600000000001254c6b3406a1787fbc1104f14942e42bc2193539bc6f2050dfd1c0570293dd5c0776475392e69ef0a39bea064d632cfbed8b9000001000000002600000000001254c7811b1bfaf8232ecc9fdd6ae567f9eca36091de63a16d3c96d7c6e0e30b3f018354bf5dd1c778f80c59564b9f4091509a000001000000002600000000001254c884f00302c907d3380bbcdd5e94b671a696343f73cede232c724c25eec235c6ad9eed2b2b851cef0154aa010e358ccc77000001000000002600000000001254c9b29e7bf5d415f32570854280d263338052f010554b7da8f655053dc0a533cf56c4249766bc18cc7ddf67750ad611e5fa000001000000002600000000001254ca9230d23e9e516d950be5ade42ae270021062628cea83b6a8a5207e5e6fe36af320545257306b968556d9f9a4648a2f9e000001000000002600000000001254cb823d374bb143955ae8b40a5a7e15037965b5a466530eeb53c4684e36e8c73491408150b0cebcec3f12c4337b0ede5061000001000000002600000000001254ccb591509efb38e15980301e046fe0f98bb8d8dfdf0bfba326d3cc61ae04f8dec453eb13f39cba1d4d9466a7661d722c82000001000000002600000000001254cd80f5a35fc0c2dfe3888d328fcd0dc349f9bfdae2ece291812132ed3c57b5898a60a3795c13fa4b648448875026dee862000001000000002600000000001254ceb438c7ebf17fdc41c1e3f00ce0dab075924b7f9f0efae2fe85602d38176cf6bcf2cc73ee5e6e1e89251983fc908573cc000001000000002600000000001254cfad3d3cb8ba2561ecc0ac3414ce9d862788667d702768d287f093f5c8cc0e422d86d8d346670fa07abc85154c5e2c98c4000001000000002600000000001254d0949ebd3730bebda125848396e2103559f309913eb27581ef0541ecdd9bc68566ff9fe8e0d50ff84e4ceac3f0a7b98703000001000000002600000000001254d1ad894bce23f6493806075efba7c6f24454d0c5f02811575740f34af62640b4ad80192d853e55509e20b2927f60e707ea000001000000002600000000001254d2904f4c2612c6c6a3595a91670da9315175fee399f05938448077bb66fa2fd36af29cd6e4bb78b2e12353e71e0dd2aa11000001000000002600000000001254d3b2d1b45c6798235c07635d0edcb25a53f171a5ee4f48ff84dd0081446b45e8ba3cf25d948a113ad1626dbb6ad556b8e6000001000000002600000000001254d48a7056f33af2023db5ca9b32c5df15434a434fda24249c81ce94c2c9e64c51231fe23f3a3a601c53bf11475feb42c37f000001000000002600000000001254d5ad3f99e9a4114acd1373101d507ba750b1cce68cef7da76de250c58844cfb2aabbaed793b336651249024f49bc14b7aa000001000000002600000000001254d6986fb11d676e44cdb19c33c3cfcdae7635c149a7c60c5d2ac6b450c758f3b2ffe1eb7225af3bcf324fca1a23528502c0000001000000002600000000001254d7a8cdb8e91a9a1eba3a717155493fc430074739a654b7cd5809df35c75cb908e92bfc9eb9185312f9e0e007a8bfa50d8b000001000000002600000000001254d8aa0b01fee37ebaff3f74ac390a96e0b97296573b4035bbb066c6a5fd10a3e1efbf5ebf08f5366e07f12ffc76a179fa7a000001000000002600000000001254d9a10aba446fd604df9e674dad1041aca21b7287ea44e551406861897000e36d5f1cb383707d6fff23eacdc2bdc5bb35f9000001000000002600000000001254daa3e08ab89eb7b2023a4f76d05a4399f1c30866f2d37e68072a10355073bdc4c2ea06060db75796f8cc5d8555e0d4ec5b000001000000002600000000001254db882b9ca39ff598093d6fc3439dcbf227eda5d9271fb8b9a6eebd5e11138b96d6be04b880165172237df0f85c4b7250f4000001000000002600000000001254dcb6ab88d8c4e0c4bfd074403e563d153abcf569084bf5943be821c688a8230ae9c347b05b56b46a628edb3cd1d3ec88a0000001000000002600000000001254ddaba75bd077888cd393b0ca76c386bf2a336d4dec78f1460962ff8bf8c71a65d47dc159df76971b873f863899addd3fa0000001000000002600000000001254de82a8b8cf9476070a8418905bf69f92b8822659ddaf2953cc3e99dcc7262149a2e2f18d3ad365ae4f8a5c7d61353e35d7000001000000002600000000001254dfa8829de1dec9e5565109bae2d84d58165ad6a212d1605d6a3e2535ec16aa2eeeae7bdc34b2feb49f1de5e2566dfe59c7000001000000002600000000001254e0b0ed9c366eef1c171970a71f42cfa808398affda2071d5b90ed6b78511e0384cbb73ce26ef4c3eff2b0fb88dd04358a3000001000000002600000000001254e18154a70a36c201ee51c05b60b26a86eb64c92f43b049d4979b8aa91e7478e775eec450f249a5ba77e05e6449d66011c800000100000000260000000000125540b175b9925400c12e09d0477ac4c035f6087406e83b0af0d908adc7a269b7b15a534167cd43a61af058d0fd0bb122faef00000100000000260000000000125541981f0e27fd0ef2bb405adad6913749d570c1471a69c48fde48d1f32fc83746afefe4b950fb34ce857599e60cd77dc6720000010000000026000000000012554284cdb164d8c65da6f3174fd34fe496fc0a619724b1de69829a7a18da8ff42545a80b6e6823bfbfc8ea6a0d99d501ca7b00000100000000260000000000125543b430ff5b360a924cc7bcb640b85396e9c70396135ae0ecca898aedd84f04f32ead016af37e9efda320d6fdec31f6bd4400000100000000260000000000125544992e8141c1caddf8ad7a0cf4421ae88f5cdcd8e10ccf0a1d1619dac01f73c74594b6fa3913005a04f9c71f04ec446d59000001000000002600000000001255458bf22ac07cda73b4a2e3d7d7531914fb27b5d4610c40619f214ea9453563336af6ec8252d7f02ed698594448b593d47500000100000000260000000000125546999a96c117f22be52fd44ff082f31e5b72c0e372fbc628ad0d8844088c6751038e9dab15cffbc7df8bdd620171c2a5f7000001000000002600000000001255478ab270c892fbaf33b09913c4d06db0025a1844af861a1d04e3c8c4c7a5ecb518c4b6992d9966f76294c2fd6ee6bb8d3800000100000000260000000000125548b8b10942b8f142dfd4942e0680344e036e54a5efb8131d0ccb04a716ed2d50aa91349a15ea3441783852a97d8333122400000100000000260000000000125549a39d40d1173c9a70533fe1c10a56e2328ad0545553c35f931ecd4f353ef8e53a9be595cfc8d4d122365bd16eadc1f14c0000010000000026000000000012554a82248cb08b59fd5e44f34114b24d0827236a7a9475218db1defbee8f12c6f55998421b2e3d4bbc4ce034f66c091c0d600000010000000026000000000012554ba4a54c24651e7655e2aecff5ad75eac7951e65b1921e279e7b884ed476bf5d78139c50f0497ac6daedd7dcc4a231ab230000010000000026000000000012554ca1d348aa4407a1116a0eeb3f8637f63b7c1fa1a63a4254a15e18d9959e9f5c982d6b8a0af1dac4eae2e4ffb352fd81550000010000000026000000000012554da19dc6815b94c410e29a4f326a5e82c8ec8186db8ab808c084c41ca1ce36d1d525fe5ba21fa1ed30294645b36b4503250000010000000026000000000012554e888d16804900f36ec5674fde61e0c800d4ebb65144734e6b5b884f18f0cbc8e88b21063acf467558fe623eed0a19a63e0000010000000026000000000012554f8c0ef849ee89e2e63f1323f665849112c2973868a2e8d50cd2cb0c12daa27aba319fdb3e3206d8a7ba88a2f82975d30e00000100000000260000000000125550ad29ee5a62035ec3eaad283ab84562a3a7c47b3c5d82a601e89b077d2f15db80204f406b0e066de1d636c9a1f545bcff00000100000000260000000000125551b678d6b56a8d7f16818d414b54f0f4227d26b0bb3dc02accd0ca13fec6da1b8ae1f53847da4f59e0adc9ec200389dee800000100000000260000000000125552b636ca9e4d64fee334c601ab74a0a902fdb335a6a302849375f2e7a7293ee5f507e36bdf5e5ba869a0cb896c6ab8f6f8000001000000002600000000001255538c16f49d7860cc4d9aefe1328c85e4a6ecca85730e766b4b2789849a9c1f0975cc078feab24cb808b787729aa57de45b00000100000000260000000000125554ae55731fd49dc5ff63c5178d078ebfcf8c43f35ebf455bb12cc50a23b16f698a04c51dbd2949d1669144217bf873dafd00000100000000260000000000125555a7b4c0f2c1536d029cd1c7fe75c54552132b49a5766952cad8056102732545d06a6f00b4a35dc40d86d3594f14b96d6a00000100000000260000000000125556b085660ce93695b61207820cd79ed8e1d84ca42ce73a5222987edd0f8eab96a6190b9648df06801cf8456fe289cb6da100000100000000260000000000125557a61049476631b1af773f74d51ac6d0fa877c1dea5a345c8516f78a143474360d38582ac4bd33e445ccc3a21cdc26e50300000100000000260000000000125558826e55ad5a66cf52eaf2bd23511f92efa848ed265bee86008eb27ecbc79c17077958e937585c18fe4b016d50d3b57b38000001000000002600000000001255598072c1ebb1d34e88577353fbc0bc92a515bbe02d88e29457a8732fe133ceab3f8cebbe7bc4da0f71a4751ecc13d5786e0000010000000026000000000012555ab81bab4d8aa4ac70410d4115149ce250ea701398fcfa7aac313df685f64a167e647ec9b938cc83981019bc6878d6372e0000010000000026000000000012555ba0f4602056e0007e6e9fcf57c108bb78e80de9dbea4c8e10b039db2a9d2c88deef2b0336a2b7d5792f1c6d6e6241b6460000010000000026000000000012555c933067cc494028483152bed85636acfe5cbb61d9dc1885b664f63bcdc1b65fa69c77a7e0fd38d55163b00680d53ed5330000010000000026000000000012555da31f45656a6456808328071e1e17ffcbb67cbb7b3b89b849eb3115c49777751b87619799b32a36689ae2da7a82e60e4f0000010000000026000000000012555e8e933f32fa8f42f7bf4cc6db65051ce41a3f0ec1bbfc1909e4b09c04f6ed5f7cd702fa9f66499d8884b90a1b542f1b0e0000010000000026000000000012555f8e865e06503ace9b02fd8ec0e31bfc474dedf2a40c4e2abcba860969727527d61f999890d5876b235a614ce402ddfa5200000100000000260000000000125560b27388608d49c6e861594f161c9fa0e34b45b9598d8638aa219525c40da12112b3165ac015b3ba40158ea9ec455b3820000001000000002600000000001255618dbe1e0b181b60ad28fc442bdbcf300791d3b90d25582cfee8794c229df4c9f90d5f0da497b3fe70b8b6771953f7a17f00000100000000260000000000125562b1f6a84a83b36277a3be4fe9587478cb776be3063ddf8f7648180e18785c91a8628ebd361d105576d1e876777eb26eb900000100000000260000000000125563ad47baf3047d4ca6508580ab91c72f1132e238854ac1b0b54b2bd825a3543e332029716a1e0c4be41bd516522f3daded00000100000000260000000000125564a41e785d279956cb2bd5b559c9c2dcedf143667f2662579846241c44cafc8349a623f4bd5d6bcd49182ed9967fc9c03200000100000000260000000000125565976bd8387c917640a2b25ea14f158ce1b29985105dbf0fa28a10439f13350a27fc5073b52685abaab570250d9ff5e36600000100000000260000000000125566823781dbb530c95f606f019d5410f9528618b222743ef513ec009f45a1f507d80fabfd18ae6c828342eafb3bd3eeca8c00000100000000260000000000125567a86ad94611d466e10397efbb5fd2fdf93aa64f6dbdb14178e5f5f45b3d8669ee2a39727f787ed08615653bc78b070e88000001000000002600000000001255688698f441efd1690a479523fe451961e6f4cd4d741a0cb54caae54ad692184cb005eaebc3b877fd6d209de879034edeac000001000000002600000000001255698a854c9c5a1b5b49d713c7496bfe7dcabf031f30254e0b1f7f76af8c3e6a76b196c82ab84318e07c7d0e7ab4f78a5ed30000010000000026000000000012556ab63b0502b1839f7a65852e7da06447c2d848762dd07b236723051eb2ffac7108676d93b10bb704378824d6f1aac6b1b30000010000000026000000000012556bb96a65d1372aad67d5ca180c22146899923717becdc7a37b3882fff232d1d9c7e35d66b1d0c3f8e2dbbe26c13fe33e020000010000000026000000000012556c9323f30a7068a53d4d97c11abae057651af8aa0e9673fd35b0087376d8e4552429ed4859a5542c9ef9bf77cbf34d62f20000010000000026000000000012556d83115ea25c2f317b12a995ccc21c2e8b967fe98d23e8a454b2a5d28d3211a3d26f8a7550a81a18f0d5ab95bae60dcfaf0000010000000026000000000012556eae5f08788f3b2db98fb40796a333c764d08198ffcbe6da80279bc9de09e94775e16f707f6d0164fc82d47998aae8e5940000010000000026000000000012556f93be88b25b8c47cb1e532bb15affc5d3258e8d76566a8cea7294b84f34e7426a2d88985e3dd25dd3b576bfdb1a7b758800000100000000260000000000125570b4875ebb577c6a8eb06557449b71dc3029d75410f412ce60bd36a4e256d89c3e6bdec07feb0ffa923bbf81d6670fb44f0000010000000026000000000012557198fe1259a55c47a3547ab97c41614628b56a9909cde9649e75a6469e000638903c6406c7c9002f700cabb8e55759cee100000100000000260000000000125572a7fcfb1d8d585e8602aa7c7fda9b1a87d1da3bb2c775fd2cbe403e2e57f0669139a2cdc905ed278eeb64ffe932de06760000010000000026000000000012557395b84c560905cfa55b4772b4d28d5312791eae150b6aca556c937350f51e1bbe69bc3227b03b61911da656870e381e3c0000010000000026000000000012557491a93e1d22e054b0a261659cc9195429f8a06c300fa6acc0a5229eec0de949bf6c046d6b7bba532e277217938398fa760000010000000026000000000012557591c6eb9a960920350e8c3e7b3364506b133f0a3ff6b17c6a7da081fb9daa33491c47556de2ae3b6ab0c1cd00a5b74f9400000100000000260000000000125576972f92649e21c1aecc22ca755562c5541248dd615df0a34c49646aa55706858fc431e81c80124e440b93fce2115fa22000000100000000260000000000125577af6922c8e29983918ff2f63867bb48260fe43de150d5cd8a82cf0fe9fb3b84376ee84f9d98e3756451a9f93e4d81921200000100000000260000000000125578a7eb567a0003c26dbf771ce042c9a25bf3eda92a814c660bafd5ed1de7777e287276920ecea86e6c49f894598c9374b3000001000000002600000000001255dd801d9f7a7891cabd842a5d8e62dfcb2b666e60d5f43e95d6dfe37e74dccb50b5b0eed4c39ecaad6e46eafe6433ed1f4b000001000000002600000000001255dea62a3e11165c2a863fe1514da709ea197461870d2de3ae506b1b617a4a4b4c89cd17583da33d09342dbee92096dcb858000001000000002600000000001255dfacfb9dcda5bf7d38a090e2e7fff691c71f40fa61c99e9e71a60eef058df981518362ed9e0c5cec3329b02188a6b54fc3000001000000002600000000001255e094c328da8e7a79343b46c83dc8cd12e00372de52062eaa2ab85cffe3e0ed8044d3b16d97ce2ffd827ec6c2054c425aac000001000000002600000000001255e18548104f32b95a814fa691029f48e3f26f2b97b589a100e7ac3c4aa6a79ac601a1c5828183260e9641ca188976b8f14a000001000000002600000000001255e2b2e654d36e3131ffebebcfe20827030eaf6ca3f783e6b6127950d0a1f949dabc1f027778e39052e276593dd4165a06d0000001000000002600000000001255e38379f751ac1ccaf0049c6ec88b77bed0d98e22a750d99cea7e3a6a09ffc723b9f79835327487244aa09f8c2ecf14a4f1000001000000002600000000001255e48c5a5b353810c9df1ec4d97a34e63c4ee9c538a43935e5789ba5ebb3f13437b49ba913deb3d04e375311d12f857b89d5000001000000002600000000001255e5b29ff9edb404193b89373c7c5597094eafd322027193e605ce17ae07252d562a7db0ef8611df7167aa7db35fcaefb2fb000001000000002600000000001255e6a5ab2ddde5ed309c2a8abe9b6709cf352dd97df1af0677c41e99accf3d8c60e43f80296a0df982d9362f62f72af110b1000001000000002600000000001255e7b76ca2526a828cf0a2276873385058d3f5fa61a69b7560bb6059641887cd5006378c806d1287f5bc02dcfabe274fea1d000001000000002600000000001255e8b61a27d9725cbea16425336614477029ca69f90e8954f7eca776fc29e62ff616b320570bc6ba042487bb13e84ab00064000001000000002600000000001255e98b500e94c7adf791c55d95d0351440c1488393326e75c9948bd05370f1c8c01276080e8bb36ec9f7e9d615ab0ef20176000001000000002600000000001255ea87406b84d5bb0b54d70956e6029a205f2b717f0269eaf0f2887f4bb9d5d6217ec0233a9901f2ecaa444542a287330eab000001000000002600000000001255eb87ef4341f2cd97a3d1dde3472a9b85b1498940655253445f545dd7462d31948150ad13622c46bf51725f0aa8f96012a3000001000000002600000000001255ec87679a8e4949a1728e02d78f7e40b557da365ebc39cf53f179c327fbc8a86d3dac718aac41e6f9652af09a72216c8715000001000000002600000000001255ed84943b7031e488e63c3444f686e6d1477d2981b7d88658a8c6c551808ccc69ceaa3d568434a23025dfeeb5bbf9c1760f000001000000002600000000001255eeb49306b0ea528daab96d6f6510ded47380c2bb66b3d911cb8bfa52c422f0a8293d940e08c177763be3e122e2777037cb000001000000002600000000001255ef995b2bc670268720f822f8e16844e8c414c082786363858270475ed8c11ec985586ad0075be987e08ef9fdb158b1b3c5000001000000002600000000001255f0a97bd89703cf368dbb03eac560a24938d42c4440ee5ff0a3bb740668a7cf5954cfb3a59ba1fcf75f47ba5af1d93df7ef000001000000002600000000001255f18a4d3f3edcfebe930b60bf8b8df3c805d26b1b4cff4a2c7dfaf82b35d88c5eb60502ba33a355415a217235049d1ca0fc000001000000002600000000001255f2b01ce0f0c6f913ebf11c34284a5fe6ddc82329feb8acef1d7ff257cd0351d3a6f82b84a603b322b7a1a96ffcbc10c0b4000001000000002600000000001255f3b0d0f61a2e97b68d2549c607223b82976a9596292d4fe76cf0589ff5cf0d98ef3d3a7ee00370231e57086b6a7fe28fe7000001000000002600000000001255f4804fe168873cbe598054887b7afd9c7d58a9a830ab756cca21b493ea5ef5185373841f65b1792f4c2be16bfc43ee1213000001000000002600000000001255f5ac8eb57823abb9ef87dbe345b403b1a40921aae8ed7b7325c69fa7016c737919460d1acf993c666321a50bd09bb96ccb000001000000002600000000001255f68554024883e9d4a5f30a1136cdbca731b70fdfd82242ade21f167639cb90705a90eb527667aa3fd23a3c613c124025c3000001000000002600000000001255f78bc517f49e682941ab3a34f4b92242cfc84fab498d3f2f01f536259241578e0ae07bf8e195778fe731f42c0fe684ad6c000001000000002600000000001255f8aee3b9fa11b7988b9e10b6cd67713ad3d70b54bffb6106ffee46bcbb8eff3fc5f9081653752d7d23ef0e67de6d027ac2000001000000002600000000001255f98982ee033546513dd4c6de472abbf98c0d1143bc9070a805a70349ed45fce6f42eaefbbf3b52723fb8f70356a503e007000001000000002600000000001255fab1b6b5adaafd8823d9b41e4bfd622f56be076a107435dcb22663e7a1f8994f84b46d8a87d9d03e8943fc937d8c84a2d7000001000000002600000000001255fb8590e0fe7a7ac0da01eda0d02db5550e8fd68deb07b71246a1f29c4e48a1bbd9b46feccb253a9660155cbb1182e2a7c3000001000000002600000000001255fcb1006634aa54cc5d79470940158f6c049c2ce42f4d32f05740e57b0218e7e360dadc16060ea783899f65fcbb8f080254000001000000002600000000001255fdb52088efdbea72224fafc5fb53c6aa4f19fb1f280d2a42b1ec8c90e8fd98f096ea00acf7ddd6fa5261307ee97f63a362000001000000002600000000001255fea2cf2aeb067c2afd40114af34e843e79634ad56ba34b9c3987f15f01f9016b3b2f0f39885a2509b75eb1ee9c64ca11ae000001000000002600000000001255ffaca7c4e5f59a0277ccff71a8113b9f4242a841d9fd0a605d42f3056b843f3dcd2ad629c50e28ce62d536973ff2d4d65600000100000000260000000000125600b6f7b901be59959c3d62927ea63b25a2f7e65888f07d49979b3cf28bee6df2b5304e0c583fb67f943f86fb7cd8968e68000001000000002600000000001256018f7350d83bb319c82e183fa76d52c366d63d6073b33f4ab851c4db2c2320e615d6f934e51984fcced7a8fc918898a4c700000100000000260000000000125602b9966e9646aa9abb3a5f8c074acbbc11331530656d5bea3b9b38c3460095f4cb3ce01cbb8ac807365bf3e035b74f290300000100000000260000000000125603a62a82a98de514813f2561768da7d3137ada9c693574b4a598213019eb72ea3599e78eeafdc21f50651d39487277e121000001000000002600000000001256048057c89cecc854c9d4e0dbe1b67d6f2caad9222c4fa0924280464a57c6c9839e2b2e2ba881e88c0c4406098ea9350369000001000000002600000000001256058cda74c4c5d020897b8a78ad1f40748217629a9735280e3d2a0e12d7c7443a40cc7d7e0d0fbd302830fde6bf08101b8d000001000000002600000000001256068265f6790e40ba1b868eb19b3d81fa9d5a3752ec0eb01ffe1fa1ff390322ac74eacadada4ac2b44f018c31f0b2c9e3900000010000000026000000000012560799be8c19533bd6b41e74ad8708472d697b054bfb053699401bcb2cd34cc3be985798771580c0947f9e0e7591d8eb850000000100000000260000000000125608a033aa2e214ae21c5349750af2ebb2a4f0830651b1934e1de4fac0d4c7c0fbea7d48fce52eea46b7c4feb508326f4d6a00000100000000260000000000125609996c85d22cae35359fc38f1314dd06242c483884a9747fbdd605520cd11801ab0f7b80be71515d18b3614dcf0724c1590000010000000026000000000012560a910dabe6dc6be40a69571d1bca6e299c543fe22273994253767757c6be84aa4b56907c068e20b3bf0b43f316c4383f3c0000010000000026000000000012560ba1b911ed430e142b4056bdf23db005237c1ec5648a29eceb98766cc37945b38822719d14b76b7cbdae48118a9aac679e0000010000000026000000000012560c846e1a9116ca87a25d677be95a6b43a6422c31cd4ef61c79b3983abd2ccc679e324a8f74f0a5de0c004e8eaaf03401d70000010000000026000000000012560d843445a4c36ccca5c00b48fc9c5bd0f1ab98253edace64e75f62dbf476186dc6f155dc108569d6ae7d0a250cb1ba8afb0000010000000026000000000012560e95354296bf0c6081368c8ec7b2002f91788714bee69472685b6a04dd60e93fb9d5979df256e82194c6ab3aba278ba0e500000100000000260000000000125665b7b539daaa76bf018ac7976e4cc1775f56950a52b6a226535a8ee43e07b4bb874402eea6a2a10e3786c4bcea820f131f00000100000000260000000000125666a2f0f1c765c69397c78b9d95bed59560ccaaff031bde9d82e4f54459b9b54954ab4618fe046137bd2386505b6de5f56300000100000000260000000000125667a7b59099829a83766f27e448b3ce995cb86e4190896026ee650d8bcd5c441c0392db0d89f1d599b3362e906a54a6507e00000100000000260000000000125668954decd501ccc57f31942a5321343e9e6e368357df42916cefa4e12adcbef87d87dd62b9a20e3439d77f5ec039fe915000000100000000260000000000125669b6e2296b4b40a0889165d69f965014901e373533a85dbf22df443345b98e3cf09536420461f41eaba9a53443de41b7d50000010000000026000000000012566aa3959564677163d985e2c289bf9d9c3738120c14fa7ac261c913f74ff4c71c13234b43008d35b231ac3396e1ff59d45d0000010000000026000000000012566b98d2b52f33a5104dd3d85ed27a4e34bf7ef075ba9ef7f20e8413341217be06b3823a9310aac47b824f97468ace61bfef0000010000000026000000000012566c8a93976baefd49aa28ad2219517a69fa494db5b7a45de810ce8e542cd80ca586db6e1880bd8a4524dab9ae36987a54620000010000000026000000000012566db700c8a8b5c39416601fc7a05a6928895ac169a746af9aed5731a4d6db25cc58faf0f136860bfa447c26431dbb80f4aa0000010000000026000000000012566eb03cd3c511601fe5f9a83e71e532f101f34922d8547bb51582b7238ad7074eb4796d927870da03a905d911f229d02e160000010000000026000000000012566f8b04adeffd67742fcf5523f5f1814d1da833a3c674e2ae074e5e2207aa90ea27f4abf8ba0820c67c445baacf7dfe1a7a0000010000000026000000000012567081f0338938bd97a3d7ef498f1a551206a5d0db2624993c73b8b89c5731710b184793e84af78134a826ed8c80eb0aad6900000100000000260000000000125671836785ba600a734cae0dba3bbf1ba93bb93430050e84f34b9487c268e56c3b66f076dcb2bfbcec1dcb732eac28ea4e2e000001000000002600000000001256728488d9ac07eef29bfac65ce8757495b4325381b965ab3b3422b0502d009c4cdc047430715bb75f2ea6598a7181072b07000001000000002600000000001256739874c620c18210f32563d08bea9384d87ae3ae05f92157da2995dc5e5cc73c874f75385ed0041118d4fde06abb3955fc00000100000000260000000000125674a1e9e12650ad23357238687bf872f4c7f795c4159e64337d170da38c2a5aafc465434ad69795c565d7e065958804f98600000100000000260000000000125675aca0d5457bdc9e13beb2efdaa09c28206dd5a64a7ccf56da80b7a31158aa638c14925ad04e4abd4b44f98023f7eaaeaf00000100000000260000000000125676a5f8a9f091c21ba8c123e23f174e8dc865d09418b430b6bd2226a959e9579ff27caf94f05d7c9662322f01a28659437100000100000000260000000000125677a7fc380e5cdc74cbdbe8da4278062c2cd5da4181593fe67336d0d51949a6b5b7eb704c35d46b450c8e22d53ef7cb705c000001000000002600000000001256788e2b1d3a780f4e79d7738ab207bab8ec5fa7daa70bf1d276a9e61aca82d5a41d50f78f20735408d9926a4bf0e1b0948a000001000000002600000000001256798230c21edbff826c415badc1e1b03d0e3d3a3b276b9dfc796f6de8c70fb69707e8e999c1e666c3014f07d820db065ee90000010000000026000000000012567ab6f7f3744d72ecfde719ed3517716910c0109ec4aa705fbb650b0e6bbab15a2137e80e3838b9f9a5a6626ae0c6275f1a0000010000000026000000000012567ba8ecea746f2e71dc854132125554e0acfb2bc5900c5dab3ff94c0286a353ca98a343d9aeff989829d3af3294a6f57b980000010000000026000000000012567cb504ed973dfc40c8d071a7ebe14ac9716a7dfe170b8f2b990e81451c1fddd8f8bb9df8aab4640cf4c4f53b4b2b068b090000010000000026000000000012567d87b6fbbcef97fbee49297dee23345dd16a615c135394838cae8b72b577fa8655af9c784d6a6362a150029b51efe89ef20000010000000026000000000012567e923ace4dee9601e6f3b8cee780cc29a54fefd23247cb7042ec0262307e7ab16e939c53981a27d0538a575ca4d4c782870000010000000026000000000012567f90533176762a56692a599d7ab8bb325b2fd537af03990d0478254c890f3e2625c4a5acbf658de27a4452d5ed4e1649ab00000100000000260000000000125680aee77c661dcf96eab83cc64d4bcc527a9625977c48ccb458dc9d596a4fcb2634096bcf8cf9f11ea56bbcef676d933f6900000100000000260000000000125681b700854ebd1ff92034752180a3149d48680c23d2a5bf1b33c6dff35d85366b3ac85a5d8bf245bc7f3a7439e5a7fbafa600000100000000260000000000125682863d74f8619d37855f7c52d846775c58447e504513f2dcb84177ff0f251d6f69c106cf872173859754fb94badc6dc477000001000000002600000000001256838a15ec3bbc8dfb0897ed128d855cf101e6515b5151168af070ab9af56f1618f8d7b46762246888ffafe36edaf8bdfde10000010000000026000000000012568490096bde9cacb6a9bbd28c86e4308d7f635f3f7c9bd203577be0f0a72582f796ec5aaa9a2d8cf0cf67cf01511df2daae00000100000000260000000000125685822ec8f954c0acd324298c473ca7f730395a3aa7de7a031efc00bff9af5f8f4777dc43c937ba3a3add6c015c4dac8e8000000100000000260000000000125686b7ebfcd697a05706b722371f4a4d693888d1fae924418fec25cd0b2d06dc627f119470f2e425db8f8f3ad11427a3794900000100000000260000000000125687820ee2a7ae862273ff52631fb80a24c16cd1f0c7285fa0f297313df25f61ce6787fd51d884f2a715c4fe4efc467baa94000001000000002600000000001256888eb2ba0010067308ee82746bfd68cbeae3e90d53f6d1d6d4977594502d559ee82cfe4a5de8a350dfdc95c3e8b9caac3100000100000000260000000000125689a2055e3ff7bd74aa540ce3b980045045647ba3aac7087f59cf6fb46e484bd3f99339a2ad155034417ffe80c7eb86b4ad0000010000000026000000000012568aae375bd415b4e7941b61896aa3e7c4417811f6759c5985e3cf7c9717a4db63a4c1659f2618455a18abe1acd3833c7d4a0000010000000026000000000012568b955484f9e9ed78a88d92cd164b4dcc25ff2d43f56c1d6c9827bca53dbff17f0e4f6f9e56e6d6d598d7697dcf15d5c5a80000010000000026000000000012568c8a710afea922a7d688605e4c13471df004dc252ee883f0fe550d2b1a4ca9c8a6770f29f8d6fd841baa85f442562741a70000010000000026000000000012568d98fca9c0428d431a0f9263e65e528230b6cc6a5842b94c3b4facd84dca05bf0d5a3fe422f54a95258f9eb98ebca4dbd80000010000000026000000000012568eac260dea7bc5181e78a6511f73d76aeb8bafff41a7cb49abb3ac79b04a0546e7f515836cbf0cfda0b77466396c1f33e10000010000000026000000000012568f885b94a1e8ccdf5b9806cc24afdba51a9140ad2563b5c97061c10dd8ccd94bc12410a4d778855ec7359c61edf01a93cd00000100000000260000000000125690ae4fe9d2346f8b480a8bd4f280e902ac10f034d1a26254a06f96b61ea1853f1bf6430817d57c4bd5eed2486848211178000001000000002600000000001256918ead7af7b379a48475f5600a1cf7da9aa66d1bb4623527a4f0f3df71b1ae778034b848dba98c5efa93a89bfa5327b54600000100000000260000000000125692b4084a1237a047611e2cbc0b50a6323608b768e58ade5e9eee82d32401ed037eb8fabfedcb83ecda02402a537d9c4e2c00000100000000260000000000125693af6399cc772a7f8424585872bd141b8ea7dbfac04f1476951c77bd5397bb9d9eb24daab4f980d79d9fe103b5bca50f440000010000000026000000000012569480cb2e28d3dc13dcb4df529564724616cb36df24cc158397e4df5c394eda1be365ced4a2c67df00a28dd825b2e95345000000100000000260000000000125695b23b6f0716300b6a957fa156b24bee053ef04a8d42fb8db1943b9fb09cc7edfd001e0f100820a9c7b289d2f57fc237530000010000000026000000000012569680afcaf87064017ccb0d1c2771b7ee9a1f867e442bd71246950bee60ec34b627e0f5d8bfc478b1f863095c6f63bd456900000100000000260000000000125697a6b7d83cd7a5a30eb1484fe0d95ba1e53ddaefa084e8c0394652600cc2595df9da7b60f4e7154122c8fb0e4650baf36e0000010000000026000000000012569898b06c1b3d1a0c5056be1d7bc8277f3ae580759b275a61a131f7c97ca5e36cfd4ebc1b81aa91cba63d1751d585bcfbff00000100000000260000000000125699a4761dc74609745be116145c9d1b3d80d191c663d0adc25101aaf46a349e23ba7b6bd7f7c8908473ba565f575b408a4d0000010000000026000000000012569ab737844ca9bb56a28b32217d697d76e15355b37a47b8d328fab2dbb57127673ca056dd1773f767ba4c4abb1c7fc41d390000010000000026000000000012569b9502ea631dcb2337a1d1c5ae9d69b65ba034e41c10a220ad31eff05629334db3254b0c4e5dc8b67d75b1f1c2f4008ecb0000010000000026000000000012569cae9ced8ebb3fceb4e67ee67bc02a3bc0a99fed7ae3118fc8b58f70025d3396bb768a74d741626425b9e438826c40ac430000010000000026000000000012569d8840ea05d5d75cb2e478f6a8dc4e23d229afa9a836928d21807c5cdaace39bec22b3b63dc5ff0f7dd96c5be49053bbd00000010000000026000000000012569e9557933f007aad3a2a234e89e0bcd629b9491767753f0cd04e6f6b048a2911538a84acd98d8b8838cc0f0c39b4dc54250000010000000026000000000012569f8422d58fa1f28a2186345e88c810560cedcc29deb2629d09053c0623ea44f6e78ad2da694df8b695f601dfea27fb2c7d000001000000002600000000001256a0819cbeb315cddcadbbe52a783dc2ebb2e6ebeb611352af863b706e45f94a766523fbba0a648f86d42519ea2ccb1e7a8b000001000000002600000000001256a1a5e63ea2bfd60861e688cf093c2253f5c0d00fccdc60d087f4f2a932d2bf3c911a3812c5c8ab317d2f6d93b66a70bac0000001000000002600000000001256a2b4b53e64c2433dbe6fb00e1ce2e1c6323f1da7755a0249434006821a57d71fff1ce02b9e64b0744667dd5b937ffe8cd9000001000000002600000000001256a3a2d2899c6776003961b0c161b9821f7a9dc6be1226e7b6997b4c0c1ffdd4671becc770602f76b8eb3ffe27e4fc40b905000001000000002600000000001256a48451d597174752d92d4ea7894d4ccf0d6d8e11c93528906c926395c5fb0a3e3d4e16420f478f86e4ad4dc16ea633bcb4000001000000002600000000001256a5a3def6a870514f9257bf1237bf5b3c4420fed8947202624c3b233f4aa16d44ab7132f02b1a5e6a0ec1cb11a5f94aa549000001000000002600000000001256f3ad153045f72b9ced59ca2de34bca8cddb901a3f557911eb1a5cfe3b98f0e92382640ddc7d81ef5b761a3e7b6d75be3be000001000000002600000000001256f48a48d8fcf60a014931331c4c5963d807e4c6f26513138e80393cb46480d96d4edf94a86871a069441c3a1faaf3ca4503000001000000002600000000001256f5b3beb4a273b11365c521e94faf496ef76d077392a67ced2c1557c714524fa3e8000c463d81b6f02d5fd162eb3c4c9608000001000000002600000000001256f6b0b634474bf2ec4e2dc00524848c4243bca807359631dbe16b280f01ddf535f2a6395a7d321456bd3e6d626a9c98a8d9000001000000002600000000001256f7ad91eb47fdcf8901b146ed23fca97a34a427aabddc7603a94221543dd55b5b02ed07edbcd54330662530ef909d1dc9e5000001000000002600000000001256f8abd4b2d96a388021fa3f240685f0beb6cd234492a22395d8a601475858dee19854d57f0aa51deec11c32eed298fa3f48000001000000002600000000001256f994151fe21c19dd0ba6093ef768dd2aa9f3da8fcf346d4affc3ff9bee33882d1f7456e604239bd687d072fb3dc8e05d9a000001000000002600000000001256fa879182e1b6efc1b27c35913e244c62c0644caf835edc93b42e9a8f29fb0eaa0bfc73609f0bd7df3c1812538b5b7d4383000001000000002600000000001256fbb569d1f9d288404e265b08af1d2ca234d8d2ce728a4643982137acdce563ff29f748e9db490d9466ab8d062b2b7ebc4c000001000000002600000000001256fcb3992f43f899bcfcfd279f6aa894ca08001df6b43859134f0216167e96be98c5e2ffcb62f24db209b7e15aeb745c07c0000001000000002600000000001256fda2fe1bf9bf5dffedee7eb3ba89dc3e5add4f8e4eb25b7e6efa8948d1071c38e91a42e2fb9c68a106c4d6fc2cdba10760000001000000002600000000001256fe8e19af5b0cb159b720155fedd62a0b5d89b26983d20407764b09fed82a3f076047f7db560a6ec548fa01a7817336b932000001000000002600000000001256ffb899b5292fc71e76a81e0775fac19a1ab994e7b62bed2cf5f45d61b78c5e097889fa0c5c869569cd8565a3a8970f21c80000010000000026000000000012570093e8cf2fc485519473009b24e2d9418387780db1da50fa8f8f49ad923da83157ac9cf7d5986f0074f95aa44db4e4294700000100000000260000000000125701935f7971be8ecbef748d61455bcd88b82187c8b86d3e037f1503b5790aae099f02e9defbe7ad3951dcfc3d055d1efb8a00000100000000260000000000125702aced3601f295a5e92bbf4a70a2b6456214a5dba2cae8104cc325fe65f0ff402f358750f5131e605b6cc5ee20322a2eea00000100000000260000000000125703a13be3d5b04037958befbb7548396d1a421e7aafe138e70688a81051aff09bcb95dbd38ef0db5451b527409d855d192a00000100000000260000000000125704ab3e22f6459d7cf0628f7dfe8d1459907a94832da66fcde8524b9400160c56efe543c14ee48e52364dd1496383f589700000010000000026000000000012570588bba74a2d23f03524497aff029e1f879911a34cef8943ebe84205ed85d2cc00486c1805b4271417dd263d6e3bf4a3db00000100000000260000000000125706b0fa089545f4713a92d9152eb14ab3a89cc0be8ffcff11b4d00f0102feaecbfeb7f1ee23d4ded1f0fb087646243195d200000100000000260000000000125707a47e1a08e87f3f98ad9e36fe433297303792f06c7664b85219470447cee7fa22ecaf910be934c47e8bb3b0373e378158000001000000002600000000001257088788e31582cd2c39e41889088489b9b78bb2ed0e73f179e190559ed547efbba8cef57175635cd8e4769c2ad0b0f186fe00000100000000260000000000125709a86d6007554f154c70cb3aa6260e20775b3e98302ffaba52c400c9f42ba98e4fbe179b6e20682ffe43c6bc64e164a7240000010000000026000000000012570a96d56b1422f95705196da995c1e2ff8187312c1cb91d51ee43dbdab60c60580ce87d92e4375997e7a88c1c9d90fd571a0000010000000026000000000012570b88df46edd4e3a23064014346ddc18a99ea472204793d3e7c7f01f07eab150a1b31afcaa283073d02bfd6ec7f84d8312d0000010000000026000000000012570ca9dcd180ea55fc312c3d65ec3fba659120dfb6a44b4ce4476c70a075c4e4fc60ad793ff0622e2102d07da6bc126ff9b60000010000000026000000000012570db0d5ed006554afc3f67321bbbb4532dbf5e873d4b18827ab81f7c0643c579d1e7a52379b92aaedb0e4b4e7e87302f0d30000010000000026000000000012570ea663dc9011084da45ff48e2dc4dbeb90b8a60a4dd1187e94b3f652aa5745f5dca8cc4d02921b8ddc9d541355a039cbaf0000010000000026000000000012570fa32d77796abe95ed81b1f7bf982279aeb07903a061a53ab83e9ed9ffdac814a618acb53db40e2f79a62797fae7b3275c0000010000000026000000000012571091c809faf055607bc68eed76eb4d18040cda859a7416492600617ba184c4bec3c5511f6da86db49f188647c9b0bab38000000100000000260000000000125711b6759fde5fbbbe671f4446630a402c520938e39d01fb6d5f611055c15b40ac50ec73d5d40732d5796e6f906d437bd04c000001000000002600000000001257128c445bbe62d747ba52abc8407ea2d3bf76c2ce994e5a0de992d85bd2260247d06bf698b08ec3e94a3476846be3a6336000000100000000260000000000125713837523b298e9c926132ce8c85b9619ead5ea2ff6ed1ffeca94fa9fd4dc7915d16d330cfb79510b662798474e134fd1ae000001000000002600000000001257148f2813734a70d6faa27b63ca6c272a54eccf61cf4bb24736425fae0e46c17409ed36c34de51fbfb17c13219143ae5ff500000100000000260000000000125715a8184001dbc35b24da6be33d1db9620cde0e952e34555202af1e0dad8a30cf5bcd1721325382843dad608ce059e0c50600000100000000260000000000125716a84ff8038592b20ed17e72d72188dd7eb9b8d1cd11990220ee95866fb4557600baa460d9f84e506426d8d3d352bf1fb000000100000000260000000000125717af7f7107b92b5acf636df217b3245b0129de5b8cc1e7d014f5b09d11cbd0b2f992e38ed810b60993d6ec03216231e0e80000010000000026000000000012571895bddbabfc022b1eb8a36dde7a0090697bb446ac9417c00c96c8045eef144562342f0eb06be3172c3a31cb0c2678c510000001000000002600000000001257198924956e9d67a871f6bd919060cc4398fea46472a98134f0741eab09863da0b24038f4074b8a9ad5f9feeb4ea26836e10000010000000026000000000012571a9935f5e1b1e8ff7aa96c135a31302a74107407b3578478688f90ccd1e42e2fd73ff1a0b9090581296809cfd1b039a1390000010000000026000000000012571b987e6700dc5c715390f27a0acf5dad71c9ab573ad9823cd01010718da20f6b35e3e6628c4439c20a10938d67abccafc90000010000000026000000000012571ca529efbc11ea0db3dcb827575a59200e3990073ec0e3af3c9506651a6e02d472a4c98f8a589c52a17d6bc3395b3d18980000010000000026000000000012571d8b5a8e7db0bac6f76b6d73e14931cca7437b1d4e2133bc46cfb8f80b9cf5f34cfebea0216b0b527807ea3b39e842510e0000010000000026000000000012571e935c82dde7f699c6cdb119a0eb58735ff26e57ea52c7dcd67dab8f23980c7fec3f05d194113fe7b2faf059aa004feb310000010000000026000000000012571fa7f7adef23c971ad60207e7547609406951b43776ea00cf82f67d22a95235910066625f0c8187d1bb7aa64b899332eaa00000100000000260000000000125720b303bc1005184d37cf8336746a10816f5125edd6a4b5033903ba8d00a9435411d07ebce22af24e9d7ea0f64e2cd1eabe00000100000000260000000000125721aa845e87e828ee240d15b13e87d8e82dec97d66ea00359b156cfc6911e830de9e4bf656e1ce163529b65022ded49f85d00000100000000260000000000125722a728ae94a63e35ee47d5dbf850272bfc187e0e6158689d5348125f9b5641fd169d363e081e2585bf5876f736b035f53d000001000000002600000000001257238a13e8163e251ac6358332bd1cfd4d6402c55220ba7e4724253929a36a3abc81543909118303c5fc818f43788e9823d100000100000000260000000000125724880c53d3f58610710a9c2e988f78b037e68d81ac80824030a82f94209ce50497a1d4637e087afe5c3687f94ee29377b500000100000000260000000000125725a37700a63c292d670b267dc56379f2e1048afb10a487d7eb5992f4674742ef3b351f7d636a74d6a0f00905e6cdc6fa9a00000100000000260000000000125726a71422dc10626e9f880370dc3c33b4d1fece95d8ed0a938f8c0683e172d3691e84f49ddeb01fd0e1a639a9a053afd7b800000100000000260000000000125727814670bacfe28958efc42e05813dc33c72893f34c77d44c2332e4fac9c4133919e6bcac11856abe33b0e18322ec25d9600000100000000260000000000125728a2956da4b61955e4008c5acaffef05937c88a997c6c85b7ca83bcc11b69fa8d677301bde5915bbd11139d8dca0ef94c4000001000000002600000000001257298b0519379449b86501e87617d564b70f27d8749eb6c7668ece6ba762373989c25c6b90a3ecea3ed272021109c57e42b0" + predefined_data_format = 1 + + # Call submitExitRequestsData + tx = validators_exit_bus.submitExitRequestsData( + (predefined_data, predefined_data_format), + {"from": stranger} + ) + + # Validate ExitDataProcessing event + matching_events = [] + target = web3.keccak(text="ExitDataProcessing(bytes32)").hex() + for log in tx.logs: + if log['topics'][0].hex() == target: + matching_events.append(log) + exit_requests_hash = log['data'] + predefined_data_bytes = bytes.fromhex(predefined_data[2:]) + assert exit_requests_hash == web3.keccak(encode(['bytes', 'uint256'], [predefined_data_bytes, predefined_data_format])) + + assert len(matching_events) == 1, f"Expected exactly 1 ExitDataProcessing event, found {len(matching_events)}" + + print("✅ Vote executed successfully:") + print(f" - SUBMIT_REPORT_HASH_ROLE granted and revoked to/from agent") + print(f" - Exit hash {EXIT_HASH_TO_SUBMIT} submitted") + print(f" - All {expected_events} events validated correctly") diff --git a/archive/tests/test_vote_tw_csm2_holesky.py b/archive/tests/test_vote_tw_csm2_holesky.py new file mode 100644 index 000000000..70275d18a --- /dev/null +++ b/archive/tests/test_vote_tw_csm2_holesky.py @@ -0,0 +1,938 @@ +from typing import Optional +from scripts.vote_tw_csm2_holesky import start_vote +from brownie import interface, reverts, chain, convert, web3, ZERO_ADDRESS # type: ignore +from brownie.network.event import EventDict +from utils.easy_track import create_permissions +from utils.test.tx_tracing_helpers import group_voting_events_from_receipt, group_dg_events_from_receipt +from utils.test.event_validators.easy_track import validate_evmscript_factory_added_event, EVMScriptFactoryAdded +from utils.test.event_validators.dual_governance import validate_dual_governance_submit_event +from utils.dual_governance import wait_for_noon_utc_to_satisfy_time_constrains +from utils.config import ( + DUAL_GOVERNANCE, + TIMELOCK, + DUAL_GOVERNANCE_EXECUTORS, + LDO_HOLDER_ADDRESS_FOR_TESTS, + CS_MODULE_ID, + CS_MODULE_MODULE_FEE_BP, + CS_MODULE_MAX_DEPOSITS_PER_BLOCK, + CS_MODULE_MIN_DEPOSIT_BLOCK_DISTANCE, + CS_MODULE_TREASURY_FEE_BP, + CS_GATE_SEAL_ADDRESS, + CSM_COMMITTEE_MS, + ARAGON_KERNEL, + AGENT, + VOTING, + contracts, +) + + +def validate_proxy_upgrade_event(event: EventDict, implementation: str, emitted_by: Optional[str] = None): + assert "Upgraded" in event, "No Upgraded event found" + + assert event["Upgraded"][0]["implementation"] == implementation, "Wrong implementation address" + + if emitted_by is not None: + assert convert.to_address(event["Upgraded"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_consensus_version_set_event(event: EventDict, new_version: int, prev_version: int, emitted_by: Optional[str] = None): + assert "ConsensusVersionSet" in event, "No ConsensusVersionSet event found" + + assert event["ConsensusVersionSet"][0]["version"] == new_version, "Wrong new version" + + assert event["ConsensusVersionSet"][0]["prevVersion"] == prev_version, "Wrong previous version" + + if emitted_by is not None: + assert convert.to_address(event["ConsensusVersionSet"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_role_grant_event(event: EventDict, role_hash: str, account: str, emitted_by: Optional[str] = None): + assert "RoleGranted" in event, "No RoleGranted event found" + + # Strip 0x prefix for consistent comparison + expected_role_hash = role_hash.replace('0x', '') + actual_role_hash = event["RoleGranted"][0]["role"].hex().replace('0x', '') + + assert actual_role_hash == expected_role_hash, "Wrong role hash" + + assert convert.to_address(event["RoleGranted"][0]["account"]) == convert.to_address(account), "Wrong account" + + if emitted_by is not None: + assert convert.to_address(event["RoleGranted"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_role_revoke_event(event: EventDict, role_hash: str, account: str, emitted_by: Optional[str] = None): + assert "RoleRevoked" in event, "No RoleRevoked event found" + + # Strip 0x prefix for consistent comparison + expected_role_hash = role_hash.replace('0x', '') + actual_role_hash = event["RoleRevoked"][0]["role"].hex().replace('0x', '') + + assert actual_role_hash == expected_role_hash, "Wrong role hash" + + assert convert.to_address(event["RoleRevoked"][0]["account"]) == convert.to_address(account), "Wrong account" + + if emitted_by is not None: + assert convert.to_address(event["RoleRevoked"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_contract_version_set_event(event: EventDict, version: int, emitted_by: Optional[str] = None): + assert "ContractVersionSet" in event, "No ContractVersionSet event found" + + assert event["ContractVersionSet"][0]["version"] == version, "Wrong version" + + if emitted_by is not None: + assert convert.to_address(event["ContractVersionSet"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_bond_curve_added_event(event: EventDict, curve_id: int, emitted_by: Optional[str] = None): + assert "BondCurveAdded" in event, "No BondCurveAdded event found" + + assert event["BondCurveAdded"][0]["curveId"] == curve_id, "Wrong curve ID" + + if emitted_by is not None: + assert convert.to_address(event["BondCurveAdded"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_staking_module_update_event( + event: EventDict, + module_id: int, + share_limit: int, + priority_share_threshold: int, + module_fee_points_bp: int, + treasury_fee_points_bp: int, + max_deposits_per_block: int, + min_deposit_block_distance: int, + emitted_by: Optional[str] = None +): + assert "StakingModuleShareLimitSet" in event, "No StakingModuleShareLimitSet event found" + assert "StakingModuleFeesSet" in event, "No StakingModuleFeesSet event found" + assert "StakingModuleMaxDepositsPerBlockSet" in event, "No StakingModuleMaxDepositsPerBlockSet event found" + assert "StakingModuleMinDepositBlockDistanceSet" in event, "No StakingModuleMinDepositBlockDistanceSet event found" + + assert len(event["StakingModuleShareLimitSet"]) == 1, "Multiple StakingModuleShareLimitSet events found" + assert len(event["StakingModuleFeesSet"]) == 1, "Multiple StakingModuleFeesSet events found" + assert len(event["StakingModuleMaxDepositsPerBlockSet"]) == 1, "Multiple StakingModuleMaxDepositsPerBlockSet events found" + assert len(event["StakingModuleMinDepositBlockDistanceSet"]) == 1, "Multiple StakingModuleMinDepositBlockDistanceSet events found" + + assert event["StakingModuleShareLimitSet"][0]["stakingModuleId"] == module_id, "Wrong module ID" + assert event["StakingModuleShareLimitSet"][0]["stakeShareLimit"] == share_limit, "Wrong share limit" + assert event["StakingModuleShareLimitSet"][0]["priorityExitShareThreshold"] == priority_share_threshold, "Wrong priority threshold" + + assert event["StakingModuleFeesSet"][0]["stakingModuleFee"] == module_fee_points_bp, "Wrong fee points" + assert event["StakingModuleFeesSet"][0]["treasuryFee"] == treasury_fee_points_bp, "Wrong treasury fee points" + + assert event["StakingModuleMaxDepositsPerBlockSet"][0]["maxDepositsPerBlock"] == max_deposits_per_block, "Wrong max deposits" + + assert event["StakingModuleMinDepositBlockDistanceSet"][0]["minDepositBlockDistance"] == min_deposit_block_distance, "Wrong min distance" + + if emitted_by is not None: + assert convert.to_address(event["StakingModuleShareLimitSet"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + assert convert.to_address(event["StakingModuleFeesSet"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + assert convert.to_address(event["StakingModuleMaxDepositsPerBlockSet"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + assert convert.to_address(event["StakingModuleMinDepositBlockDistanceSet"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def get_ossifiable_proxy_impl(proxy_address): + """Get implementation address from an OssifiableProxy""" + proxy = interface.OssifiableProxy(proxy_address) + return proxy.proxy__getImplementation() + + +def get_wv_contract_proxy_impl(proxy_address): + """Get implementation address from an WithdrawalContractProxy""" + proxy = interface.WithdrawalContractProxy(proxy_address) + return proxy.implementation() + + +def check_proxy_implementation(proxy_address, expected_impl): + """Check that proxy has expected implementation""" + actual_impl = get_ossifiable_proxy_impl(proxy_address) + assert actual_impl == expected_impl, f"Expected impl {expected_impl}, got {actual_impl}" + + +# New core contracts implementations +LIDO_LOCATOR_IMPL = "0xa437ab5614033d071493C88Fd351aFEbc802521f" +ACCOUNTING_ORACLE_IMPL = "0xE63267AAaC507A329213593e8A9bCa37e2994F1C" +VALIDATORS_EXIT_BUS_ORACLE_IMPL = "0xeCE105ABd3F2653398BE75e680dB033A238E2aD6" +WITHDRAWAL_VAULT_IMPL = "0x6aAA28C515E02ED0fe1B51e74323e14E910eA7d7" +STAKING_ROUTER_IMPL = "0xE6E775C6AdF8753588237b1De32f61937bC54341" +NODE_OPERATORS_REGISTRY_IMPL = "0x834aa47DCd21A32845099a78B4aBb17A7f0bD503" + +TRIGGERABLE_WITHDRAWALS_GATEWAY = "0x4FD4113f2B92856B59BC3be77f2943B7F4eaa9a5" +VALIDATOR_EXIT_VERIFIER = "0x9c5da60e54fcae8592132Fc9a67511e686b52BE8" + +# Oracle consensus versions +AO_CONSENSUS_VERSION = 4 +VEBO_CONSENSUS_VERSION = 4 +CSM_CONSENSUS_VERSION = 3 + +EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS = 7 * 7200 + +NOR_EXIT_DEADLINE_IN_SEC = 172800 + +# CSM +CS_MODULE_NEW_TARGET_SHARE_BP = 2000 # 20% +CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP = 2500 # 25% + +CS_ACCOUNTING_IMPL_V2_ADDRESS = "0xbd78207826CfdBE125cFf0a7075EaB90F5f9FCbb" +CS_FEE_DISTRIBUTOR_IMPL_V2_ADDRESS = "0x6e00A87690A1CAF4abb135B549408cEfca2fd6f5" +CS_FEE_ORACLE_IMPL_V2_ADDRESS = "0xD6F44e196A5b4A1C3863Bdd87233465ef42aBB40" +CSM_IMPL_V2_ADDRESS = "0xaF370636f618bC97c8Af2aBC33aAD426b1f4164A" + +CS_GATE_SEAL_V2_ADDRESS = "0x86E4aFE068f30A41f650601Df9A097bc7CddFb76" +CS_SET_VETTED_GATE_TREE_FACTORY = "0x26CDa8f9D84956efC743c8432658Ae9a5B7939da" +CS_EJECTOR_ADDRESS = "0x477589D5A8cB67Bd6682AF3612f99ADB72d09582" +CS_PERMISSIONLESS_GATE_ADDRESS = "0x676626c3940ae32eF1e4F609938F785fF064ee22" +CS_VETTED_GATE_ADDRESS = "0x92A5aB5e4f98e67Fb7295fe439A652d0E51033bf" +CS_VERIFIER_V2_ADDRESS = "0xBC88b4b56A58b33716C3C2e879b4B1F964152AD4" + +CS_DEFAULT_BOND_CURVE = ( + [1, 2 * 10**18], [2, 1.9 * 10**18], [3, 1.8 * 10**18], [4, 1.7 * 10**18], [5, 1.6 * 10**18], [6, 1.5 * 10**18] +) +CS_LEGACY_EA_BOND_CURVE = ( + ([1, 1.5 * 10**18], [2, 1.9 * 10**18], [3, 1.8 * 10**18], [4, 1.7 * 10**18], [5, 1.6 * 10**18], [6, 1.5 * 10**18]) +) +CS_EXTRA_CURVES = [ + ([1, 3 * 10**18], [2, 1.9 * 10**18], [3, 1.8 * 10**18], [4, 1.7 * 10**18], [5, 1.6 * 10**18], [6, 1.5 * 10**18]), + ([1, 4 * 10**18], [2, 1 * 10**18]) +] +CS_CURVES = [CS_DEFAULT_BOND_CURVE, CS_LEGACY_EA_BOND_CURVE, *CS_EXTRA_CURVES] +CS_ICS_GATE_BOND_CURVE = ([1, 1.5 * 10**18], [2, 1.3 * 10**18]) # Identified Community Stakers Gate Bond Curve + +# Contract versions expected after upgrade +CSM_V2_VERSION = 2 +CS_ACCOUNTING_V2_VERSION = 2 +CS_FEE_ORACLE_V2_VERSION = 2 +CS_FEE_DISTRIBUTOR_V2_VERSION = 2 + + +# Add imports for Gate Seal and ResealManager constants +OLD_GATE_SEAL_ADDRESS = "0xAE6eCd77DCC656c5533c4209454Fd56fB46e1778" +NEW_WQ_GATE_SEAL = "0xE900BC859EB750562E1009e912B63743BC877662" +NEW_TW_GATE_SEAL = "0xaEEF47C61f2A9CCe4C4D0363911C5d49e2cFb6f1" +RESEAL_MANAGER = "0x9dE2273f9f1e81145171CcA927EFeE7aCC64c9fb" + +def test_tw_vote(helpers, accounts, vote_ids_from_env, stranger): + # Save original implementations for comparison + locator_impl_before = get_ossifiable_proxy_impl(contracts.lido_locator) + accounting_oracle_impl_before = get_ossifiable_proxy_impl(contracts.accounting_oracle) + vebo_impl_before = get_ossifiable_proxy_impl(contracts.validators_exit_bus_oracle) + withdrawal_vault_impl_before = get_wv_contract_proxy_impl(contracts.withdrawal_vault) + staking_router_impl_before = get_ossifiable_proxy_impl(contracts.staking_router) + + csm_impl_before = get_ossifiable_proxy_impl(contracts.csm.address) + cs_accounting_impl_before = get_ossifiable_proxy_impl(contracts.cs_accounting.address) + cs_fee_oracle_impl_before = get_ossifiable_proxy_impl(contracts.cs_fee_oracle.address) + cs_fee_distributor_impl_before = get_ossifiable_proxy_impl(contracts.cs_fee_distributor.address) + + timelock = interface.EmergencyProtectedTimelock(TIMELOCK) + dual_governance = interface.DualGovernance(DUAL_GOVERNANCE) + + # Not yet used by the protocol, but needed for the test + triggerable_withdrawals_gateway = interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY) + cs_ejector = interface.CSEjector(CS_EJECTOR_ADDRESS) + cs_permissionless_gate = interface.CSPermissionlessGate(CS_PERMISSIONLESS_GATE_ADDRESS) + cs_vetted_gate = interface.CSVettedGate(CS_VETTED_GATE_ADDRESS) + cs_verifier_v2 = interface.CSVerifierV2(CS_VERIFIER_V2_ADDRESS) + + # --- Initial state checks --- + + # Step 1: Check Lido Locator implementation initial state + assert locator_impl_before != LIDO_LOCATOR_IMPL, "Locator implementation should be different before upgrade" + + # Step 2: Check VEBO implementation initial state + assert vebo_impl_before != VALIDATORS_EXIT_BUS_ORACLE_IMPL, "VEBO implementation should be different before upgrade" + + # Step 3: Check VEBO finalizeUpgrade_v2 state + try: + assert contracts.validators_exit_bus_oracle.getMaxValidatorsPerReport() != 600, "VEBO max validators per report should not be 600 before upgrade" + except Exception: + pass # Function might not exist yet + + # Steps 4-6: Check VEBO consensus version management + initial_vebo_consensus_version = contracts.validators_exit_bus_oracle.getConsensusVersion() + assert initial_vebo_consensus_version < VEBO_CONSENSUS_VERSION, f"VEBO consensus version should be less than {VEBO_CONSENSUS_VERSION}" + assert not contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.MANAGE_CONSENSUS_VERSION_ROLE(), contracts.validators_exit_bus_oracle), "Agent should not have MANAGE_CONSENSUS_VERSION_ROLE on VEBO before upgrade" + + # Step 7: Check TWG role for CS Ejector initial state + add_full_withdrawal_request_role = triggerable_withdrawals_gateway.ADD_FULL_WITHDRAWAL_REQUEST_ROLE() + assert not triggerable_withdrawals_gateway.hasRole(add_full_withdrawal_request_role, cs_ejector), "CS Ejector should not have ADD_FULL_WITHDRAWAL_REQUEST_ROLE before upgrade" + + # Step 8: Check TWG role for VEB initial state + assert not triggerable_withdrawals_gateway.hasRole(add_full_withdrawal_request_role, contracts.validators_exit_bus_oracle), "VEBO should not have ADD_FULL_WITHDRAWAL_REQUEST_ROLE before upgrade" + + # Step 9: Check Withdrawal Vault implementation initial state + assert withdrawal_vault_impl_before != WITHDRAWAL_VAULT_IMPL, "Withdrawal Vault implementation should be different before upgrade" + + # Step 10: Withdrawal Vault finalizeUpgrade_v2 check is done post-execution + assert contracts.withdrawal_vault.getContractVersion() == 1, "Withdrawal Vault version should be 1 before upgrade" + + # Step 11: Check Accounting Oracle implementation initial state + assert accounting_oracle_impl_before != ACCOUNTING_ORACLE_IMPL, "Accounting Oracle implementation should be different before upgrade" + + # Steps 12-14: Check AO consensus version management + initial_ao_consensus_version = contracts.accounting_oracle.getConsensusVersion() + assert initial_ao_consensus_version < AO_CONSENSUS_VERSION, f"AO consensus version should be less than {AO_CONSENSUS_VERSION}" + assert not contracts.accounting_oracle.hasRole(contracts.accounting_oracle.MANAGE_CONSENSUS_VERSION_ROLE(), contracts.agent), "Agent should not have MANAGE_CONSENSUS_VERSION_ROLE on AO before upgrade" + assert contracts.accounting_oracle.getContractVersion() == 2, "Accounting Oracle version should be 2 before upgrade" + # Step 15: Check Staking Router implementation initial state + assert staking_router_impl_before != STAKING_ROUTER_IMPL, "Staking Router implementation should be different before upgrade" + + # Steps 16-17: Check SR roles initial state + try: + report_validator_exiting_status_role = contracts.staking_router.REPORT_VALIDATOR_EXITING_STATUS_ROLE() + report_validator_exit_triggered_role = contracts.staking_router.REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE() + except Exception as e: + assert "Unknown typed error: 0x" in str(e), f"Unexpected error: {e}" + report_validator_exiting_status_role = ZERO_ADDRESS + report_validator_exit_triggered_role = ZERO_ADDRESS + + assert report_validator_exiting_status_role == ZERO_ADDRESS, "REPORT_VALIDATOR_EXITING_STATUS_ROLE should not exist before upgrade" + assert report_validator_exit_triggered_role == ZERO_ADDRESS, "REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE should not exist before upgrade" + + # Step 18: Check APP_MANAGER_ROLE initial state + app_manager_role = web3.keccak(text="APP_MANAGER_ROLE") + assert contracts.acl.getPermissionManager(ARAGON_KERNEL, app_manager_role) == AGENT, "AGENT should be the permission manager for APP_MANAGER_ROLE" + assert contracts.node_operators_registry.kernel() == ARAGON_KERNEL, "Node Operators Registry must use the correct kernel" + assert not contracts.acl.hasPermission(VOTING, ARAGON_KERNEL, app_manager_role), "VOTING should not have APP_MANAGER_ROLE before the upgrade" + assert not contracts.acl.hasPermission(AGENT, ARAGON_KERNEL, app_manager_role), "AGENT should not have APP_MANAGER_ROLE before the upgrade" + + # Steps 19-23: Check NOR and sDVT initial state + assert not contracts.acl.hasPermission(contracts.agent, contracts.kernel, app_manager_role), "Agent should not have APP_MANAGER_ROLE before upgrade" + assert contracts.node_operators_registry.getContractVersion() == 3, "Node Operators Registry version should be 3 before upgrade" + assert contracts.simple_dvt.getContractVersion() == 3, "Simple DVT version should be 3 before upgrade" + + # Step 24: Check CONFIG_MANAGER_ROLE initial state + config_manager_role = contracts.oracle_daemon_config.CONFIG_MANAGER_ROLE() + assert not contracts.oracle_daemon_config.hasRole(config_manager_role, contracts.agent), "Agent should not have CONFIG_MANAGER_ROLE on Oracle Daemon Config before upgrade" + + # Steps 25-27: Check Oracle Daemon Config variables to be removed + try: + contracts.oracle_daemon_config.get('NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP') + contracts.oracle_daemon_config.get('VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS') + contracts.oracle_daemon_config.get('VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS') + except Exception as e: + assert False, f"Expected variables to exist before removal: {e}" + + # Step 28: Check that EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS doesn't exist yet + try: + contracts.oracle_daemon_config.get('EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS') + assert False, "EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS should not exist before vote" + except Exception: + pass # Expected to fail + + # Step 29: Check CSM implementation initial state + assert csm_impl_before != CSM_IMPL_V2_ADDRESS, "CSM implementation should be different before vote" + + # Step 30: Check CSM finalizeUpgradeV2 initial state + with reverts(): + # The function should not exist yet + contracts.csm.getInitializedVersion() + + # CSM Step 32: Check CSAccounting implementation (pre-vote state) + assert cs_accounting_impl_before != CS_ACCOUNTING_IMPL_V2_ADDRESS, "CSAccounting implementation should be different before vote" + + # CSM Step 33: Check CSAccounting finalizeUpgradeV2 was not called (pre-vote state) + with reverts(): + # The function should not exist yet + contracts.cs_accounting.getInitializedVersion() + + # CSM Step 34: Check CSFeeOracle implementation (pre-vote state) + assert cs_fee_oracle_impl_before != CS_FEE_ORACLE_IMPL_V2_ADDRESS, "CSFeeOracle implementation should be different before vote" + + # CSM Step 35: Check CSFeeOracle finalizeUpgradeV2 was not called (pre-vote state) + assert contracts.cs_fee_oracle.getContractVersion() < CS_FEE_ORACLE_V2_VERSION, f"CSFeeOracle version should be less than {CS_FEE_ORACLE_V2_VERSION} before vote" + assert contracts.cs_fee_oracle.getConsensusVersion() < 3, "CSFeeOracle consensus version should be less than 3 before vote" + + # CSM Step 36: Check CSFeeDistributor implementation (pre-vote state) + assert cs_fee_distributor_impl_before != CS_FEE_DISTRIBUTOR_IMPL_V2_ADDRESS, "CSFeeDistributor implementation should be different before vote" + + # CSM Step 37: Check CSFeeDistributor finalizeUpgradeV2 was not called (pre-vote state) + with reverts(): + # The function should not exist yet + contracts.cs_fee_distributor.getInitializedVersion() + + # CSM Steps 38-40: CSAccounting roles (pre-vote state) + assert contracts.cs_accounting.hasRole(contracts.cs_accounting.SET_BOND_CURVE_ROLE(), contracts.csm.address), "CSM should have SET_BOND_CURVE_ROLE on CSAccounting before vote" + assert contracts.cs_accounting.hasRole(web3.keccak(text="RESET_BOND_CURVE_ROLE"), contracts.csm.address), "CSM should have RESET_BOND_CURVE_ROLE on CSAccounting before vote" + assert contracts.cs_accounting.hasRole(web3.keccak(text="RESET_BOND_CURVE_ROLE"), CSM_COMMITTEE_MS), "CSM committee should have RESET_BOND_CURVE_ROLE on CSAccounting before vote" + + # CSM Steps 41-42: CSM roles (pre-vote state) + assert not contracts.csm.hasRole(web3.keccak(text="CREATE_NODE_OPERATOR_ROLE"), cs_permissionless_gate.address), "Permissionless gate should not have CREATE_NODE_OPERATOR_ROLE on CSM before vote" + assert not contracts.csm.hasRole(web3.keccak(text="CREATE_NODE_OPERATOR_ROLE"), cs_vetted_gate.address), "Vetted gate should not have CREATE_NODE_OPERATOR_ROLE on CSM before vote" + + # CSM Step 43: CSAccounting bond curve role for vetted gate (pre-vote state) + assert not contracts.cs_accounting.hasRole(contracts.cs_accounting.SET_BOND_CURVE_ROLE(), cs_vetted_gate.address), "Vetted gate should not have SET_BOND_CURVE_ROLE on CSAccounting before vote" + + # CSM Steps 44-45: Verifier roles (pre-vote state) + assert contracts.csm.hasRole(contracts.csm.VERIFIER_ROLE(), contracts.cs_verifier.address), "Old verifier should have VERIFIER_ROLE on CSM before vote" + assert not contracts.csm.hasRole(contracts.csm.VERIFIER_ROLE(), cs_verifier_v2.address), "New verifier should not have VERIFIER_ROLE on CSM before vote" + + # CSM Steps 46-51: GateSeal roles (pre-vote state) + assert contracts.csm.hasRole(contracts.csm.PAUSE_ROLE(), CS_GATE_SEAL_ADDRESS), "Old GateSeal should have PAUSE_ROLE on CSM before vote" + assert contracts.cs_accounting.hasRole(contracts.cs_accounting.PAUSE_ROLE(), CS_GATE_SEAL_ADDRESS), "Old GateSeal should have PAUSE_ROLE on CSAccounting before vote" + assert contracts.cs_fee_oracle.hasRole(contracts.cs_fee_oracle.PAUSE_ROLE(), CS_GATE_SEAL_ADDRESS), "Old GateSeal should have PAUSE_ROLE on CSFeeOracle before vote" + + assert not contracts.csm.hasRole(contracts.csm.PAUSE_ROLE(), CS_GATE_SEAL_V2_ADDRESS), "New GateSeal should not have PAUSE_ROLE on CSM before vote" + assert not contracts.cs_accounting.hasRole(contracts.cs_accounting.PAUSE_ROLE(), CS_GATE_SEAL_V2_ADDRESS), "New GateSeal should not have PAUSE_ROLE on CSAccounting before vote" + assert not contracts.cs_fee_oracle.hasRole(contracts.cs_fee_oracle.PAUSE_ROLE(), CS_GATE_SEAL_V2_ADDRESS), "New GateSeal should not have PAUSE_ROLE on CSFeeOracle before vote" + + # CSM Step 52: Staking Router CSM module state before vote (pre-vote state) + csm_module_before = contracts.staking_router.getStakingModule(CS_MODULE_ID) + csm_share_before = csm_module_before['stakeShareLimit'] + csm_priority_exit_threshold_before = csm_module_before['priorityExitShareThreshold'] + assert csm_share_before != CS_MODULE_NEW_TARGET_SHARE_BP, f"CSM share should not be {CS_MODULE_NEW_TARGET_SHARE_BP} before vote, current: {csm_share_before}" + assert csm_priority_exit_threshold_before != CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP, f"CSM priority exit threshold should not be {CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP} before vote, current: {csm_priority_exit_threshold_before}" + + # CSM Step 53: EasyTrack factories before vote (pre-vote state) + initial_factories = contracts.easy_track.getEVMScriptFactories() + assert CS_SET_VETTED_GATE_TREE_FACTORY not in initial_factories, "EasyTrack should not have CSMSetVettedGateTree factory before vote" + + # Steps 55-56: Check that old GateSeal has PAUSE_ROLE initially + assert contracts.withdrawal_queue.hasRole(contracts.withdrawal_queue.PAUSE_ROLE(), OLD_GATE_SEAL_ADDRESS), "Old GateSeal should have PAUSE_ROLE on WithdrawalQueue before vote" + assert contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.PAUSE_ROLE(), OLD_GATE_SEAL_ADDRESS), "Old GateSeal should have PAUSE_ROLE on VEBO before vote" + + # Steps 57-59: Check new Gate Seals don't have roles yet + assert not contracts.withdrawal_queue.hasRole(contracts.withdrawal_queue.PAUSE_ROLE(), NEW_WQ_GATE_SEAL), "New WQ GateSeal should not have PAUSE_ROLE on WithdrawalQueue before vote" + assert not contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.PAUSE_ROLE(), NEW_TW_GATE_SEAL), "New TW GateSeal should not have PAUSE_ROLE on VEBO before vote" + assert not triggerable_withdrawals_gateway.hasRole(triggerable_withdrawals_gateway.PAUSE_ROLE(), NEW_TW_GATE_SEAL), "New TW GateSeal should not have PAUSE_ROLE on TWG before vote" + + # Steps 60-65: Check ResealManager doesn't have roles yet + # There should already be a role granted on the network for all contracts except TWG + assert contracts.withdrawal_queue.hasRole(contracts.withdrawal_queue.PAUSE_ROLE(), RESEAL_MANAGER), "ResealManager should have PAUSE_ROLE on WithdrawalQueue after vote" + assert contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.PAUSE_ROLE(), RESEAL_MANAGER), "ResealManager should have PAUSE_ROLE on VEBO after vote" + assert not triggerable_withdrawals_gateway.hasRole(triggerable_withdrawals_gateway.PAUSE_ROLE(), RESEAL_MANAGER), "ResealManager should have PAUSE_ROLE on TWG after vote" + assert contracts.withdrawal_queue.hasRole(contracts.withdrawal_queue.RESUME_ROLE(), RESEAL_MANAGER), "ResealManager should have RESUME_ROLE on WithdrawalQueue after vote" + assert contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.RESUME_ROLE(), RESEAL_MANAGER), "ResealManager should have RESUME_ROLE on VEBO after vote" + assert not triggerable_withdrawals_gateway.hasRole(triggerable_withdrawals_gateway.RESUME_ROLE(), RESEAL_MANAGER), "ResealManager should have RESUME_ROLE on TWG after vote" + + # START VOTE + if len(vote_ids_from_env) > 0: + (vote_id,) = vote_ids_from_env + else: + tx_params = {"from": LDO_HOLDER_ADDRESS_FOR_TESTS} + vote_id, _ = start_vote(tx_params, silent=True) + + vote_tx = helpers.execute_vote(accounts, vote_id, contracts.voting) + print(f"voteId = {vote_id}") + + proposal_id = vote_tx.events["ProposalSubmitted"][1]["proposalId"] + print(f"proposalId = {proposal_id}") + + chain.sleep(timelock.getAfterSubmitDelay() + 1) + dual_governance.scheduleProposal(proposal_id, {"from": stranger}) + + chain.sleep(timelock.getAfterScheduleDelay() + 1) + wait_for_noon_utc_to_satisfy_time_constrains() + + dg_tx = timelock.execute(proposal_id, {"from": stranger}) + + # --- VALIDATE EXECUTION RESULTS --- + + # Step 1: Validate Lido Locator implementation was updated + assert get_ossifiable_proxy_impl(contracts.lido_locator) == LIDO_LOCATOR_IMPL, "Locator implementation should be updated to the new value" + + # Step 2-3: Validate VEBO implementation was updated and configured + assert get_ossifiable_proxy_impl(contracts.validators_exit_bus_oracle) == VALIDATORS_EXIT_BUS_ORACLE_IMPL, "VEBO implementation should be updated" + assert contracts.validators_exit_bus_oracle.getMaxValidatorsPerReport() == 600, "VEBO max validators per report should be set to 600" + + # Validate exit request limit parameters from finalizeUpgrade_v2 call + exit_request_limits = contracts.validators_exit_bus_oracle.getExitRequestLimitFullInfo() + assert exit_request_limits[0] == 11200, "maxExitRequestsLimit should be 11200" + assert exit_request_limits[1] == 1, "exitsPerFrame should be 1" + assert exit_request_limits[2] == 48, "frameDurationInSec should be 48 hours in seconds" + + # Steps 4-6: Validate VEBO consensus version management + assert not contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.MANAGE_CONSENSUS_VERSION_ROLE(), contracts.agent), "Agent should not have MANAGE_CONSENSUS_VERSION_ROLE on VEBO" + assert contracts.validators_exit_bus_oracle.getConsensusVersion() == VEBO_CONSENSUS_VERSION, f"VEBO consensus version should be set to {VEBO_CONSENSUS_VERSION}" + + # Steps 7-8: Validate TWG roles + assert triggerable_withdrawals_gateway.hasRole(add_full_withdrawal_request_role, cs_ejector), "CS Ejector should have ADD_FULL_WITHDRAWAL_REQUEST_ROLE on TWG" + assert triggerable_withdrawals_gateway.hasRole(add_full_withdrawal_request_role, contracts.validators_exit_bus_oracle), "VEBO should have ADD_FULL_WITHDRAWAL_REQUEST_ROLE on TWG" + + # Steps 9-10: Validate Withdrawal Vault upgrade + assert get_wv_contract_proxy_impl(contracts.withdrawal_vault) == WITHDRAWAL_VAULT_IMPL, "Withdrawal Vault implementation should be updated" + assert contracts.withdrawal_vault.getContractVersion() == 2, "Withdrawal Vault version should be 2 after finalizeUpgrade_v2" + + # Steps 11-14: Validate Accounting Oracle upgrade + assert get_ossifiable_proxy_impl(contracts.accounting_oracle) == ACCOUNTING_ORACLE_IMPL, "Accounting Oracle implementation should be updated" + assert not contracts.accounting_oracle.hasRole(contracts.accounting_oracle.MANAGE_CONSENSUS_VERSION_ROLE(), contracts.agent), "Agent should not have MANAGE_CONSENSUS_VERSION_ROLE on AO" + assert contracts.accounting_oracle.getConsensusVersion() == AO_CONSENSUS_VERSION, f"AO consensus version should be set to {AO_CONSENSUS_VERSION}" + assert contracts.accounting_oracle.getContractVersion() == 3, "Accounting Oracle version should be updated to 3" + # Steps 15-17: Validate Staking Router upgrade + assert get_ossifiable_proxy_impl(contracts.staking_router) == STAKING_ROUTER_IMPL, "Staking Router implementation should be updated" + assert contracts.staking_router.hasRole(contracts.staking_router.REPORT_VALIDATOR_EXITING_STATUS_ROLE(), VALIDATOR_EXIT_VERIFIER), "ValidatorExitVerifier should have REPORT_VALIDATOR_EXITING_STATUS_ROLE on SR" + assert contracts.staking_router.hasRole(contracts.staking_router.REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE(), triggerable_withdrawals_gateway), "TWG should have REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE on SR" + + # Steps 18-23: Validate NOR and sDVT updates + assert not contracts.acl.hasPermission(contracts.agent, contracts.kernel, app_manager_role), "Agent should not have APP_MANAGER_ROLE after vote" + assert contracts.node_operators_registry.getContractVersion() == 4, "Node Operators Registry version should be updated to 4" + assert contracts.simple_dvt.getContractVersion() == 4, "Simple DVT version should be updated to 4" + assert contracts.node_operators_registry.exitDeadlineThreshold(0) == NOR_EXIT_DEADLINE_IN_SEC, "NOR exit deadline threshold should be set correctly" + assert contracts.simple_dvt.exitDeadlineThreshold(0) == NOR_EXIT_DEADLINE_IN_SEC, "sDVT exit deadline threshold should be set correctly" + + # Steps 24-28: Validate Oracle Daemon Config changes + assert contracts.oracle_daemon_config.hasRole(config_manager_role, contracts.agent), "Agent should have CONFIG_MANAGER_ROLE on Oracle Daemon Config" + for var_name in ['NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP', 'VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS', 'VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS']: + try: + contracts.oracle_daemon_config.get(var_name) + assert False, f"Variable {var_name} should have been removed" + except Exception: + pass # Expected to fail - variable should be removed + assert convert.to_uint(contracts.oracle_daemon_config.get('EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS')) == EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS, f"EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS should be set to {EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS}" + + # Step 29: Validate CSM implementation upgrade + check_proxy_implementation(contracts.csm.address, CSM_IMPL_V2_ADDRESS) + + # Step 30: Validate CSM finalizeUpgradeV2 was called + assert contracts.csm.getInitializedVersion() == CSM_V2_VERSION, f"CSM version should be {CSM_V2_VERSION} after vote" + + # Step 31: Validate CSAccounting implementation upgrade + check_proxy_implementation(contracts.cs_accounting.address, CS_ACCOUNTING_IMPL_V2_ADDRESS) + + # Step 32: Validate CSAccounting finalizeUpgradeV2 was called with bond curves + assert contracts.cs_accounting.getInitializedVersion() == CS_ACCOUNTING_V2_VERSION, f"CSAccounting version should be {CS_ACCOUNTING_V2_VERSION} after vote" + + # Step 33: Validate CSFeeOracle implementation upgrade + check_proxy_implementation(contracts.cs_fee_oracle.address, CS_FEE_ORACLE_IMPL_V2_ADDRESS) + + # Step 34: Validate CSFeeOracle finalizeUpgradeV2 was called with consensus version 3 + assert contracts.cs_fee_oracle.getContractVersion() == CS_FEE_ORACLE_V2_VERSION, f"CSFeeOracle version should be {CS_FEE_ORACLE_V2_VERSION} after vote" + assert contracts.cs_fee_oracle.getConsensusVersion() == CSM_CONSENSUS_VERSION, "CSFeeOracle consensus version should be 3 after vote" + + # Step 35: Validate CSFeeDistributor implementation upgrade + check_proxy_implementation(contracts.cs_fee_distributor.address, CS_FEE_DISTRIBUTOR_IMPL_V2_ADDRESS) + + # Step 36: Validate CSFeeDistributor finalizeUpgradeV2 was called + assert contracts.cs_fee_distributor.getInitializedVersion() == CS_FEE_DISTRIBUTOR_V2_VERSION, f"CSFeeDistributor version should be {CS_FEE_DISTRIBUTOR_V2_VERSION} after vote" + + # Step 37: Validate SET_BOND_CURVE_ROLE was revoked from CSM on CSAccounting + assert not contracts.cs_accounting.hasRole(contracts.cs_accounting.SET_BOND_CURVE_ROLE(), contracts.csm.address), "CSM should not have SET_BOND_CURVE_ROLE on CSAccounting after vote" + + # Step 38: Validate RESET_BOND_CURVE_ROLE was revoked from CSM on CSAccounting + assert not contracts.cs_accounting.hasRole(web3.keccak(text="RESET_BOND_CURVE_ROLE"), contracts.csm.address), "CSM should not have RESET_BOND_CURVE_ROLE on CSAccounting after vote" + + # Step 39: Validate RESET_BOND_CURVE_ROLE was revoked from CSM committee on CSAccounting + assert not contracts.cs_accounting.hasRole(web3.keccak(text="RESET_BOND_CURVE_ROLE"), CSM_COMMITTEE_MS), "CSM committee should not have RESET_BOND_CURVE_ROLE on CSAccounting after vote" + + # Step 40: Validate CREATE_NODE_OPERATOR_ROLE was granted to permissionless gate on CSM + assert contracts.csm.hasRole(contracts.csm.CREATE_NODE_OPERATOR_ROLE(), cs_permissionless_gate.address), "Permissionless gate should have CREATE_NODE_OPERATOR_ROLE on CSM after vote" + + # Step 41: Validate CREATE_NODE_OPERATOR_ROLE was granted to vetted gate on CSM + assert contracts.csm.hasRole(contracts.csm.CREATE_NODE_OPERATOR_ROLE(), cs_vetted_gate.address), "Vetted gate should have CREATE_NODE_OPERATOR_ROLE on CSM after vote" + + # Step 42: Validate SET_BOND_CURVE_ROLE was granted to vetted gate on CSAccounting + assert contracts.cs_accounting.hasRole(contracts.cs_accounting.SET_BOND_CURVE_ROLE(), cs_vetted_gate.address), "Vetted gate should have SET_BOND_CURVE_ROLE on CSAccounting after vote" + + # Step 43: Validate VERIFIER_ROLE was revoked from old verifier on CSM + assert not contracts.csm.hasRole(contracts.csm.VERIFIER_ROLE(), contracts.cs_verifier.address), "Old verifier should not have VERIFIER_ROLE on CSM after vote" + + # Step 44: Validate VERIFIER_ROLE was granted to new verifier on CSM + assert contracts.csm.hasRole(contracts.csm.VERIFIER_ROLE(), cs_verifier_v2.address), "New verifier should have VERIFIER_ROLE on CSM after vote" + + # Step 45: Validate PAUSE_ROLE was revoked from old GateSeal on CSM + assert not contracts.csm.hasRole(contracts.csm.PAUSE_ROLE(), CS_GATE_SEAL_ADDRESS), "Old GateSeal should not have PAUSE_ROLE on CSM after vote" + + # Step 46: Validate PAUSE_ROLE was revoked from old GateSeal on CSAccounting + assert not contracts.cs_accounting.hasRole(contracts.cs_accounting.PAUSE_ROLE(), CS_GATE_SEAL_ADDRESS), "Old GateSeal should not have PAUSE_ROLE on CSAccounting after vote" + + # Step 47: Validate PAUSE_ROLE was revoked from old GateSeal on CSFeeOracle + assert not contracts.cs_fee_oracle.hasRole(contracts.cs_fee_oracle.PAUSE_ROLE(), CS_GATE_SEAL_ADDRESS), "Old GateSeal should not have PAUSE_ROLE on CSFeeOracle after vote" + + # Step 48: Validate PAUSE_ROLE was granted to new GateSeal on CSM + assert contracts.csm.hasRole(contracts.csm.PAUSE_ROLE(), CS_GATE_SEAL_V2_ADDRESS), "New GateSeal should have PAUSE_ROLE on CSM after vote" + + # Step 49: Validate PAUSE_ROLE was granted to new GateSeal on CSAccounting + assert contracts.cs_accounting.hasRole(contracts.cs_accounting.PAUSE_ROLE(), CS_GATE_SEAL_V2_ADDRESS), "New GateSeal should have PAUSE_ROLE on CSAccounting after vote" + + # Step 50: Validate PAUSE_ROLE was granted to new GateSeal on CSFeeOracle + assert contracts.cs_fee_oracle.hasRole(contracts.cs_fee_oracle.PAUSE_ROLE(), CS_GATE_SEAL_V2_ADDRESS), "New GateSeal should have PAUSE_ROLE on CSFeeOracle after vote" + + # Step 50-52: Check add ICS Bond Curve to CSAccounting + assert not contracts.cs_accounting.hasRole(contracts.cs_accounting.MANAGE_BOND_CURVES_ROLE(), contracts.agent), "Agent should not have MANAGE_BOND_CURVES_ROLE on CSAccounting after vote" + assert contracts.cs_accounting.getCurvesCount() == len(CS_CURVES) + 1, "CSAccounting should have legacy bond curves and ICS Bond Curve after vote" + + # Step 53: Increase CSM share in Staking Router + csm_module_after = contracts.staking_router.getStakingModule(CS_MODULE_ID) + csm_share_after = csm_module_after['stakeShareLimit'] + assert csm_share_after == CS_MODULE_NEW_TARGET_SHARE_BP, f"CSM share should be {CS_MODULE_NEW_TARGET_SHARE_BP} after vote, but got {csm_share_after}" + + csm_priority_exit_threshold_after = csm_module_after['priorityExitShareThreshold'] + assert csm_priority_exit_threshold_after == CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP, f"CSM priority exit threshold should be {CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP} after vote, but got {csm_priority_exit_threshold_after}" + + # Step 54: Add EasyTrack factory for CSSetVettedGateTree + new_factories = contracts.easy_track.getEVMScriptFactories() + assert CS_SET_VETTED_GATE_TREE_FACTORY in new_factories, "EasyTrack should have CSSetVettedGateTree factory after vote" + + # Steps 55-56: Validate old GateSeal no longer has PAUSE_ROLE + assert not contracts.withdrawal_queue.hasRole(contracts.withdrawal_queue.PAUSE_ROLE(), OLD_GATE_SEAL_ADDRESS), "Old GateSeal should not have PAUSE_ROLE on WithdrawalQueue after vote" + assert not contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.PAUSE_ROLE(), OLD_GATE_SEAL_ADDRESS), "Old GateSeal should not have PAUSE_ROLE on VEBO after vote" + + # Steps 57-59: Validate new Gate Seals have PAUSE_ROLE + assert contracts.withdrawal_queue.hasRole(contracts.withdrawal_queue.PAUSE_ROLE(), NEW_WQ_GATE_SEAL), "New WQ GateSeal should have PAUSE_ROLE on WithdrawalQueue after vote" + assert contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.PAUSE_ROLE(), NEW_TW_GATE_SEAL), "New TW GateSeal should have PAUSE_ROLE on VEBO after vote" + assert triggerable_withdrawals_gateway.hasRole(triggerable_withdrawals_gateway.PAUSE_ROLE(), NEW_TW_GATE_SEAL), "New TW GateSeal should have PAUSE_ROLE on TWG after vote" + + # Steps 60-65: Validate ResealManager has PAUSE_ROLE and RESUME_ROLE + assert contracts.withdrawal_queue.hasRole(contracts.withdrawal_queue.PAUSE_ROLE(), RESEAL_MANAGER), "ResealManager should have PAUSE_ROLE on WithdrawalQueue after vote" + assert contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.PAUSE_ROLE(), RESEAL_MANAGER), "ResealManager should have PAUSE_ROLE on VEBO after vote" + assert triggerable_withdrawals_gateway.hasRole(triggerable_withdrawals_gateway.PAUSE_ROLE(), RESEAL_MANAGER), "ResealManager should have PAUSE_ROLE on TWG after vote" + assert contracts.withdrawal_queue.hasRole(contracts.withdrawal_queue.RESUME_ROLE(), RESEAL_MANAGER), "ResealManager should have RESUME_ROLE on WithdrawalQueue after vote" + assert contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.RESUME_ROLE(), RESEAL_MANAGER), "ResealManager should have RESUME_ROLE on VEBO after vote" + assert triggerable_withdrawals_gateway.hasRole(triggerable_withdrawals_gateway.RESUME_ROLE(), RESEAL_MANAGER), "ResealManager should have RESUME_ROLE on TWG after vote" + + # --- VALIDATE EVENTS --- + + voting_events = group_voting_events_from_receipt(vote_tx) + assert len(voting_events) == 2, "Unexpected number of voting events" + dg_voting_event, dg_bypass_voting_event = voting_events + + validate_dual_governance_submit_event( + dg_voting_event, + proposal_id, + proposer=VOTING, + executor=DUAL_GOVERNANCE_EXECUTORS[0], + ) + dg_execution_events = group_dg_events_from_receipt(dg_tx, timelock=TIMELOCK, admin_executor=DUAL_GOVERNANCE_EXECUTORS[0]) + assert len(dg_execution_events) == 62, "Unexpected number of dual governance events" + + # 1. Lido Locator upgrade events + validate_proxy_upgrade_event(dg_execution_events[0], LIDO_LOCATOR_IMPL, emitted_by=contracts.lido_locator) + + # 2. VEBO upgrade events + validate_proxy_upgrade_event(dg_execution_events[1], VALIDATORS_EXIT_BUS_ORACLE_IMPL, emitted_by=contracts.validators_exit_bus_oracle) + + # 3. VEBO finalize upgrade events + validate_contract_version_set_event(dg_execution_events[2], version=2, emitted_by=contracts.validators_exit_bus_oracle) + assert 'ExitRequestsLimitSet' in dg_execution_events[2], "ExitRequestsLimitSet event not found" + assert dg_execution_events[2]['ExitRequestsLimitSet'][0]['maxExitRequestsLimit'] == 11200, "Wrong maxExitRequestsLimit" + assert dg_execution_events[2]['ExitRequestsLimitSet'][0]['exitsPerFrame'] == 1, "Wrong exitsPerFrame" + assert dg_execution_events[2]['ExitRequestsLimitSet'][0]['frameDurationInSec'] == 48, "Wrong frameDurationInSec" + + # 4. Grant VEBO MANAGE_CONSENSUS_VERSION_ROLE to Agent + validate_role_grant_event( + dg_execution_events[3], + role_hash=web3.keccak(text="MANAGE_CONSENSUS_VERSION_ROLE").hex(), + account=contracts.agent.address, + emitted_by=contracts.validators_exit_bus_oracle + ) + + # 5. Set VEBO consensus version to 4 + validate_consensus_version_set_event( + dg_execution_events[4], + new_version=4, + prev_version=3, + emitted_by=contracts.validators_exit_bus_oracle + ) + + # 6. Revoke VEBO MANAGE_CONSENSUS_VERSION_ROLE from Agent + validate_role_revoke_event( + dg_execution_events[5], + role_hash=web3.keccak(text="MANAGE_CONSENSUS_VERSION_ROLE").hex(), + account=contracts.agent.address, + emitted_by=contracts.validators_exit_bus_oracle + ) + + # 7. Grant TWG ADD_FULL_WITHDRAWAL_REQUEST_ROLE to CS Ejector + validate_role_grant_event( + dg_execution_events[6], + role_hash=web3.keccak(text="ADD_FULL_WITHDRAWAL_REQUEST_ROLE").hex(), + account=cs_ejector.address, + emitted_by=triggerable_withdrawals_gateway + ) + + # 8. Grant TWG ADD_FULL_WITHDRAWAL_REQUEST_ROLE to VEBO + validate_role_grant_event( + dg_execution_events[7], + role_hash=web3.keccak(text="ADD_FULL_WITHDRAWAL_REQUEST_ROLE").hex(), + account=contracts.validators_exit_bus_oracle.address, + emitted_by=triggerable_withdrawals_gateway + ) + + # 9. Update WithdrawalVault implementation + validate_proxy_upgrade_event(dg_execution_events[8], WITHDRAWAL_VAULT_IMPL, emitted_by=contracts.withdrawal_vault) + + # 10. Call finalizeUpgrade_v2 on WithdrawalVault + validate_contract_version_set_event(dg_execution_events[9], version=2, emitted_by=contracts.withdrawal_vault) + + # 11. Update AO implementation + validate_proxy_upgrade_event(dg_execution_events[10], ACCOUNTING_ORACLE_IMPL, emitted_by=contracts.accounting_oracle) + + # 12. Grant AO MANAGE_CONSENSUS_VERSION_ROLE to the AGENT + validate_role_grant_event( + dg_execution_events[11], + role_hash=web3.keccak(text="MANAGE_CONSENSUS_VERSION_ROLE").hex(), + account=contracts.agent.address, + emitted_by=contracts.accounting_oracle + ) + + # 13. Bump AO consensus version to 4 + validate_consensus_version_set_event( + dg_execution_events[12], + new_version=4, + prev_version=3, + emitted_by=contracts.accounting_oracle + ) + + # 14. Revoke AO MANAGE_CONSENSUS_VERSION_ROLE from the AGENT + validate_role_revoke_event( + dg_execution_events[13], + role_hash=web3.keccak(text="MANAGE_CONSENSUS_VERSION_ROLE").hex(), + account=contracts.agent.address, + emitted_by=contracts.accounting_oracle + ) + + # 15. Update SR implementation + validate_proxy_upgrade_event(dg_execution_events[14], STAKING_ROUTER_IMPL, emitted_by=contracts.staking_router) + + # 16. Grant SR REPORT_VALIDATOR_EXITING_STATUS_ROLE to ValidatorExitVerifier + validate_role_grant_event( + dg_execution_events[15], + role_hash=web3.keccak(text="REPORT_VALIDATOR_EXITING_STATUS_ROLE").hex(), + account=VALIDATOR_EXIT_VERIFIER, + emitted_by=contracts.staking_router + ) + + # 17. Grant SR REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE to TWG + validate_role_grant_event( + dg_execution_events[16], + role_hash=web3.keccak(text="REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE").hex(), + account=triggerable_withdrawals_gateway.address, + emitted_by=contracts.staking_router + ) + + # 18. Grant APP_MANAGER_ROLE on Kernel to Voting + assert 'SetPermission' in dg_execution_events[17] + assert dg_execution_events[17]['SetPermission'][0]['allowed'] is True + + # 19. Set new implementation for NOR + assert 'SetApp' in dg_execution_events[18] + + # 20. Finalize upgrade for NOR + validate_contract_version_set_event(dg_execution_events[19], version=4, emitted_by=contracts.node_operators_registry) + assert 'ExitDeadlineThresholdChanged' in dg_execution_events[19] + assert dg_execution_events[19]['ExitDeadlineThresholdChanged'][0]['threshold'] == 172800 + + # 21. Set new implementation for sDVT + assert 'SetApp' in dg_execution_events[20] + + # 22. Finalize upgrade for sDVT + validate_contract_version_set_event(dg_execution_events[21], version=4, emitted_by=contracts.simple_dvt) + assert 'ExitDeadlineThresholdChanged' in dg_execution_events[21] + assert dg_execution_events[21]['ExitDeadlineThresholdChanged'][0]['threshold'] == 172800 + + # 23. Revoke APP_MANAGER_ROLE on Kernel from Voting + assert 'SetPermission' in dg_execution_events[22] + assert dg_execution_events[22]['SetPermission'][0]['allowed'] is False + + # 24. Grant CONFIG_MANAGER_ROLE on OracleDaemonConfig to Agent + validate_role_grant_event( + dg_execution_events[23], + role_hash=contracts.oracle_daemon_config.CONFIG_MANAGER_ROLE().hex(), + account=contracts.agent.address, + emitted_by=contracts.oracle_daemon_config + ) + + # 25. Unset NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP + assert 'ConfigValueUnset' in dg_execution_events[24] + assert 'NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP' in dg_execution_events[24]['ConfigValueUnset'][0]['key'] + + # 26. Unset VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS + assert 'ConfigValueUnset' in dg_execution_events[25] + assert 'VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS' in dg_execution_events[25]['ConfigValueUnset'][0]['key'] + + # 27. Unset VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS + assert 'ConfigValueUnset' in dg_execution_events[26] + assert 'VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS' in dg_execution_events[26]['ConfigValueUnset'][0]['key'] + + # 28. Set EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS + assert 'ConfigValueSet' in dg_execution_events[27] + assert 'EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS' in dg_execution_events[27]['ConfigValueSet'][0]['key'] + assert convert.to_int(dg_execution_events[27]['ConfigValueSet'][0]['value']) == EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS + + # 29. CSM implementation upgrade + validate_proxy_upgrade_event(dg_execution_events[28], CSM_IMPL_V2_ADDRESS, emitted_by=contracts.csm) + + # 30. CSM finalize upgrade validation + assert 'Initialized' in dg_execution_events[29] + assert dg_execution_events[29]['Initialized'][0]['version'] == 2 + + # 31. CSAccounting implementation upgrade + validate_proxy_upgrade_event(dg_execution_events[30], CS_ACCOUNTING_IMPL_V2_ADDRESS, emitted_by=contracts.cs_accounting) + + # 32. CSAccounting finalize upgrade with bond curves + assert 'BondCurveAdded' in dg_execution_events[31] + assert len(dg_execution_events[31]['BondCurveAdded']) == len(CS_CURVES) + assert 'Initialized' in dg_execution_events[31] + assert dg_execution_events[31]['Initialized'][0]['version'] == 2 + + # 33. CSFeeOracle implementation upgrade + validate_proxy_upgrade_event(dg_execution_events[32], CS_FEE_ORACLE_IMPL_V2_ADDRESS, emitted_by=contracts.cs_fee_oracle) + + # 34. CSFeeOracle finalize upgrade with consensus version + validate_consensus_version_set_event(dg_execution_events[33], new_version=3, prev_version=2, emitted_by=contracts.cs_fee_oracle) + validate_contract_version_set_event(dg_execution_events[33], version=2, emitted_by=contracts.cs_fee_oracle) + + # 35. CSFeeDistributor implementation upgrade + validate_proxy_upgrade_event(dg_execution_events[34], CS_FEE_DISTRIBUTOR_IMPL_V2_ADDRESS, emitted_by=contracts.cs_fee_distributor) + + # 36. CSFeeDistributor finalize upgrade + assert 'RebateRecipientSet' in dg_execution_events[35] + assert 'Initialized' in dg_execution_events[35] + assert dg_execution_events[35]['Initialized'][0]['version'] == CS_FEE_DISTRIBUTOR_V2_VERSION + + # 37. Revoke SET_BOND_CURVE_ROLE from CSM on CSAccounting + validate_role_revoke_event( + dg_execution_events[36], + role_hash=contracts.cs_accounting.SET_BOND_CURVE_ROLE().hex(), + account=contracts.csm.address, + emitted_by=contracts.cs_accounting + ) + + # 38. Revoke RESET_BOND_CURVE_ROLE from CSM on CSAccounting + validate_role_revoke_event( + dg_execution_events[37], + role_hash=web3.keccak(text="RESET_BOND_CURVE_ROLE").hex(), + account=contracts.csm.address, + emitted_by=contracts.cs_accounting + ) + + # 39. Revoke RESET_BOND_CURVE_ROLE from CSM committee on CSAccounting + validate_role_revoke_event( + dg_execution_events[38], + role_hash=web3.keccak(text="RESET_BOND_CURVE_ROLE").hex(), + account=CSM_COMMITTEE_MS, + emitted_by=contracts.cs_accounting + ) + + # 40. Grant CREATE_NODE_OPERATOR_ROLE to permissionless gate on CSM + validate_role_grant_event( + dg_execution_events[39], + role_hash=contracts.csm.CREATE_NODE_OPERATOR_ROLE().hex(), + account=cs_permissionless_gate.address, + emitted_by=contracts.csm + ) + + # 41. Grant CREATE_NODE_OPERATOR_ROLE to vetted gate on CSM + validate_role_grant_event( + dg_execution_events[40], + role_hash=contracts.csm.CREATE_NODE_OPERATOR_ROLE().hex(), + account=cs_vetted_gate.address, + emitted_by=contracts.csm + ) + + # 42. Grant SET_BOND_CURVE_ROLE to vetted gate on CSAccounting + validate_role_grant_event( + dg_execution_events[41], + role_hash=contracts.cs_accounting.SET_BOND_CURVE_ROLE().hex(), + account=cs_vetted_gate.address, + emitted_by=contracts.cs_accounting + ) + + # 43. Revoke VERIFIER_ROLE from old verifier on CSM + validate_role_revoke_event( + dg_execution_events[42], + role_hash=contracts.csm.VERIFIER_ROLE().hex(), + account=contracts.cs_verifier.address, + emitted_by=contracts.csm + ) + + # 44. Grant VERIFIER_ROLE to new verifier on CSM + validate_role_grant_event( + dg_execution_events[43], + role_hash=contracts.csm.VERIFIER_ROLE().hex(), + account=cs_verifier_v2.address, + emitted_by=contracts.csm + ) + + # 45. Revoke PAUSE_ROLE from old GateSeal on CSM + validate_role_revoke_event( + dg_execution_events[44], + role_hash=contracts.csm.PAUSE_ROLE().hex(), + account=CS_GATE_SEAL_ADDRESS, + emitted_by=contracts.csm + ) + + # 46. Revoke PAUSE_ROLE from old GateSeal on CSAccounting + validate_role_revoke_event( + dg_execution_events[45], + role_hash=contracts.cs_accounting.PAUSE_ROLE().hex(), + account=CS_GATE_SEAL_ADDRESS, + emitted_by=contracts.cs_accounting + ) + + # 47. Revoke PAUSE_ROLE from old GateSeal on CSFeeOracle + validate_role_revoke_event( + dg_execution_events[46], + role_hash=contracts.cs_fee_oracle.PAUSE_ROLE().hex(), + account=CS_GATE_SEAL_ADDRESS, + emitted_by=contracts.cs_fee_oracle + ) + + # 48. Grant PAUSE_ROLE to new GateSeal on CSM + validate_role_grant_event( + dg_execution_events[47], + role_hash=contracts.csm.PAUSE_ROLE().hex(), + account=CS_GATE_SEAL_V2_ADDRESS, + emitted_by=contracts.csm + ) + + # 49. Grant PAUSE_ROLE to new GateSeal on CSAccounting + validate_role_grant_event( + dg_execution_events[48], + role_hash=contracts.cs_accounting.PAUSE_ROLE().hex(), + account=CS_GATE_SEAL_V2_ADDRESS, + emitted_by=contracts.cs_accounting + ) + + # 50. Grant PAUSE_ROLE to new GateSeal on CSFeeOracle + validate_role_grant_event( + dg_execution_events[49], + role_hash=contracts.cs_fee_oracle.PAUSE_ROLE().hex(), + account=CS_GATE_SEAL_V2_ADDRESS, + emitted_by=contracts.cs_fee_oracle + ) + + # 51. Grant MANAGE_BOND_CURVES_ROLE to agent on CSAccounting + validate_role_grant_event( + dg_execution_events[50], + role_hash=contracts.cs_accounting.MANAGE_BOND_CURVES_ROLE().hex(), + account=contracts.agent.address, + emitted_by=contracts.cs_accounting + ) + + # 52. Add ICS bond curve + ics_curve_id = len(CS_CURVES) + validate_bond_curve_added_event(dg_execution_events[51], curve_id=ics_curve_id, emitted_by=contracts.cs_accounting) + + # 53. Revoke MANAGE_BOND_CURVES_ROLE from agent on CSAccounting + validate_role_revoke_event( + dg_execution_events[52], + role_hash=contracts.cs_accounting.MANAGE_BOND_CURVES_ROLE().hex(), + account=contracts.agent.address, + emitted_by=contracts.cs_accounting + ) + + # 54. Increase CSM share in Staking Router + validate_staking_module_update_event( + dg_execution_events[53], + module_id=CS_MODULE_ID, + share_limit=CS_MODULE_NEW_TARGET_SHARE_BP, + priority_share_threshold=CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP, + module_fee_points_bp=CS_MODULE_MODULE_FEE_BP, + treasury_fee_points_bp=CS_MODULE_TREASURY_FEE_BP, + max_deposits_per_block=CS_MODULE_MAX_DEPOSITS_PER_BLOCK, + min_deposit_block_distance=CS_MODULE_MIN_DEPOSIT_BLOCK_DISTANCE, + emitted_by=contracts.staking_router + ) + + # 55. Add EasyTrack factory for CSSetVettedGateTree + validate_evmscript_factory_added_event( + event=dg_bypass_voting_event, + p=EVMScriptFactoryAdded( + factory_addr=CS_SET_VETTED_GATE_TREE_FACTORY, + permissions=create_permissions(cs_vetted_gate, "setTreeParams") + ), + emitted_by=contracts.easy_track, + ) diff --git a/archive/tests/test_vote_tw_csm2_hoodi.py b/archive/tests/test_vote_tw_csm2_hoodi.py new file mode 100644 index 000000000..944009e48 --- /dev/null +++ b/archive/tests/test_vote_tw_csm2_hoodi.py @@ -0,0 +1,1062 @@ +from typing import Optional +from scripts.vote_tw_csm2_hoodi import start_vote +from brownie import interface, reverts, chain, convert, web3, ZERO_ADDRESS # type: ignore +from brownie.network.event import EventDict +from utils.easy_track import create_permissions +from utils.test.tx_tracing_helpers import group_voting_events_from_receipt, group_dg_events_from_receipt +from utils.test.event_validators.easy_track import validate_evmscript_factory_added_event, EVMScriptFactoryAdded +from utils.test.event_validators.dual_governance import validate_dual_governance_submit_event +from utils.dual_governance import wait_for_noon_utc_to_satisfy_time_constrains +from utils.config import ( + DUAL_GOVERNANCE, + TIMELOCK, + DUAL_GOVERNANCE_EXECUTORS, + LDO_HOLDER_ADDRESS_FOR_TESTS, + CS_MODULE_ID, + CS_MODULE_MODULE_FEE_BP, + CS_MODULE_MAX_DEPOSITS_PER_BLOCK, + CS_MODULE_MIN_DEPOSIT_BLOCK_DISTANCE, + CS_MODULE_TREASURY_FEE_BP, + CS_GATE_SEAL_ADDRESS, + CSM_COMMITTEE_MS, + ARAGON_KERNEL, + AGENT, + VOTING, + contracts, +) + + +def validate_proxy_upgrade_event(event: EventDict, implementation: str, emitted_by: Optional[str] = None): + assert "Upgraded" in event, "No Upgraded event found" + + assert event["Upgraded"][0]["implementation"] == implementation, "Wrong implementation address" + + if emitted_by is not None: + assert convert.to_address(event["Upgraded"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_consensus_version_set_event(event: EventDict, new_version: int, prev_version: int, emitted_by: Optional[str] = None): + assert "ConsensusVersionSet" in event, "No ConsensusVersionSet event found" + + assert event["ConsensusVersionSet"][0]["version"] == new_version, "Wrong new version" + + assert event["ConsensusVersionSet"][0]["prevVersion"] == prev_version, "Wrong previous version" + + if emitted_by is not None: + assert convert.to_address(event["ConsensusVersionSet"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_role_grant_event(event: EventDict, role_hash: str, account: str, emitted_by: Optional[str] = None): + assert "RoleGranted" in event, "No RoleGranted event found" + + # Strip 0x prefix for consistent comparison + expected_role_hash = role_hash.replace('0x', '') + actual_role_hash = event["RoleGranted"][0]["role"].hex().replace('0x', '') + + assert actual_role_hash == expected_role_hash, "Wrong role hash" + + assert convert.to_address(event["RoleGranted"][0]["account"]) == convert.to_address(account), "Wrong account" + + if emitted_by is not None: + assert convert.to_address(event["RoleGranted"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_role_revoke_event(event: EventDict, role_hash: str, account: str, emitted_by: Optional[str] = None): + assert "RoleRevoked" in event, "No RoleRevoked event found" + + # Strip 0x prefix for consistent comparison + expected_role_hash = role_hash.replace('0x', '') + actual_role_hash = event["RoleRevoked"][0]["role"].hex().replace('0x', '') + + assert actual_role_hash == expected_role_hash, "Wrong role hash" + + assert convert.to_address(event["RoleRevoked"][0]["account"]) == convert.to_address(account), "Wrong account" + + if emitted_by is not None: + assert convert.to_address(event["RoleRevoked"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_contract_version_set_event(event: EventDict, version: int, emitted_by: Optional[str] = None): + assert "ContractVersionSet" in event, "No ContractVersionSet event found" + + assert event["ContractVersionSet"][0]["version"] == version, "Wrong version" + + if emitted_by is not None: + assert convert.to_address(event["ContractVersionSet"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_bond_curve_added_event(event: EventDict, curve_id: int, emitted_by: Optional[str] = None): + assert "BondCurveAdded" in event, "No BondCurveAdded event found" + + assert event["BondCurveAdded"][0]["curveId"] == curve_id, "Wrong curve ID" + + if emitted_by is not None: + assert convert.to_address(event["BondCurveAdded"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_staking_module_update_event( + event: EventDict, + module_id: int, + share_limit: int, + priority_share_threshold: int, + module_fee_points_bp: int, + treasury_fee_points_bp: int, + max_deposits_per_block: int, + min_deposit_block_distance: int, + emitted_by: Optional[str] = None +): + assert "StakingModuleShareLimitSet" in event, "No StakingModuleShareLimitSet event found" + assert "StakingModuleFeesSet" in event, "No StakingModuleFeesSet event found" + assert "StakingModuleMaxDepositsPerBlockSet" in event, "No StakingModuleMaxDepositsPerBlockSet event found" + assert "StakingModuleMinDepositBlockDistanceSet" in event, "No StakingModuleMinDepositBlockDistanceSet event found" + + assert len(event["StakingModuleShareLimitSet"]) == 1, "Multiple StakingModuleShareLimitSet events found" + assert len(event["StakingModuleFeesSet"]) == 1, "Multiple StakingModuleFeesSet events found" + assert len(event["StakingModuleMaxDepositsPerBlockSet"]) == 1, "Multiple StakingModuleMaxDepositsPerBlockSet events found" + assert len(event["StakingModuleMinDepositBlockDistanceSet"]) == 1, "Multiple StakingModuleMinDepositBlockDistanceSet events found" + + assert event["StakingModuleShareLimitSet"][0]["stakingModuleId"] == module_id, "Wrong module ID" + assert event["StakingModuleShareLimitSet"][0]["stakeShareLimit"] == share_limit, "Wrong share limit" + assert event["StakingModuleShareLimitSet"][0]["priorityExitShareThreshold"] == priority_share_threshold, "Wrong priority threshold" + + assert event["StakingModuleFeesSet"][0]["stakingModuleFee"] == module_fee_points_bp, "Wrong fee points" + assert event["StakingModuleFeesSet"][0]["treasuryFee"] == treasury_fee_points_bp, "Wrong treasury fee points" + + assert event["StakingModuleMaxDepositsPerBlockSet"][0]["maxDepositsPerBlock"] == max_deposits_per_block, "Wrong max deposits" + + assert event["StakingModuleMinDepositBlockDistanceSet"][0]["minDepositBlockDistance"] == min_deposit_block_distance, "Wrong min distance" + + if emitted_by is not None: + assert convert.to_address(event["StakingModuleShareLimitSet"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + assert convert.to_address(event["StakingModuleFeesSet"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + assert convert.to_address(event["StakingModuleMaxDepositsPerBlockSet"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + assert convert.to_address(event["StakingModuleMinDepositBlockDistanceSet"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def get_ossifiable_proxy_impl(proxy_address): + """Get implementation address from an OssifiableProxy""" + proxy = interface.OssifiableProxy(proxy_address) + return proxy.proxy__getImplementation() + + +def get_wv_contract_proxy_impl(proxy_address): + """Get implementation address from an WithdrawalContractProxy""" + proxy = interface.WithdrawalContractProxy(proxy_address) + return proxy.implementation() + + +def check_proxy_implementation(proxy_address, expected_impl): + """Check that proxy has expected implementation""" + actual_impl = get_ossifiable_proxy_impl(proxy_address) + assert actual_impl == expected_impl, f"Expected impl {expected_impl}, got {actual_impl}" + + +# New core contracts implementations +LIDO_LOCATOR_IMPL = "0x003f20CD17e7683A7F88A7AfF004f0C44F0cfB31" +ACCOUNTING_ORACLE_IMPL = "0x2341c9BE0E639f262f8170f9ef1efeCC92cCF617" +VALIDATORS_EXIT_BUS_ORACLE_IMPL = "0x7E6d9C9C44417bf2EaF69685981646e9752D623A" +WITHDRAWAL_VAULT_IMPL = "0xfe7A58960Af333eAdeAeC39149F9d6A71dc3E668" +STAKING_ROUTER_IMPL = "0xd5F04A81ac472B2cB32073CE9dDABa6FaF022827" +NODE_OPERATORS_REGISTRY_IMPL = "0x95F00b016bB31b7182D96D25074684518246E42a" + +TRIGGERABLE_WITHDRAWALS_GATEWAY = "0x6679090D92b08a2a686eF8614feECD8cDFE209db" +VALIDATOR_EXIT_VERIFIER = "0xFd4386A8795956f4B6D01cbb6dB116749731D7bD" + +# Add missing constants +OLD_GATE_SEAL_ADDRESS = "0x2168Ea6D948Ab49c3D34c667A7e02F92369F3A9C" +NEW_WQ_GATE_SEAL = "0x73d76Bd3D589B2b2185c402da82cdAfbc18b958D" +NEW_TW_GATE_SEAL = "0x368f2fcb593170823cc844F1B29e75E3d26879A1" +RESEAL_MANAGER = "0x05172CbCDb7307228F781436b327679e4DAE166B" + +# Add EasyTrack constants +EASYTRACK_EVMSCRIPT_EXECUTOR = "0x79a20FD0FA36453B2F45eAbab19bfef43575Ba9E" +EASYTRACK_SDVT_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY = "0xAa3D6A8B52447F272c1E8FAaA06EA06658bd95E2" +EASYTRACK_CURATED_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY = "0x397206ecdbdcb1A55A75e60Fc4D054feC72E5f63" + +# Oracle consensus versions +AO_CONSENSUS_VERSION = 4 +VEBO_CONSENSUS_VERSION = 4 +CSM_CONSENSUS_VERSION = 3 + +EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS = 14 * 7200 + +NOR_EXIT_DEADLINE_IN_SEC = 172800 + +# CSM +CS_MODULE_NEW_TARGET_SHARE_BP = 1600 # 16% +CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP = 2100 # 21% + +CS_ACCOUNTING_IMPL_V2_ADDRESS = "0x9483b34504292a0E4f6509e5887D2c68f7129638" +CS_FEE_DISTRIBUTOR_IMPL_V2_ADDRESS = "0xe05F7Aab7177D73f26e62a5296120583F5F18031" +CS_FEE_ORACLE_IMPL_V2_ADDRESS = "0x752fF00fcacdB66Bc512a067F15A5E0B0b50EADB" +CSM_IMPL_V2_ADDRESS = "0x9aE387EB2abA80B9B1ebc145597D593EFAE61f31" + +CS_GATE_SEAL_V2_ADDRESS = "0x94a3aEB0E9148F64CB453Be2BDe2Bc0148f6AC24" +CS_EJECTOR_ADDRESS = "0x21e271cBa32672B106737AbeB3a45E53Fe9a0df4" +CS_PERMISSIONLESS_GATE_ADDRESS = "0x5553077102322689876A6AdFd48D75014c28acfb" +CS_VETTED_GATE_ADDRESS = "0x10a254E724fe2b7f305F76f3F116a3969c53845f" +CS_VERIFIER_V2_ADDRESS = "0xf805b3711cBB48F15Ae2bb27095ddC38c5339968" + +CS_CURVES = [ + ([1, 2.4 * 10**18], [2, 1.3 * 10**18]), # Default Curve + ([1, 1.5 * 10**18], [2, 1.3 * 10**18]), # Legacy EA Curve +] +CS_ICS_GATE_BOND_CURVE = ([1, 1.5 * 10**18], [2, 1.3 * 10**18]) # Identified Community Stakers Gate Bond Curve + +# Contract versions expected after upgrade +CSM_V2_VERSION = 2 +CS_ACCOUNTING_V2_VERSION = 2 +CS_FEE_ORACLE_V2_VERSION = 2 +CS_FEE_DISTRIBUTOR_V2_VERSION = 2 + +EASYTRACK_CS_SET_VETTED_GATE_TREE_FACTORY = "0xa890fc73e1b771Ee6073e2402E631c312FF92Cd9" + + +def test_tw_vote(helpers, accounts, vote_ids_from_env, stranger): + # Save original implementations for comparison + locator_impl_before = get_ossifiable_proxy_impl(contracts.lido_locator) + accounting_oracle_impl_before = get_ossifiable_proxy_impl(contracts.accounting_oracle) + vebo_impl_before = get_ossifiable_proxy_impl(contracts.validators_exit_bus_oracle) + withdrawal_vault_impl_before = get_wv_contract_proxy_impl(contracts.withdrawal_vault) + staking_router_impl_before = get_ossifiable_proxy_impl(contracts.staking_router) + + csm_impl_before = get_ossifiable_proxy_impl(contracts.csm.address) + cs_accounting_impl_before = get_ossifiable_proxy_impl(contracts.cs_accounting.address) + cs_fee_oracle_impl_before = get_ossifiable_proxy_impl(contracts.cs_fee_oracle.address) + cs_fee_distributor_impl_before = get_ossifiable_proxy_impl(contracts.cs_fee_distributor.address) + + timelock = interface.EmergencyProtectedTimelock(TIMELOCK) + dual_governance = interface.DualGovernance(DUAL_GOVERNANCE) + + # Not yet used by the protocol, but needed for the test + triggerable_withdrawals_gateway = interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY) + cs_ejector = interface.CSEjector(CS_EJECTOR_ADDRESS) + cs_permissionless_gate = interface.CSPermissionlessGate(CS_PERMISSIONLESS_GATE_ADDRESS) + cs_vetted_gate = interface.CSVettedGate(CS_VETTED_GATE_ADDRESS) + cs_verifier_v2 = interface.CSVerifierV2(CS_VERIFIER_V2_ADDRESS) + + # --- Initial state checks --- + + # Step 1: Check Lido Locator implementation initial state + assert locator_impl_before != LIDO_LOCATOR_IMPL, "Locator implementation should be different before upgrade" + + # Step 2: Check VEBO implementation initial state + assert vebo_impl_before != VALIDATORS_EXIT_BUS_ORACLE_IMPL, "VEBO implementation should be different before upgrade" + + # Step 3: Check VEBO finalizeUpgrade_v2 state + try: + assert contracts.validators_exit_bus_oracle.getMaxValidatorsPerReport() != 600, "VEBO max validators per report should not be 600 before upgrade" + except Exception: + pass # Function might not exist yet + + # Steps 4-6: Check VEBO consensus version management + initial_vebo_consensus_version = contracts.validators_exit_bus_oracle.getConsensusVersion() + assert initial_vebo_consensus_version < VEBO_CONSENSUS_VERSION, f"VEBO consensus version should be less than {VEBO_CONSENSUS_VERSION}" + + # Step 7: Check TWG role for CS Ejector initial state + add_full_withdrawal_request_role = triggerable_withdrawals_gateway.ADD_FULL_WITHDRAWAL_REQUEST_ROLE() + assert not triggerable_withdrawals_gateway.hasRole(add_full_withdrawal_request_role, cs_ejector), "CS Ejector should not have ADD_FULL_WITHDRAWAL_REQUEST_ROLE before upgrade" + + # Step 8: Check TWG role for VEB initial state + assert not triggerable_withdrawals_gateway.hasRole(add_full_withdrawal_request_role, contracts.validators_exit_bus_oracle), "VEBO should not have ADD_FULL_WITHDRAWAL_REQUEST_ROLE before upgrade" + + # Step 9: Check EasyTrack VEB SUBMIT_REPORT_HASH_ROLE initial state + submit_report_hash_role = web3.keccak(text="SUBMIT_REPORT_HASH_ROLE") + assert not contracts.validators_exit_bus_oracle.hasRole(submit_report_hash_role, EASYTRACK_EVMSCRIPT_EXECUTOR), "EasyTrack executor should not have SUBMIT_REPORT_HASH_ROLE on VEBO before upgrade" + + # Step 10: Check DualGovernance tiebreaker initial state + tiebreaker_details = contracts.dual_governance.getTiebreakerDetails() + initial_tiebreakers = tiebreaker_details[3] # sealableWithdrawalBlockers + assert TRIGGERABLE_WITHDRAWALS_GATEWAY not in initial_tiebreakers, "TWG should not be in tiebreaker list before upgrade" + + # Step 9: Check Withdrawal Vault implementation initial state + assert withdrawal_vault_impl_before != WITHDRAWAL_VAULT_IMPL, "Withdrawal Vault implementation should be different before upgrade" + + # Step 10: Withdrawal Vault finalizeUpgrade_v2 check is done post-execution + assert contracts.withdrawal_vault.getContractVersion() == 1, "Withdrawal Vault version should be 1 before upgrade" + + # Step 11: Check Accounting Oracle implementation initial state + assert accounting_oracle_impl_before != ACCOUNTING_ORACLE_IMPL, "Accounting Oracle implementation should be different before upgrade" + + # Steps 12-14: Check AO consensus version management + initial_ao_consensus_version = contracts.accounting_oracle.getConsensusVersion() + assert initial_ao_consensus_version < AO_CONSENSUS_VERSION, f"AO consensus version should be less than {AO_CONSENSUS_VERSION}" + assert not contracts.accounting_oracle.hasRole(contracts.accounting_oracle.MANAGE_CONSENSUS_VERSION_ROLE(), contracts.agent), "Agent should not have MANAGE_CONSENSUS_VERSION_ROLE on AO before upgrade" + + # Step 17: Check AO version before finalizeUpgrade_v3 + assert contracts.accounting_oracle.getContractVersion() == 2, "AO contract version should be 2 before finalizeUpgrade_v3" + + # Step 15: Check Staking Router implementation initial state + assert staking_router_impl_before != STAKING_ROUTER_IMPL, "Staking Router implementation should be different before upgrade" + + # Steps 16-17: Check SR roles initial state + try: + report_validator_exiting_status_role = contracts.staking_router.REPORT_VALIDATOR_EXITING_STATUS_ROLE() + report_validator_exit_triggered_role = contracts.staking_router.REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE() + except Exception as e: + assert "Unknown typed error: 0x" in str(e), f"Unexpected error: {e}" + report_validator_exiting_status_role = ZERO_ADDRESS + report_validator_exit_triggered_role = ZERO_ADDRESS + + assert report_validator_exiting_status_role == ZERO_ADDRESS, "REPORT_VALIDATOR_EXITING_STATUS_ROLE should not exist before upgrade" + assert report_validator_exit_triggered_role == ZERO_ADDRESS, "REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE should not exist before upgrade" + + # Step 18: Check APP_MANAGER_ROLE initial state + app_manager_role = web3.keccak(text="APP_MANAGER_ROLE") + assert contracts.acl.getPermissionManager(ARAGON_KERNEL, app_manager_role) == AGENT, "AGENT should be the permission manager for APP_MANAGER_ROLE" + assert contracts.node_operators_registry.kernel() == ARAGON_KERNEL, "Node Operators Registry must use the correct kernel" + assert not contracts.acl.hasPermission(VOTING, ARAGON_KERNEL, app_manager_role), "VOTING should not have APP_MANAGER_ROLE before the upgrade" + assert not contracts.acl.hasPermission(AGENT, ARAGON_KERNEL, app_manager_role), "AGENT should not have APP_MANAGER_ROLE before the upgrade" + + # Steps 19-23: Check NOR and sDVT initial state + assert not contracts.acl.hasPermission(contracts.agent, contracts.kernel, app_manager_role), "Agent should not have APP_MANAGER_ROLE before upgrade" + assert contracts.node_operators_registry.getContractVersion() == 3, "Node Operators Registry version should be 3 before upgrade" + assert contracts.simple_dvt.getContractVersion() == 3, "Simple DVT version should be 3 before upgrade" + + # Step 24: Check CONFIG_MANAGER_ROLE initial state + config_manager_role = contracts.oracle_daemon_config.CONFIG_MANAGER_ROLE() + assert not contracts.oracle_daemon_config.hasRole(config_manager_role, contracts.agent), "Agent should not have CONFIG_MANAGER_ROLE on Oracle Daemon Config before upgrade" + + # Steps 25-27: Check Oracle Daemon Config variables to be removed + try: + contracts.oracle_daemon_config.get('NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP') + contracts.oracle_daemon_config.get('VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS') + contracts.oracle_daemon_config.get('VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS') + except Exception as e: + assert False, f"Expected variables to exist before removal: {e}" + + # Step 28: Check that EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS doesn't exist yet + try: + contracts.oracle_daemon_config.get('EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS') + assert False, "EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS should not exist before vote" + except Exception: + pass # Expected to fail + + # Step 29: Check CSM implementation initial state + assert csm_impl_before != CSM_IMPL_V2_ADDRESS, "CSM implementation should be different before vote" + + # Step 30: Check CSM finalizeUpgradeV2 initial state + with reverts(): + # The function should not exist yet + contracts.csm.getInitializedVersion() + + # CSM Step 32: Check CSAccounting implementation (pre-vote state) + assert cs_accounting_impl_before != CS_ACCOUNTING_IMPL_V2_ADDRESS, "CSAccounting implementation should be different before vote" + + # CSM Step 33: Check CSAccounting finalizeUpgradeV2 was not called (pre-vote state) + with reverts(): + # The function should not exist yet + contracts.cs_accounting.getInitializedVersion() + + # CSM Step 34: Check CSFeeOracle implementation (pre-vote state) + assert cs_fee_oracle_impl_before != CS_FEE_ORACLE_IMPL_V2_ADDRESS, "CSFeeOracle implementation should be different before vote" + + # CSM Step 35: Check CSFeeOracle finalizeUpgradeV2 was not called (pre-vote state) + assert contracts.cs_fee_oracle.getContractVersion() < CS_FEE_ORACLE_V2_VERSION, f"CSFeeOracle version should be less than {CS_FEE_ORACLE_V2_VERSION} before vote" + assert contracts.cs_fee_oracle.getConsensusVersion() < 3, "CSFeeOracle consensus version should be less than 3 before vote" + + # CSM Step 36: Check CSFeeDistributor implementation (pre-vote state) + assert cs_fee_distributor_impl_before != CS_FEE_DISTRIBUTOR_IMPL_V2_ADDRESS, "CSFeeDistributor implementation should be different before vote" + + # CSM Step 37: Check CSFeeDistributor finalizeUpgradeV2 was not called (pre-vote state) + with reverts(): + # The function should not exist yet + contracts.cs_fee_distributor.getInitializedVersion() + + # CSM Steps 38-40: CSAccounting roles (pre-vote state) + assert contracts.cs_accounting.hasRole(contracts.cs_accounting.SET_BOND_CURVE_ROLE(), contracts.csm.address), "CSM should have SET_BOND_CURVE_ROLE on CSAccounting before vote" + assert contracts.cs_accounting.hasRole(web3.keccak(text="RESET_BOND_CURVE_ROLE"), contracts.csm.address), "CSM should have RESET_BOND_CURVE_ROLE on CSAccounting before vote" + assert contracts.cs_accounting.hasRole(web3.keccak(text="RESET_BOND_CURVE_ROLE"), CSM_COMMITTEE_MS), "CSM committee should have RESET_BOND_CURVE_ROLE on CSAccounting before vote" + + # CSM Steps 41-42: CSM roles (pre-vote state) + assert not contracts.csm.hasRole(web3.keccak(text="CREATE_NODE_OPERATOR_ROLE"), cs_permissionless_gate.address), "Permissionless gate should not have CREATE_NODE_OPERATOR_ROLE on CSM before vote" + assert not contracts.csm.hasRole(web3.keccak(text="CREATE_NODE_OPERATOR_ROLE"), cs_vetted_gate.address), "Vetted gate should not have CREATE_NODE_OPERATOR_ROLE on CSM before vote" + + # CSM Step 43: CSAccounting bond curve role for vetted gate (pre-vote state) + assert not contracts.cs_accounting.hasRole(contracts.cs_accounting.SET_BOND_CURVE_ROLE(), cs_vetted_gate.address), "Vetted gate should not have SET_BOND_CURVE_ROLE on CSAccounting before vote" + + # CSM Steps 44-45: Verifier roles (pre-vote state) + assert contracts.csm.hasRole(contracts.csm.VERIFIER_ROLE(), contracts.cs_verifier.address), "Old verifier should have VERIFIER_ROLE on CSM before vote" + assert not contracts.csm.hasRole(contracts.csm.VERIFIER_ROLE(), cs_verifier_v2.address), "New verifier should not have VERIFIER_ROLE on CSM before vote" + + # CSM Steps 46-51: GateSeal roles (pre-vote state) + assert contracts.csm.hasRole(contracts.csm.PAUSE_ROLE(), CS_GATE_SEAL_ADDRESS), "Old GateSeal should have PAUSE_ROLE on CSM before vote" + assert contracts.cs_accounting.hasRole(contracts.cs_accounting.PAUSE_ROLE(), CS_GATE_SEAL_ADDRESS), "Old GateSeal should have PAUSE_ROLE on CSAccounting before vote" + assert contracts.cs_fee_oracle.hasRole(contracts.cs_fee_oracle.PAUSE_ROLE(), CS_GATE_SEAL_ADDRESS), "Old GateSeal should have PAUSE_ROLE on CSFeeOracle before vote" + + assert not contracts.csm.hasRole(contracts.csm.PAUSE_ROLE(), CS_GATE_SEAL_V2_ADDRESS), "New GateSeal should not have PAUSE_ROLE on CSM before vote" + assert not contracts.cs_accounting.hasRole(contracts.cs_accounting.PAUSE_ROLE(), CS_GATE_SEAL_V2_ADDRESS), "New GateSeal should not have PAUSE_ROLE on CSAccounting before vote" + assert not contracts.cs_fee_oracle.hasRole(contracts.cs_fee_oracle.PAUSE_ROLE(), CS_GATE_SEAL_V2_ADDRESS), "New GateSeal should not have PAUSE_ROLE on CSFeeOracle before vote" + + # CSM Step 52: Staking Router CSM module state before vote (pre-vote state) + csm_module_before = contracts.staking_router.getStakingModule(CS_MODULE_ID) + csm_share_before = csm_module_before['stakeShareLimit'] + csm_priority_exit_threshold_before = csm_module_before['priorityExitShareThreshold'] + assert csm_share_before != CS_MODULE_NEW_TARGET_SHARE_BP, f"CSM share should not be {CS_MODULE_NEW_TARGET_SHARE_BP} before vote, current: {csm_share_before}" + assert csm_priority_exit_threshold_before != CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP, f"CSM priority exit threshold should not be {CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP} before vote, current: {csm_priority_exit_threshold_before}" + + # CSM Step 65: EasyTrack factories before vote (pre-vote state) + initial_factories = contracts.easy_track.getEVMScriptFactories() + assert EASYTRACK_CS_SET_VETTED_GATE_TREE_FACTORY not in initial_factories, "EasyTrack should not have CSMSetVettedGateTree factory before vote" + assert EASYTRACK_SDVT_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY not in initial_factories, "EasyTrack should not have SDVT validator exit request hashes factory before vote" + assert EASYTRACK_CURATED_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY not in initial_factories, "EasyTrack should not have Curated validator exit request hashes factory before vote" + + # Gate Seals: Check initial states before vote + assert contracts.withdrawal_queue.hasRole(contracts.withdrawal_queue.PAUSE_ROLE(), OLD_GATE_SEAL_ADDRESS), "Old GateSeal should have PAUSE_ROLE on WithdrawalQueue before vote" + assert contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.PAUSE_ROLE(), OLD_GATE_SEAL_ADDRESS), "Old GateSeal should have PAUSE_ROLE on VEBO before vote" + assert not contracts.withdrawal_queue.hasRole(contracts.withdrawal_queue.PAUSE_ROLE(), NEW_WQ_GATE_SEAL), "New WQ GateSeal should not have PAUSE_ROLE on WithdrawalQueue before vote" + assert not contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.PAUSE_ROLE(), NEW_TW_GATE_SEAL), "New TW GateSeal should not have PAUSE_ROLE on VEBO before vote" + assert not triggerable_withdrawals_gateway.hasRole(triggerable_withdrawals_gateway.PAUSE_ROLE(), NEW_TW_GATE_SEAL), "New TW GateSeal should not have PAUSE_ROLE on TWG before vote" + + # ResealManager: Check initial states before vote + assert not triggerable_withdrawals_gateway.hasRole(triggerable_withdrawals_gateway.PAUSE_ROLE(), RESEAL_MANAGER), "ResealManager should not have PAUSE_ROLE on TWG before vote" + assert not triggerable_withdrawals_gateway.hasRole(triggerable_withdrawals_gateway.RESUME_ROLE(), RESEAL_MANAGER), "ResealManager should not have RESUME_ROLE on TWG before vote" + + # START VOTE + if len(vote_ids_from_env) > 0: + (vote_id,) = vote_ids_from_env + else: + tx_params = {"from": LDO_HOLDER_ADDRESS_FOR_TESTS} + vote_id, _ = start_vote(tx_params, silent=True) + + vote_tx = helpers.execute_vote(accounts, vote_id, contracts.voting) + print(f"voteId = {vote_id}") + + proposal_id = vote_tx.events["ProposalSubmitted"][1]["proposalId"] + print(f"proposalId = {proposal_id}") + + chain.sleep(timelock.getAfterSubmitDelay() + 1) + dual_governance.scheduleProposal(proposal_id, {"from": stranger}) + + chain.sleep(timelock.getAfterScheduleDelay() + 1) + wait_for_noon_utc_to_satisfy_time_constrains() + + dg_tx = timelock.execute(proposal_id, {"from": stranger}) + + # --- VALIDATE EXECUTION RESULTS --- + + # Step 1: Validate Lido Locator implementation was updated + assert get_ossifiable_proxy_impl(contracts.lido_locator) == LIDO_LOCATOR_IMPL, "Locator implementation should be updated to the new value" + + # Step 2-3: Validate VEBO implementation was updated and configured + assert get_ossifiable_proxy_impl(contracts.validators_exit_bus_oracle) == VALIDATORS_EXIT_BUS_ORACLE_IMPL, "VEBO implementation should be updated" + assert contracts.validators_exit_bus_oracle.getMaxValidatorsPerReport() == 600, "VEBO max validators per report should be set to 600" + + # Validate exit request limit parameters from finalizeUpgrade_v2 call + exit_request_limits = contracts.validators_exit_bus_oracle.getExitRequestLimitFullInfo() + assert exit_request_limits[0] == 11200, "maxExitRequestsLimit should be 11200" + assert exit_request_limits[1] == 1, "exitsPerFrame should be 1" + assert exit_request_limits[2] == 48, "frameDurationInSec should be 48 hours in seconds" + + # Steps 4-6: Validate VEBO consensus version management + assert not contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.MANAGE_CONSENSUS_VERSION_ROLE(), contracts.agent), "Agent should not have MANAGE_CONSENSUS_VERSION_ROLE on VEBO" + assert contracts.validators_exit_bus_oracle.getConsensusVersion() == VEBO_CONSENSUS_VERSION, f"VEBO consensus version should be set to {VEBO_CONSENSUS_VERSION}" + + # Steps 7-8: Validate TWG roles + assert triggerable_withdrawals_gateway.hasRole(add_full_withdrawal_request_role, cs_ejector), "CS Ejector should have ADD_FULL_WITHDRAWAL_REQUEST_ROLE on TWG" + assert triggerable_withdrawals_gateway.hasRole(add_full_withdrawal_request_role, contracts.validators_exit_bus_oracle), "VEBO should have ADD_FULL_WITHDRAWAL_REQUEST_ROLE on TWG" + + # Step 9: Validate EasyTrack VEB SUBMIT_REPORT_HASH_ROLE + assert contracts.validators_exit_bus_oracle.hasRole(submit_report_hash_role, EASYTRACK_EVMSCRIPT_EXECUTOR), "EasyTrack executor should have SUBMIT_REPORT_HASH_ROLE on VEBO" + + # Step 10: Validate DualGovernance tiebreaker connection + final_tiebreaker_details = contracts.dual_governance.getTiebreakerDetails() + final_tiebreakers = final_tiebreaker_details[3] # sealableWithdrawalBlockers + assert TRIGGERABLE_WITHDRAWALS_GATEWAY in final_tiebreakers, "TWG should be in tiebreaker list after upgrade" + + # Steps 9-10: Validate Withdrawal Vault upgrade + assert get_wv_contract_proxy_impl(contracts.withdrawal_vault) == WITHDRAWAL_VAULT_IMPL, "Withdrawal Vault implementation should be updated" + assert contracts.withdrawal_vault.getContractVersion() == 2, "Withdrawal Vault version should be 2 after finalizeUpgrade_v2" + + # Steps 11-14: Validate Accounting Oracle upgrade + assert get_ossifiable_proxy_impl(contracts.accounting_oracle) == ACCOUNTING_ORACLE_IMPL, "Accounting Oracle implementation should be updated" + assert not contracts.accounting_oracle.hasRole(contracts.accounting_oracle.MANAGE_CONSENSUS_VERSION_ROLE(), contracts.agent), "Agent should not have MANAGE_CONSENSUS_VERSION_ROLE on AO" + assert contracts.accounting_oracle.getConsensusVersion() == AO_CONSENSUS_VERSION, f"AO consensus version should be set to {AO_CONSENSUS_VERSION}" + + # Step 17: Validate AO finalizeUpgrade_v3 + assert contracts.accounting_oracle.getContractVersion() == 3, "AO contract version should be 3 after finalizeUpgrade_v3" + + # Steps 15-17: Validate Staking Router upgrade + assert get_ossifiable_proxy_impl(contracts.staking_router) == STAKING_ROUTER_IMPL, "Staking Router implementation should be updated" + assert contracts.staking_router.hasRole(contracts.staking_router.REPORT_VALIDATOR_EXITING_STATUS_ROLE(), VALIDATOR_EXIT_VERIFIER), "ValidatorExitVerifier should have REPORT_VALIDATOR_EXITING_STATUS_ROLE on SR" + assert contracts.staking_router.hasRole(contracts.staking_router.REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE(), triggerable_withdrawals_gateway), "TWG should have REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE on SR" + + # Steps 18-23: Validate NOR and sDVT updates + assert not contracts.acl.hasPermission(contracts.agent, contracts.kernel, app_manager_role), "Agent should not have APP_MANAGER_ROLE after vote" + assert contracts.node_operators_registry.getContractVersion() == 4, "Node Operators Registry version should be updated to 4" + assert contracts.simple_dvt.getContractVersion() == 4, "Simple DVT version should be updated to 4" + assert contracts.node_operators_registry.exitDeadlineThreshold(0) == NOR_EXIT_DEADLINE_IN_SEC, "NOR exit deadline threshold should be set correctly" + assert contracts.simple_dvt.exitDeadlineThreshold(0) == NOR_EXIT_DEADLINE_IN_SEC, "sDVT exit deadline threshold should be set correctly" + + # Steps 24-28: Validate Oracle Daemon Config changes + assert not contracts.oracle_daemon_config.hasRole(config_manager_role, contracts.agent), "Agent should not have CONFIG_MANAGER_ROLE on Oracle Daemon Config" + for var_name in ['NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP', 'VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS', 'VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS']: + try: + contracts.oracle_daemon_config.get(var_name) + assert False, f"Variable {var_name} should have been removed" + except Exception: + pass # Expected to fail - variable should be removed + assert convert.to_uint(contracts.oracle_daemon_config.get('EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS')) == EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS, f"EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS should be set to {EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS}" + + # Step 29: Validate CSM implementation upgrade + check_proxy_implementation(contracts.csm.address, CSM_IMPL_V2_ADDRESS) + + # Step 30: Validate CSM finalizeUpgradeV2 was called + assert contracts.csm.getInitializedVersion() == CSM_V2_VERSION, f"CSM version should be {CSM_V2_VERSION} after vote" + + # Step 31: Validate CSAccounting implementation upgrade + check_proxy_implementation(contracts.cs_accounting.address, CS_ACCOUNTING_IMPL_V2_ADDRESS) + + # Step 32: Validate CSAccounting finalizeUpgradeV2 was called with bond curves + assert contracts.cs_accounting.getInitializedVersion() == CS_ACCOUNTING_V2_VERSION, f"CSAccounting version should be {CS_ACCOUNTING_V2_VERSION} after vote" + + # Step 33: Validate CSFeeOracle implementation upgrade + check_proxy_implementation(contracts.cs_fee_oracle.address, CS_FEE_ORACLE_IMPL_V2_ADDRESS) + + # Step 34: Validate CSFeeOracle finalizeUpgradeV2 was called with consensus version 3 + assert contracts.cs_fee_oracle.getContractVersion() == CS_FEE_ORACLE_V2_VERSION, f"CSFeeOracle version should be {CS_FEE_ORACLE_V2_VERSION} after vote" + assert contracts.cs_fee_oracle.getConsensusVersion() == CSM_CONSENSUS_VERSION, "CSFeeOracle consensus version should be 3 after vote" + + # Step 35: Validate CSFeeDistributor implementation upgrade + check_proxy_implementation(contracts.cs_fee_distributor.address, CS_FEE_DISTRIBUTOR_IMPL_V2_ADDRESS) + + # Step 36: Validate CSFeeDistributor finalizeUpgradeV2 was called + assert contracts.cs_fee_distributor.getInitializedVersion() == CS_FEE_DISTRIBUTOR_V2_VERSION, f"CSFeeDistributor version should be {CS_FEE_DISTRIBUTOR_V2_VERSION} after vote" + + # Step 37: Validate SET_BOND_CURVE_ROLE was revoked from CSM on CSAccounting + assert not contracts.cs_accounting.hasRole(contracts.cs_accounting.SET_BOND_CURVE_ROLE(), contracts.csm.address), "CSM should not have SET_BOND_CURVE_ROLE on CSAccounting after vote" + + # Step 38: Validate RESET_BOND_CURVE_ROLE was revoked from CSM on CSAccounting + assert not contracts.cs_accounting.hasRole(web3.keccak(text="RESET_BOND_CURVE_ROLE"), contracts.csm.address), "CSM should not have RESET_BOND_CURVE_ROLE on CSAccounting after vote" + + # Step 39: Validate RESET_BOND_CURVE_ROLE was revoked from CSM committee on CSAccounting + assert not contracts.cs_accounting.hasRole(web3.keccak(text="RESET_BOND_CURVE_ROLE"), CSM_COMMITTEE_MS), "CSM committee should not have RESET_BOND_CURVE_ROLE on CSAccounting after vote" + + # Step 40: Validate CREATE_NODE_OPERATOR_ROLE was granted to permissionless gate on CSM + assert contracts.csm.hasRole(contracts.csm.CREATE_NODE_OPERATOR_ROLE(), cs_permissionless_gate.address), "Permissionless gate should have CREATE_NODE_OPERATOR_ROLE on CSM after vote" + + # Step 41: Validate CREATE_NODE_OPERATOR_ROLE was granted to vetted gate on CSM + assert contracts.csm.hasRole(contracts.csm.CREATE_NODE_OPERATOR_ROLE(), cs_vetted_gate.address), "Vetted gate should have CREATE_NODE_OPERATOR_ROLE on CSM after vote" + + # Step 42: Validate SET_BOND_CURVE_ROLE was granted to vetted gate on CSAccounting + assert contracts.cs_accounting.hasRole(contracts.cs_accounting.SET_BOND_CURVE_ROLE(), cs_vetted_gate.address), "Vetted gate should have SET_BOND_CURVE_ROLE on CSAccounting after vote" + + # Step 43: Validate VERIFIER_ROLE was revoked from old verifier on CSM + assert not contracts.csm.hasRole(contracts.csm.VERIFIER_ROLE(), contracts.cs_verifier.address), "Old verifier should not have VERIFIER_ROLE on CSM after vote" + + # Step 44: Validate VERIFIER_ROLE was granted to new verifier on CSM + assert contracts.csm.hasRole(contracts.csm.VERIFIER_ROLE(), cs_verifier_v2.address), "New verifier should have VERIFIER_ROLE on CSM after vote" + + # Step 45: Validate PAUSE_ROLE was revoked from old GateSeal on CSM + assert not contracts.csm.hasRole(contracts.csm.PAUSE_ROLE(), CS_GATE_SEAL_ADDRESS), "Old GateSeal should not have PAUSE_ROLE on CSM after vote" + + # Step 46: Validate PAUSE_ROLE was revoked from old GateSeal on CSAccounting + assert not contracts.cs_accounting.hasRole(contracts.cs_accounting.PAUSE_ROLE(), CS_GATE_SEAL_ADDRESS), "Old GateSeal should not have PAUSE_ROLE on CSAccounting after vote" + + # Step 47: Validate PAUSE_ROLE was revoked from old GateSeal on CSFeeOracle + assert not contracts.cs_fee_oracle.hasRole(contracts.cs_fee_oracle.PAUSE_ROLE(), CS_GATE_SEAL_ADDRESS), "Old GateSeal should not have PAUSE_ROLE on CSFeeOracle after vote" + + # Step 48: Validate PAUSE_ROLE was granted to new GateSeal on CSM + assert contracts.csm.hasRole(contracts.csm.PAUSE_ROLE(), CS_GATE_SEAL_V2_ADDRESS), "New GateSeal should have PAUSE_ROLE on CSM after vote" + + # Step 49: Validate PAUSE_ROLE was granted to new GateSeal on CSAccounting + assert contracts.cs_accounting.hasRole(contracts.cs_accounting.PAUSE_ROLE(), CS_GATE_SEAL_V2_ADDRESS), "New GateSeal should have PAUSE_ROLE on CSAccounting after vote" + + # Step 50: Validate PAUSE_ROLE was granted to new GateSeal on CSFeeOracle + assert contracts.cs_fee_oracle.hasRole(contracts.cs_fee_oracle.PAUSE_ROLE(), CS_GATE_SEAL_V2_ADDRESS), "New GateSeal should have PAUSE_ROLE on CSFeeOracle after vote" + + # Step 50-52: Check add ICS Bond Curve to CSAccounting + assert not contracts.cs_accounting.hasRole(contracts.cs_accounting.MANAGE_BOND_CURVES_ROLE(), contracts.agent), "Agent should not have MANAGE_BOND_CURVES_ROLE on CSAccounting after vote" + assert contracts.cs_accounting.getCurvesCount() == len(CS_CURVES) + 1, "CSAccounting should have legacy bond curves and ICS Bond Curve after vote" + + # Step 53: Increase CSM share in Staking Router + csm_module_after = contracts.staking_router.getStakingModule(CS_MODULE_ID) + csm_share_after = csm_module_after['stakeShareLimit'] + assert csm_share_after == CS_MODULE_NEW_TARGET_SHARE_BP, f"CSM share should be {CS_MODULE_NEW_TARGET_SHARE_BP} after vote, but got {csm_share_after}" + + csm_priority_exit_threshold_after = csm_module_after['priorityExitShareThreshold'] + assert csm_priority_exit_threshold_after == CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP, f"CSM priority exit threshold should be {CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP} after vote, but got {csm_priority_exit_threshold_after}" + + + # Steps 58-62: Validate Gate Seals updates + assert not contracts.withdrawal_queue.hasRole(contracts.withdrawal_queue.PAUSE_ROLE(), OLD_GATE_SEAL_ADDRESS), "Old GateSeal should not have PAUSE_ROLE on WithdrawalQueue after vote" + assert not contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.PAUSE_ROLE(), OLD_GATE_SEAL_ADDRESS), "Old GateSeal should not have PAUSE_ROLE on VEBO after vote" + assert contracts.withdrawal_queue.hasRole(contracts.withdrawal_queue.PAUSE_ROLE(), NEW_WQ_GATE_SEAL), "New WQ GateSeal should have PAUSE_ROLE on WithdrawalQueue after vote" + assert contracts.validators_exit_bus_oracle.hasRole(contracts.validators_exit_bus_oracle.PAUSE_ROLE(), NEW_TW_GATE_SEAL), "New TW GateSeal should have PAUSE_ROLE on VEBO after vote" + assert triggerable_withdrawals_gateway.hasRole(triggerable_withdrawals_gateway.PAUSE_ROLE(), NEW_TW_GATE_SEAL), "New TW GateSeal should have PAUSE_ROLE on TWG after vote" + + # Steps 63-64: Validate ResealManager roles + assert triggerable_withdrawals_gateway.hasRole(triggerable_withdrawals_gateway.PAUSE_ROLE(), RESEAL_MANAGER), "ResealManager should have PAUSE_ROLE on TWG after vote" + assert triggerable_withdrawals_gateway.hasRole(triggerable_withdrawals_gateway.RESUME_ROLE(), RESEAL_MANAGER), "ResealManager should have RESUME_ROLE on TWG after vote" + + # Step 65: Add EasyTrack factory for CSSetVettedGateTree + new_factories = contracts.easy_track.getEVMScriptFactories() + assert EASYTRACK_CS_SET_VETTED_GATE_TREE_FACTORY in new_factories, "EasyTrack should have CSSetVettedGateTree factory after vote" + + # Steps 66-67: Validate EasyTrack factories for validator exit request hashes + assert EASYTRACK_SDVT_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY in new_factories, "EasyTrack should have SDVT validator exit request hashes factory after vote" + assert EASYTRACK_CURATED_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY in new_factories, "EasyTrack should have Curated validator exit request hashes factory after vote" + + # --- VALIDATE EVENTS --- + + voting_events = group_voting_events_from_receipt(vote_tx) + dg_execution_events = group_dg_events_from_receipt(dg_tx, timelock=TIMELOCK, admin_executor=DUAL_GOVERNANCE_EXECUTORS[0]) + + # Validate voting events structure + assert len(voting_events) == 4, "Unexpected number of voting events" + dg_voting_event, dg_bypass_voting_event1, dg_bypass_voting_event2, dg_bypass_voting_event3 = voting_events + + # Validate DG execution events structure + assert len(dg_execution_events) == 66, "Unexpected number of dual governance events" + + + # Main DG voting event validation + validate_dual_governance_submit_event( + dg_voting_event, + proposal_id, + proposer=VOTING, + executor=DUAL_GOVERNANCE_EXECUTORS[0], + ) + + # Validate EasyTrack bypass events for new factories + validate_evmscript_factory_added_event( + event=dg_bypass_voting_event1, + p=EVMScriptFactoryAdded( + factory_addr=EASYTRACK_CS_SET_VETTED_GATE_TREE_FACTORY, + permissions=create_permissions(interface.CSVettedGate(CS_VETTED_GATE_ADDRESS), "setTreeParams") + ), + emitted_by=contracts.easy_track, + ) + + validate_evmscript_factory_added_event( + event=dg_bypass_voting_event2, + p=EVMScriptFactoryAdded( + factory_addr=EASYTRACK_SDVT_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY, + permissions=create_permissions(contracts.validators_exit_bus_oracle, "submitExitRequestsHash") + ), + emitted_by=contracts.easy_track, + ) + + validate_evmscript_factory_added_event( + event=dg_bypass_voting_event3, + p=EVMScriptFactoryAdded( + factory_addr=EASYTRACK_CURATED_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY, + permissions=create_permissions(contracts.validators_exit_bus_oracle, "submitExitRequestsHash") + ), + emitted_by=contracts.easy_track, + ) + + # === DG EXECUTION EVENTS VALIDATION === + + # 0. Lido Locator upgrade events + validate_proxy_upgrade_event(dg_execution_events[0], LIDO_LOCATOR_IMPL, emitted_by=contracts.lido_locator) + + # 1. VEBO upgrade events + validate_proxy_upgrade_event(dg_execution_events[1], VALIDATORS_EXIT_BUS_ORACLE_IMPL, emitted_by=contracts.validators_exit_bus_oracle) + + # 2. VEBO finalize upgrade events + validate_contract_version_set_event(dg_execution_events[2], version=2, emitted_by=contracts.validators_exit_bus_oracle) + assert 'ExitRequestsLimitSet' in dg_execution_events[2], "ExitRequestsLimitSet event not found" + assert dg_execution_events[2]['ExitRequestsLimitSet'][0]['maxExitRequestsLimit'] == 11200, "Wrong maxExitRequestsLimit" + assert dg_execution_events[2]['ExitRequestsLimitSet'][0]['exitsPerFrame'] == 1, "Wrong exitsPerFrame" + assert dg_execution_events[2]['ExitRequestsLimitSet'][0]['frameDurationInSec'] == 48, "Wrong frameDurationInSec" + + # 3. Grant VEBO MANAGE_CONSENSUS_VERSION_ROLE to Agent + validate_role_grant_event( + dg_execution_events[3], + role_hash=web3.keccak(text="MANAGE_CONSENSUS_VERSION_ROLE").hex(), + account=contracts.agent.address, + emitted_by=contracts.validators_exit_bus_oracle + ) + + # 4. Set VEBO consensus version to 4 + validate_consensus_version_set_event( + dg_execution_events[4], + new_version=4, + prev_version=3, + emitted_by=contracts.validators_exit_bus_oracle + ) + + # 5. Revoke VEBO MANAGE_CONSENSUS_VERSION_ROLE from Agent + validate_role_revoke_event( + dg_execution_events[5], + role_hash=web3.keccak(text="MANAGE_CONSENSUS_VERSION_ROLE").hex(), + account=contracts.agent.address, + emitted_by=contracts.validators_exit_bus_oracle + ) + + # 6. Grant VEBO SUBMIT_REPORT_HASH_ROLE to EasyTrack executor + validate_role_grant_event( + dg_execution_events[6], + role_hash=web3.keccak(text="SUBMIT_REPORT_HASH_ROLE").hex(), + account=EASYTRACK_EVMSCRIPT_EXECUTOR, + emitted_by=contracts.validators_exit_bus_oracle + ) + + # 7. Grant TWG ADD_FULL_WITHDRAWAL_REQUEST_ROLE to CS Ejector + validate_role_grant_event( + dg_execution_events[7], + role_hash=web3.keccak(text="ADD_FULL_WITHDRAWAL_REQUEST_ROLE").hex(), + account=CS_EJECTOR_ADDRESS, + emitted_by=triggerable_withdrawals_gateway + ) + + # 8. Grant TWG ADD_FULL_WITHDRAWAL_REQUEST_ROLE to VEBO + validate_role_grant_event( + dg_execution_events[8], + role_hash=web3.keccak(text="ADD_FULL_WITHDRAWAL_REQUEST_ROLE").hex(), + account=contracts.validators_exit_bus_oracle.address, + emitted_by=triggerable_withdrawals_gateway + ) + + # 9. Connect TWG to Dual Governance tiebreaker + assert 'SealableWithdrawalBlockerAdded' in dg_execution_events[9], "SealableWithdrawalBlockerAdded event not found" + assert dg_execution_events[9]['SealableWithdrawalBlockerAdded'][0]['sealable'] == TRIGGERABLE_WITHDRAWALS_GATEWAY, "Wrong sealableWithdrawalBlocker" + + # 10. Update WithdrawalVault implementation + validate_proxy_upgrade_event(dg_execution_events[10], WITHDRAWAL_VAULT_IMPL, emitted_by=contracts.withdrawal_vault) + + # 11. Call finalizeUpgrade_v2 on WithdrawalVault + validate_contract_version_set_event(dg_execution_events[11], version=2, emitted_by=contracts.withdrawal_vault) + + # 12. Update AO implementation + validate_proxy_upgrade_event(dg_execution_events[12], ACCOUNTING_ORACLE_IMPL, emitted_by=contracts.accounting_oracle) + + # 13. Grant AO MANAGE_CONSENSUS_VERSION_ROLE to the AGENT + validate_role_grant_event( + dg_execution_events[13], + role_hash=web3.keccak(text="MANAGE_CONSENSUS_VERSION_ROLE").hex(), + account=contracts.agent.address, + emitted_by=contracts.accounting_oracle + ) + + # 14. Bump AO consensus version to 4 + validate_consensus_version_set_event( + dg_execution_events[14], + new_version=4, + prev_version=3, + emitted_by=contracts.accounting_oracle + ) + + # 15. Revoke AO MANAGE_CONSENSUS_VERSION_ROLE from the AGENT + validate_role_revoke_event( + dg_execution_events[15], + role_hash=web3.keccak(text="MANAGE_CONSENSUS_VERSION_ROLE").hex(), + account=contracts.agent.address, + emitted_by=contracts.accounting_oracle + ) + + # 16. Call finalizeUpgrade_v3() on AO + validate_contract_version_set_event(dg_execution_events[16], version=3, emitted_by=contracts.accounting_oracle) + + # 17. Update SR implementation + validate_proxy_upgrade_event(dg_execution_events[17], STAKING_ROUTER_IMPL, emitted_by=contracts.staking_router) + + # 18. Call finalizeUpgrade_v3() on SR + validate_contract_version_set_event(dg_execution_events[18], version=3, emitted_by=contracts.staking_router) + + # 19. Grant SR REPORT_VALIDATOR_EXITING_STATUS_ROLE to ValidatorExitVerifier + validate_role_grant_event( + dg_execution_events[19], + role_hash=web3.keccak(text="REPORT_VALIDATOR_EXITING_STATUS_ROLE").hex(), + account=VALIDATOR_EXIT_VERIFIER, + emitted_by=contracts.staking_router + ) + + # 20. Grant SR REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE to TWG + validate_role_grant_event( + dg_execution_events[20], + role_hash=web3.keccak(text="REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE").hex(), + account=triggerable_withdrawals_gateway.address, + emitted_by=contracts.staking_router + ) + + # 21. Grant APP_MANAGER_ROLE on Kernel to Voting + assert 'SetPermission' in dg_execution_events[21] + assert dg_execution_events[21]['SetPermission'][0]['allowed'] is True + + # 22. Set new implementation for NOR + assert 'SetApp' in dg_execution_events[22] + + # 23. Finalize upgrade for NOR + validate_contract_version_set_event(dg_execution_events[23], version=4, emitted_by=contracts.node_operators_registry) + assert 'ExitDeadlineThresholdChanged' in dg_execution_events[23] + assert dg_execution_events[23]['ExitDeadlineThresholdChanged'][0]['threshold'] == NOR_EXIT_DEADLINE_IN_SEC + + # 24. Set new implementation for sDVT + assert 'SetApp' in dg_execution_events[24] + + # 25. Finalize upgrade for sDVT + validate_contract_version_set_event(dg_execution_events[25], version=4, emitted_by=contracts.simple_dvt) + assert 'ExitDeadlineThresholdChanged' in dg_execution_events[25] + assert dg_execution_events[25]['ExitDeadlineThresholdChanged'][0]['threshold'] == NOR_EXIT_DEADLINE_IN_SEC + + # 26. Revoke APP_MANAGER_ROLE on Kernel from Voting + assert 'SetPermission' in dg_execution_events[26] + assert dg_execution_events[26]['SetPermission'][0]['allowed'] is False + + # 27. Grant CONFIG_MANAGER_ROLE on OracleDaemonConfig to Agent + validate_role_grant_event( + dg_execution_events[27], + role_hash=contracts.oracle_daemon_config.CONFIG_MANAGER_ROLE().hex(), + account=contracts.agent.address, + emitted_by=contracts.oracle_daemon_config + ) + + # 28. Unset NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP + assert 'ConfigValueUnset' in dg_execution_events[28] + assert 'NODE_OPERATOR_NETWORK_PENETRATION_THRESHOLD_BP' in dg_execution_events[28]['ConfigValueUnset'][0]['key'] + + # 29. Unset VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS + assert 'ConfigValueUnset' in dg_execution_events[29] + assert 'VALIDATOR_DELAYED_TIMEOUT_IN_SLOTS' in dg_execution_events[29]['ConfigValueUnset'][0]['key'] + + # 30. Unset VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS + assert 'ConfigValueUnset' in dg_execution_events[30] + assert 'VALIDATOR_DELINQUENT_TIMEOUT_IN_SLOTS' in dg_execution_events[30]['ConfigValueUnset'][0]['key'] + + # 31. Set EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS + assert 'ConfigValueSet' in dg_execution_events[31] + assert 'EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS' in dg_execution_events[31]['ConfigValueSet'][0]['key'] + assert convert.to_int(dg_execution_events[31]['ConfigValueSet'][0]['value']) == EXIT_EVENTS_LOOKBACK_WINDOW_IN_SLOTS + + # 32. Revoke CONFIG_MANAGER_ROLE from the AGENT + validate_role_revoke_event( + dg_execution_events[32], + role_hash=contracts.oracle_daemon_config.CONFIG_MANAGER_ROLE().hex(), + account=contracts.agent.address, + emitted_by=contracts.oracle_daemon_config + ) + + # 33. CSM implementation upgrade + validate_proxy_upgrade_event(dg_execution_events[33], CSM_IMPL_V2_ADDRESS, emitted_by=contracts.csm) + + # 34. CSM finalize upgrade validation + assert 'Initialized' in dg_execution_events[34] + assert dg_execution_events[34]['Initialized'][0]['version'] == CSM_V2_VERSION + + # 35. CSAccounting implementation upgrade + validate_proxy_upgrade_event(dg_execution_events[35], CS_ACCOUNTING_IMPL_V2_ADDRESS, emitted_by=contracts.cs_accounting) + + # 36. CSAccounting finalize upgrade with bond curves + assert 'BondCurveAdded' in dg_execution_events[36] + assert len(dg_execution_events[36]['BondCurveAdded']) == len(CS_CURVES) + assert 'Initialized' in dg_execution_events[36] + assert dg_execution_events[36]['Initialized'][0]['version'] == CS_ACCOUNTING_V2_VERSION + + # 37. CSFeeOracle implementation upgrade + validate_proxy_upgrade_event(dg_execution_events[37], CS_FEE_ORACLE_IMPL_V2_ADDRESS, emitted_by=contracts.cs_fee_oracle) + + # 38. CSFeeOracle finalize upgrade with consensus version + validate_consensus_version_set_event(dg_execution_events[38], new_version=3, prev_version=2, emitted_by=contracts.cs_fee_oracle) + validate_contract_version_set_event(dg_execution_events[38], version=CS_FEE_ORACLE_V2_VERSION, emitted_by=contracts.cs_fee_oracle) + + # 39. CSFeeDistributor implementation upgrade + validate_proxy_upgrade_event(dg_execution_events[39], CS_FEE_DISTRIBUTOR_IMPL_V2_ADDRESS, emitted_by=contracts.cs_fee_distributor) + + # 40. CSFeeDistributor finalize upgrade + assert 'RebateRecipientSet' in dg_execution_events[40] + assert 'Initialized' in dg_execution_events[40] + assert dg_execution_events[40]['Initialized'][0]['version'] == CS_FEE_DISTRIBUTOR_V2_VERSION + + # 41. Revoke SET_BOND_CURVE_ROLE from CSM on CSAccounting + validate_role_revoke_event( + dg_execution_events[41], + role_hash=contracts.cs_accounting.SET_BOND_CURVE_ROLE().hex(), + account=contracts.csm.address, + emitted_by=contracts.cs_accounting + ) + + # 42. Revoke RESET_BOND_CURVE_ROLE from CSM on CSAccounting + validate_role_revoke_event( + dg_execution_events[42], + role_hash=web3.keccak(text="RESET_BOND_CURVE_ROLE").hex(), + account=contracts.csm.address, + emitted_by=contracts.cs_accounting + ) + + # 43. Revoke RESET_BOND_CURVE_ROLE from CSM committee on CSAccounting + validate_role_revoke_event( + dg_execution_events[43], + role_hash=web3.keccak(text="RESET_BOND_CURVE_ROLE").hex(), + account=CSM_COMMITTEE_MS, + emitted_by=contracts.cs_accounting + ) + + # 44. Grant CREATE_NODE_OPERATOR_ROLE to permissionless gate on CSM + validate_role_grant_event( + dg_execution_events[44], + role_hash=contracts.csm.CREATE_NODE_OPERATOR_ROLE().hex(), + account=CS_PERMISSIONLESS_GATE_ADDRESS, + emitted_by=contracts.csm + ) + + # 45. Grant CREATE_NODE_OPERATOR_ROLE to vetted gate on CSM + validate_role_grant_event( + dg_execution_events[45], + role_hash=contracts.csm.CREATE_NODE_OPERATOR_ROLE().hex(), + account=CS_VETTED_GATE_ADDRESS, + emitted_by=contracts.csm + ) + + # 46. Grant SET_BOND_CURVE_ROLE to vetted gate on CSAccounting + validate_role_grant_event( + dg_execution_events[46], + role_hash=contracts.cs_accounting.SET_BOND_CURVE_ROLE().hex(), + account=CS_VETTED_GATE_ADDRESS, + emitted_by=contracts.cs_accounting + ) + + # 47. Revoke VERIFIER_ROLE from old verifier on CSM + validate_role_revoke_event( + dg_execution_events[47], + role_hash=contracts.csm.VERIFIER_ROLE().hex(), + account=contracts.cs_verifier.address, + emitted_by=contracts.csm + ) + + # 48. Grant VERIFIER_ROLE to new verifier on CSM + validate_role_grant_event( + dg_execution_events[48], + role_hash=contracts.csm.VERIFIER_ROLE().hex(), + account=CS_VERIFIER_V2_ADDRESS, + emitted_by=contracts.csm + ) + + # 49. Revoke PAUSE_ROLE from old GateSeal on CSM + validate_role_revoke_event( + dg_execution_events[49], + role_hash=contracts.csm.PAUSE_ROLE().hex(), + account=CS_GATE_SEAL_ADDRESS, + emitted_by=contracts.csm + ) + + # 50. Revoke PAUSE_ROLE from old GateSeal on CSAccounting + validate_role_revoke_event( + dg_execution_events[50], + role_hash=contracts.cs_accounting.PAUSE_ROLE().hex(), + account=CS_GATE_SEAL_ADDRESS, + emitted_by=contracts.cs_accounting + ) + + # 51. Revoke PAUSE_ROLE from old GateSeal on CSFeeOracle + validate_role_revoke_event( + dg_execution_events[51], + role_hash=contracts.cs_fee_oracle.PAUSE_ROLE().hex(), + account=CS_GATE_SEAL_ADDRESS, + emitted_by=contracts.cs_fee_oracle + ) + + # 52. Grant PAUSE_ROLE to new GateSeal on CSM + validate_role_grant_event( + dg_execution_events[52], + role_hash=contracts.csm.PAUSE_ROLE().hex(), + account=CS_GATE_SEAL_V2_ADDRESS, + emitted_by=contracts.csm + ) + + # 53. Grant PAUSE_ROLE to new GateSeal on CSAccounting + validate_role_grant_event( + dg_execution_events[53], + role_hash=contracts.cs_accounting.PAUSE_ROLE().hex(), + account=CS_GATE_SEAL_V2_ADDRESS, + emitted_by=contracts.cs_accounting + ) + + # 54. Grant PAUSE_ROLE to new GateSeal on CSFeeOracle + validate_role_grant_event( + dg_execution_events[54], + role_hash=contracts.cs_fee_oracle.PAUSE_ROLE().hex(), + account=CS_GATE_SEAL_V2_ADDRESS, + emitted_by=contracts.cs_fee_oracle + ) + + # 55. Grant MANAGE_BOND_CURVES_ROLE to agent on CSAccounting + validate_role_grant_event( + dg_execution_events[55], + role_hash=contracts.cs_accounting.MANAGE_BOND_CURVES_ROLE().hex(), + account=contracts.agent.address, + emitted_by=contracts.cs_accounting + ) + + # 56. Add ICS bond curve + ics_curve_id = len(CS_CURVES) + validate_bond_curve_added_event(dg_execution_events[56], curve_id=ics_curve_id, emitted_by=contracts.cs_accounting) + + # 57. Revoke MANAGE_BOND_CURVES_ROLE from agent on CSAccounting + validate_role_revoke_event( + dg_execution_events[57], + role_hash=contracts.cs_accounting.MANAGE_BOND_CURVES_ROLE().hex(), + account=contracts.agent.address, + emitted_by=contracts.cs_accounting + ) + + # 58. Increase CSM share in Staking Router + validate_staking_module_update_event( + dg_execution_events[58], + module_id=CS_MODULE_ID, + share_limit=CS_MODULE_NEW_TARGET_SHARE_BP, + priority_share_threshold=CS_MODULE_NEW_PRIORITY_EXIT_THRESHOLD_BP, + module_fee_points_bp=CS_MODULE_MODULE_FEE_BP, + treasury_fee_points_bp=CS_MODULE_TREASURY_FEE_BP, + max_deposits_per_block=CS_MODULE_MAX_DEPOSITS_PER_BLOCK, + min_deposit_block_distance=CS_MODULE_MIN_DEPOSIT_BLOCK_DISTANCE, + emitted_by=contracts.staking_router + ) + + # 59-65. Gate Seals and ResealManager role updates + # 59. Revoke PAUSE_ROLE on WithdrawalQueue from the old GateSeal + validate_role_revoke_event( + dg_execution_events[59], + role_hash=contracts.withdrawal_queue.PAUSE_ROLE().hex(), + account=OLD_GATE_SEAL_ADDRESS, + emitted_by=contracts.withdrawal_queue + ) + + # 60. Revoke PAUSE_ROLE on ValidatorsExitBusOracle from the old GateSeal + validate_role_revoke_event( + dg_execution_events[60], + role_hash=contracts.validators_exit_bus_oracle.PAUSE_ROLE().hex(), + account=OLD_GATE_SEAL_ADDRESS, + emitted_by=contracts.validators_exit_bus_oracle + ) + + # 61. Grant PAUSE_ROLE on WithdrawalQueue to the new WithdrawalQueue GateSeal + validate_role_grant_event( + dg_execution_events[61], + role_hash=contracts.withdrawal_queue.PAUSE_ROLE().hex(), + account=NEW_WQ_GATE_SEAL, + emitted_by=contracts.withdrawal_queue + ) + + # 62. Grant PAUSE_ROLE on ValidatorsExitBusOracle to the new Triggerable Withdrawals GateSeal + validate_role_grant_event( + dg_execution_events[62], + role_hash=contracts.validators_exit_bus_oracle.PAUSE_ROLE().hex(), + account=NEW_TW_GATE_SEAL, + emitted_by=contracts.validators_exit_bus_oracle + ) + + # 63. Grant PAUSE_ROLE on TriggerableWithdrawalsGateway to the new Triggerable Withdrawals GateSeal + validate_role_grant_event( + dg_execution_events[63], + role_hash=triggerable_withdrawals_gateway.PAUSE_ROLE().hex(), + account=NEW_TW_GATE_SEAL, + emitted_by=triggerable_withdrawals_gateway + ) + + # 64. Grant PAUSE_ROLE on TriggerableWithdrawalsGateway to ResealManager + validate_role_grant_event( + dg_execution_events[64], + role_hash=triggerable_withdrawals_gateway.PAUSE_ROLE().hex(), + account=RESEAL_MANAGER, + emitted_by=triggerable_withdrawals_gateway + ) + + # 65. Grant RESUME_ROLE on TriggerableWithdrawalsGateway to ResealManager + validate_role_grant_event( + dg_execution_events[65], + role_hash=triggerable_withdrawals_gateway.RESUME_ROLE().hex(), + account=RESEAL_MANAGER, + emitted_by=triggerable_withdrawals_gateway + ) diff --git a/archive/tests/test_vote_tw_upgrade_verifier_hoodi.py b/archive/tests/test_vote_tw_upgrade_verifier_hoodi.py new file mode 100644 index 000000000..e29493748 --- /dev/null +++ b/archive/tests/test_vote_tw_upgrade_verifier_hoodi.py @@ -0,0 +1,151 @@ +from typing import Optional +from archive.scripts.vote_tw_upgrade_verifier_hoodi import start_vote, OLD_VALIDATOR_EXIT_VERIFIER, LIDO_LOCATOR_IMPL +from brownie import interface, chain, convert, web3 # type: ignore +from brownie.network.event import EventDict +from utils.test.tx_tracing_helpers import group_voting_events_from_receipt, group_dg_events_from_receipt +from utils.test.event_validators.dual_governance import validate_dual_governance_submit_event +from utils.dual_governance import wait_for_noon_utc_to_satisfy_time_constrains +from utils.config import ( + DUAL_GOVERNANCE, + TIMELOCK, + DUAL_GOVERNANCE_EXECUTORS, + LDO_HOLDER_ADDRESS_FOR_TESTS, + VOTING, + contracts, +) + + +def validate_role_grant_event(event: EventDict, role_hash: str, account: str, emitted_by: Optional[str] = None): + """Validates an OpenZeppelin AccessControl role grant event""" + assert "RoleGranted" in event, "No RoleGranted event found" + assert event["RoleGranted"][0]["role"] == role_hash, f"Wrong role hash. Expected: {role_hash}, Got: {event['RoleGranted'][0]['role']}" + assert event["RoleGranted"][0]["account"] == convert.to_address(account), f"Wrong account. Expected: {account}, Got: {event['RoleGranted'][0]['account']}" + + if emitted_by is not None: + assert convert.to_address(event["RoleGranted"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_role_revoke_event(event: EventDict, role_hash: str, account: str, emitted_by: Optional[str] = None): + """Validates an OpenZeppelin AccessControl role revoke event""" + assert "RoleRevoked" in event, "No RoleRevoked event found" + assert event["RoleRevoked"][0]["role"] == role_hash, f"Wrong role hash. Expected: {role_hash}, Got: {event['RoleRevoked'][0]['role']}" + assert event["RoleRevoked"][0]["account"] == convert.to_address(account), f"Wrong account. Expected: {account}, Got: {event['RoleRevoked'][0]['account']}" + + if emitted_by is not None: + assert convert.to_address(event["RoleRevoked"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_proxy_upgrade_event(event: EventDict, expected_implementation: str, emitted_by: Optional[str] = None): + """Validates Upgraded event from OssifiableProxy""" + assert "Upgraded" in event, "No Upgraded event found" + assert event["Upgraded"][0]["implementation"] == convert.to_address(expected_implementation), f"Wrong implementation. Expected: {expected_implementation}, Got: {event['Upgraded'][0]['implementation']}" + + if emitted_by is not None: + assert convert.to_address(event["Upgraded"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def test_vote_tw_upgrade_verifier_hoodi(helpers, accounts, vote_ids_from_env, stranger): + """Test the TW upgrade validator exit verifier vote that upgrades locator and manages validator roles""" + + # Calculate role hash + REPORT_VALIDATOR_EXITING_STATUS_ROLE = web3.keccak(text="REPORT_VALIDATOR_EXITING_STATUS_ROLE") + + # Get contracts + staking_router = interface.StakingRouter(contracts.staking_router) + lido_locator_proxy = interface.OssifiableProxy(contracts.lido_locator) + timelock = interface.EmergencyProtectedTimelock(TIMELOCK) + dual_governance = interface.DualGovernance(DUAL_GOVERNANCE) + + # Check initial state + initial_implementation = lido_locator_proxy.proxy__getImplementation() + + # Check role states before vote + old_verifier_has_role_before = staking_router.hasRole(REPORT_VALIDATOR_EXITING_STATUS_ROLE, OLD_VALIDATOR_EXIT_VERIFIER) + new_verifier_has_role_before = staking_router.hasRole(REPORT_VALIDATOR_EXITING_STATUS_ROLE, contracts.validator_exit_verifier) + + print(f"Initial Lido Locator implementation: {initial_implementation}") + print(f"Old validator exit verifier ({OLD_VALIDATOR_EXIT_VERIFIER}) has role before vote: {old_verifier_has_role_before}") + print(f"New validator exit verifier ({contracts.validator_exit_verifier}) has role before vote: {new_verifier_has_role_before}") + + # START VOTE + if len(vote_ids_from_env) > 0: + (vote_id,) = vote_ids_from_env + else: + tx_params = {"from": LDO_HOLDER_ADDRESS_FOR_TESTS} + vote_id, _ = start_vote(tx_params, silent=True) + + vote_tx = helpers.execute_vote(accounts, vote_id, contracts.voting) + print(f"voteId = {vote_id}") + + proposal_id = vote_tx.events["ProposalSubmitted"][1]["proposalId"] + print(f"proposalId = {proposal_id}") + + chain.sleep(timelock.getAfterSubmitDelay() + 1) + dual_governance.scheduleProposal(proposal_id, {"from": stranger}) + + chain.sleep(timelock.getAfterScheduleDelay() + 1) + wait_for_noon_utc_to_satisfy_time_constrains() + + dg_tx = timelock.execute(proposal_id, {"from": stranger}) + + # --- VALIDATE EXECUTION RESULTS --- + + # 1. Verify Lido Locator was upgraded + final_implementation = lido_locator_proxy.proxy__getImplementation() + assert final_implementation == LIDO_LOCATOR_IMPL, f"Locator implementation not upgraded. Expected: {LIDO_LOCATOR_IMPL}, Got: {final_implementation}" + assert final_implementation != initial_implementation, "Implementation should have changed" + + # 2. Verify validator roles were updated + new_verifier_has_role_after = staking_router.hasRole(REPORT_VALIDATOR_EXITING_STATUS_ROLE, contracts.validator_exit_verifier) + old_verifier_has_role_after = staking_router.hasRole(REPORT_VALIDATOR_EXITING_STATUS_ROLE, OLD_VALIDATOR_EXIT_VERIFIER) + + assert new_verifier_has_role_after, f"New verifier ({contracts.validator_exit_verifier}) should have role after vote" + assert not old_verifier_has_role_after, f"Old verifier ({OLD_VALIDATOR_EXIT_VERIFIER}) should not have role after vote" + + # --- VALIDATE EVENTS --- + voting_events = group_voting_events_from_receipt(vote_tx) + assert len(voting_events) >= 1, "No voting events found" + + validate_dual_governance_submit_event( + voting_events[0], + proposal_id, + proposer=VOTING, + executor=DUAL_GOVERNANCE_EXECUTORS[0], + ) + + dg_execution_events = group_dg_events_from_receipt(dg_tx, timelock=TIMELOCK, admin_executor=DUAL_GOVERNANCE_EXECUTORS[0]) + expected_events = 3 # 1 proxy upgrade + 1 role grant + 1 role revoke + assert len(dg_execution_events) == expected_events, f"Expected {expected_events} dual governance events, got {len(dg_execution_events)}" + + event_idx = 0 + + # Step 1: Upgrade Lido Locator implementation + validate_proxy_upgrade_event( + dg_execution_events[event_idx], + expected_implementation=LIDO_LOCATOR_IMPL, + emitted_by=contracts.lido_locator + ) + event_idx += 1 + + # Step 2: Grant REPORT_VALIDATOR_EXITING_STATUS_ROLE to new validator exit verifier + validate_role_grant_event( + dg_execution_events[event_idx], + role_hash=REPORT_VALIDATOR_EXITING_STATUS_ROLE.hex(), + account=contracts.validator_exit_verifier, + emitted_by=contracts.staking_router + ) + event_idx += 1 + + # Step 3: Revoke REPORT_VALIDATOR_EXITING_STATUS_ROLE from old validator exit verifier + validate_role_revoke_event( + dg_execution_events[event_idx], + role_hash=REPORT_VALIDATOR_EXITING_STATUS_ROLE.hex(), + account=OLD_VALIDATOR_EXIT_VERIFIER, + emitted_by=contracts.staking_router + ) + + print("✅ Vote executed successfully:") + print(f" - Lido Locator upgraded from {initial_implementation} to {LIDO_LOCATOR_IMPL}") + print(f" - REPORT_VALIDATOR_EXITING_STATUS_ROLE granted to new verifier: {contracts.validator_exit_verifier}") + print(f" - REPORT_VALIDATOR_EXITING_STATUS_ROLE revoked from old verifier: {OLD_VALIDATOR_EXIT_VERIFIER}") + print(f" - All {expected_events} events validated correctly") diff --git a/archive/tests/test_vote_update_sandbox_impl_holesky.py b/archive/tests/test_vote_update_sandbox_impl_holesky.py new file mode 100644 index 000000000..f793f50cd --- /dev/null +++ b/archive/tests/test_vote_update_sandbox_impl_holesky.py @@ -0,0 +1,137 @@ +from typing import Optional +from scripts.vote_update_sandbox_impl_holesky import start_vote +from brownie import interface, chain, convert, web3 # type: ignore +from brownie.network.event import EventDict +from utils.test.tx_tracing_helpers import group_voting_events_from_receipt, group_dg_events_from_receipt +from utils.test.event_validators.dual_governance import validate_dual_governance_submit_event +from utils.dual_governance import wait_for_noon_utc_to_satisfy_time_constrains +from utils.config import ( + DUAL_GOVERNANCE, + TIMELOCK, + DUAL_GOVERNANCE_EXECUTORS, + LDO_HOLDER_ADDRESS_FOR_TESTS, + ARAGON_KERNEL, + AGENT, + VOTING, + contracts, +) + +# Implementation address from vote script +NODE_OPERATORS_REGISTRY_IMPL = "0x834aa47DCd21A32845099a78B4aBb17A7f0bD503" +NOR_EXIT_DEADLINE_IN_SEC = 172800 +SANDBOX_APP_ID = "0x85d2fceef13a6c14c43527594f79fb91a8ef8f15024a43486efac8df2b11e632" + +def validate_role_grant_event(event: EventDict, role_name: str, account: str, emitted_by: Optional[str] = None): + """Validates a permission grant event from ACL""" + assert "SetPermission" in event, "No SetPermission event found" + assert event["SetPermission"][0]["allowed"] is True, "Permission was not granted" + assert event["SetPermission"][0]["entity"] == convert.to_address(account), "Wrong account" + + role_hash = convert.to_uint(web3.keccak(text=role_name)) + assert convert.to_uint(event["SetPermission"][0]["role"]) == role_hash, "Wrong role hash" + + if emitted_by is not None: + assert convert.to_address(event["SetPermission"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_role_revoke_event(event: EventDict, role_name: str, account: str, emitted_by: Optional[str] = None): + """Validates a permission revoke event from ACL""" + assert "SetPermission" in event, "No SetPermission event found" + assert event["SetPermission"][0]["allowed"] is False, "Permission was not revoked" + assert event["SetPermission"][0]["entity"] == convert.to_address(account), "Wrong account" + + role_hash = convert.to_uint(web3.keccak(text=role_name)) + assert convert.to_uint(event["SetPermission"][0]["role"]) == role_hash, "Wrong role hash" + + if emitted_by is not None: + assert convert.to_address(event["SetPermission"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_app_set_event(event: EventDict, app_id: str, app_addr: str, emitted_by: Optional[str] = None): + """Validates SetApp event from Kernel""" + assert "SetApp" in event, "No SetApp event found" + + app_id_bytes = bytes.fromhex(app_id.replace('0x', '')) + assert event["SetApp"][0]["appId"] == app_id_bytes, "Wrong app ID" + assert event["SetApp"][0]["appAddress"] == app_addr, "Wrong app address" + + if emitted_by is not None: + assert convert.to_address(event["SetApp"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_contract_version_set_event(event: EventDict, version: int, emitted_by: Optional[str] = None): + assert "ContractVersionSet" in event, "No ContractVersionSet event found" + assert event["ContractVersionSet"][0]["version"] == version, "Wrong version" + if emitted_by is not None: + assert convert.to_address(event["ContractVersionSet"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def test_vote_update_sandbox_impl(helpers, accounts, vote_ids_from_env, stranger): + # Save original state for comparison + app_manager_role = web3.keccak(text="APP_MANAGER_ROLE") + + # Check initial state + assert not contracts.acl.hasPermission(AGENT, ARAGON_KERNEL, app_manager_role), "AGENT should not have APP_MANAGER_ROLE before upgrade" + + # Get sandbox contract + sandbox = interface.NodeOperatorsRegistry(contracts.sandbox) + + # Check initial sandbox version + assert sandbox.getContractVersion() < 4, "Sandbox module version should be less than 4 before upgrade" + + # Get current implementation + base_namespace = contracts.kernel.APP_BASES_NAMESPACE() + sandbox_impl_before = contracts.kernel.getApp(base_namespace, SANDBOX_APP_ID) + assert sandbox_impl_before.lower() != NODE_OPERATORS_REGISTRY_IMPL.lower(), "Sandbox implementation should be different before upgrade" + + timelock = interface.EmergencyProtectedTimelock(TIMELOCK) + dual_governance = interface.DualGovernance(DUAL_GOVERNANCE) + + # START VOTE + if len(vote_ids_from_env) > 0: + (vote_id,) = vote_ids_from_env + else: + tx_params = {"from": LDO_HOLDER_ADDRESS_FOR_TESTS} + vote_id, _ = start_vote(tx_params, silent=True) + + vote_tx = helpers.execute_vote(accounts, vote_id, contracts.voting) + print(f"voteId = {vote_id}") + + proposal_id = vote_tx.events["ProposalSubmitted"][1]["proposalId"] + print(f"proposalId = {proposal_id}") + + chain.sleep(timelock.getAfterSubmitDelay() + 1) + dual_governance.scheduleProposal(proposal_id, {"from": stranger}) + + chain.sleep(timelock.getAfterScheduleDelay() + 1) + wait_for_noon_utc_to_satisfy_time_constrains() + + dg_tx = timelock.execute(proposal_id, {"from": stranger}) + + # --- VALIDATE EXECUTION RESULTS --- + + # 1. Verify APP_MANAGER_ROLE was granted and then revoked (final state is revoked) + assert not contracts.acl.hasPermission(AGENT, ARAGON_KERNEL, app_manager_role), "AGENT should not have APP_MANAGER_ROLE after upgrade" + + # 2. Verify Sandbox implementation was updated + sandbox_impl_after = contracts.kernel.getApp(base_namespace, SANDBOX_APP_ID) + assert sandbox_impl_after.lower() == NODE_OPERATORS_REGISTRY_IMPL.lower(), "Sandbox implementation should be updated" + + # 3. Verify finalizeUpgrade_v4 was called + assert sandbox.getContractVersion() == 4, "Sandbox module version should be 4 after upgrade" + assert sandbox.exitDeadlineThreshold(0) == NOR_EXIT_DEADLINE_IN_SEC, "Sandbox exit deadline threshold should be set correctly" + + # --- VALIDATE EVENTS --- + voting_events = group_voting_events_from_receipt(vote_tx) + assert len(voting_events) >= 1, "No voting events found" + + validate_dual_governance_submit_event( + voting_events[0], + proposal_id, + proposer=VOTING, + executor=DUAL_GOVERNANCE_EXECUTORS[0], + ) + + dg_execution_events = group_dg_events_from_receipt(dg_tx, timelock=TIMELOCK, admin_executor=DUAL_GOVERNANCE_EXECUTORS[0]) + assert len(dg_execution_events) == 4, "Unexpected number of dual governance events" + diff --git a/archive/tests/test_vote_update_sandbox_impl_hoodi.py b/archive/tests/test_vote_update_sandbox_impl_hoodi.py new file mode 100644 index 000000000..e1bccbe84 --- /dev/null +++ b/archive/tests/test_vote_update_sandbox_impl_hoodi.py @@ -0,0 +1,179 @@ +from typing import Optional +from scripts.vote_update_sandbox_impl_hoodi import start_vote +from brownie import interface, chain, convert, web3 # type: ignore +from brownie.network.event import EventDict +from utils.test.tx_tracing_helpers import group_voting_events_from_receipt, group_dg_events_from_receipt +from utils.test.event_validators.dual_governance import validate_dual_governance_submit_event +from utils.dual_governance import wait_for_noon_utc_to_satisfy_time_constrains +from utils.config import ( + DUAL_GOVERNANCE, + TIMELOCK, + DUAL_GOVERNANCE_EXECUTORS, + LDO_HOLDER_ADDRESS_FOR_TESTS, + ARAGON_KERNEL, + AGENT, + VOTING, + contracts, +) + +# Implementation address from vote script +NODE_OPERATORS_REGISTRY_IMPL = "0x95F00b016bB31b7182D96D25074684518246E42a" +NOR_EXIT_DEADLINE_IN_SEC = 172800 +SANDBOX_APP_ID = "0x85d2fceef13a6c14c43527594f79fb91a8ef8f15024a43486efac8df2b11e632" + +def validate_role_grant_event(event: EventDict, role_name: str, account: str, emitted_by: Optional[str] = None): + """Validates a permission grant event from ACL""" + assert "SetPermission" in event, "No SetPermission event found" + assert event["SetPermission"][0]["allowed"] is True, "Permission was not granted" + assert event["SetPermission"][0]["entity"] == convert.to_address(account), "Wrong account" + + role_hash = convert.to_uint(web3.keccak(text=role_name)) + assert convert.to_uint(event["SetPermission"][0]["role"]) == role_hash, "Wrong role hash" + + if emitted_by is not None: + assert convert.to_address(event["SetPermission"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_role_revoke_event(event: EventDict, role_name: str, account: str, emitted_by: Optional[str] = None): + """Validates a permission revoke event from ACL""" + assert "SetPermission" in event, "No SetPermission event found" + assert event["SetPermission"][0]["allowed"] is False, "Permission was not revoked" + assert event["SetPermission"][0]["entity"] == convert.to_address(account), "Wrong account" + + role_hash = convert.to_uint(web3.keccak(text=role_name)) + assert convert.to_uint(event["SetPermission"][0]["role"]) == role_hash, "Wrong role hash" + + if emitted_by is not None: + assert convert.to_address(event["SetPermission"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_app_set_event(event: EventDict, app_id: str, app_addr: str, emitted_by: Optional[str] = None): + """Validates SetApp event from Kernel""" + assert "SetApp" in event, "No SetApp event found" + + # Convert event appId to hex string for comparison + actual_app_id = event["SetApp"][0]["appId"] + if isinstance(actual_app_id, bytes): + actual_app_id_hex = "0x" + actual_app_id.hex() + else: + actual_app_id_hex = str(actual_app_id) + + expected_app_id = app_id.lower() + assert actual_app_id_hex.lower() == expected_app_id, f"Wrong app ID: expected {expected_app_id}, got {actual_app_id_hex.lower()}" + assert convert.to_address(event["SetApp"][0]["app"]) == convert.to_address(app_addr), "Wrong app address" + + if emitted_by is not None: + assert convert.to_address(event["SetApp"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def validate_contract_version_set_event(event: EventDict, version: int, emitted_by: Optional[str] = None): + assert "ContractVersionSet" in event, "No ContractVersionSet event found" + assert event["ContractVersionSet"][0]["version"] == version, "Wrong version" + if emitted_by is not None: + assert convert.to_address(event["ContractVersionSet"][0]["_emitted_by"]) == convert.to_address(emitted_by), "Wrong event emitter" + + +def test_vote_update_sandbox_impl(helpers, accounts, vote_ids_from_env, stranger): + # Save original state for comparison + app_manager_role = web3.keccak(text="APP_MANAGER_ROLE") + + # Check initial state + assert not contracts.acl.hasPermission(AGENT, ARAGON_KERNEL, app_manager_role), "AGENT should not have APP_MANAGER_ROLE before upgrade" + + # Get sandbox contract + sandbox = interface.NodeOperatorsRegistry(contracts.sandbox) + + # Check initial sandbox version + assert sandbox.getContractVersion() < 4, "Sandbox module version should be less than 4 before upgrade" + + # Get current implementation + base_namespace = contracts.kernel.APP_BASES_NAMESPACE() + sandbox_impl_before = contracts.kernel.getApp(base_namespace, SANDBOX_APP_ID) + assert sandbox_impl_before.lower() != NODE_OPERATORS_REGISTRY_IMPL.lower(), "Sandbox implementation should be different before upgrade" + + timelock = interface.EmergencyProtectedTimelock(TIMELOCK) + dual_governance = interface.DualGovernance(DUAL_GOVERNANCE) + + # START VOTE + if len(vote_ids_from_env) > 0: + (vote_id,) = vote_ids_from_env + else: + tx_params = {"from": LDO_HOLDER_ADDRESS_FOR_TESTS} + vote_id, _ = start_vote(tx_params, silent=True) + + vote_tx = helpers.execute_vote(accounts, vote_id, contracts.voting) + print(f"voteId = {vote_id}") + + proposal_id = vote_tx.events["ProposalSubmitted"][1]["proposalId"] + print(f"proposalId = {proposal_id}") + + chain.sleep(timelock.getAfterSubmitDelay() + 1) + dual_governance.scheduleProposal(proposal_id, {"from": stranger}) + + chain.sleep(timelock.getAfterScheduleDelay() + 1) + wait_for_noon_utc_to_satisfy_time_constrains() + + dg_tx = timelock.execute(proposal_id, {"from": stranger}) + + # --- VALIDATE EXECUTION RESULTS --- + + # 1. Verify APP_MANAGER_ROLE was granted and then revoked (final state is revoked) + assert not contracts.acl.hasPermission(AGENT, ARAGON_KERNEL, app_manager_role), "AGENT should not have APP_MANAGER_ROLE after upgrade" + + # 2. Verify Sandbox implementation was updated + sandbox_impl_after = contracts.kernel.getApp(base_namespace, SANDBOX_APP_ID) + assert sandbox_impl_after.lower() == NODE_OPERATORS_REGISTRY_IMPL.lower(), "Sandbox implementation should be updated" + + # 3. Verify finalizeUpgrade_v4 was called + assert sandbox.getContractVersion() == 4, "Sandbox module version should be 4 after upgrade" + assert sandbox.exitDeadlineThreshold(0) == NOR_EXIT_DEADLINE_IN_SEC, "Sandbox exit deadline threshold should be set correctly" + + # --- VALIDATE EVENTS --- + voting_events = group_voting_events_from_receipt(vote_tx) + assert len(voting_events) >= 1, "No voting events found" + + validate_dual_governance_submit_event( + voting_events[0], + proposal_id, + proposer=VOTING, + executor=DUAL_GOVERNANCE_EXECUTORS[0], + ) + + dg_execution_events = group_dg_events_from_receipt(dg_tx, timelock=TIMELOCK, admin_executor=DUAL_GOVERNANCE_EXECUTORS[0]) + assert len(dg_execution_events) == 4, "Unexpected number of dual governance events" + + # 0. Grant APP_MANAGER_ROLE to AGENT + validate_role_grant_event( + dg_execution_events[0], + "APP_MANAGER_ROLE", + AGENT, + emitted_by=contracts.acl + ) + + # 1. Update Sandbox Module implementation + validate_app_set_event( + dg_execution_events[1], + SANDBOX_APP_ID, + NODE_OPERATORS_REGISTRY_IMPL, + emitted_by=contracts.kernel + ) + + # 2. Call finalizeUpgrade_v4 on Sandbox Module + validate_contract_version_set_event( + dg_execution_events[2], + version=4, + emitted_by=contracts.sandbox + ) + + # Check that ExitDeadlineThresholdChanged event was emitted + assert 'ExitDeadlineThresholdChanged' in dg_execution_events[2], "ExitDeadlineThresholdChanged event not found" + assert dg_execution_events[2]['ExitDeadlineThresholdChanged'][0]['threshold'] == NOR_EXIT_DEADLINE_IN_SEC, "Wrong exit deadline threshold" + + # 3. Revoke APP_MANAGER_ROLE from AGENT + validate_role_revoke_event( + dg_execution_events[3], + "APP_MANAGER_ROLE", + AGENT, + emitted_by=contracts.acl + ) + diff --git a/configs/config_holesky.py b/configs/config_holesky.py index 6927fc841..77c3bbfdc 100644 --- a/configs/config_holesky.py +++ b/configs/config_holesky.py @@ -110,7 +110,7 @@ # GateSeal GATE_SEAL_FACTORY = "0x1134F7077055b0B3559BE52AfeF9aA22A0E1eEC2" -GATE_SEAL = "0x7f6FA688d4C12a2d51936680b241f3B0F0F9ca60" +GATE_SEAL = "0xAE6eCd77DCC656c5533c4209454Fd56fB46e1778" GATE_SEAL_PAUSE_DURATION = 518400 # 6 days GATE_SEAL_EXPIRY_TIMESTAMP = 1714521600 # 2024-05-01 00:00GMT GATE_SEAL_COMMITTEE = "0x6165267E76D609465640bffc158aff7905D47B46" @@ -134,14 +134,35 @@ SANDBOX_IMPL = "0x605A3AFadF35A8a8fa4f4Cd4fe34a09Bbcea7718" +CS_MODULE_ID = 4 +CS_MODULE_NAME = "Community Staking" +CS_MODULE_MODULE_FEE_BP = 700 +CS_MODULE_TREASURY_FEE_BP = 300 +CS_MODULE_TARGET_SHARE_BP = 1500 +CS_MODULE_PRIORITY_EXIT_SHARE_THRESHOLD = 2000 +CS_MODULE_MAX_DEPOSITS_PER_BLOCK = 30 +CS_MODULE_MIN_DEPOSIT_BLOCK_DISTANCE = 25 +CSM_COMMITTEE_MS = "0xc4DAB3a3ef68C6DFd8614a870D64D475bA44F164" # EOA CSM_ADDRESS = "0x4562c3e63c2e586cD1651B958C22F88135aCAd4f" CS_ACCOUNTING_ADDRESS = "0xc093e53e8F4b55A223c18A2Da6fA00e60DD5EFE1" CS_ORACLE_HASH_CONSENSUS_ADDRESS = "0xbF38618Ea09B503c1dED867156A0ea276Ca1AE37" CS_EARLY_ADOPTION_ADDRESS = "0x71E92eA77C198a770d9f33A03277DbeB99989660" CS_FEE_DISTRIBUTOR_ADDRESS = "0xD7ba648C8F72669C6aE649648B516ec03D07c8ED" CS_FEE_ORACLE_ADDRESS = "0xaF57326C7d513085051b50912D51809ECC5d98Ee" -CS_GATE_SEAL_ADDRESS = "0x41F2677fae0222cF1f08Cd1c0AAa607B469654Ce" +CS_GATE_SEAL_ADDRESS = "0xf1C03536dbC77B1bD493a2D1C0b1831Ea78B540a" CS_VERIFIER_ADDRESS = "0xc099dfd61f6e5420e0ca7e84d820daad17fc1d44" CS_ORACLE_EPOCHS_PER_FRAME = 225 * 7 # 7 days CS_VERIFIER_ADDRESS_OLD = "0x6FDAA094227CF8E1593f9fB9C1b867C1f846F916" + +# DUAL_GOVERNANCE +DUAL_GOVERNANCE = "0x490bf377734CA134A8E207525E8576745652212e" +TIMELOCK = "0xe9c5FfEAd0668AFdBB9aac16163840d649DB76DD" +DUAL_GOVERNANCE_ADMIN_EXECUTOR = "0x8BD0a916faDa88Ba3accb595a3Acd28F467130e8" +DUAL_GOVERNANCE_EXECUTORS = [DUAL_GOVERNANCE_ADMIN_EXECUTOR] +RESEAL_MANAGER = "0x9dE2273f9f1e81145171CcA927EFeE7aCC64c9fb" +DAO_EMERGENCY_GOVERNANCE = "0x46c6C7E1Cc438456d658Eed61A764a475abDa0C1" +AGENT_MANAGER = "0xc807d4036B400dE8f6cD2aDbd8d9cf9a3a01CC30" +TIME_CONSTRAINTS = "0x4D36598EA14bd70a1040CF59ABF6f9439afBf5d9" +ROLES_VALIDATOR = "0xf532fC0a18D3339A52b3f1152FcA9925De5855AA" +ALLOWED_TOKENS_REGISTRY = "0x091C0eC8B4D54a9fcB36269B5D5E5AF43309e666" diff --git a/configs/config_hoodi.py b/configs/config_hoodi.py index b433e0d0a..417ec86e0 100644 --- a/configs/config_hoodi.py +++ b/configs/config_hoodi.py @@ -1,10 +1,8 @@ -ACCOUNTING_ORACLE = "0xcb883B1bD0a41512b42D2dB267F2A2cd919FB216" -VALIDATORS_EXIT_BUS_ORACLE = "0x8664d394C2B3278F26A1B44B967aEf99707eeAB2" -AO_CONSENSUS_VERSION = 3 - +# Ethereum Chain parameters CHAIN_NETWORK_NAME = "hoodi" # DAO +ARAGON_KERNEL = "0xA48DF029Fd2e5FCECB3886c5c2F60e3625A1E87d" LDO_TOKEN = "0xEf2573966D009CcEA0Fc74451dee2193564198dc" # Standard (or forked) Aragon apps @@ -14,14 +12,17 @@ VOTING = "0x49B3512c44891bef83F8967d075121Bd1b07a01B" TOKEN_MANAGER = "0x8ab4a56721Ad8e68c6Ad86F9D9929782A78E39E5" -# Custom Aragon apps +SANDBOX = "0x682E94d2630846a503BDeE8b6810DF71C9806891" +SANDBOX_IMPL = "0x95F00b016bB31b7182D96D25074684518246E42a" +SANDBOX_REPO = "0x89D37eC788988e98BEceB32a8774394F1338B09C" + +# Our custom Aragon apps LIDO = "0x3508A952176b3c15387C97BE809eaffB1982176a" +NODE_OPERATORS_REGISTRY = "0x5cDbE1590c083b5A2A64427fAA63A7cfDB91FbB5" SIMPLE_DVT = "0x0B5236BECA68004DB89434462DfC3BB074d2c830" -CS_FEE_ORACLE_ADDRESS = "0xe7314f561B2e72f9543F1004e741bab6Fc51028B" -CS_VERIFIER_ADDRESS = "0xB6bafBD970a4537077dE59cebE33081d794513d6" -CS_VERIFIER_ADDRESS_OLD = "0x16D0f6068D211608e3703323314aa976a6492D09" -CSM_ADDRESS = "0x79CEf36D84743222f37765204Bec41E92a93E59d" +# Other (non-aragon) protocol contracts +WITHDRAWAL_VAULT = "0x4473dCDDbf77679A643BdB654dbd86D67F8d32f2" # EasyTracks EASYTRACK = "0x284D91a7D47850d21A6DEaaC6E538AC7E5E6fc2a" @@ -29,7 +30,6 @@ EASYTRACK_EVMSCRIPT_EXECUTOR = "0x79a20FD0FA36453B2F45eAbab19bfef43575Ba9E" EASYTRACK_INCREASE_NOP_STAKING_LIMIT_FACTORY = "0x0f121e4069e17a2Dc5bAbF39d769313a1e20f323" EASYTRACK_SIMPLE_DVT_TRUSTED_CALLER = "0xbB958292042c604855d23F8db458855d20e16996" - EASYTRACK_SIMPLE_DVT_ADD_NODE_OPERATORS_FACTORY = "0x42f2532ab3d41dfD6030db1EC2fF3DBC8DCdf89a" EASYTRACK_SIMPLE_DVT_ACTIVATE_NODE_OPERATORS_FACTORY = "0xfA3B3EE204E1f0f165379326768667300992530e" EASYTRACK_SIMPLE_DVT_DEACTIVATE_NODE_OPERATORS_FACTORY = "0x3114bEbC222Faec27DF8AB7f9bD8dF2063d7fc77" @@ -41,11 +41,12 @@ EASYTRACK_MEV_BOOST_ADD_RELAYS_FACTORY = "0xF02DbeaA1Bbc90226CaB995db4C190DbE25983af" EASYTRACK_MEV_BOOST_REMOVE_RELAYS_FACTORY = "0x7FCc2901C6C3D62784cB178B14d44445B038f736" EASYTRACK_MEV_BOOST_EDIT_RELAYS_FACTORY = "0x27A99a7104190DdA297B222104A6C70A4Ca5A17e" +EASYTRACK_SDVT_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY = "0xAa3D6A8B52447F272c1E8FAaA06EA06658bd95E2" +EASYTRACK_CURATED_SUBMIT_VALIDATOR_EXIT_REQUEST_HASHES_FACTORY = "0x397206ecdbdcb1A55A75e60Fc4D054feC72E5f63" +EASYTRACK_CS_SET_VETTED_GATE_TREE_FACTORY = "0xa890fc73e1b771Ee6073e2402E631c312FF92Cd9" # Other RELAY_ALLOWED_LIST = "0x279d3A456212a1294DaEd0faEE98675a52E8A4Bf" - -# Other (non-aragon) protocol contracts WSTETH_TOKEN = "0x7E99eE3C66636DE415D2d7C880938F2f40f94De4" LDO_HOLDER_ADDRESS_FOR_TESTS = "0xD500a8aDB182F55741E267730dfbfb4F1944C205" @@ -55,12 +56,71 @@ "0xc3C65cB7aa6D36F051f875708b8E17f9a0B210eD", ] +# LidoLocator +LIDO_LOCATOR = "0xe2EF9536DAAAEBFf5b1c130957AB3E80056b06D8" + +# NodeOperatorsRegistry aka Curated Staking Module +## see NodeOperatorsRegistry's proxy appId() +NODE_OPERATORS_REGISTRY_ARAGON_APP_ID = "0x7071f283424072341f856ac9e947e7ec0eb68719f757a7e785979b6b8717579d" + +# NodeOperatorsRegistry clone aka SimpleDVT +## see SimpleDVT's proxy appId() +SIMPLE_DVT_ARAGON_APP_ID = "0xe1635b63b5f7b5e545f2a637558a4029dea7905361a2f0fc28c66e9136cf86a4" + +# CSM staking router parameters +CS_MODULE_ID = 4 +CS_MODULE_NAME = "Community Staking" +CS_MODULE_MODULE_FEE_BP = 600 +CS_MODULE_TREASURY_FEE_BP = 400 +CS_MODULE_TARGET_SHARE_BP = 1600 +CS_MODULE_PRIORITY_EXIT_SHARE_THRESHOLD = 2100 +CS_MODULE_MAX_DEPOSITS_PER_BLOCK = 30 +CS_MODULE_MIN_DEPOSIT_BLOCK_DISTANCE = 25 + +# OracleDaemonConfig +ORACLE_DAEMON_CONFIG = "0x2a833402e3F46fFC1ecAb3598c599147a78731a9" + +# AccountingOracle +# and its corresponding HashConsensus +ACCOUNTING_ORACLE = "0xcb883B1bD0a41512b42D2dB267F2A2cd919FB216" +ACCOUNTING_ORACLE_CONSENSUS_VERSION = 4 # updated from 3 to 4 after vote + +# ValidatorsExitBusOracle +VALIDATORS_EXIT_BUS_ORACLE = "0x8664d394C2B3278F26A1B44B967aEf99707eeAB2" +VALIDATORS_EXIT_BUS_CONSENSUS_VERSION = 4 # added after vote + +# CSOracle +CS_ORACLE_EPOCHS_PER_FRAME = 225 * 7 # 7 days +CS_ORACLE_CONSENSUS_VERSION = 3 + # WithdrawalQueueERC721 WITHDRAWAL_QUEUE = "0xfe56573178f1bcdf53F01A6E9977670dcBBD9186" # StakingRouter STAKING_ROUTER = "0xCc820558B39ee15C7C45B59390B503b83fb499A8" +# Triggerable Withdrawals Gateway +TRIGGERABLE_WITHDRAWALS_GATEWAY = "0x6679090D92b08a2a686eF8614feECD8cDFE209db" +VALIDATOR_EXIT_VERIFIER = "0xa5F5A9360275390fF9728262a29384399f38d2f0" + +# CSM addresses +CSM_COMMITTEE_MS = "0x4AF43Ee34a6fcD1fEcA1e1F832124C763561dA53" +CSM_ADDRESS = "0x79CEf36D84743222f37765204Bec41E92a93E59d" +CS_ACCOUNTING_ADDRESS = "0xA54b90BA34C5f326BC1485054080994e38FB4C60" +CS_ORACLE_HASH_CONSENSUS_ADDRESS = "0x54f74a10e4397dDeF85C4854d9dfcA129D72C637" +CS_EARLY_ADOPTION_ADDRESS = "0x3281b9E45518F462E594697f8fba1896a8B43939" +CS_FEE_DISTRIBUTOR_ADDRESS = "0xaCd9820b0A2229a82dc1A0770307ce5522FF3582" +CS_FEE_ORACLE_ADDRESS = "0xe7314f561B2e72f9543F1004e741bab6Fc51028B" +CS_VERIFIER_ADDRESS = "0xf805b3711cBB48F15Ae2bb27095ddC38c5339968" +CS_EJECTOR_ADDRESS = "0x21e271cBa32672B106737AbeB3a45E53Fe9a0df4" +CS_PERMISSIONLESS_GATE_ADDRESS = "0x5553077102322689876A6AdFd48D75014c28acfb" +CS_VETTED_GATE_ADDRESS = "0x10a254E724fe2b7f305F76f3F116a3969c53845f" + +# Gate Seals +CS_GATE_SEAL_ADDRESS = "0x94a3aEB0E9148F64CB453Be2BDe2Bc0148f6AC24" +WITHDRAWAL_QUEUE_GATE_SEAL_ADDRESS = "0x73d76Bd3D589B2b2185c402da82cdAfbc18b958D" +TRIGGERABLE_WITHDRAWALS_GATE_SEAL_ADDRESS = "0x368f2fcb593170823cc844F1B29e75E3d26879A1" + # DualGovernance DUAL_GOVERNANCE = "0x9CAaCCc62c66d817CC59c44780D1b722359795bF" diff --git a/interfaces/AccountingOracle.json b/interfaces/AccountingOracle.json index 069da4f74..35c6e7e9f 100644 --- a/interfaces/AccountingOracle.json +++ b/interfaces/AccountingOracle.json @@ -50,6 +50,22 @@ "name": "CannotSubmitExtraDataBeforeMainData", "type": "error" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "itemIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "dataType", + "type": "uint256" + } + ], + "name": "DeprecatedExtraDataType", + "type": "error" + }, { "inputs": [], "name": "ExtraDataAlreadyProcessed", @@ -334,11 +350,6 @@ "name": "UnexpectedExtraDataItemsCount", "type": "error" }, - { - "inputs": [], - "name": "UnexpectedExtraDataLength", - "type": "error" - }, { "inputs": [ { @@ -834,6 +845,13 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "finalizeUpgrade_v3", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "getConsensusContract", diff --git a/interfaces/CSAccounting.json b/interfaces/CSAccounting.json new file mode 100644 index 000000000..8eaef61dc --- /dev/null +++ b/interfaces/CSAccounting.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"lidoLocator","type":"address","internalType":"address"},{"name":"module","type":"address","internalType":"address"},{"name":"_feeDistributor","type":"address","internalType":"address"},{"name":"maxCurveLength","type":"uint256","internalType":"uint256"},{"name":"minBondLockPeriod","type":"uint256","internalType":"uint256"},{"name":"maxBondLockPeriod","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_BOND_CURVE_ID","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"FEE_DISTRIBUTOR","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSFeeDistributor"}],"stateMutability":"view"},{"type":"function","name":"LIDO","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ILido"}],"stateMutability":"view"},{"type":"function","name":"LIDO_LOCATOR","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ILidoLocator"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_BOND_CURVES_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MAX_BOND_LOCK_PERIOD","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MAX_CURVE_LENGTH","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MIN_BOND_LOCK_PERIOD","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MIN_CURVE_LENGTH","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MODULE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSModule"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_INFINITELY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RECOVERER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RESUME_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"SET_BOND_CURVE_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"WITHDRAWAL_QUEUE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IWithdrawalQueue"}],"stateMutability":"view"},{"type":"function","name":"WSTETH","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IWstETH"}],"stateMutability":"view"},{"type":"function","name":"addBondCurve","inputs":[{"name":"bondCurve","type":"tuple[]","internalType":"struct ICSBondCurve.BondCurveIntervalInput[]","components":[{"name":"minKeysCount","type":"uint256","internalType":"uint256"},{"name":"trend","type":"uint256","internalType":"uint256"}]}],"outputs":[{"name":"id","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"chargeFee","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"chargePenaltyRecipient","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"claimRewardsStETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"stETHAmount","type":"uint256","internalType":"uint256"},{"name":"cumulativeFeeShares","type":"uint256","internalType":"uint256"},{"name":"rewardsProof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"claimedShares","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"claimRewardsUnstETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"stEthAmount","type":"uint256","internalType":"uint256"},{"name":"cumulativeFeeShares","type":"uint256","internalType":"uint256"},{"name":"rewardsProof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"requestId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"claimRewardsWstETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"wstETHAmount","type":"uint256","internalType":"uint256"},{"name":"cumulativeFeeShares","type":"uint256","internalType":"uint256"},{"name":"rewardsProof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"claimedWstETH","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"compensateLockedBondETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"depositETH","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"depositETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"depositStETH","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"stETHAmount","type":"uint256","internalType":"uint256"},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"depositStETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"stETHAmount","type":"uint256","internalType":"uint256"},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"depositWstETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"wstETHAmount","type":"uint256","internalType":"uint256"},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"depositWstETH","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"wstETHAmount","type":"uint256","internalType":"uint256"},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"feeDistributor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSFeeDistributor"}],"stateMutability":"view"},{"type":"function","name":"finalizeUpgradeV2","inputs":[{"name":"bondCurvesInputs","type":"tuple[][]","internalType":"struct ICSBondCurve.BondCurveIntervalInput[][]","components":[{"name":"minKeysCount","type":"uint256","internalType":"uint256"},{"name":"trend","type":"uint256","internalType":"uint256"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getActualLockedBond","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getBond","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getBondAmountByKeysCount","inputs":[{"name":"keys","type":"uint256","internalType":"uint256"},{"name":"curveId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getBondAmountByKeysCountWstETH","inputs":[{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"curveId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getBondCurve","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct ICSBondCurve.BondCurve","components":[{"name":"intervals","type":"tuple[]","internalType":"struct ICSBondCurve.BondCurveInterval[]","components":[{"name":"minKeysCount","type":"uint256","internalType":"uint256"},{"name":"minBond","type":"uint256","internalType":"uint256"},{"name":"trend","type":"uint256","internalType":"uint256"}]}]}],"stateMutability":"view"},{"type":"function","name":"getBondCurveId","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getBondLockPeriod","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getBondShares","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getBondSummary","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"current","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getBondSummaryShares","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"current","type":"uint256","internalType":"uint256"},{"name":"required","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getClaimableBondShares","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getClaimableRewardsAndBondShares","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"cumulativeFeeShares","type":"uint256","internalType":"uint256"},{"name":"rewardsProof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"claimableShares","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getCurveInfo","inputs":[{"name":"curveId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct ICSBondCurve.BondCurve","components":[{"name":"intervals","type":"tuple[]","internalType":"struct ICSBondCurve.BondCurveInterval[]","components":[{"name":"minKeysCount","type":"uint256","internalType":"uint256"},{"name":"minBond","type":"uint256","internalType":"uint256"},{"name":"trend","type":"uint256","internalType":"uint256"}]}]}],"stateMutability":"view"},{"type":"function","name":"getCurvesCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getInitializedVersion","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getKeysCountByBondAmount","inputs":[{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"curveId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getLockedBondInfo","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct ICSBondLock.BondLock","components":[{"name":"amount","type":"uint128","internalType":"uint128"},{"name":"until","type":"uint128","internalType":"uint128"}]}],"stateMutability":"view"},{"type":"function","name":"getRequiredBondForNextKeys","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"additionalKeys","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRequiredBondForNextKeysWstETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"additionalKeys","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getResumeSinceTimestamp","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getUnbondedKeysCount","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getUnbondedKeysCountToEject","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"bondCurve","type":"tuple[]","internalType":"struct ICSBondCurve.BondCurveIntervalInput[]","components":[{"name":"minKeysCount","type":"uint256","internalType":"uint256"},{"name":"trend","type":"uint256","internalType":"uint256"}]},{"name":"admin","type":"address","internalType":"address"},{"name":"bondLockPeriod","type":"uint256","internalType":"uint256"},{"name":"_chargePenaltyRecipient","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isPaused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"lockBondETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"pauseFor","inputs":[{"name":"duration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"penalize","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"pullFeeRewards","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"cumulativeFeeShares","type":"uint256","internalType":"uint256"},{"name":"rewardsProof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC1155","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC20","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC721","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverEther","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverStETHShares","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"releaseLockedBondETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renewBurnerAllowance","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setBondCurve","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"curveId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setBondLockPeriod","inputs":[{"name":"period","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setChargePenaltyRecipient","inputs":[{"name":"_chargePenaltyRecipient","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"settleLockedBondETH","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"applied","type":"bool","internalType":"bool"}],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"totalBondShares","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"updateBondCurve","inputs":[{"name":"curveId","type":"uint256","internalType":"uint256"},{"name":"bondCurve","type":"tuple[]","internalType":"struct ICSBondCurve.BondCurveIntervalInput[]","components":[{"name":"minKeysCount","type":"uint256","internalType":"uint256"},{"name":"trend","type":"uint256","internalType":"uint256"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"BondBurned","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toBurnAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"burnedAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BondCharged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"toChargeAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"chargedAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BondClaimedStETH","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BondClaimedUnstETH","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"requestId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BondClaimedWstETH","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"to","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BondCurveAdded","inputs":[{"name":"curveId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"bondCurveIntervals","type":"tuple[]","indexed":false,"internalType":"struct ICSBondCurve.BondCurveIntervalInput[]","components":[{"name":"minKeysCount","type":"uint256","internalType":"uint256"},{"name":"trend","type":"uint256","internalType":"uint256"}]}],"anonymous":false},{"type":"event","name":"BondCurveSet","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"curveId","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BondCurveUpdated","inputs":[{"name":"curveId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"bondCurveIntervals","type":"tuple[]","indexed":false,"internalType":"struct ICSBondCurve.BondCurveIntervalInput[]","components":[{"name":"minKeysCount","type":"uint256","internalType":"uint256"},{"name":"trend","type":"uint256","internalType":"uint256"}]}],"anonymous":false},{"type":"event","name":"BondDepositedETH","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"from","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BondDepositedStETH","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"from","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BondDepositedWstETH","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"from","type":"address","indexed":false,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BondLockChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"newAmount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"until","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BondLockCompensated","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BondLockPeriodChanged","inputs":[{"name":"period","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"BondLockRemoved","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ChargePenaltyRecipientSet","inputs":[{"name":"chargePenaltyRecipient","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ERC1155Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC20Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC721Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EtherRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"duration","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Resumed","inputs":[],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StETHSharesRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"ElRewardsVaultReceiveFailed","inputs":[]},{"type":"error","name":"FailedToSendEther","inputs":[]},{"type":"error","name":"InvalidBondCurveId","inputs":[]},{"type":"error","name":"InvalidBondCurveLength","inputs":[]},{"type":"error","name":"InvalidBondCurveMaxLength","inputs":[]},{"type":"error","name":"InvalidBondCurveValues","inputs":[]},{"type":"error","name":"InvalidBondCurvesLength","inputs":[]},{"type":"error","name":"InvalidBondLockAmount","inputs":[]},{"type":"error","name":"InvalidBondLockPeriod","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"InvalidInitializationCurveId","inputs":[]},{"type":"error","name":"NodeOperatorDoesNotExist","inputs":[]},{"type":"error","name":"NotAllowedToRecover","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"NothingToClaim","inputs":[]},{"type":"error","name":"PauseUntilMustBeInFuture","inputs":[]},{"type":"error","name":"PausedExpected","inputs":[]},{"type":"error","name":"ResumedExpected","inputs":[]},{"type":"error","name":"SafeCastOverflowedUintDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"SenderIsNotEligible","inputs":[]},{"type":"error","name":"SenderIsNotModule","inputs":[]},{"type":"error","name":"ZeroAdminAddress","inputs":[]},{"type":"error","name":"ZeroChargePenaltyRecipientAddress","inputs":[]},{"type":"error","name":"ZeroFeeDistributorAddress","inputs":[]},{"type":"error","name":"ZeroLocatorAddress","inputs":[]},{"type":"error","name":"ZeroModuleAddress","inputs":[]},{"type":"error","name":"ZeroPauseDuration","inputs":[]}] diff --git a/interfaces/csm/CSEarlyAdoption.json b/interfaces/CSEarlyAdoption.json similarity index 100% rename from interfaces/csm/CSEarlyAdoption.json rename to interfaces/CSEarlyAdoption.json diff --git a/interfaces/CSEjector.json b/interfaces/CSEjector.json new file mode 100644 index 000000000..c27efed2b --- /dev/null +++ b/interfaces/CSEjector.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"module","type":"address","internalType":"address"},{"name":"strikes","type":"address","internalType":"address"},{"name":"twg","type":"address","internalType":"address"},{"name":"stakingModuleId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MODULE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSModule"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_INFINITELY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RESUME_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"STAKING_MODULE_ID","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"STRIKES","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"STRIKES_EXIT_TYPE_ID","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"TWG","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ITriggerableWithdrawalsGateway"}],"stateMutability":"view"},{"type":"function","name":"VOLUNTARY_EXIT_TYPE_ID","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"ejectBadPerformer","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keyIndex","type":"uint256","internalType":"uint256"},{"name":"refundRecipient","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"getResumeSinceTimestamp","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"admin","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isPaused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"pauseFor","inputs":[{"name":"duration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"voluntaryEject","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"startFrom","type":"uint256","internalType":"uint256"},{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"refundRecipient","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"voluntaryEjectByArray","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keyIndices","type":"uint256[]","internalType":"uint256[]"},{"name":"refundRecipient","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"payable"},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"duration","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Resumed","inputs":[],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AlreadyWithdrawn","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NodeOperatorDoesNotExist","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"PauseUntilMustBeInFuture","inputs":[]},{"type":"error","name":"PausedExpected","inputs":[]},{"type":"error","name":"ResumedExpected","inputs":[]},{"type":"error","name":"SenderIsNotEligible","inputs":[]},{"type":"error","name":"SenderIsNotStrikes","inputs":[]},{"type":"error","name":"SigningKeysInvalidOffset","inputs":[]},{"type":"error","name":"ZeroAdminAddress","inputs":[]},{"type":"error","name":"ZeroModuleAddress","inputs":[]},{"type":"error","name":"ZeroPauseDuration","inputs":[]},{"type":"error","name":"ZeroStrikesAddress","inputs":[]},{"type":"error","name":"ZeroTWGAddress","inputs":[]}] diff --git a/interfaces/CSExitPenalties.json b/interfaces/CSExitPenalties.json new file mode 100644 index 000000000..e45976af2 --- /dev/null +++ b/interfaces/CSExitPenalties.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"module","type":"address","internalType":"address"},{"name":"parametersRegistry","type":"address","internalType":"address"},{"name":"strikes","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"ACCOUNTING","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSAccounting"}],"stateMutability":"view"},{"type":"function","name":"MODULE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSModule"}],"stateMutability":"view"},{"type":"function","name":"PARAMETERS_REGISTRY","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSParametersRegistry"}],"stateMutability":"view"},{"type":"function","name":"STRIKES","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"STRIKES_EXIT_TYPE_ID","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"VOLUNTARY_EXIT_TYPE_ID","inputs":[],"outputs":[{"name":"","type":"uint8","internalType":"uint8"}],"stateMutability":"view"},{"type":"function","name":"getExitPenaltyInfo","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"publicKey","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"tuple","internalType":"struct ExitPenaltyInfo","components":[{"name":"delayPenalty","type":"tuple","internalType":"struct MarkedUint248","components":[{"name":"value","type":"uint248","internalType":"uint248"},{"name":"isValue","type":"bool","internalType":"bool"}]},{"name":"strikesPenalty","type":"tuple","internalType":"struct MarkedUint248","components":[{"name":"value","type":"uint248","internalType":"uint248"},{"name":"isValue","type":"bool","internalType":"bool"}]},{"name":"withdrawalRequestFee","type":"tuple","internalType":"struct MarkedUint248","components":[{"name":"value","type":"uint248","internalType":"uint248"},{"name":"isValue","type":"bool","internalType":"bool"}]}]}],"stateMutability":"view"},{"type":"function","name":"isValidatorExitDelayPenaltyApplicable","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"publicKey","type":"bytes","internalType":"bytes"},{"name":"eligibleToExitInSec","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"processExitDelayReport","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"publicKey","type":"bytes","internalType":"bytes"},{"name":"eligibleToExitInSec","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"processStrikesReport","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"publicKey","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"processTriggeredExit","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"publicKey","type":"bytes","internalType":"bytes"},{"name":"withdrawalRequestPaidFee","type":"uint256","internalType":"uint256"},{"name":"exitType","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"StrikesPenaltyProcessed","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"pubkey","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"strikesPenalty","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"TriggeredExitFeeRecorded","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"exitType","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"pubkey","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"withdrawalRequestFee","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ValidatorExitDelayProcessed","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"pubkey","type":"bytes","indexed":false,"internalType":"bytes"},{"name":"delayPenalty","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"SafeCastOverflowedUintDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"SenderIsNotModule","inputs":[]},{"type":"error","name":"SenderIsNotStrikes","inputs":[]},{"type":"error","name":"ValidatorExitDelayAlreadyReported","inputs":[]},{"type":"error","name":"ValidatorExitDelayNotApplicable","inputs":[]},{"type":"error","name":"ZeroAccountingAddress","inputs":[]},{"type":"error","name":"ZeroModuleAddress","inputs":[]},{"type":"error","name":"ZeroParametersRegistryAddress","inputs":[]},{"type":"error","name":"ZeroStrikesAddress","inputs":[]}] diff --git a/interfaces/CSFeeDistributor.json b/interfaces/CSFeeDistributor.json new file mode 100644 index 000000000..e5f46981c --- /dev/null +++ b/interfaces/CSFeeDistributor.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"stETH","type":"address","internalType":"address"},{"name":"accounting","type":"address","internalType":"address"},{"name":"oracle","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"ACCOUNTING","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"ORACLE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"RECOVERER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"STETH","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IStETH"}],"stateMutability":"view"},{"type":"function","name":"distributeFees","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"sharesToDistribute","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"distributedShares","inputs":[{"name":"","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"distributionDataHistoryCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"finalizeUpgradeV2","inputs":[{"name":"_rebateRecipient","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getFeesToDistribute","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"shares","type":"uint256","internalType":"uint256"},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"sharesToDistribute","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getHistoricalDistributionData","inputs":[{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct ICSFeeDistributor.DistributionData","components":[{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"treeRoot","type":"bytes32","internalType":"bytes32"},{"name":"treeCid","type":"string","internalType":"string"},{"name":"logCid","type":"string","internalType":"string"},{"name":"distributed","type":"uint256","internalType":"uint256"},{"name":"rebate","type":"uint256","internalType":"uint256"}]}],"stateMutability":"view"},{"type":"function","name":"getInitializedVersion","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"hashLeaf","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"shares","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"pure"},{"type":"function","name":"initialize","inputs":[{"name":"admin","type":"address","internalType":"address"},{"name":"_rebateRecipient","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"logCid","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"pendingSharesToDistribute","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"processOracleReport","inputs":[{"name":"_treeRoot","type":"bytes32","internalType":"bytes32"},{"name":"_treeCid","type":"string","internalType":"string"},{"name":"_logCid","type":"string","internalType":"string"},{"name":"distributed","type":"uint256","internalType":"uint256"},{"name":"rebate","type":"uint256","internalType":"uint256"},{"name":"refSlot","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"rebateRecipient","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"recoverERC1155","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC20","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC721","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverEther","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setRebateRecipient","inputs":[{"name":"_rebateRecipient","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"totalClaimableShares","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"treeCid","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"treeRoot","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"event","name":"DistributionDataUpdated","inputs":[{"name":"totalClaimableShares","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"treeRoot","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"treeCid","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"DistributionLogUpdated","inputs":[{"name":"logCid","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"ERC1155Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC20Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC721Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EtherRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"ModuleFeeDistributed","inputs":[{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"OperatorFeeDistributed","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RebateRecipientSet","inputs":[{"name":"recipient","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RebateTransferred","inputs":[{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StETHSharesRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"FailedToSendEther","inputs":[]},{"type":"error","name":"FeeSharesDecrease","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"InvalidLogCID","inputs":[]},{"type":"error","name":"InvalidProof","inputs":[]},{"type":"error","name":"InvalidReportData","inputs":[]},{"type":"error","name":"InvalidShares","inputs":[]},{"type":"error","name":"InvalidTreeCid","inputs":[]},{"type":"error","name":"InvalidTreeRoot","inputs":[]},{"type":"error","name":"NotAccounting","inputs":[]},{"type":"error","name":"NotAllowedToRecover","inputs":[]},{"type":"error","name":"NotEnoughShares","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"NotOracle","inputs":[]},{"type":"error","name":"ZeroAccountingAddress","inputs":[]},{"type":"error","name":"ZeroAdminAddress","inputs":[]},{"type":"error","name":"ZeroOracleAddress","inputs":[]},{"type":"error","name":"ZeroRebateRecipientAddress","inputs":[]},{"type":"error","name":"ZeroStEthAddress","inputs":[]}] diff --git a/interfaces/CSFeeOracle.json b/interfaces/CSFeeOracle.json new file mode 100644 index 000000000..6d13c0c2c --- /dev/null +++ b/interfaces/CSFeeOracle.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"feeDistributor","type":"address","internalType":"address"},{"name":"strikes","type":"address","internalType":"address"},{"name":"secondsPerSlot","type":"uint256","internalType":"uint256"},{"name":"genesisTime","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"FEE_DISTRIBUTOR","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSFeeDistributor"}],"stateMutability":"view"},{"type":"function","name":"GENESIS_TIME","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_CONSENSUS_CONTRACT_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_CONSENSUS_VERSION_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_INFINITELY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RECOVERER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RESUME_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"SECONDS_PER_SLOT","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"STRIKES","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSStrikes"}],"stateMutability":"view"},{"type":"function","name":"SUBMIT_DATA_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"discardConsensusReport","inputs":[{"name":"refSlot","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"finalizeUpgradeV2","inputs":[{"name":"consensusVersion","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getConsensusContract","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getConsensusReport","inputs":[],"outputs":[{"name":"hash","type":"bytes32","internalType":"bytes32"},{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"processingDeadlineTime","type":"uint256","internalType":"uint256"},{"name":"processingStarted","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getConsensusVersion","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getContractVersion","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getLastProcessingRefSlot","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getResumeSinceTimestamp","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"admin","type":"address","internalType":"address"},{"name":"consensusContract","type":"address","internalType":"address"},{"name":"consensusVersion","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isPaused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"pauseFor","inputs":[{"name":"duration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"pauseUntil","inputs":[{"name":"pauseUntilInclusive","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC1155","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC20","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC721","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverEther","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setConsensusContract","inputs":[{"name":"addr","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setConsensusVersion","inputs":[{"name":"version","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"submitConsensusReport","inputs":[{"name":"reportHash","type":"bytes32","internalType":"bytes32"},{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"submitReportData","inputs":[{"name":"data","type":"tuple","internalType":"struct ICSFeeOracle.ReportData","components":[{"name":"consensusVersion","type":"uint256","internalType":"uint256"},{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"treeRoot","type":"bytes32","internalType":"bytes32"},{"name":"treeCid","type":"string","internalType":"string"},{"name":"logCid","type":"string","internalType":"string"},{"name":"distributed","type":"uint256","internalType":"uint256"},{"name":"rebate","type":"uint256","internalType":"uint256"},{"name":"strikesTreeRoot","type":"bytes32","internalType":"bytes32"},{"name":"strikesTreeCid","type":"string","internalType":"string"}]},{"name":"contractVersion","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"ConsensusHashContractSet","inputs":[{"name":"addr","type":"address","indexed":true,"internalType":"address"},{"name":"prevAddr","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ConsensusVersionSet","inputs":[{"name":"version","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"prevVersion","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ContractVersionSet","inputs":[{"name":"version","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC1155Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC20Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC721Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EtherRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"duration","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ProcessingStarted","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"hash","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"ReportDiscarded","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"hash","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"ReportSubmitted","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"hash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"processingDeadlineTime","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Resumed","inputs":[],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StETHSharesRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"WarnProcessingMissed","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AddressCannotBeSame","inputs":[]},{"type":"error","name":"AddressCannotBeZero","inputs":[]},{"type":"error","name":"FailedToSendEther","inputs":[]},{"type":"error","name":"HashCannotBeZero","inputs":[]},{"type":"error","name":"InitialRefSlotCannotBeLessThanProcessingOne","inputs":[{"name":"initialRefSlot","type":"uint256","internalType":"uint256"},{"name":"processingRefSlot","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"InvalidContractVersion","inputs":[]},{"type":"error","name":"InvalidContractVersionIncrement","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"NoConsensusReportToProcess","inputs":[]},{"type":"error","name":"NonZeroContractVersionOnInit","inputs":[]},{"type":"error","name":"NotAllowedToRecover","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"PauseUntilMustBeInFuture","inputs":[]},{"type":"error","name":"PausedExpected","inputs":[]},{"type":"error","name":"ProcessingDeadlineMissed","inputs":[{"name":"deadline","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"RefSlotAlreadyProcessing","inputs":[]},{"type":"error","name":"RefSlotCannotDecrease","inputs":[{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"prevRefSlot","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"RefSlotMustBeGreaterThanProcessingOne","inputs":[{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"processingRefSlot","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ResumedExpected","inputs":[]},{"type":"error","name":"SafeCastOverflowedUintDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"SecondsPerSlotCannotBeZero","inputs":[]},{"type":"error","name":"SenderIsNotTheConsensusContract","inputs":[]},{"type":"error","name":"SenderNotAllowed","inputs":[]},{"type":"error","name":"UnexpectedChainConfig","inputs":[]},{"type":"error","name":"UnexpectedConsensusVersion","inputs":[{"name":"expectedVersion","type":"uint256","internalType":"uint256"},{"name":"receivedVersion","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnexpectedContractVersion","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"received","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"UnexpectedDataHash","inputs":[{"name":"consensusHash","type":"bytes32","internalType":"bytes32"},{"name":"receivedHash","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"UnexpectedRefSlot","inputs":[{"name":"consensusRefSlot","type":"uint256","internalType":"uint256"},{"name":"dataRefSlot","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"VersionCannotBeSame","inputs":[]},{"type":"error","name":"VersionCannotBeZero","inputs":[]},{"type":"error","name":"ZeroAdminAddress","inputs":[]},{"type":"error","name":"ZeroFeeDistributorAddress","inputs":[]},{"type":"error","name":"ZeroPauseDuration","inputs":[]},{"type":"error","name":"ZeroStrikesAddress","inputs":[]}] diff --git a/interfaces/CSHashConsensus.json b/interfaces/CSHashConsensus.json new file mode 100644 index 000000000..bb18bbdca --- /dev/null +++ b/interfaces/CSHashConsensus.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"slotsPerEpoch","type":"uint256","internalType":"uint256"},{"name":"secondsPerSlot","type":"uint256","internalType":"uint256"},{"name":"genesisTime","type":"uint256","internalType":"uint256"},{"name":"epochsPerFrame","type":"uint256","internalType":"uint256"},{"name":"fastLaneLengthSlots","type":"uint256","internalType":"uint256"},{"name":"admin","type":"address","internalType":"address"},{"name":"reportProcessor","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"DISABLE_CONSENSUS_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_FAST_LANE_CONFIG_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_FRAME_CONFIG_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_MEMBERS_AND_QUORUM_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MANAGE_REPORT_PROCESSOR_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"addMember","inputs":[{"name":"addr","type":"address","internalType":"address"},{"name":"quorum","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"disableConsensus","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getChainConfig","inputs":[],"outputs":[{"name":"slotsPerEpoch","type":"uint256","internalType":"uint256"},{"name":"secondsPerSlot","type":"uint256","internalType":"uint256"},{"name":"genesisTime","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getConsensusState","inputs":[],"outputs":[{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"consensusReport","type":"bytes32","internalType":"bytes32"},{"name":"isReportProcessing","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getConsensusStateForMember","inputs":[{"name":"addr","type":"address","internalType":"address"}],"outputs":[{"name":"result","type":"tuple","internalType":"struct HashConsensus.MemberConsensusState","components":[{"name":"currentFrameRefSlot","type":"uint256","internalType":"uint256"},{"name":"currentFrameConsensusReport","type":"bytes32","internalType":"bytes32"},{"name":"isMember","type":"bool","internalType":"bool"},{"name":"isFastLane","type":"bool","internalType":"bool"},{"name":"canReport","type":"bool","internalType":"bool"},{"name":"lastMemberReportRefSlot","type":"uint256","internalType":"uint256"},{"name":"currentFrameMemberReport","type":"bytes32","internalType":"bytes32"}]}],"stateMutability":"view"},{"type":"function","name":"getCurrentFrame","inputs":[],"outputs":[{"name":"refSlot","type":"uint256","internalType":"uint256"},{"name":"reportProcessingDeadlineSlot","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getFastLaneMembers","inputs":[],"outputs":[{"name":"addresses","type":"address[]","internalType":"address[]"},{"name":"lastReportedRefSlots","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getFrameConfig","inputs":[],"outputs":[{"name":"initialEpoch","type":"uint256","internalType":"uint256"},{"name":"epochsPerFrame","type":"uint256","internalType":"uint256"},{"name":"fastLaneLengthSlots","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getInitialRefSlot","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getIsFastLaneMember","inputs":[{"name":"addr","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getIsMember","inputs":[{"name":"addr","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getMembers","inputs":[],"outputs":[{"name":"addresses","type":"address[]","internalType":"address[]"},{"name":"lastReportedRefSlots","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getQuorum","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getReportProcessor","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getReportVariants","inputs":[],"outputs":[{"name":"variants","type":"bytes32[]","internalType":"bytes32[]"},{"name":"support","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"removeMember","inputs":[{"name":"addr","type":"address","internalType":"address"},{"name":"quorum","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFastLaneLengthSlots","inputs":[{"name":"fastLaneLengthSlots","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setFrameConfig","inputs":[{"name":"epochsPerFrame","type":"uint256","internalType":"uint256"},{"name":"fastLaneLengthSlots","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setQuorum","inputs":[{"name":"quorum","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setReportProcessor","inputs":[{"name":"newProcessor","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"submitReport","inputs":[{"name":"slot","type":"uint256","internalType":"uint256"},{"name":"report","type":"bytes32","internalType":"bytes32"},{"name":"consensusVersion","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"updateInitialEpoch","inputs":[{"name":"initialEpoch","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"ConsensusLost","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ConsensusReached","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"report","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"support","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"FastLaneConfigSet","inputs":[{"name":"fastLaneLengthSlots","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"FrameConfigSet","inputs":[{"name":"newInitialEpoch","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newEpochsPerFrame","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"MemberAdded","inputs":[{"name":"addr","type":"address","indexed":true,"internalType":"address"},{"name":"newTotalMembers","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newQuorum","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"MemberRemoved","inputs":[{"name":"addr","type":"address","indexed":true,"internalType":"address"},{"name":"newTotalMembers","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"newQuorum","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"QuorumSet","inputs":[{"name":"newQuorum","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"totalMembers","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"prevQuorum","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ReportProcessorSet","inputs":[{"name":"processor","type":"address","indexed":true,"internalType":"address"},{"name":"prevProcessor","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"ReportReceived","inputs":[{"name":"refSlot","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"member","type":"address","indexed":true,"internalType":"address"},{"name":"report","type":"bytes32","indexed":false,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AddressCannotBeZero","inputs":[]},{"type":"error","name":"AdminCannotBeZero","inputs":[]},{"type":"error","name":"ConsensusReportAlreadyProcessing","inputs":[]},{"type":"error","name":"DuplicateMember","inputs":[]},{"type":"error","name":"DuplicateReport","inputs":[]},{"type":"error","name":"EmptyReport","inputs":[]},{"type":"error","name":"EpochsPerFrameCannotBeZero","inputs":[]},{"type":"error","name":"FastLanePeriodCannotBeLongerThanFrame","inputs":[]},{"type":"error","name":"InitialEpochAlreadyArrived","inputs":[]},{"type":"error","name":"InitialEpochIsYetToArrive","inputs":[]},{"type":"error","name":"InitialEpochRefSlotCannotBeEarlierThanProcessingSlot","inputs":[]},{"type":"error","name":"InvalidChainConfig","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"InvalidSlot","inputs":[]},{"type":"error","name":"NewProcessorCannotBeTheSame","inputs":[]},{"type":"error","name":"NonFastLaneMemberCannotReportWithinFastLaneInterval","inputs":[]},{"type":"error","name":"NonMember","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"NumericOverflow","inputs":[]},{"type":"error","name":"QuorumTooSmall","inputs":[{"name":"minQuorum","type":"uint256","internalType":"uint256"},{"name":"receivedQuorum","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"ReportProcessorCannotBeZero","inputs":[]},{"type":"error","name":"SafeCastOverflowedUintDowncast","inputs":[{"name":"bits","type":"uint8","internalType":"uint8"},{"name":"value","type":"uint256","internalType":"uint256"}]},{"type":"error","name":"StaleReport","inputs":[]},{"type":"error","name":"UnexpectedConsensusVersion","inputs":[{"name":"expected","type":"uint256","internalType":"uint256"},{"name":"received","type":"uint256","internalType":"uint256"}]}] diff --git a/interfaces/CSModule.json b/interfaces/CSModule.json new file mode 100644 index 000000000..67ac8332a --- /dev/null +++ b/interfaces/CSModule.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"moduleType","type":"bytes32","internalType":"bytes32"},{"name":"lidoLocator","type":"address","internalType":"address"},{"name":"parametersRegistry","type":"address","internalType":"address"},{"name":"_accounting","type":"address","internalType":"address"},{"name":"exitPenalties","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"ACCOUNTING","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSAccounting"}],"stateMutability":"view"},{"type":"function","name":"CREATE_NODE_OPERATOR_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"DEPOSIT_SIZE","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"EXIT_PENALTIES","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSExitPenalties"}],"stateMutability":"view"},{"type":"function","name":"LIDO_LOCATOR","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ILidoLocator"}],"stateMutability":"view"},{"type":"function","name":"PARAMETERS_REGISTRY","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSParametersRegistry"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_INFINITELY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"QUEUE_LEGACY_PRIORITY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"QUEUE_LOWEST_PRIORITY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"RECOVERER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"REPORT_EL_REWARDS_STEALING_PENALTY_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RESUME_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"STAKING_ROUTER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"STETH","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract IStETH"}],"stateMutability":"view"},{"type":"function","name":"VERIFIER_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"accounting","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSAccounting"}],"stateMutability":"view"},{"type":"function","name":"addValidatorKeysETH","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"addValidatorKeysStETH","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"addValidatorKeysWstETH","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"cancelELRewardsStealingPenalty","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"changeNodeOperatorRewardAddress","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"newAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"cleanDepositQueue","inputs":[{"name":"maxItems","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"removed","type":"uint256","internalType":"uint256"},{"name":"lastRemovedAtDepth","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"compensateELRewardsStealingPenalty","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"payable"},{"type":"function","name":"confirmNodeOperatorManagerAddressChange","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"confirmNodeOperatorRewardAddressChange","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"createNodeOperator","inputs":[{"name":"from","type":"address","internalType":"address"},{"name":"managementProperties","type":"tuple","internalType":"struct NodeOperatorManagementProperties","components":[{"name":"managerAddress","type":"address","internalType":"address"},{"name":"rewardAddress","type":"address","internalType":"address"},{"name":"extendedManagerPermissions","type":"bool","internalType":"bool"}]},{"name":"referrer","type":"address","internalType":"address"}],"outputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"decreaseVettedSigningKeysCount","inputs":[{"name":"nodeOperatorIds","type":"bytes","internalType":"bytes"},{"name":"vettedSigningKeysCounts","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"depositQueueItem","inputs":[{"name":"queuePriority","type":"uint256","internalType":"uint256"},{"name":"index","type":"uint128","internalType":"uint128"}],"outputs":[{"name":"","type":"uint256","internalType":"Batch"}],"stateMutability":"view"},{"type":"function","name":"depositQueuePointers","inputs":[{"name":"queuePriority","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"head","type":"uint128","internalType":"uint128"},{"name":"tail","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"type":"function","name":"exitDeadlineThreshold","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"finalizeUpgradeV2","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getActiveNodeOperatorsCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getInitializedVersion","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getNodeOperator","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct NodeOperator","components":[{"name":"totalAddedKeys","type":"uint32","internalType":"uint32"},{"name":"totalWithdrawnKeys","type":"uint32","internalType":"uint32"},{"name":"totalDepositedKeys","type":"uint32","internalType":"uint32"},{"name":"totalVettedKeys","type":"uint32","internalType":"uint32"},{"name":"stuckValidatorsCount","type":"uint32","internalType":"uint32"},{"name":"depositableValidatorsCount","type":"uint32","internalType":"uint32"},{"name":"targetLimit","type":"uint32","internalType":"uint32"},{"name":"targetLimitMode","type":"uint8","internalType":"uint8"},{"name":"totalExitedKeys","type":"uint32","internalType":"uint32"},{"name":"enqueuedCount","type":"uint32","internalType":"uint32"},{"name":"managerAddress","type":"address","internalType":"address"},{"name":"proposedManagerAddress","type":"address","internalType":"address"},{"name":"rewardAddress","type":"address","internalType":"address"},{"name":"proposedRewardAddress","type":"address","internalType":"address"},{"name":"extendedManagerPermissions","type":"bool","internalType":"bool"},{"name":"usedPriorityQueue","type":"bool","internalType":"bool"}]}],"stateMutability":"view"},{"type":"function","name":"getNodeOperatorIds","inputs":[{"name":"offset","type":"uint256","internalType":"uint256"},{"name":"limit","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"nodeOperatorIds","type":"uint256[]","internalType":"uint256[]"}],"stateMutability":"view"},{"type":"function","name":"getNodeOperatorIsActive","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"getNodeOperatorManagementProperties","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"tuple","internalType":"struct NodeOperatorManagementProperties","components":[{"name":"managerAddress","type":"address","internalType":"address"},{"name":"rewardAddress","type":"address","internalType":"address"},{"name":"extendedManagerPermissions","type":"bool","internalType":"bool"}]}],"stateMutability":"view"},{"type":"function","name":"getNodeOperatorNonWithdrawnKeys","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getNodeOperatorSummary","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"targetLimitMode","type":"uint256","internalType":"uint256"},{"name":"targetValidatorsCount","type":"uint256","internalType":"uint256"},{"name":"stuckValidatorsCount","type":"uint256","internalType":"uint256"},{"name":"refundedValidatorsCount","type":"uint256","internalType":"uint256"},{"name":"stuckPenaltyEndTimestamp","type":"uint256","internalType":"uint256"},{"name":"totalExitedValidators","type":"uint256","internalType":"uint256"},{"name":"totalDepositedValidators","type":"uint256","internalType":"uint256"},{"name":"depositableValidatorsCount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getNodeOperatorTotalDepositedKeys","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"totalDepositedKeys","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getNodeOperatorsCount","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getNonce","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getResumeSinceTimestamp","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getSigningKeys","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"startIndex","type":"uint256","internalType":"uint256"},{"name":"keysCount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getSigningKeysWithSignatures","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"startIndex","type":"uint256","internalType":"uint256"},{"name":"keysCount","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"keys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"}],"stateMutability":"view"},{"type":"function","name":"getStakingModuleSummary","inputs":[],"outputs":[{"name":"totalExitedValidators","type":"uint256","internalType":"uint256"},{"name":"totalDepositedValidators","type":"uint256","internalType":"uint256"},{"name":"depositableValidatorsCount","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getType","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"initialize","inputs":[{"name":"admin","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isPaused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isValidatorExitDelayPenaltyApplicable","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"publicKey","type":"bytes","internalType":"bytes"},{"name":"eligibleToExitInSec","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isValidatorWithdrawn","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keyIndex","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"legacyQueue","inputs":[],"outputs":[{"name":"head","type":"uint128","internalType":"uint128"},{"name":"tail","type":"uint128","internalType":"uint128"}],"stateMutability":"view"},{"type":"function","name":"migrateToPriorityQueue","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"obtainDepositData","inputs":[{"name":"depositsCount","type":"uint256","internalType":"uint256"},{"name":"","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"}],"stateMutability":"nonpayable"},{"type":"function","name":"onExitedAndStuckValidatorsCountsUpdated","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"onRewardsMinted","inputs":[{"name":"totalShares","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"onValidatorExitTriggered","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"publicKey","type":"bytes","internalType":"bytes"},{"name":"withdrawalRequestPaidFee","type":"uint256","internalType":"uint256"},{"name":"exitType","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"onWithdrawalCredentialsChanged","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"pauseFor","inputs":[{"name":"duration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"proposeNodeOperatorManagerAddressChange","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"proposedAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"proposeNodeOperatorRewardAddressChange","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"proposedAddress","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC1155","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC20","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverERC721","inputs":[{"name":"token","type":"address","internalType":"address"},{"name":"tokenId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"recoverEther","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"removeKeys","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"startIndex","type":"uint256","internalType":"uint256"},{"name":"keysCount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"reportELRewardsStealingPenalty","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"blockHash","type":"bytes32","internalType":"bytes32"},{"name":"amount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"reportValidatorExitDelay","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"","type":"uint256","internalType":"uint256"},{"name":"publicKey","type":"bytes","internalType":"bytes"},{"name":"eligibleToExitInSec","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resetNodeOperatorManagerAddress","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"settleELRewardsStealingPenalty","inputs":[{"name":"nodeOperatorIds","type":"uint256[]","internalType":"uint256[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"submitWithdrawals","inputs":[{"name":"withdrawalsInfo","type":"tuple[]","internalType":"struct ValidatorWithdrawalInfo[]","components":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keyIndex","type":"uint256","internalType":"uint256"},{"name":"amount","type":"uint256","internalType":"uint256"},{"name":"isSlashed","type":"bool","internalType":"bool"}]}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"unsafeUpdateValidatorsCount","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"exitedValidatorsKeysCount","type":"uint256","internalType":"uint256"},{"name":"stuckValidatorsKeysCount","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateDepositableValidatorsCount","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateExitedValidatorsCount","inputs":[{"name":"nodeOperatorIds","type":"bytes","internalType":"bytes"},{"name":"exitedValidatorsCounts","type":"bytes","internalType":"bytes"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"updateTargetValidatorsLimits","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"targetLimitMode","type":"uint256","internalType":"uint256"},{"name":"targetLimit","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"event","name":"BatchEnqueued","inputs":[{"name":"queuePriority","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"count","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"DelayedValidatorExitPenalized","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"penaltyValue","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"DepositableSigningKeysCountChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"depositableKeysCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"DepositedSigningKeysCountChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"depositedKeysCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ELRewardsStealingPenaltyCancelled","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ELRewardsStealingPenaltyCompensated","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ELRewardsStealingPenaltyReported","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"proposedBlockHash","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"stolenAmount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ELRewardsStealingPenaltySettled","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC1155Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC20Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ERC721Recovered","inputs":[{"name":"token","type":"address","indexed":true,"internalType":"address"},{"name":"tokenId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"recipient","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"EtherRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ExitedSigningKeysCountChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"exitedKeysCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"KeyRemovalChargeApplied","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"NodeOperatorAdded","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"managerAddress","type":"address","indexed":true,"internalType":"address"},{"name":"rewardAddress","type":"address","indexed":true,"internalType":"address"},{"name":"extendedManagerPermissions","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"type":"event","name":"NodeOperatorManagerAddressChangeProposed","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"oldProposedAddress","type":"address","indexed":true,"internalType":"address"},{"name":"newProposedAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"NodeOperatorManagerAddressChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"oldAddress","type":"address","indexed":true,"internalType":"address"},{"name":"newAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"NodeOperatorRewardAddressChangeProposed","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"oldProposedAddress","type":"address","indexed":true,"internalType":"address"},{"name":"newProposedAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"NodeOperatorRewardAddressChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"oldAddress","type":"address","indexed":true,"internalType":"address"},{"name":"newAddress","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"NonceChanged","inputs":[{"name":"nonce","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"duration","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ReferrerSet","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"referrer","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Resumed","inputs":[],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"SigningKeyAdded","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"pubkey","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"SigningKeyRemoved","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"pubkey","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"event","name":"StETHSharesRecovered","inputs":[{"name":"recipient","type":"address","indexed":true,"internalType":"address"},{"name":"shares","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"TargetValidatorsCountChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"targetLimitMode","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"targetValidatorsCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"TotalSigningKeysCountChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"totalKeysCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"VettedSigningKeysCountChanged","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"vettedKeysCount","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"VettedSigningKeysCountDecreased","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"WithdrawalSubmitted","inputs":[{"name":"nodeOperatorId","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"keyIndex","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"amount","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"pubkey","type":"bytes","indexed":false,"internalType":"bytes"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AlreadyProposed","inputs":[]},{"type":"error","name":"AlreadyWithdrawn","inputs":[]},{"type":"error","name":"CannotAddKeys","inputs":[]},{"type":"error","name":"EmptyKey","inputs":[]},{"type":"error","name":"ExitedKeysDecrease","inputs":[]},{"type":"error","name":"ExitedKeysHigherThanTotalDeposited","inputs":[]},{"type":"error","name":"FailedToSendEther","inputs":[]},{"type":"error","name":"InvalidAmount","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"InvalidInput","inputs":[]},{"type":"error","name":"InvalidKeysCount","inputs":[]},{"type":"error","name":"InvalidLength","inputs":[]},{"type":"error","name":"InvalidReportData","inputs":[]},{"type":"error","name":"InvalidVetKeysPointer","inputs":[]},{"type":"error","name":"KeysLimitExceeded","inputs":[]},{"type":"error","name":"MethodCallIsNotAllowed","inputs":[]},{"type":"error","name":"NodeOperatorDoesNotExist","inputs":[]},{"type":"error","name":"NotAllowedToRecover","inputs":[]},{"type":"error","name":"NotEnoughKeys","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"PauseUntilMustBeInFuture","inputs":[]},{"type":"error","name":"PausedExpected","inputs":[]},{"type":"error","name":"PriorityQueueAlreadyUsed","inputs":[]},{"type":"error","name":"QueueIsEmpty","inputs":[]},{"type":"error","name":"QueueLookupNoLimit","inputs":[]},{"type":"error","name":"ResumedExpected","inputs":[]},{"type":"error","name":"SameAddress","inputs":[]},{"type":"error","name":"SenderIsNotEligible","inputs":[]},{"type":"error","name":"SenderIsNotManagerAddress","inputs":[]},{"type":"error","name":"SenderIsNotProposedAddress","inputs":[]},{"type":"error","name":"SenderIsNotRewardAddress","inputs":[]},{"type":"error","name":"SigningKeysInvalidOffset","inputs":[]},{"type":"error","name":"ZeroAccountingAddress","inputs":[]},{"type":"error","name":"ZeroAdminAddress","inputs":[]},{"type":"error","name":"ZeroExitPenaltiesAddress","inputs":[]},{"type":"error","name":"ZeroLocatorAddress","inputs":[]},{"type":"error","name":"ZeroParametersRegistryAddress","inputs":[]},{"type":"error","name":"ZeroPauseDuration","inputs":[]},{"type":"error","name":"ZeroRewardAddress","inputs":[]},{"type":"error","name":"ZeroSenderAddress","inputs":[]}] diff --git a/interfaces/CSPermissionlessGate.json b/interfaces/CSPermissionlessGate.json new file mode 100644 index 000000000..bda444b61 --- /dev/null +++ b/interfaces/CSPermissionlessGate.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"module","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"CURVE_ID","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"MODULE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSModule"}],"stateMutability":"view"},{"type":"function","name":"addNodeOperatorETH","inputs":[{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"},{"name":"managementProperties","type":"tuple","internalType":"struct NodeOperatorManagementProperties","components":[{"name":"managerAddress","type":"address","internalType":"address"},{"name":"rewardAddress","type":"address","internalType":"address"},{"name":"extendedManagerPermissions","type":"bool","internalType":"bool"}]},{"name":"referrer","type":"address","internalType":"address"}],"outputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"addNodeOperatorStETH","inputs":[{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"},{"name":"managementProperties","type":"tuple","internalType":"struct NodeOperatorManagementProperties","components":[{"name":"managerAddress","type":"address","internalType":"address"},{"name":"rewardAddress","type":"address","internalType":"address"},{"name":"extendedManagerPermissions","type":"bool","internalType":"bool"}]},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"name":"referrer","type":"address","internalType":"address"}],"outputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"addNodeOperatorWstETH","inputs":[{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"},{"name":"managementProperties","type":"tuple","internalType":"struct NodeOperatorManagementProperties","components":[{"name":"managerAddress","type":"address","internalType":"address"},{"name":"rewardAddress","type":"address","internalType":"address"},{"name":"extendedManagerPermissions","type":"bool","internalType":"bool"}]},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"name":"referrer","type":"address","internalType":"address"}],"outputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"error","name":"ZeroModuleAddress","inputs":[]}] diff --git a/interfaces/CSStrikes.json b/interfaces/CSStrikes.json new file mode 100644 index 000000000..6ccc28dd3 --- /dev/null +++ b/interfaces/CSStrikes.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"module","type":"address","internalType":"address"},{"name":"oracle","type":"address","internalType":"address"},{"name":"exitPenalties","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"ACCOUNTING","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSAccounting"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"EXIT_PENALTIES","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSExitPenalties"}],"stateMutability":"view"},{"type":"function","name":"MODULE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSModule"}],"stateMutability":"view"},{"type":"function","name":"ORACLE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"PARAMETERS_REGISTRY","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSParametersRegistry"}],"stateMutability":"view"},{"type":"function","name":"ejector","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSEjector"}],"stateMutability":"view"},{"type":"function","name":"getInitializedVersion","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"hashLeaf","inputs":[{"name":"keyStrikes","type":"tuple","internalType":"struct ICSStrikes.ModuleKeyStrikes","components":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keyIndex","type":"uint256","internalType":"uint256"},{"name":"data","type":"uint256[]","internalType":"uint256[]"}]},{"name":"pubkey","type":"bytes","internalType":"bytes"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"pure"},{"type":"function","name":"initialize","inputs":[{"name":"admin","type":"address","internalType":"address"},{"name":"_ejector","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"processBadPerformanceProof","inputs":[{"name":"keyStrikesList","type":"tuple[]","internalType":"struct ICSStrikes.ModuleKeyStrikes[]","components":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keyIndex","type":"uint256","internalType":"uint256"},{"name":"data","type":"uint256[]","internalType":"uint256[]"}]},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"},{"name":"proofFlags","type":"bool[]","internalType":"bool[]"},{"name":"refundRecipient","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"processOracleReport","inputs":[{"name":"_treeRoot","type":"bytes32","internalType":"bytes32"},{"name":"_treeCid","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setEjector","inputs":[{"name":"_ejector","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"treeCid","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"treeRoot","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"verifyProof","inputs":[{"name":"keyStrikesList","type":"tuple[]","internalType":"struct ICSStrikes.ModuleKeyStrikes[]","components":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keyIndex","type":"uint256","internalType":"uint256"},{"name":"data","type":"uint256[]","internalType":"uint256[]"}]},{"name":"pubkeys","type":"bytes[]","internalType":"bytes[]"},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"},{"name":"proofFlags","type":"bool[]","internalType":"bool[]"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"EjectorSet","inputs":[{"name":"ejector","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"StrikesDataUpdated","inputs":[{"name":"treeRoot","type":"bytes32","indexed":false,"internalType":"bytes32"},{"name":"treeCid","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"event","name":"StrikesDataWiped","inputs":[],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"InvalidProof","inputs":[]},{"type":"error","name":"InvalidReportData","inputs":[]},{"type":"error","name":"MerkleProofInvalidMultiproof","inputs":[]},{"type":"error","name":"NotEnoughStrikesToEject","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"NotOracle","inputs":[]},{"type":"error","name":"ZeroAdminAddress","inputs":[]},{"type":"error","name":"ZeroBadPerformancePenaltyAmount","inputs":[]},{"type":"error","name":"ZeroEjectionFeeAmount","inputs":[]},{"type":"error","name":"ZeroEjectorAddress","inputs":[]},{"type":"error","name":"ZeroExitPenaltiesAddress","inputs":[]},{"type":"error","name":"ZeroModuleAddress","inputs":[]},{"type":"error","name":"ZeroOracleAddress","inputs":[]}] diff --git a/interfaces/csm/CSVerifier.json b/interfaces/CSVerifier.json similarity index 100% rename from interfaces/csm/CSVerifier.json rename to interfaces/CSVerifier.json diff --git a/interfaces/CSVerifierV2.json b/interfaces/CSVerifierV2.json new file mode 100644 index 000000000..267204b21 --- /dev/null +++ b/interfaces/CSVerifierV2.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"withdrawalAddress","type":"address","internalType":"address"},{"name":"module","type":"address","internalType":"address"},{"name":"slotsPerEpoch","type":"uint64","internalType":"uint64"},{"name":"gindices","type":"tuple","internalType":"struct ICSVerifier.GIndices","components":[{"name":"gIFirstWithdrawalPrev","type":"bytes32","internalType":"GIndex"},{"name":"gIFirstWithdrawalCurr","type":"bytes32","internalType":"GIndex"},{"name":"gIFirstValidatorPrev","type":"bytes32","internalType":"GIndex"},{"name":"gIFirstValidatorCurr","type":"bytes32","internalType":"GIndex"},{"name":"gIHistoricalSummariesPrev","type":"bytes32","internalType":"GIndex"},{"name":"gIHistoricalSummariesCurr","type":"bytes32","internalType":"GIndex"}]},{"name":"firstSupportedSlot","type":"uint64","internalType":"Slot"},{"name":"pivotSlot","type":"uint64","internalType":"Slot"},{"name":"admin","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"BEACON_ROOTS","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"FIRST_SUPPORTED_SLOT","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"Slot"}],"stateMutability":"view"},{"type":"function","name":"GI_FIRST_VALIDATOR_CURR","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"GIndex"}],"stateMutability":"view"},{"type":"function","name":"GI_FIRST_VALIDATOR_PREV","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"GIndex"}],"stateMutability":"view"},{"type":"function","name":"GI_FIRST_WITHDRAWAL_CURR","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"GIndex"}],"stateMutability":"view"},{"type":"function","name":"GI_FIRST_WITHDRAWAL_PREV","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"GIndex"}],"stateMutability":"view"},{"type":"function","name":"GI_HISTORICAL_SUMMARIES_CURR","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"GIndex"}],"stateMutability":"view"},{"type":"function","name":"GI_HISTORICAL_SUMMARIES_PREV","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"GIndex"}],"stateMutability":"view"},{"type":"function","name":"MODULE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSModule"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_INFINITELY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"PIVOT_SLOT","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"Slot"}],"stateMutability":"view"},{"type":"function","name":"RESUME_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"SLOTS_PER_EPOCH","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"WITHDRAWAL_ADDRESS","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getResumeSinceTimestamp","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isPaused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"pauseFor","inputs":[{"name":"duration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"processHistoricalWithdrawalProof","inputs":[{"name":"beaconBlock","type":"tuple","internalType":"struct ICSVerifier.ProvableBeaconBlockHeader","components":[{"name":"header","type":"tuple","internalType":"struct BeaconBlockHeader","components":[{"name":"slot","type":"uint64","internalType":"Slot"},{"name":"proposerIndex","type":"uint64","internalType":"uint64"},{"name":"parentRoot","type":"bytes32","internalType":"bytes32"},{"name":"stateRoot","type":"bytes32","internalType":"bytes32"},{"name":"bodyRoot","type":"bytes32","internalType":"bytes32"}]},{"name":"rootsTimestamp","type":"uint64","internalType":"uint64"}]},{"name":"oldBlock","type":"tuple","internalType":"struct ICSVerifier.HistoricalHeaderWitness","components":[{"name":"header","type":"tuple","internalType":"struct BeaconBlockHeader","components":[{"name":"slot","type":"uint64","internalType":"Slot"},{"name":"proposerIndex","type":"uint64","internalType":"uint64"},{"name":"parentRoot","type":"bytes32","internalType":"bytes32"},{"name":"stateRoot","type":"bytes32","internalType":"bytes32"},{"name":"bodyRoot","type":"bytes32","internalType":"bytes32"}]},{"name":"rootGIndex","type":"bytes32","internalType":"GIndex"},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"}]},{"name":"witness","type":"tuple","internalType":"struct ICSVerifier.WithdrawalWitness","components":[{"name":"withdrawalOffset","type":"uint8","internalType":"uint8"},{"name":"withdrawalIndex","type":"uint64","internalType":"uint64"},{"name":"validatorIndex","type":"uint64","internalType":"uint64"},{"name":"amount","type":"uint64","internalType":"uint64"},{"name":"withdrawalCredentials","type":"bytes32","internalType":"bytes32"},{"name":"effectiveBalance","type":"uint64","internalType":"uint64"},{"name":"slashed","type":"bool","internalType":"bool"},{"name":"activationEligibilityEpoch","type":"uint64","internalType":"uint64"},{"name":"activationEpoch","type":"uint64","internalType":"uint64"},{"name":"exitEpoch","type":"uint64","internalType":"uint64"},{"name":"withdrawableEpoch","type":"uint64","internalType":"uint64"},{"name":"withdrawalProof","type":"bytes32[]","internalType":"bytes32[]"},{"name":"validatorProof","type":"bytes32[]","internalType":"bytes32[]"}]},{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keyIndex","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"processWithdrawalProof","inputs":[{"name":"beaconBlock","type":"tuple","internalType":"struct ICSVerifier.ProvableBeaconBlockHeader","components":[{"name":"header","type":"tuple","internalType":"struct BeaconBlockHeader","components":[{"name":"slot","type":"uint64","internalType":"Slot"},{"name":"proposerIndex","type":"uint64","internalType":"uint64"},{"name":"parentRoot","type":"bytes32","internalType":"bytes32"},{"name":"stateRoot","type":"bytes32","internalType":"bytes32"},{"name":"bodyRoot","type":"bytes32","internalType":"bytes32"}]},{"name":"rootsTimestamp","type":"uint64","internalType":"uint64"}]},{"name":"witness","type":"tuple","internalType":"struct ICSVerifier.WithdrawalWitness","components":[{"name":"withdrawalOffset","type":"uint8","internalType":"uint8"},{"name":"withdrawalIndex","type":"uint64","internalType":"uint64"},{"name":"validatorIndex","type":"uint64","internalType":"uint64"},{"name":"amount","type":"uint64","internalType":"uint64"},{"name":"withdrawalCredentials","type":"bytes32","internalType":"bytes32"},{"name":"effectiveBalance","type":"uint64","internalType":"uint64"},{"name":"slashed","type":"bool","internalType":"bool"},{"name":"activationEligibilityEpoch","type":"uint64","internalType":"uint64"},{"name":"activationEpoch","type":"uint64","internalType":"uint64"},{"name":"exitEpoch","type":"uint64","internalType":"uint64"},{"name":"withdrawableEpoch","type":"uint64","internalType":"uint64"},{"name":"withdrawalProof","type":"bytes32[]","internalType":"bytes32[]"},{"name":"validatorProof","type":"bytes32[]","internalType":"bytes32[]"}]},{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"keyIndex","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"Paused","inputs":[{"name":"duration","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"Resumed","inputs":[],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"IndexOutOfRange","inputs":[]},{"type":"error","name":"InvalidBlockHeader","inputs":[]},{"type":"error","name":"InvalidChainConfig","inputs":[]},{"type":"error","name":"InvalidGIndex","inputs":[]},{"type":"error","name":"InvalidPivotSlot","inputs":[]},{"type":"error","name":"InvalidWithdrawalAddress","inputs":[]},{"type":"error","name":"PartialWithdrawal","inputs":[]},{"type":"error","name":"PauseUntilMustBeInFuture","inputs":[]},{"type":"error","name":"PausedExpected","inputs":[]},{"type":"error","name":"ResumedExpected","inputs":[]},{"type":"error","name":"RootNotFound","inputs":[]},{"type":"error","name":"UnsupportedSlot","inputs":[{"name":"slot","type":"uint64","internalType":"Slot"}]},{"type":"error","name":"ValidatorNotWithdrawn","inputs":[]},{"type":"error","name":"ZeroAdminAddress","inputs":[]},{"type":"error","name":"ZeroModuleAddress","inputs":[]},{"type":"error","name":"ZeroPauseDuration","inputs":[]},{"type":"error","name":"ZeroWithdrawalAddress","inputs":[]}] diff --git a/interfaces/CSVettedGate.json b/interfaces/CSVettedGate.json new file mode 100644 index 000000000..5c966b2ae --- /dev/null +++ b/interfaces/CSVettedGate.json @@ -0,0 +1 @@ +[{"type":"constructor","inputs":[{"name":"module","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"type":"function","name":"ACCOUNTING","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSAccounting"}],"stateMutability":"view"},{"type":"function","name":"DEFAULT_ADMIN_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"END_REFERRAL_SEASON_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"MODULE","inputs":[],"outputs":[{"name":"","type":"address","internalType":"contract ICSModule"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_INFINITELY","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"PAUSE_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"RESUME_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"SET_TREE_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"START_REFERRAL_SEASON_ROLE","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"addNodeOperatorETH","inputs":[{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"},{"name":"managementProperties","type":"tuple","internalType":"struct NodeOperatorManagementProperties","components":[{"name":"managerAddress","type":"address","internalType":"address"},{"name":"rewardAddress","type":"address","internalType":"address"},{"name":"extendedManagerPermissions","type":"bool","internalType":"bool"}]},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"},{"name":"referrer","type":"address","internalType":"address"}],"outputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"stateMutability":"payable"},{"type":"function","name":"addNodeOperatorStETH","inputs":[{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"},{"name":"managementProperties","type":"tuple","internalType":"struct NodeOperatorManagementProperties","components":[{"name":"managerAddress","type":"address","internalType":"address"},{"name":"rewardAddress","type":"address","internalType":"address"},{"name":"extendedManagerPermissions","type":"bool","internalType":"bool"}]},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"},{"name":"referrer","type":"address","internalType":"address"}],"outputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"addNodeOperatorWstETH","inputs":[{"name":"keysCount","type":"uint256","internalType":"uint256"},{"name":"publicKeys","type":"bytes","internalType":"bytes"},{"name":"signatures","type":"bytes","internalType":"bytes"},{"name":"managementProperties","type":"tuple","internalType":"struct NodeOperatorManagementProperties","components":[{"name":"managerAddress","type":"address","internalType":"address"},{"name":"rewardAddress","type":"address","internalType":"address"},{"name":"extendedManagerPermissions","type":"bool","internalType":"bool"}]},{"name":"permit","type":"tuple","internalType":"struct ICSAccounting.PermitInput","components":[{"name":"value","type":"uint256","internalType":"uint256"},{"name":"deadline","type":"uint256","internalType":"uint256"},{"name":"v","type":"uint8","internalType":"uint8"},{"name":"r","type":"bytes32","internalType":"bytes32"},{"name":"s","type":"bytes32","internalType":"bytes32"}]},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"},{"name":"referrer","type":"address","internalType":"address"}],"outputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"}],"stateMutability":"nonpayable"},{"type":"function","name":"claimBondCurve","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"claimReferrerBondCurve","inputs":[{"name":"nodeOperatorId","type":"uint256","internalType":"uint256"},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"curveId","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"endCurrentReferralProgramSeason","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"getInitializedVersion","inputs":[],"outputs":[{"name":"","type":"uint64","internalType":"uint64"}],"stateMutability":"view"},{"type":"function","name":"getReferralsCount","inputs":[{"name":"referrer","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getResumeSinceTimestamp","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"getRoleAdmin","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"getRoleMember","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"index","type":"uint256","internalType":"uint256"}],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"type":"function","name":"getRoleMemberCount","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"grantRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"hasRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"hashLeaf","inputs":[{"name":"member","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"pure"},{"type":"function","name":"initialize","inputs":[{"name":"_curveId","type":"uint256","internalType":"uint256"},{"name":"_treeRoot","type":"bytes32","internalType":"bytes32"},{"name":"_treeCid","type":"string","internalType":"string"},{"name":"admin","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"isConsumed","inputs":[{"name":"member","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isPaused","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isReferralProgramSeasonActive","inputs":[],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"isReferrerConsumed","inputs":[{"name":"referrer","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"pauseFor","inputs":[{"name":"duration","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"referralCounts","inputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"referralCurveId","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"referralProgramSeasonNumber","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"referralsThreshold","inputs":[],"outputs":[{"name":"","type":"uint256","internalType":"uint256"}],"stateMutability":"view"},{"type":"function","name":"renounceRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"callerConfirmation","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"resume","inputs":[],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"revokeRole","inputs":[{"name":"role","type":"bytes32","internalType":"bytes32"},{"name":"account","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"setTreeParams","inputs":[{"name":"_treeRoot","type":"bytes32","internalType":"bytes32"},{"name":"_treeCid","type":"string","internalType":"string"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"startNewReferralProgramSeason","inputs":[{"name":"_referralCurveId","type":"uint256","internalType":"uint256"},{"name":"_referralsThreshold","type":"uint256","internalType":"uint256"}],"outputs":[],"stateMutability":"nonpayable"},{"type":"function","name":"supportsInterface","inputs":[{"name":"interfaceId","type":"bytes4","internalType":"bytes4"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"function","name":"treeCid","inputs":[],"outputs":[{"name":"","type":"string","internalType":"string"}],"stateMutability":"view"},{"type":"function","name":"treeRoot","inputs":[],"outputs":[{"name":"","type":"bytes32","internalType":"bytes32"}],"stateMutability":"view"},{"type":"function","name":"verifyProof","inputs":[{"name":"member","type":"address","internalType":"address"},{"name":"proof","type":"bytes32[]","internalType":"bytes32[]"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"type":"event","name":"Consumed","inputs":[{"name":"member","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Initialized","inputs":[{"name":"version","type":"uint64","indexed":false,"internalType":"uint64"}],"anonymous":false},{"type":"event","name":"Paused","inputs":[{"name":"duration","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ReferralProgramSeasonEnded","inputs":[{"name":"season","type":"uint256","indexed":true,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ReferralProgramSeasonStarted","inputs":[{"name":"season","type":"uint256","indexed":true,"internalType":"uint256"},{"name":"referralCurveId","type":"uint256","indexed":false,"internalType":"uint256"},{"name":"referralsThreshold","type":"uint256","indexed":false,"internalType":"uint256"}],"anonymous":false},{"type":"event","name":"ReferrerConsumed","inputs":[{"name":"referrer","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"Resumed","inputs":[],"anonymous":false},{"type":"event","name":"RoleAdminChanged","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"previousAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"newAdminRole","type":"bytes32","indexed":true,"internalType":"bytes32"}],"anonymous":false},{"type":"event","name":"RoleGranted","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"RoleRevoked","inputs":[{"name":"role","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"account","type":"address","indexed":true,"internalType":"address"},{"name":"sender","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"type":"event","name":"TreeSet","inputs":[{"name":"treeRoot","type":"bytes32","indexed":true,"internalType":"bytes32"},{"name":"treeCid","type":"string","indexed":false,"internalType":"string"}],"anonymous":false},{"type":"error","name":"AccessControlBadConfirmation","inputs":[]},{"type":"error","name":"AccessControlUnauthorizedAccount","inputs":[{"name":"account","type":"address","internalType":"address"},{"name":"neededRole","type":"bytes32","internalType":"bytes32"}]},{"type":"error","name":"AlreadyConsumed","inputs":[]},{"type":"error","name":"InvalidCurveId","inputs":[]},{"type":"error","name":"InvalidInitialization","inputs":[]},{"type":"error","name":"InvalidProof","inputs":[]},{"type":"error","name":"InvalidReferralsThreshold","inputs":[]},{"type":"error","name":"InvalidTreeCid","inputs":[]},{"type":"error","name":"InvalidTreeRoot","inputs":[]},{"type":"error","name":"NotAllowedToClaim","inputs":[]},{"type":"error","name":"NotEnoughReferrals","inputs":[]},{"type":"error","name":"NotInitializing","inputs":[]},{"type":"error","name":"PauseUntilMustBeInFuture","inputs":[]},{"type":"error","name":"PausedExpected","inputs":[]},{"type":"error","name":"ReferralProgramIsActive","inputs":[]},{"type":"error","name":"ReferralProgramIsNotActive","inputs":[]},{"type":"error","name":"ResumedExpected","inputs":[]},{"type":"error","name":"ZeroAdminAddress","inputs":[]},{"type":"error","name":"ZeroModuleAddress","inputs":[]},{"type":"error","name":"ZeroPauseDuration","inputs":[]}] diff --git a/interfaces/NodeOperatorsRegistry.json b/interfaces/NodeOperatorsRegistry.json index 4e15f855d..835d9c9fa 100644 --- a/interfaces/NodeOperatorsRegistry.json +++ b/interfaces/NodeOperatorsRegistry.json @@ -79,15 +79,15 @@ "constant": true, "inputs": [ { - "name": "_script", - "type": "bytes" + "name": "", + "type": "uint256" } ], - "name": "getEVMScriptExecutor", + "name": "exitDeadlineThreshold", "outputs": [ { "name": "", - "type": "address" + "type": "uint256" } ], "payable": false, @@ -95,22 +95,22 @@ "type": "function" }, { - "constant": false, + "constant": true, "inputs": [ { - "name": "_nodeOperatorId", - "type": "uint256" + "name": "_script", + "type": "bytes" } ], - "name": "clearNodeOperatorPenalty", + "name": "getEVMScriptExecutor", "outputs": [ { "name": "", - "type": "bool" + "type": "address" } ], "payable": false, - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -150,6 +150,32 @@ "stateMutability": "view", "type": "function" }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_proofSlotTimestamp", + "type": "uint256" + }, + { + "name": "_publicKey", + "type": "bytes" + }, + { + "name": "_eligibleToExitInSec", + "type": "uint256" + } + ], + "name": "reportValidatorExitDelay", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": true, "inputs": [ @@ -301,7 +327,7 @@ "type": "bytes32" }, { - "name": "_stuckPenaltyDelay", + "name": "_exitDeadlineThresholdInSeconds", "type": "uint256" } ], @@ -315,20 +341,23 @@ "constant": false, "inputs": [ { - "name": "_delay", + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_publicKey", + "type": "bytes" + }, + { + "name": "_withdrawalRequestPaidFee", + "type": "uint256" + }, + { + "name": "_exitType", "type": "uint256" } ], - "name": "setStuckPenaltyDelay", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "finalizeUpgrade_v3", + "name": "onValidatorExitTriggered", "outputs": [], "payable": false, "stateMutability": "nonpayable", @@ -345,7 +374,7 @@ } ], "payable": false, - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { @@ -406,7 +435,7 @@ "constant": true, "inputs": [ { - "name": "_nodeOperatorId", + "name": "", "type": "uint256" } ], @@ -418,7 +447,7 @@ } ], "payable": false, - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { @@ -508,6 +537,37 @@ "stateMutability": "view", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + }, + { + "name": "_proofSlotTimestamp", + "type": "uint256" + }, + { + "name": "_publicKey", + "type": "bytes" + }, + { + "name": "_eligibleToExitInSec", + "type": "uint256" + } + ], + "name": "isValidatorExitDelayPenaltyApplicable", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [], @@ -620,6 +680,20 @@ "stateMutability": "view", "type": "function" }, + { + "constant": false, + "inputs": [ + { + "name": "_exitDeadlineThresholdInSeconds", + "type": "uint256" + } + ], + "name": "finalizeUpgrade_v4", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": false, "inputs": [], @@ -652,6 +726,24 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_exitedValidatorsCount", + "type": "uint256" + } + ], + "name": "unsafeUpdateValidatorsCount", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": false, "inputs": [ @@ -717,28 +809,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": false, - "inputs": [ - { - "name": "_locator", - "type": "address" - }, - { - "name": "_type", - "type": "bytes32" - }, - { - "name": "_stuckPenaltyDelay", - "type": "uint256" - } - ], - "name": "finalizeUpgrade_v2", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, { "constant": true, "inputs": [], @@ -779,24 +849,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorIds", - "type": "bytes" - }, - { - "name": "_stuckValidatorsCounts", - "type": "bytes" - } - ], - "name": "updateStuckValidatorsCount", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, { "constant": false, "inputs": [ @@ -838,24 +890,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_refundedValidatorsCount", - "type": "uint256" - } - ], - "name": "updateRefundedValidatorsCount", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, { "constant": true, "inputs": [], @@ -1034,6 +1068,43 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "_publicKey", + "type": "bytes" + } + ], + "name": "isValidatorExitingKeyReported", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_threshold", + "type": "uint256" + }, + { + "name": "_lateReportingWindow", + "type": "uint256" + } + ], + "name": "setExitDeadlineThreshold", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": false, "inputs": [ @@ -1061,6 +1132,20 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [], + "name": "exitPenaltyCutoffTimestamp", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [], @@ -1219,28 +1304,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_exitedValidatorsCount", - "type": "uint256" - }, - { - "name": "_stuckValidatorsCount", - "type": "uint256" - } - ], - "name": "unsafeUpdateValidatorsCount", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, { "constant": true, "inputs": [], @@ -1259,7 +1322,7 @@ "constant": true, "inputs": [ { - "name": "_nodeOperatorId", + "name": "", "type": "uint256" } ], @@ -1271,7 +1334,7 @@ } ], "payable": false, - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { @@ -1517,13 +1580,23 @@ { "anonymous": false, "inputs": [ + { + "indexed": true, + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "name": "targetValidatorsCount", + "type": "uint256" + }, { "indexed": false, - "name": "stuckPenaltyDelay", + "name": "targetLimitMode", "type": "uint256" } ], - "name": "StuckPenaltyDelayChanged", + "name": "TargetValidatorsCountChanged", "type": "event" }, { @@ -1536,21 +1609,21 @@ }, { "indexed": false, - "name": "stuckValidatorsCount", - "type": "uint256" + "name": "publicKey", + "type": "bytes" }, { "indexed": false, - "name": "refundedValidatorsCount", + "name": "eligibleToExitInSec", "type": "uint256" }, { "indexed": false, - "name": "stuckPenaltyEndTimestamp", + "name": "proofSlotTimestamp", "type": "uint256" } ], - "name": "StuckPenaltyStateChanged", + "name": "ValidatorExitStatusUpdated", "type": "event" }, { @@ -1563,33 +1636,38 @@ }, { "indexed": false, - "name": "targetValidatorsCount", + "name": "publicKey", + "type": "bytes" + }, + { + "indexed": false, + "name": "withdrawalRequestPaidFee", "type": "uint256" }, { "indexed": false, - "name": "targetLimitMode", + "name": "exitType", "type": "uint256" } ], - "name": "TargetValidatorsCountChanged", + "name": "ValidatorExitTriggered", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": true, - "name": "recipientAddress", - "type": "address" + "indexed": false, + "name": "threshold", + "type": "uint256" }, { "indexed": false, - "name": "sharesPenalizedAmount", + "name": "reportingWindow", "type": "uint256" } ], - "name": "NodeOperatorPenalized", + "name": "ExitDeadlineThresholdChanged", "type": "event" }, { diff --git a/interfaces/Sandbox.json b/interfaces/Sandbox.json index 632231338..e42569137 100644 --- a/interfaces/Sandbox.json +++ b/interfaces/Sandbox.json @@ -1 +1,1734 @@ -[{"constant":true,"inputs":[],"name":"hasInitialized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_keysCount","type":"uint256"},{"name":"_publicKeys","type":"bytes"},{"name":"_signatures","type":"bytes"}],"name":"addSigningKeys","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getType","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_script","type":"bytes"}],"name":"getEVMScriptExecutor","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"clearNodeOperatorPenalty","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getRecoveryVault","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_offset","type":"uint256"},{"name":"_limit","type":"uint256"}],"name":"getNodeOperatorIds","outputs":[{"name":"nodeOperatorIds","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_offset","type":"uint256"},{"name":"_limit","type":"uint256"}],"name":"getSigningKeys","outputs":[{"name":"pubkeys","type":"bytes"},{"name":"signatures","type":"bytes"},{"name":"used","type":"bool[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_fromIndex","type":"uint256"},{"name":"_keysCount","type":"uint256"}],"name":"removeSigningKeysOperatorBH","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"getNodeOperatorIsActive","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_name","type":"string"}],"name":"setNodeOperatorName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_totalRewardShares","type":"uint256"}],"name":"getRewardsDistribution","outputs":[{"name":"recipients","type":"address[]"},{"name":"shares","type":"uint256[]"},{"name":"penalized","type":"bool[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_indexFrom","type":"uint256"},{"name":"_indexTo","type":"uint256"}],"name":"invalidateReadyToDepositKeysRange","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_locator","type":"address"},{"name":"_type","type":"bytes32"},{"name":"_stuckPenaltyDelay","type":"uint256"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_delay","type":"uint256"}],"name":"setStuckPenaltyDelay","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getStuckPenaltyDelay","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_index","type":"uint256"}],"name":"removeSigningKey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_fromIndex","type":"uint256"},{"name":"_keysCount","type":"uint256"}],"name":"removeSigningKeys","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"isOperatorPenalized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"deactivateNodeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"allowRecoverability","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"STAKING_ROUTER_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_keysCount","type":"uint256"},{"name":"_publicKeys","type":"bytes"},{"name":"_signatures","type":"bytes"}],"name":"addSigningKeysOperatorBH","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"appId","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getActiveNodeOperatorsCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"},{"name":"_rewardAddress","type":"address"}],"name":"addNodeOperator","outputs":[{"name":"id","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getContractVersion","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getInitializationBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"getUnusedSigningKeyCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"onRewardsMinted","outputs":[],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MANAGE_NODE_OPERATOR_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"onWithdrawalCredentialsChanged","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"activateNodeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_rewardAddress","type":"address"}],"name":"setNodeOperatorRewardAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_fullInfo","type":"bool"}],"name":"getNodeOperator","outputs":[{"name":"active","type":"bool"},{"name":"name","type":"string"},{"name":"rewardAddress","type":"address"},{"name":"totalVettedValidators","type":"uint64"},{"name":"totalExitedValidators","type":"uint64"},{"name":"totalAddedValidators","type":"uint64"},{"name":"totalDepositedValidators","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_locator","type":"address"},{"name":"_type","type":"bytes32"},{"name":"_stuckPenaltyDelay","type":"uint256"}],"name":"finalizeUpgrade_v2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getStakingModuleSummary","outputs":[{"name":"totalExitedValidators","type":"uint256"},{"name":"totalDepositedValidators","type":"uint256"},{"name":"depositableValidatorsCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorIds","type":"bytes"},{"name":"_exitedValidatorsCounts","type":"bytes"}],"name":"updateExitedValidatorsCount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorIds","type":"bytes"},{"name":"_stuckValidatorsCounts","type":"bytes"}],"name":"updateStuckValidatorsCount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"}],"name":"transferToVault","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_sender","type":"address"},{"name":"_role","type":"bytes32"},{"name":"_params","type":"uint256[]"}],"name":"canPerform","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_refundedValidatorsCount","type":"uint256"}],"name":"updateRefundedValidatorsCount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getEVMScriptRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNodeOperatorsCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_isTargetLimitActive","type":"bool"},{"name":"_targetLimit","type":"uint256"}],"name":"updateTargetValidatorsLimits","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_vettedSigningKeysCount","type":"uint64"}],"name":"setNodeOperatorStakingLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"getNodeOperatorSummary","outputs":[{"name":"isTargetLimitActive","type":"bool"},{"name":"targetValidatorsCount","type":"uint256"},{"name":"stuckValidatorsCount","type":"uint256"},{"name":"refundedValidatorsCount","type":"uint256"},{"name":"stuckPenaltyEndTimestamp","type":"uint256"},{"name":"totalExitedValidators","type":"uint256"},{"name":"totalDepositedValidators","type":"uint256"},{"name":"depositableValidatorsCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_index","type":"uint256"}],"name":"getSigningKey","outputs":[{"name":"key","type":"bytes"},{"name":"depositSignature","type":"bytes"},{"name":"used","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_NODE_OPERATOR_NAME_LENGTH","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_depositsCount","type":"uint256"},{"name":"","type":"bytes"}],"name":"obtainDepositData","outputs":[{"name":"publicKeys","type":"bytes"},{"name":"signatures","type":"bytes"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getKeysOpIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNonce","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"kernel","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getLocator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SET_NODE_OPERATOR_LIMIT_ROLE","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"getTotalSigningKeyCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPetrified","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_STUCK_PENALTY_DELAY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"onExitedAndStuckValidatorsCountsUpdated","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_NODE_OPERATORS_COUNT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_index","type":"uint256"}],"name":"removeSigningKeyOperatorBH","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_nodeOperatorId","type":"uint256"},{"name":"_exitedValidatorsCount","type":"uint256"},{"name":"_stuckValidatorsCount","type":"uint256"}],"name":"unsafeUpdateValidatorsCount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MANAGE_SIGNING_KEYS","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_nodeOperatorId","type":"uint256"}],"name":"isOperatorPenaltyCleared","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"name","type":"string"},{"indexed":false,"name":"rewardAddress","type":"address"},{"indexed":false,"name":"stakingLimit","type":"uint64"}],"name":"NodeOperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"active","type":"bool"}],"name":"NodeOperatorActiveSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"name","type":"string"}],"name":"NodeOperatorNameSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"rewardAddress","type":"address"}],"name":"NodeOperatorRewardAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"totalKeysTrimmed","type":"uint64"}],"name":"NodeOperatorTotalKeysTrimmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"keysOpIndex","type":"uint256"}],"name":"KeysOpIndexSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"moduleType","type":"bytes32"}],"name":"StakingModuleTypeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"rewardAddress","type":"address"},{"indexed":false,"name":"sharesAmount","type":"uint256"}],"name":"RewardsDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"locatorAddress","type":"address"}],"name":"LocatorContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"approvedValidatorsCount","type":"uint256"}],"name":"VettedSigningKeysCountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"depositedValidatorsCount","type":"uint256"}],"name":"DepositedSigningKeysCountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"exitedValidatorsCount","type":"uint256"}],"name":"ExitedSigningKeysCountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"totalValidatorsCount","type":"uint256"}],"name":"TotalSigningKeysCountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"nonce","type":"uint256"}],"name":"NonceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"stuckPenaltyDelay","type":"uint256"}],"name":"StuckPenaltyDelayChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"stuckValidatorsCount","type":"uint256"},{"indexed":false,"name":"refundedValidatorsCount","type":"uint256"},{"indexed":false,"name":"stuckPenaltyEndTimestamp","type":"uint256"}],"name":"StuckPenaltyStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"nodeOperatorId","type":"uint256"},{"indexed":false,"name":"targetValidatorsCount","type":"uint256"}],"name":"TargetValidatorsCountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"recipientAddress","type":"address"},{"indexed":false,"name":"sharesPenalizedAmount","type":"uint256"}],"name":"NodeOperatorPenalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"version","type":"uint256"}],"name":"ContractVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"executor","type":"address"},{"indexed":false,"name":"script","type":"bytes"},{"indexed":false,"name":"input","type":"bytes"},{"indexed":false,"name":"returnData","type":"bytes"}],"name":"ScriptResult","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"vault","type":"address"},{"indexed":true,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"RecoverToVault","type":"event"}] \ No newline at end of file +[ + { + "constant": true, + "inputs": [], + "name": "hasInitialized", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_targetLimitMode", + "type": "uint256" + }, + { + "name": "_targetLimit", + "type": "uint256" + } + ], + "name": "updateTargetValidatorsLimits", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_keysCount", + "type": "uint256" + }, + { + "name": "_publicKeys", + "type": "bytes" + }, + { + "name": "_signatures", + "type": "bytes" + } + ], + "name": "addSigningKeys", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getType", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "exitDeadlineThreshold", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_script", + "type": "bytes" + } + ], + "name": "getEVMScriptExecutor", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getRecoveryVault", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_offset", + "type": "uint256" + }, + { + "name": "_limit", + "type": "uint256" + } + ], + "name": "getNodeOperatorIds", + "outputs": [ + { + "name": "nodeOperatorIds", + "type": "uint256[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_proofSlotTimestamp", + "type": "uint256" + }, + { + "name": "_publicKey", + "type": "bytes" + }, + { + "name": "_eligibleToExitInSec", + "type": "uint256" + } + ], + "name": "reportValidatorExitDelay", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_offset", + "type": "uint256" + }, + { + "name": "_limit", + "type": "uint256" + } + ], + "name": "getSigningKeys", + "outputs": [ + { + "name": "pubkeys", + "type": "bytes" + }, + { + "name": "signatures", + "type": "bytes" + }, + { + "name": "used", + "type": "bool[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_fromIndex", + "type": "uint256" + }, + { + "name": "_keysCount", + "type": "uint256" + } + ], + "name": "removeSigningKeysOperatorBH", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + } + ], + "name": "getNodeOperatorIsActive", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_name", + "type": "string" + } + ], + "name": "setNodeOperatorName", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_totalRewardShares", + "type": "uint256" + } + ], + "name": "getRewardsDistribution", + "outputs": [ + { + "name": "recipients", + "type": "address[]" + }, + { + "name": "shares", + "type": "uint256[]" + }, + { + "name": "penalized", + "type": "bool[]" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_indexFrom", + "type": "uint256" + }, + { + "name": "_indexTo", + "type": "uint256" + } + ], + "name": "invalidateReadyToDepositKeysRange", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_locator", + "type": "address" + }, + { + "name": "_type", + "type": "bytes32" + }, + { + "name": "_exitDeadlineThresholdInSeconds", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_publicKey", + "type": "bytes" + }, + { + "name": "_withdrawalRequestPaidFee", + "type": "uint256" + }, + { + "name": "_exitType", + "type": "uint256" + } + ], + "name": "onValidatorExitTriggered", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getStuckPenaltyDelay", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_index", + "type": "uint256" + } + ], + "name": "removeSigningKey", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getRewardDistributionState", + "outputs": [ + { + "name": "", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_fromIndex", + "type": "uint256" + }, + { + "name": "_keysCount", + "type": "uint256" + } + ], + "name": "removeSigningKeys", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "isOperatorPenalized", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + } + ], + "name": "deactivateNodeOperator", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "token", + "type": "address" + } + ], + "name": "allowRecoverability", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "STAKING_ROUTER_ROLE", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_keysCount", + "type": "uint256" + }, + { + "name": "_publicKeys", + "type": "bytes" + }, + { + "name": "_signatures", + "type": "bytes" + } + ], + "name": "addSigningKeysOperatorBH", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "appId", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + }, + { + "name": "_proofSlotTimestamp", + "type": "uint256" + }, + { + "name": "_publicKey", + "type": "bytes" + }, + { + "name": "_eligibleToExitInSec", + "type": "uint256" + } + ], + "name": "isValidatorExitDelayPenaltyApplicable", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getActiveNodeOperatorsCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_name", + "type": "string" + }, + { + "name": "_rewardAddress", + "type": "address" + } + ], + "name": "addNodeOperator", + "outputs": [ + { + "name": "id", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getContractVersion", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getInitializationBlock", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + } + ], + "name": "getUnusedSigningKeyCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "onRewardsMinted", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "MANAGE_NODE_OPERATOR_ROLE", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_exitDeadlineThresholdInSeconds", + "type": "uint256" + } + ], + "name": "finalizeUpgrade_v4", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "distributeReward", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "onWithdrawalCredentialsChanged", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + } + ], + "name": "activateNodeOperator", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_exitedValidatorsCount", + "type": "uint256" + } + ], + "name": "unsafeUpdateValidatorsCount", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_rewardAddress", + "type": "address" + } + ], + "name": "setNodeOperatorRewardAddress", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_fullInfo", + "type": "bool" + } + ], + "name": "getNodeOperator", + "outputs": [ + { + "name": "active", + "type": "bool" + }, + { + "name": "name", + "type": "string" + }, + { + "name": "rewardAddress", + "type": "address" + }, + { + "name": "totalVettedValidators", + "type": "uint64" + }, + { + "name": "totalExitedValidators", + "type": "uint64" + }, + { + "name": "totalAddedValidators", + "type": "uint64" + }, + { + "name": "totalDepositedValidators", + "type": "uint64" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getStakingModuleSummary", + "outputs": [ + { + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorIds", + "type": "bytes" + }, + { + "name": "_exitedValidatorsCounts", + "type": "bytes" + } + ], + "name": "updateExitedValidatorsCount", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_token", + "type": "address" + } + ], + "name": "transferToVault", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_sender", + "type": "address" + }, + { + "name": "_role", + "type": "bytes32" + }, + { + "name": "_params", + "type": "uint256[]" + } + ], + "name": "canPerform", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getEVMScriptRegistry", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getNodeOperatorsCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_isTargetLimitActive", + "type": "bool" + }, + { + "name": "_targetLimit", + "type": "uint256" + } + ], + "name": "updateTargetValidatorsLimits", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_vettedSigningKeysCount", + "type": "uint64" + } + ], + "name": "setNodeOperatorStakingLimit", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + } + ], + "name": "getNodeOperatorSummary", + "outputs": [ + { + "name": "targetLimitMode", + "type": "uint256" + }, + { + "name": "targetValidatorsCount", + "type": "uint256" + }, + { + "name": "stuckValidatorsCount", + "type": "uint256" + }, + { + "name": "refundedValidatorsCount", + "type": "uint256" + }, + { + "name": "stuckPenaltyEndTimestamp", + "type": "uint256" + }, + { + "name": "totalExitedValidators", + "type": "uint256" + }, + { + "name": "totalDepositedValidators", + "type": "uint256" + }, + { + "name": "depositableValidatorsCount", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_index", + "type": "uint256" + } + ], + "name": "getSigningKey", + "outputs": [ + { + "name": "key", + "type": "bytes" + }, + { + "name": "depositSignature", + "type": "bytes" + }, + { + "name": "used", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "MAX_NODE_OPERATOR_NAME_LENGTH", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorIds", + "type": "bytes" + }, + { + "name": "_vettedSigningKeysCounts", + "type": "bytes" + } + ], + "name": "decreaseVettedSigningKeysCount", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_publicKey", + "type": "bytes" + } + ], + "name": "isValidatorExitingKeyReported", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_threshold", + "type": "uint256" + }, + { + "name": "_lateReportingWindow", + "type": "uint256" + } + ], + "name": "setExitDeadlineThreshold", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_depositsCount", + "type": "uint256" + }, + { + "name": "", + "type": "bytes" + } + ], + "name": "obtainDepositData", + "outputs": [ + { + "name": "publicKeys", + "type": "bytes" + }, + { + "name": "signatures", + "type": "bytes" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "exitPenaltyCutoffTimestamp", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getKeysOpIndex", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getNonce", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "kernel", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "getLocator", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "SET_NODE_OPERATOR_LIMIT_ROLE", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + } + ], + "name": "getTotalSigningKeyCount", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isPetrified", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "MAX_STUCK_PENALTY_DELAY", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "onExitedAndStuckValidatorsCountsUpdated", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "MAX_NODE_OPERATORS_COUNT", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_index", + "type": "uint256" + } + ], + "name": "removeSigningKeyOperatorBH", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "MANAGE_SIGNING_KEYS", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + } + ], + "name": "isOperatorPenaltyCleared", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "pure", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "name": "name", + "type": "string" + }, + { + "indexed": false, + "name": "rewardAddress", + "type": "address" + }, + { + "indexed": false, + "name": "stakingLimit", + "type": "uint64" + } + ], + "name": "NodeOperatorAdded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "name": "active", + "type": "bool" + } + ], + "name": "NodeOperatorActiveSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "name": "name", + "type": "string" + } + ], + "name": "NodeOperatorNameSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "name": "rewardAddress", + "type": "address" + } + ], + "name": "NodeOperatorRewardAddressSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "name": "totalKeysTrimmed", + "type": "uint64" + } + ], + "name": "NodeOperatorTotalKeysTrimmed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "keysOpIndex", + "type": "uint256" + } + ], + "name": "KeysOpIndexSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "moduleType", + "type": "bytes32" + } + ], + "name": "StakingModuleTypeSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "rewardAddress", + "type": "address" + }, + { + "indexed": false, + "name": "sharesAmount", + "type": "uint256" + } + ], + "name": "RewardsDistributed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "state", + "type": "uint8" + } + ], + "name": "RewardDistributionStateChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "locatorAddress", + "type": "address" + } + ], + "name": "LocatorContractSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "name": "approvedValidatorsCount", + "type": "uint256" + } + ], + "name": "VettedSigningKeysCountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "name": "depositedValidatorsCount", + "type": "uint256" + } + ], + "name": "DepositedSigningKeysCountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "name": "exitedValidatorsCount", + "type": "uint256" + } + ], + "name": "ExitedSigningKeysCountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "name": "totalValidatorsCount", + "type": "uint256" + } + ], + "name": "TotalSigningKeysCountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "nonce", + "type": "uint256" + } + ], + "name": "NonceChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "name": "targetValidatorsCount", + "type": "uint256" + }, + { + "indexed": false, + "name": "targetLimitMode", + "type": "uint256" + } + ], + "name": "TargetValidatorsCountChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "name": "publicKey", + "type": "bytes" + }, + { + "indexed": false, + "name": "eligibleToExitInSec", + "type": "uint256" + }, + { + "indexed": false, + "name": "proofSlotTimestamp", + "type": "uint256" + } + ], + "name": "ValidatorExitStatusUpdated", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "name": "publicKey", + "type": "bytes" + }, + { + "indexed": false, + "name": "withdrawalRequestPaidFee", + "type": "uint256" + }, + { + "indexed": false, + "name": "exitType", + "type": "uint256" + } + ], + "name": "ValidatorExitTriggered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "threshold", + "type": "uint256" + }, + { + "indexed": false, + "name": "reportingWindow", + "type": "uint256" + } + ], + "name": "ExitDeadlineThresholdChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "name": "version", + "type": "uint256" + } + ], + "name": "ContractVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "executor", + "type": "address" + }, + { + "indexed": false, + "name": "script", + "type": "bytes" + }, + { + "indexed": false, + "name": "input", + "type": "bytes" + }, + { + "indexed": false, + "name": "returnData", + "type": "bytes" + } + ], + "name": "ScriptResult", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "vault", + "type": "address" + }, + { + "indexed": true, + "name": "token", + "type": "address" + }, + { + "indexed": false, + "name": "amount", + "type": "uint256" + } + ], + "name": "RecoverToVault", + "type": "event" + } + ] diff --git a/interfaces/SimpleDVT.json b/interfaces/SimpleDVT.json index 4e15f855d..835d9c9fa 100644 --- a/interfaces/SimpleDVT.json +++ b/interfaces/SimpleDVT.json @@ -79,15 +79,15 @@ "constant": true, "inputs": [ { - "name": "_script", - "type": "bytes" + "name": "", + "type": "uint256" } ], - "name": "getEVMScriptExecutor", + "name": "exitDeadlineThreshold", "outputs": [ { "name": "", - "type": "address" + "type": "uint256" } ], "payable": false, @@ -95,22 +95,22 @@ "type": "function" }, { - "constant": false, + "constant": true, "inputs": [ { - "name": "_nodeOperatorId", - "type": "uint256" + "name": "_script", + "type": "bytes" } ], - "name": "clearNodeOperatorPenalty", + "name": "getEVMScriptExecutor", "outputs": [ { "name": "", - "type": "bool" + "type": "address" } ], "payable": false, - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -150,6 +150,32 @@ "stateMutability": "view", "type": "function" }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_proofSlotTimestamp", + "type": "uint256" + }, + { + "name": "_publicKey", + "type": "bytes" + }, + { + "name": "_eligibleToExitInSec", + "type": "uint256" + } + ], + "name": "reportValidatorExitDelay", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": true, "inputs": [ @@ -301,7 +327,7 @@ "type": "bytes32" }, { - "name": "_stuckPenaltyDelay", + "name": "_exitDeadlineThresholdInSeconds", "type": "uint256" } ], @@ -315,20 +341,23 @@ "constant": false, "inputs": [ { - "name": "_delay", + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_publicKey", + "type": "bytes" + }, + { + "name": "_withdrawalRequestPaidFee", + "type": "uint256" + }, + { + "name": "_exitType", "type": "uint256" } ], - "name": "setStuckPenaltyDelay", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": false, - "inputs": [], - "name": "finalizeUpgrade_v3", + "name": "onValidatorExitTriggered", "outputs": [], "payable": false, "stateMutability": "nonpayable", @@ -345,7 +374,7 @@ } ], "payable": false, - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { @@ -406,7 +435,7 @@ "constant": true, "inputs": [ { - "name": "_nodeOperatorId", + "name": "", "type": "uint256" } ], @@ -418,7 +447,7 @@ } ], "payable": false, - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { @@ -508,6 +537,37 @@ "stateMutability": "view", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "", + "type": "uint256" + }, + { + "name": "_proofSlotTimestamp", + "type": "uint256" + }, + { + "name": "_publicKey", + "type": "bytes" + }, + { + "name": "_eligibleToExitInSec", + "type": "uint256" + } + ], + "name": "isValidatorExitDelayPenaltyApplicable", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [], @@ -620,6 +680,20 @@ "stateMutability": "view", "type": "function" }, + { + "constant": false, + "inputs": [ + { + "name": "_exitDeadlineThresholdInSeconds", + "type": "uint256" + } + ], + "name": "finalizeUpgrade_v4", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": false, "inputs": [], @@ -652,6 +726,24 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": false, + "inputs": [ + { + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "name": "_exitedValidatorsCount", + "type": "uint256" + } + ], + "name": "unsafeUpdateValidatorsCount", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": false, "inputs": [ @@ -717,28 +809,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": false, - "inputs": [ - { - "name": "_locator", - "type": "address" - }, - { - "name": "_type", - "type": "bytes32" - }, - { - "name": "_stuckPenaltyDelay", - "type": "uint256" - } - ], - "name": "finalizeUpgrade_v2", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, { "constant": true, "inputs": [], @@ -779,24 +849,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorIds", - "type": "bytes" - }, - { - "name": "_stuckValidatorsCounts", - "type": "bytes" - } - ], - "name": "updateStuckValidatorsCount", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, { "constant": false, "inputs": [ @@ -838,24 +890,6 @@ "stateMutability": "view", "type": "function" }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_refundedValidatorsCount", - "type": "uint256" - } - ], - "name": "updateRefundedValidatorsCount", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, { "constant": true, "inputs": [], @@ -1034,6 +1068,43 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [ + { + "name": "_publicKey", + "type": "bytes" + } + ], + "name": "isValidatorExitingKeyReported", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_threshold", + "type": "uint256" + }, + { + "name": "_lateReportingWindow", + "type": "uint256" + } + ], + "name": "setExitDeadlineThreshold", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, { "constant": false, "inputs": [ @@ -1061,6 +1132,20 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "constant": true, + "inputs": [], + "name": "exitPenaltyCutoffTimestamp", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, { "constant": true, "inputs": [], @@ -1219,28 +1304,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "constant": false, - "inputs": [ - { - "name": "_nodeOperatorId", - "type": "uint256" - }, - { - "name": "_exitedValidatorsCount", - "type": "uint256" - }, - { - "name": "_stuckValidatorsCount", - "type": "uint256" - } - ], - "name": "unsafeUpdateValidatorsCount", - "outputs": [], - "payable": false, - "stateMutability": "nonpayable", - "type": "function" - }, { "constant": true, "inputs": [], @@ -1259,7 +1322,7 @@ "constant": true, "inputs": [ { - "name": "_nodeOperatorId", + "name": "", "type": "uint256" } ], @@ -1271,7 +1334,7 @@ } ], "payable": false, - "stateMutability": "view", + "stateMutability": "pure", "type": "function" }, { @@ -1517,13 +1580,23 @@ { "anonymous": false, "inputs": [ + { + "indexed": true, + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "name": "targetValidatorsCount", + "type": "uint256" + }, { "indexed": false, - "name": "stuckPenaltyDelay", + "name": "targetLimitMode", "type": "uint256" } ], - "name": "StuckPenaltyDelayChanged", + "name": "TargetValidatorsCountChanged", "type": "event" }, { @@ -1536,21 +1609,21 @@ }, { "indexed": false, - "name": "stuckValidatorsCount", - "type": "uint256" + "name": "publicKey", + "type": "bytes" }, { "indexed": false, - "name": "refundedValidatorsCount", + "name": "eligibleToExitInSec", "type": "uint256" }, { "indexed": false, - "name": "stuckPenaltyEndTimestamp", + "name": "proofSlotTimestamp", "type": "uint256" } ], - "name": "StuckPenaltyStateChanged", + "name": "ValidatorExitStatusUpdated", "type": "event" }, { @@ -1563,33 +1636,38 @@ }, { "indexed": false, - "name": "targetValidatorsCount", + "name": "publicKey", + "type": "bytes" + }, + { + "indexed": false, + "name": "withdrawalRequestPaidFee", "type": "uint256" }, { "indexed": false, - "name": "targetLimitMode", + "name": "exitType", "type": "uint256" } ], - "name": "TargetValidatorsCountChanged", + "name": "ValidatorExitTriggered", "type": "event" }, { "anonymous": false, "inputs": [ { - "indexed": true, - "name": "recipientAddress", - "type": "address" + "indexed": false, + "name": "threshold", + "type": "uint256" }, { "indexed": false, - "name": "sharesPenalizedAmount", + "name": "reportingWindow", "type": "uint256" } ], - "name": "NodeOperatorPenalized", + "name": "ExitDeadlineThresholdChanged", "type": "event" }, { diff --git a/interfaces/StakingRouter.json b/interfaces/StakingRouter.json index dfd058948..63233f2d2 100644 --- a/interfaces/StakingRouter.json +++ b/interfaces/StakingRouter.json @@ -77,6 +77,11 @@ "name": "InvalidFeeSum", "type": "error" }, + { + "inputs": [], + "name": "InvalidMaxDepositPerBlockValue", + "type": "error" + }, { "inputs": [], "name": "InvalidMinDepositBlockDistance", @@ -213,14 +218,25 @@ "internalType": "uint256", "name": "currentNodeOpExitedValidatorsCount", "type": "uint256" + } + ], + "name": "UnexpectedCurrentValidatorsCount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "newModuleTotalExitedValidatorsCount", + "type": "uint256" }, { "internalType": "uint256", - "name": "currentNodeOpStuckValidatorsCount", + "name": "newModuleTotalExitedValidatorsCountInStakingRouter", "type": "uint256" } ], - "name": "UnexpectedCurrentValidatorsCount", + "name": "UnexpectedFinalExitedValidatorsCount", "type": "error" }, { @@ -717,6 +733,32 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "REPORT_VALIDATOR_EXITING_STATUS_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "REPORT_VALIDATOR_EXIT_TRIGGERED_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "STAKING_MODULE_MANAGE_ROLE", @@ -864,24 +906,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "uint256[]", - "name": "_priorityExitShareThresholds", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "_maxDepositsPerBlock", - "type": "uint256[]" - }, - { - "internalType": "uint256[]", - "name": "_minDepositBlockDistances", - "type": "uint256[]" - } - ], - "name": "finalizeUpgrade_v2", + "inputs": [], + "name": "finalizeUpgrade_v3", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -2164,6 +2190,39 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "_publicKey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_withdrawalRequestPaidFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_exitType", + "type": "uint256" + } + ], + "name": "onValidatorExitTriggered", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "onValidatorsCountsByNodeOperatorReportingFinished", @@ -2238,17 +2297,27 @@ "type": "uint256" }, { - "internalType": "bytes", - "name": "_nodeOperatorIds", - "type": "bytes" + "internalType": "uint256", + "name": "_nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "_proofSlotTimestamp", + "type": "uint256" }, { "internalType": "bytes", - "name": "_stuckValidatorsCounts", + "name": "_publicKey", "type": "bytes" + }, + { + "internalType": "uint256", + "name": "_eligibleToExitInSec", + "type": "uint256" } ], - "name": "reportStakingModuleStuckValidatorsCountByNodeOperator", + "name": "reportValidatorExitDelay", "outputs": [], "stateMutability": "nonpayable", "type": "function" @@ -2350,11 +2419,6 @@ "name": "currentNodeOperatorExitedValidatorsCount", "type": "uint256" }, - { - "internalType": "uint256", - "name": "currentNodeOperatorStuckValidatorsCount", - "type": "uint256" - }, { "internalType": "uint256", "name": "newModuleExitedValidatorsCount", @@ -2364,11 +2428,6 @@ "internalType": "uint256", "name": "newNodeOperatorExitedValidatorsCount", "type": "uint256" - }, - { - "internalType": "uint256", - "name": "newNodeOperatorStuckValidatorsCount", - "type": "uint256" } ], "internalType": "struct StakingRouter.ValidatorsCountsCorrection", diff --git a/interfaces/TriggerableWithdrawalsGateway.json b/interfaces/TriggerableWithdrawalsGateway.json new file mode 100644 index 000000000..f46463094 --- /dev/null +++ b/interfaces/TriggerableWithdrawalsGateway.json @@ -0,0 +1,703 @@ +[ + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "lidoLocator", + "type": "address" + }, + { + "internalType": "uint256", + "name": "maxExitRequestsLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitsPerFrame", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "frameDurationInSec", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AdminCannotBeZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingLimit", + "type": "uint256" + } + ], + "name": "ExitRequestsLimitExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "FeeRefundFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "feeRequired", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "passedValue", + "type": "uint256" + } + ], + "name": "InsufficientFee", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRequestsDataLength", + "type": "error" + }, + { + "inputs": [], + "name": "LimitExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "PauseUntilMustBeInFuture", + "type": "error" + }, + { + "inputs": [], + "name": "PausedExpected", + "type": "error" + }, + { + "inputs": [], + "name": "ResumedExpected", + "type": "error" + }, + { + "inputs": [], + "name": "TooLargeExitsPerFrame", + "type": "error" + }, + { + "inputs": [], + "name": "TooLargeFrameDuration", + "type": "error" + }, + { + "inputs": [], + "name": "TooLargeMaxExitRequestsLimit", + "type": "error" + }, + { + "inputs": [], + "name": "UnrecoverableModuleError", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "ZeroArgument", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroFrameDuration", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPauseDuration", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxExitRequestsLimit", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "exitsPerFrame", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "frameDurationInSec", + "type": "uint256" + } + ], + "name": "ExitRequestsLimitSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Resumed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "validatorPubkey", + "type": "bytes" + } + ], + "name": "StakingModuleExitNotificationFailed", + "type": "event" + }, + { + "inputs": [], + "name": "ADD_FULL_WITHDRAWAL_REQUEST_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_INFINITELY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESUME_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TWR_LIMIT_POSITION", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TW_EXIT_LIMIT_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getExitRequestLimitFullInfo", + "outputs": [ + { + "internalType": "uint256", + "name": "maxExitRequestsLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitsPerFrame", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "frameDurationInSec", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevExitRequestsLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "currentExitRequestsLimit", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getResumeSinceTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_duration", + "type": "uint256" + } + ], + "name": "pauseFor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pauseUntilInclusive", + "type": "uint256" + } + ], + "name": "pauseUntil", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "resume", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxExitRequestsLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitsPerFrame", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "frameDurationInSec", + "type": "uint256" + } + ], + "name": "setExitRequestLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + } + ], + "internalType": "struct TriggerableWithdrawalsGateway.ValidatorData[]", + "name": "validatorsData", + "type": "tuple[]" + }, + { + "internalType": "address", + "name": "refundRecipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "exitType", + "type": "uint256" + } + ], + "name": "triggerFullWithdrawals", + "outputs": [], + "stateMutability": "payable", + "type": "function" + } +] diff --git a/interfaces/ValidatorExitVerifier.json b/interfaces/ValidatorExitVerifier.json new file mode 100644 index 000000000..39e5cc8aa --- /dev/null +++ b/interfaces/ValidatorExitVerifier.json @@ -0,0 +1 @@ +[{"inputs":[{"internalType":"address","name":"lidoLocator","type":"address"},{"internalType":"GIndex","name":"gIFirstValidatorPrev","type":"bytes32"},{"internalType":"GIndex","name":"gIFirstValidatorCurr","type":"bytes32"},{"internalType":"GIndex","name":"gIHistoricalSummariesPrev","type":"bytes32"},{"internalType":"GIndex","name":"gIHistoricalSummariesCurr","type":"bytes32"},{"internalType":"uint64","name":"firstSupportedSlot","type":"uint64"},{"internalType":"uint64","name":"pivotSlot","type":"uint64"},{"internalType":"uint32","name":"slotsPerEpoch","type":"uint32"},{"internalType":"uint32","name":"secondsPerSlot","type":"uint32"},{"internalType":"uint64","name":"genesisTime","type":"uint64"},{"internalType":"uint32","name":"shardCommitteePeriodInSeconds","type":"uint32"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint64","name":"provableBeaconBlockTimestamp","type":"uint64"},{"internalType":"uint64","name":"eligibleExitRequestTimestamp","type":"uint64"}],"name":"ExitRequestNotEligibleOnProvableBeaconBlock","type":"error"},{"inputs":[],"name":"IndexOutOfRange","type":"error"},{"inputs":[],"name":"InvalidBlockHeader","type":"error"},{"inputs":[],"name":"InvalidGIndex","type":"error"},{"inputs":[],"name":"InvalidPivotSlot","type":"error"},{"inputs":[{"internalType":"uint256","name":"keyIndex","type":"uint256"},{"internalType":"uint256","name":"totalItemsCount","type":"uint256"}],"name":"KeyIndexOutOfRange","type":"error"},{"inputs":[{"internalType":"uint256","name":"keyIndex","type":"uint256"},{"internalType":"uint256","name":"lastUnpackedKeyIndex","type":"uint256"}],"name":"KeyWasNotUnpacked","type":"error"},{"inputs":[],"name":"RootNotFound","type":"error"},{"inputs":[{"internalType":"uint64","name":"slot","type":"uint64"}],"name":"UnsupportedSlot","type":"error"},{"inputs":[],"name":"ZeroLidoLocatorAddress","type":"error"},{"inputs":[],"name":"BEACON_ROOTS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FIRST_SUPPORTED_SLOT","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GENESIS_TIME","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GI_FIRST_VALIDATOR_CURR","outputs":[{"internalType":"GIndex","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GI_FIRST_VALIDATOR_PREV","outputs":[{"internalType":"GIndex","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GI_HISTORICAL_SUMMARIES_CURR","outputs":[{"internalType":"GIndex","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GI_HISTORICAL_SUMMARIES_PREV","outputs":[{"internalType":"GIndex","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOCATOR","outputs":[{"internalType":"contract ILidoLocator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PIVOT_SLOT","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_PER_SLOT","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARD_COMMITTEE_PERIOD_IN_SECONDS","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SLOTS_PER_EPOCH","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint64","name":"slot","type":"uint64"},{"internalType":"uint64","name":"proposerIndex","type":"uint64"},{"internalType":"bytes32","name":"parentRoot","type":"bytes32"},{"internalType":"bytes32","name":"stateRoot","type":"bytes32"},{"internalType":"bytes32","name":"bodyRoot","type":"bytes32"}],"internalType":"struct BeaconBlockHeader","name":"header","type":"tuple"},{"internalType":"uint64","name":"rootsTimestamp","type":"uint64"}],"internalType":"struct ProvableBeaconBlockHeader","name":"beaconBlock","type":"tuple"},{"components":[{"internalType":"uint32","name":"exitRequestIndex","type":"uint32"},{"internalType":"bytes32","name":"withdrawalCredentials","type":"bytes32"},{"internalType":"uint64","name":"effectiveBalance","type":"uint64"},{"internalType":"bool","name":"slashed","type":"bool"},{"internalType":"uint64","name":"activationEligibilityEpoch","type":"uint64"},{"internalType":"uint64","name":"activationEpoch","type":"uint64"},{"internalType":"uint64","name":"withdrawableEpoch","type":"uint64"},{"internalType":"bytes32[]","name":"validatorProof","type":"bytes32[]"}],"internalType":"struct ValidatorWitness[]","name":"validatorWitnesses","type":"tuple[]"},{"components":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"dataFormat","type":"uint256"}],"internalType":"struct ExitRequestData","name":"exitRequests","type":"tuple"}],"name":"verifyActiveValidatorsAfterExitRequest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"components":[{"internalType":"uint64","name":"slot","type":"uint64"},{"internalType":"uint64","name":"proposerIndex","type":"uint64"},{"internalType":"bytes32","name":"parentRoot","type":"bytes32"},{"internalType":"bytes32","name":"stateRoot","type":"bytes32"},{"internalType":"bytes32","name":"bodyRoot","type":"bytes32"}],"internalType":"struct BeaconBlockHeader","name":"header","type":"tuple"},{"internalType":"uint64","name":"rootsTimestamp","type":"uint64"}],"internalType":"struct ProvableBeaconBlockHeader","name":"beaconBlock","type":"tuple"},{"components":[{"components":[{"internalType":"uint64","name":"slot","type":"uint64"},{"internalType":"uint64","name":"proposerIndex","type":"uint64"},{"internalType":"bytes32","name":"parentRoot","type":"bytes32"},{"internalType":"bytes32","name":"stateRoot","type":"bytes32"},{"internalType":"bytes32","name":"bodyRoot","type":"bytes32"}],"internalType":"struct BeaconBlockHeader","name":"header","type":"tuple"},{"internalType":"GIndex","name":"rootGIndex","type":"bytes32"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"internalType":"struct HistoricalHeaderWitness","name":"oldBlock","type":"tuple"},{"components":[{"internalType":"uint32","name":"exitRequestIndex","type":"uint32"},{"internalType":"bytes32","name":"withdrawalCredentials","type":"bytes32"},{"internalType":"uint64","name":"effectiveBalance","type":"uint64"},{"internalType":"bool","name":"slashed","type":"bool"},{"internalType":"uint64","name":"activationEligibilityEpoch","type":"uint64"},{"internalType":"uint64","name":"activationEpoch","type":"uint64"},{"internalType":"uint64","name":"withdrawableEpoch","type":"uint64"},{"internalType":"bytes32[]","name":"validatorProof","type":"bytes32[]"}],"internalType":"struct ValidatorWitness[]","name":"validatorWitnesses","type":"tuple[]"},{"components":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"dataFormat","type":"uint256"}],"internalType":"struct ExitRequestData","name":"exitRequests","type":"tuple"}],"name":"verifyHistoricalActiveValidatorsAfterExitRequest","outputs":[],"stateMutability":"nonpayable","type":"function"}] diff --git a/interfaces/ValidatorsExitBusOracle.json b/interfaces/ValidatorsExitBusOracle.json index 9c30845be..6d07ffd00 100644 --- a/interfaces/ValidatorsExitBusOracle.json +++ b/interfaces/ValidatorsExitBusOracle.json @@ -1 +1,1649 @@ -[{"inputs":[{"internalType":"uint256","name":"secondsPerSlot","type":"uint256"},{"internalType":"uint256","name":"genesisTime","type":"uint256"},{"internalType":"address","name":"lidoLocator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressCannotBeSame","type":"error"},{"inputs":[],"name":"AddressCannotBeZero","type":"error"},{"inputs":[],"name":"AdminCannotBeZero","type":"error"},{"inputs":[],"name":"ArgumentOutOfBounds","type":"error"},{"inputs":[],"name":"HashCannotBeZero","type":"error"},{"inputs":[{"internalType":"uint256","name":"initialRefSlot","type":"uint256"},{"internalType":"uint256","name":"processingRefSlot","type":"uint256"}],"name":"InitialRefSlotCannotBeLessThanProcessingOne","type":"error"},{"inputs":[],"name":"InvalidContractVersionIncrement","type":"error"},{"inputs":[],"name":"InvalidRequestsData","type":"error"},{"inputs":[],"name":"InvalidRequestsDataLength","type":"error"},{"inputs":[],"name":"InvalidRequestsDataSortOrder","type":"error"},{"inputs":[],"name":"NoConsensusReportToProcess","type":"error"},{"inputs":[{"internalType":"uint256","name":"moduleId","type":"uint256"},{"internalType":"uint256","name":"nodeOpId","type":"uint256"},{"internalType":"uint256","name":"prevRequestedValidatorIndex","type":"uint256"},{"internalType":"uint256","name":"requestedValidatorIndex","type":"uint256"}],"name":"NodeOpValidatorIndexMustIncrease","type":"error"},{"inputs":[],"name":"NonZeroContractVersionOnInit","type":"error"},{"inputs":[],"name":"PauseUntilMustBeInFuture","type":"error"},{"inputs":[],"name":"PausedExpected","type":"error"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"ProcessingDeadlineMissed","type":"error"},{"inputs":[],"name":"RefSlotAlreadyProcessing","type":"error"},{"inputs":[{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"prevRefSlot","type":"uint256"}],"name":"RefSlotCannotDecrease","type":"error"},{"inputs":[{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"processingRefSlot","type":"uint256"}],"name":"RefSlotMustBeGreaterThanProcessingOne","type":"error"},{"inputs":[],"name":"ResumedExpected","type":"error"},{"inputs":[],"name":"SecondsPerSlotCannotBeZero","type":"error"},{"inputs":[],"name":"SenderIsNotTheConsensusContract","type":"error"},{"inputs":[],"name":"SenderNotAllowed","type":"error"},{"inputs":[],"name":"UnexpectedChainConfig","type":"error"},{"inputs":[{"internalType":"uint256","name":"expectedVersion","type":"uint256"},{"internalType":"uint256","name":"receivedVersion","type":"uint256"}],"name":"UnexpectedConsensusVersion","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"received","type":"uint256"}],"name":"UnexpectedContractVersion","type":"error"},{"inputs":[{"internalType":"bytes32","name":"consensusHash","type":"bytes32"},{"internalType":"bytes32","name":"receivedHash","type":"bytes32"}],"name":"UnexpectedDataHash","type":"error"},{"inputs":[{"internalType":"uint256","name":"consensusRefSlot","type":"uint256"},{"internalType":"uint256","name":"dataRefSlot","type":"uint256"}],"name":"UnexpectedRefSlot","type":"error"},{"inputs":[],"name":"UnexpectedRequestsDataLength","type":"error"},{"inputs":[{"internalType":"uint256","name":"format","type":"uint256"}],"name":"UnsupportedRequestsDataFormat","type":"error"},{"inputs":[],"name":"VersionCannotBeSame","type":"error"},{"inputs":[],"name":"ZeroPauseDuration","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"address","name":"prevAddr","type":"address"}],"name":"ConsensusHashContractSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"version","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"prevVersion","type":"uint256"}],"name":"ConsensusVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"}],"name":"ContractVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"ProcessingStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"ReportDiscarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hash","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"processingDeadlineTime","type":"uint256"}],"name":"ReportSubmitted","type":"event"},{"anonymous":false,"inputs":[],"name":"Resumed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"nodeOperatorId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"validatorIndex","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"validatorPubkey","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"ValidatorExitRequest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestsProcessed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"requestsCount","type":"uint256"}],"name":"WarnDataIncompleteProcessing","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"refSlot","type":"uint256"}],"name":"WarnProcessingMissed","type":"event"},{"inputs":[],"name":"DATA_FORMAT_LIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GENESIS_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_CONSENSUS_CONTRACT_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MANAGE_CONSENSUS_VERSION_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_INFINITELY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESUME_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_PER_SLOT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUBMIT_DATA_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"refSlot","type":"uint256"}],"name":"discardConsensusReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getConsensusContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConsensusReport","outputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"},{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"processingDeadlineTime","type":"uint256"},{"internalType":"bool","name":"processingStarted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getConsensusVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastProcessingRefSlot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"moduleId","type":"uint256"},{"internalType":"uint256[]","name":"nodeOpIds","type":"uint256[]"}],"name":"getLastRequestedValidatorIndices","outputs":[{"internalType":"int256[]","name":"","type":"int256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProcessingState","outputs":[{"components":[{"internalType":"uint256","name":"currentFrameRefSlot","type":"uint256"},{"internalType":"uint256","name":"processingDeadlineTime","type":"uint256"},{"internalType":"bytes32","name":"dataHash","type":"bytes32"},{"internalType":"bool","name":"dataSubmitted","type":"bool"},{"internalType":"uint256","name":"dataFormat","type":"uint256"},{"internalType":"uint256","name":"requestsCount","type":"uint256"},{"internalType":"uint256","name":"requestsSubmitted","type":"uint256"}],"internalType":"struct ValidatorsExitBusOracle.ProcessingState","name":"result","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getResumeSinceTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalRequestsProcessed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"consensusContract","type":"address"},{"internalType":"uint256","name":"consensusVersion","type":"uint256"},{"internalType":"uint256","name":"lastProcessingRefSlot","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"pauseFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pauseUntilInclusive","type":"uint256"}],"name":"pauseUntil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resume","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"setConsensusContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"version","type":"uint256"}],"name":"setConsensusVersion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"reportHash","type":"bytes32"},{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"submitConsensusReport","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"consensusVersion","type":"uint256"},{"internalType":"uint256","name":"refSlot","type":"uint256"},{"internalType":"uint256","name":"requestsCount","type":"uint256"},{"internalType":"uint256","name":"dataFormat","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"internalType":"struct ValidatorsExitBusOracle.ReportData","name":"data","type":"tuple"},{"internalType":"uint256","name":"contractVersion","type":"uint256"}],"name":"submitReportData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}] \ No newline at end of file +[ + { + "inputs": [ + { + "internalType": "uint256", + "name": "secondsPerSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "genesisTime", + "type": "uint256" + }, + { + "internalType": "address", + "name": "lidoLocator", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [], + "name": "AddressCannotBeSame", + "type": "error" + }, + { + "inputs": [], + "name": "AddressCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "AdminCannotBeZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "exitDataIndex", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsCount", + "type": "uint256" + } + ], + "name": "ExitDataIndexOutOfRange", + "type": "error" + }, + { + "inputs": [], + "name": "ExitHashAlreadySubmitted", + "type": "error" + }, + { + "inputs": [], + "name": "ExitHashNotSubmitted", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "remainingLimit", + "type": "uint256" + } + ], + "name": "ExitRequestsLimitExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "HashCannotBeZero", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "initialRefSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingRefSlot", + "type": "uint256" + } + ], + "name": "InitialRefSlotCannotBeLessThanProcessingOne", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidContractVersionIncrement", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidExitDataIndexSortOrder", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidModuleId", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRequestsDataLength", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidRequestsDataSortOrder", + "type": "error" + }, + { + "inputs": [], + "name": "LimitExceeded", + "type": "error" + }, + { + "inputs": [], + "name": "NoConsensusReportToProcess", + "type": "error" + }, + { + "inputs": [], + "name": "NonZeroContractVersionOnInit", + "type": "error" + }, + { + "inputs": [], + "name": "PauseUntilMustBeInFuture", + "type": "error" + }, + { + "inputs": [], + "name": "PausedExpected", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "ProcessingDeadlineMissed", + "type": "error" + }, + { + "inputs": [], + "name": "RefSlotAlreadyProcessing", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevRefSlot", + "type": "uint256" + } + ], + "name": "RefSlotCannotDecrease", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingRefSlot", + "type": "uint256" + } + ], + "name": "RefSlotMustBeGreaterThanProcessingOne", + "type": "error" + }, + { + "inputs": [], + "name": "RequestsAlreadyDelivered", + "type": "error" + }, + { + "inputs": [], + "name": "RequestsNotDelivered", + "type": "error" + }, + { + "inputs": [], + "name": "ResumedExpected", + "type": "error" + }, + { + "inputs": [], + "name": "SecondsPerSlotCannotBeZero", + "type": "error" + }, + { + "inputs": [], + "name": "SenderIsNotTheConsensusContract", + "type": "error" + }, + { + "inputs": [], + "name": "SenderNotAllowed", + "type": "error" + }, + { + "inputs": [], + "name": "TooLargeExitsPerFrame", + "type": "error" + }, + { + "inputs": [], + "name": "TooLargeFrameDuration", + "type": "error" + }, + { + "inputs": [], + "name": "TooLargeMaxExitRequestsLimit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requestsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxRequestsPerReport", + "type": "uint256" + } + ], + "name": "TooManyExitRequestsInReport", + "type": "error" + }, + { + "inputs": [], + "name": "UnexpectedChainConfig", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expectedVersion", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "receivedVersion", + "type": "uint256" + } + ], + "name": "UnexpectedConsensusVersion", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "received", + "type": "uint256" + } + ], + "name": "UnexpectedContractVersion", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "consensusHash", + "type": "bytes32" + }, + { + "internalType": "bytes32", + "name": "receivedHash", + "type": "bytes32" + } + ], + "name": "UnexpectedDataHash", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "consensusRefSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "dataRefSlot", + "type": "uint256" + } + ], + "name": "UnexpectedRefSlot", + "type": "error" + }, + { + "inputs": [], + "name": "UnexpectedRequestsDataLength", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "format", + "type": "uint256" + } + ], + "name": "UnsupportedRequestsDataFormat", + "type": "error" + }, + { + "inputs": [], + "name": "VersionCannotBeSame", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "ZeroArgument", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroFrameDuration", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroPauseDuration", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "addr", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "prevAddr", + "type": "address" + } + ], + "name": "ConsensusHashContractSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "version", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "prevVersion", + "type": "uint256" + } + ], + "name": "ConsensusVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "ContractVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "exitRequestsHash", + "type": "bytes32" + } + ], + "name": "ExitDataProcessing", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxExitRequestsLimit", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "exitsPerFrame", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "frameDurationInSec", + "type": "uint256" + } + ], + "name": "ExitRequestsLimitSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "duration", + "type": "uint256" + } + ], + "name": "Paused", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "ProcessingStarted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + } + ], + "name": "ReportDiscarded", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "processingDeadlineTime", + "type": "uint256" + } + ], + "name": "ReportSubmitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes32", + "name": "exitRequestsHash", + "type": "bytes32" + } + ], + "name": "RequestsHashSubmitted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "Resumed", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "maxValidatorsPerReport", + "type": "uint256" + } + ], + "name": "SetMaxValidatorsPerReport", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "stakingModuleId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "nodeOperatorId", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "validatorIndex", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "validatorPubkey", + "type": "bytes" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "timestamp", + "type": "uint256" + } + ], + "name": "ValidatorExitRequest", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "requestsProcessed", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "requestsCount", + "type": "uint256" + } + ], + "name": "WarnDataIncompleteProcessing", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + } + ], + "name": "WarnProcessingMissed", + "type": "event" + }, + { + "inputs": [], + "name": "DATA_FORMAT_LIST", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXIT_REQUEST_LIMIT_MANAGER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "EXIT_TYPE", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "GENESIS_TIME", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_CONSENSUS_CONTRACT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MANAGE_CONSENSUS_VERSION_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_INFINITELY", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "PAUSE_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "RESUME_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SECONDS_PER_SLOT", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SUBMIT_DATA_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "SUBMIT_REPORT_HASH_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + } + ], + "name": "discardConsensusReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxValidatorsPerReport", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxExitRequestsLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitsPerFrame", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "frameDurationInSec", + "type": "uint256" + } + ], + "name": "finalizeUpgrade_v2", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getConsensusContract", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getConsensusReport", + "outputs": [ + { + "internalType": "bytes32", + "name": "hash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingDeadlineTime", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "processingStarted", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getConsensusVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getContractVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "exitRequestsHash", + "type": "bytes32" + } + ], + "name": "getDeliveryTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "deliveryDateTimestamp", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getExitRequestLimitFullInfo", + "outputs": [ + { + "internalType": "uint256", + "name": "maxExitRequestsLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitsPerFrame", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "frameDurationInSec", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "prevExitRequestsLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "currentExitRequestsLimit", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getLastProcessingRefSlot", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getMaxValidatorsPerReport", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getProcessingState", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "currentFrameRefSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "processingDeadlineTime", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "dataHash", + "type": "bytes32" + }, + { + "internalType": "bool", + "name": "dataSubmitted", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "dataFormat", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsSubmitted", + "type": "uint256" + } + ], + "internalType": "struct ValidatorsExitBusOracle.ProcessingState", + "name": "result", + "type": "tuple" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getResumeSinceTimestamp", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "getRoleMember", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleMemberCount", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getTotalRequestsProcessed", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "grantRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "hasRole", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "admin", + "type": "address" + }, + { + "internalType": "address", + "name": "consensusContract", + "type": "address" + }, + { + "internalType": "uint256", + "name": "consensusVersion", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastProcessingRefSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxValidatorsPerRequest", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "maxExitRequestsLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitsPerFrame", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "frameDurationInSec", + "type": "uint256" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "isPaused", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_duration", + "type": "uint256" + } + ], + "name": "pauseFor", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_pauseUntilInclusive", + "type": "uint256" + } + ], + "name": "pauseUntil", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "resume", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "revokeRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "addr", + "type": "address" + } + ], + "name": "setConsensusContract", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "setConsensusVersion", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxExitRequestsLimit", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "exitsPerFrame", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "frameDurationInSec", + "type": "uint256" + } + ], + "name": "setExitRequestLimit", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "maxRequests", + "type": "uint256" + } + ], + "name": "setMaxValidatorsPerReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "reportHash", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "deadline", + "type": "uint256" + } + ], + "name": "submitConsensusReport", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "dataFormat", + "type": "uint256" + } + ], + "internalType": "struct ValidatorsExitBus.ExitRequestsData", + "name": "request", + "type": "tuple" + } + ], + "name": "submitExitRequestsData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "exitRequestsHash", + "type": "bytes32" + } + ], + "name": "submitExitRequestsHash", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "consensusVersion", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "refSlot", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requestsCount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "dataFormat", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "internalType": "struct ValidatorsExitBusOracle.ReportData", + "name": "data", + "type": "tuple" + }, + { + "internalType": "uint256", + "name": "contractVersion", + "type": "uint256" + } + ], + "name": "submitReportData", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "dataFormat", + "type": "uint256" + } + ], + "internalType": "struct ValidatorsExitBus.ExitRequestsData", + "name": "exitsData", + "type": "tuple" + }, + { + "internalType": "uint256[]", + "name": "exitDataIndexes", + "type": "uint256[]" + }, + { + "internalType": "address", + "name": "refundRecipient", + "type": "address" + } + ], + "name": "triggerExits", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "exitRequests", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "dataFormat", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "index", + "type": "uint256" + } + ], + "name": "unpackExitRequest", + "outputs": [ + { + "internalType": "bytes", + "name": "pubkey", + "type": "bytes" + }, + { + "internalType": "uint256", + "name": "nodeOpId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "moduleId", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "valIndex", + "type": "uint256" + } + ], + "stateMutability": "pure", + "type": "function" + } +] diff --git a/interfaces/WithdrawalVault.json b/interfaces/WithdrawalVault.json index cf8287e26..4d6c2157a 100644 --- a/interfaces/WithdrawalVault.json +++ b/interfaces/WithdrawalVault.json @@ -1 +1,371 @@ -[{"inputs":[{"internalType":"contract ILido","name":"_lido","type":"address"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidContractVersionIncrement","type":"error"},{"inputs":[],"name":"LidoZeroAddress","type":"error"},{"inputs":[],"name":"NonZeroContractVersionOnInit","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"NotEnoughEther","type":"error"},{"inputs":[],"name":"NotLido","type":"error"},{"inputs":[],"name":"TreasuryZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"expected","type":"uint256"},{"internalType":"uint256","name":"received","type":"uint256"}],"name":"UnexpectedContractVersion","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"version","type":"uint256"}],"name":"ContractVersionSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requestedBy","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"requestedBy","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ERC721Recovered","type":"event"},{"inputs":[],"name":"LIDO","outputs":[{"internalType":"contract ILido","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TREASURY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractVersion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"_token","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"recoverERC721","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"}] \ No newline at end of file +[ + { + "inputs": [ + { + "internalType": "address", + "name": "_lido", + "type": "address" + }, + { + "internalType": "address", + "name": "_treasury", + "type": "address" + }, + { + "internalType": "address", + "name": "_triggerableWithdrawalsGateway", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "firstArrayLength", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "secondArrayLength", + "type": "uint256" + } + ], + "name": "ArraysLengthMismatch", + "type": "error" + }, + { + "inputs": [], + "name": "FeeInvalidData", + "type": "error" + }, + { + "inputs": [], + "name": "FeeReadFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "providedFee", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "requiredFee", + "type": "uint256" + } + ], + "name": "IncorrectFee", + "type": "error" + }, + { + "inputs": [], + "name": "InvalidContractVersionIncrement", + "type": "error" + }, + { + "inputs": [], + "name": "NonZeroContractVersionOnInit", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "requested", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "balance", + "type": "uint256" + } + ], + "name": "NotEnoughEther", + "type": "error" + }, + { + "inputs": [], + "name": "NotLido", + "type": "error" + }, + { + "inputs": [], + "name": "NotTriggerableWithdrawalsGateway", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "callData", + "type": "bytes" + } + ], + "name": "RequestAdditionFailed", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "expected", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "received", + "type": "uint256" + } + ], + "name": "UnexpectedContractVersion", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "ZeroAmount", + "type": "error" + }, + { + "inputs": [ + { + "internalType": "string", + "name": "name", + "type": "string" + } + ], + "name": "ZeroArgument", + "type": "error" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint256", + "name": "version", + "type": "uint256" + } + ], + "name": "ContractVersionSet", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "requestedBy", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "ERC20Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "requestedBy", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "token", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ERC721Recovered", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "bytes", + "name": "request", + "type": "bytes" + } + ], + "name": "WithdrawalRequestAdded", + "type": "event" + }, + { + "inputs": [], + "name": "LIDO", + "outputs": [ + { + "internalType": "contract ILido", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TREASURY", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TRIGGERABLE_WITHDRAWALS_GATEWAY", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes[]", + "name": "pubkeys", + "type": "bytes[]" + }, + { + "internalType": "uint64[]", + "name": "amounts", + "type": "uint64[]" + } + ], + "name": "addWithdrawalRequests", + "outputs": [], + "stateMutability": "payable", + "type": "function" + }, + { + "inputs": [], + "name": "finalizeUpgrade_v2", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "getContractVersion", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getWithdrawalRequestFee", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC20", + "name": "_token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "recoverERC20", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract IERC721", + "name": "_token", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "name": "recoverERC721", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_amount", + "type": "uint256" + } + ], + "name": "withdrawWithdrawals", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } +] diff --git a/interfaces/WithdrawalsManagerProxy.json b/interfaces/WithdrawalsManagerProxy.json new file mode 100644 index 000000000..92f4356bb --- /dev/null +++ b/interfaces/WithdrawalsManagerProxy.json @@ -0,0 +1,81 @@ +[ + { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "previousAdmin", + "type": "address" + }, + { + "indexed": false, + "internalType": "address", + "name": "newAdmin", + "type": "address" + } + ], + "name": "AdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "implementation", + "type": "address" + } + ], + "name": "Upgraded", + "type": "event" + }, + { "stateMutability": "payable", "type": "fallback" }, + { + "inputs": [], + "name": "implementation", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { "internalType": "address", "name": "newAdmin", "type": "address" } + ], + "name": "proxy_changeAdmin", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "proxy_getAdmin", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "proxy_getIsOssified", + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newImplementation", + "type": "address" + }, + { "internalType": "bytes", "name": "setupCalldata", "type": "bytes" } + ], + "name": "proxy_upgradeTo", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { "stateMutability": "payable", "type": "receive" } +] diff --git a/interfaces/csm/CSAccounting.json b/interfaces/csm/CSAccounting.json deleted file mode 100644 index 8dc94bed9..000000000 --- a/interfaces/csm/CSAccounting.json +++ /dev/null @@ -1,2299 +0,0 @@ -[ - { - "type": "constructor", - "inputs": [ - { - "name": "lidoLocator", - "type": "address", - "internalType": "address" - }, - { - "name": "communityStakingModule", - "type": "address", - "internalType": "address" - }, - { - "name": "maxCurveLength", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "minBondLockRetentionPeriod", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "maxBondLockRetentionPeriod", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "ACCOUNTING_MANAGER_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "CSM", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract ICSModule" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "DEFAULT_ADMIN_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "DEFAULT_BOND_CURVE_ID", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "LIDO", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract ILido" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "LIDO_LOCATOR", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract ILidoLocator" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "MANAGE_BOND_CURVES_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "MAX_BOND_LOCK_RETENTION_PERIOD", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "MAX_CURVE_LENGTH", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "MIN_BOND_LOCK_RETENTION_PERIOD", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "MIN_CURVE_LENGTH", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "PAUSE_INFINITELY", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "PAUSE_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "RECOVERER_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "RESET_BOND_CURVE_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "RESUME_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "SET_BOND_CURVE_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "WITHDRAWAL_QUEUE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract IWithdrawalQueue" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "WSTETH", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract IWstETH" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "addBondCurve", - "inputs": [ - { - "name": "bondCurve", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "outputs": [ - { - "name": "id", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "chargeFee", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "chargePenaltyRecipient", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "claimRewardsStETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "stETHAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "rewardAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "cumulativeFeeShares", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "rewardsProof", - "type": "bytes32[]", - "internalType": "bytes32[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "claimRewardsUnstETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "stEthAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "rewardAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "cumulativeFeeShares", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "rewardsProof", - "type": "bytes32[]", - "internalType": "bytes32[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "claimRewardsWstETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "wstETHAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "rewardAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "cumulativeFeeShares", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "rewardsProof", - "type": "bytes32[]", - "internalType": "bytes32[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "compensateLockedBondETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "depositETH", - "inputs": [ - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "depositStETH", - "inputs": [ - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "stETHAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "permit", - "type": "tuple", - "internalType": "struct ICSAccounting.PermitInput", - "components": [ - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "deadline", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "v", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "r", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "s", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "depositWstETH", - "inputs": [ - { - "name": "from", - "type": "address", - "internalType": "address" - }, - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "wstETHAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "permit", - "type": "tuple", - "internalType": "struct ICSAccounting.PermitInput", - "components": [ - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "deadline", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "v", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "r", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "s", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "feeDistributor", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract ICSFeeDistributor" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getActualLockedBond", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getBond", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getBondAmountByKeysCount", - "inputs": [ - { - "name": "keys", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "curve", - "type": "tuple", - "internalType": "struct ICSBondCurve.BondCurve", - "components": [ - { - "name": "points", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "trend", - "type": "uint256", - "internalType": "uint256" - } - ] - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "getBondAmountByKeysCount", - "inputs": [ - { - "name": "keys", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "curveId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getBondAmountByKeysCountWstETH", - "inputs": [ - { - "name": "keysCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "curveId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getBondAmountByKeysCountWstETH", - "inputs": [ - { - "name": "keysCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "curve", - "type": "tuple", - "internalType": "struct ICSBondCurve.BondCurve", - "components": [ - { - "name": "points", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "trend", - "type": "uint256", - "internalType": "uint256" - } - ] - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getBondCurve", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct ICSBondCurve.BondCurve", - "components": [ - { - "name": "points", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "trend", - "type": "uint256", - "internalType": "uint256" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getBondCurveId", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getBondLockRetentionPeriod", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getBondShares", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getBondSummary", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "current", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "required", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getBondSummaryShares", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "current", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "required", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getCurveInfo", - "inputs": [ - { - "name": "curveId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct ICSBondCurve.BondCurve", - "components": [ - { - "name": "points", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "trend", - "type": "uint256", - "internalType": "uint256" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getKeysCountByBondAmount", - "inputs": [ - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "curve", - "type": "tuple", - "internalType": "struct ICSBondCurve.BondCurve", - "components": [ - { - "name": "points", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "trend", - "type": "uint256", - "internalType": "uint256" - } - ] - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "getKeysCountByBondAmount", - "inputs": [ - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "curveId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getLockedBondInfo", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct ICSBondLock.BondLock", - "components": [ - { - "name": "amount", - "type": "uint128", - "internalType": "uint128" - }, - { - "name": "retentionUntil", - "type": "uint128", - "internalType": "uint128" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRequiredBondForNextKeys", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "additionalKeys", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRequiredBondForNextKeysWstETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "additionalKeys", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getResumeSinceTimestamp", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleAdmin", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleMember", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "index", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleMemberCount", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getUnbondedKeysCount", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getUnbondedKeysCountToEject", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "grantRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "hasRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "initialize", - "inputs": [ - { - "name": "bondCurve", - "type": "uint256[]", - "internalType": "uint256[]" - }, - { - "name": "admin", - "type": "address", - "internalType": "address" - }, - { - "name": "_feeDistributor", - "type": "address", - "internalType": "address" - }, - { - "name": "bondLockRetentionPeriod", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "_chargePenaltyRecipient", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "isPaused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "lockBondETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "pauseFor", - "inputs": [ - { - "name": "duration", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "penalize", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "pullFeeRewards", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "cumulativeFeeShares", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "rewardsProof", - "type": "bytes32[]", - "internalType": "bytes32[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "recoverERC1155", - "inputs": [ - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "tokenId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "recoverERC20", - "inputs": [ - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "recoverERC721", - "inputs": [ - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "tokenId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "recoverEther", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "recoverStETHShares", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "releaseLockedBondETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "renewBurnerAllowance", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "renounceRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "callerConfirmation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resetBondCurve", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resume", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "revokeRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setBondCurve", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "curveId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setChargePenaltyRecipient", - "inputs": [ - { - "name": "_chargePenaltyRecipient", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setLockedBondRetentionPeriod", - "inputs": [ - { - "name": "retention", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "settleLockedBondETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "settledAmount", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "supportsInterface", - "inputs": [ - { - "name": "interfaceId", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "totalBondShares", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "updateBondCurve", - "inputs": [ - { - "name": "curveId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "bondCurve", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "BondBurned", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "toBurnAmount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "burnedAmount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BondCharged", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "toChargeAmount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "chargedAmount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BondClaimedStETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "to", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BondClaimedUnstETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "to", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "requestId", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BondClaimedWstETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "to", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BondCurveAdded", - "inputs": [ - { - "name": "bondCurve", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BondCurveSet", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "curveId", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BondCurveUpdated", - "inputs": [ - { - "name": "curveId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "bondCurve", - "type": "uint256[]", - "indexed": false, - "internalType": "uint256[]" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BondDepositedETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "from", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BondDepositedStETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "from", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BondDepositedWstETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "from", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BondLockChanged", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "newAmount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "retentionUntil", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BondLockCompensated", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BondLockRemoved", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "BondLockRetentionPeriodChanged", - "inputs": [ - { - "name": "retentionPeriod", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ChargePenaltyRecipientSet", - "inputs": [ - { - "name": "chargePenaltyRecipient", - "type": "address", - "indexed": false, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ERC1155Recovered", - "inputs": [ - { - "name": "token", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "tokenId", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ERC20Recovered", - "inputs": [ - { - "name": "token", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ERC721Recovered", - "inputs": [ - { - "name": "token", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "tokenId", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "EtherRecovered", - "inputs": [ - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "duration", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Resumed", - "inputs": [], - "anonymous": false - }, - { - "type": "event", - "name": "RoleAdminChanged", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "previousAdminRole", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "newAdminRole", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleGranted", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "sender", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleRevoked", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "sender", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "StETHSharesRecovered", - "inputs": [ - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "shares", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "AccessControlBadConfirmation", - "inputs": [] - }, - { - "type": "error", - "name": "AccessControlUnauthorizedAccount", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - }, - { - "name": "neededRole", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "ElRewardsVaultReceiveFailed", - "inputs": [] - }, - { - "type": "error", - "name": "FailedToSendEther", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidBondCurveId", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidBondCurveLength", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidBondCurveMaxLength", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidBondCurveValues", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidBondLockAmount", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidBondLockRetentionPeriod", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidInitialisationCurveId", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidInitialization", - "inputs": [] - }, - { - "type": "error", - "name": "NodeOperatorDoesNotExist", - "inputs": [] - }, - { - "type": "error", - "name": "NotAllowedToRecover", - "inputs": [] - }, - { - "type": "error", - "name": "NotInitializing", - "inputs": [] - }, - { - "type": "error", - "name": "NothingToClaim", - "inputs": [] - }, - { - "type": "error", - "name": "PauseUntilMustBeInFuture", - "inputs": [] - }, - { - "type": "error", - "name": "PausedExpected", - "inputs": [] - }, - { - "type": "error", - "name": "ResumedExpected", - "inputs": [] - }, - { - "type": "error", - "name": "SafeCastOverflowedUintDowncast", - "inputs": [ - { - "name": "bits", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "SenderIsNotCSM", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroAdminAddress", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroChargePenaltyRecipientAddress", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroFeeDistributorAddress", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroLocatorAddress", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroModuleAddress", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroPauseDuration", - "inputs": [] - } - ] diff --git a/interfaces/csm/CSFeeDistributor.json b/interfaces/csm/CSFeeDistributor.json deleted file mode 100644 index 26a88ba29..000000000 --- a/interfaces/csm/CSFeeDistributor.json +++ /dev/null @@ -1,849 +0,0 @@ -[ - { - "type": "constructor", - "inputs": [ - { - "name": "stETH", - "type": "address", - "internalType": "address" - }, - { - "name": "accounting", - "type": "address", - "internalType": "address" - }, - { - "name": "oracle", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "ACCOUNTING", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "DEFAULT_ADMIN_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "ORACLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "RECOVERER_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "STETH", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract IStETH" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "distributeFees", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "shares", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "proof", - "type": "bytes32[]", - "internalType": "bytes32[]" - } - ], - "outputs": [ - { - "name": "sharesToDistribute", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "distributedShares", - "inputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getFeesToDistribute", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "shares", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "proof", - "type": "bytes32[]", - "internalType": "bytes32[]" - } - ], - "outputs": [ - { - "name": "sharesToDistribute", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleAdmin", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleMember", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "index", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleMemberCount", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "grantRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "hasRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "hashLeaf", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "shares", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "pure" - }, - { - "type": "function", - "name": "initialize", - "inputs": [ - { - "name": "admin", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "pendingSharesToDistribute", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "processOracleReport", - "inputs": [ - { - "name": "_treeRoot", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "_treeCid", - "type": "string", - "internalType": "string" - }, - { - "name": "distributed", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "recoverERC1155", - "inputs": [ - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "tokenId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "recoverERC20", - "inputs": [ - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "recoverERC721", - "inputs": [ - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "tokenId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "recoverEther", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "renounceRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "callerConfirmation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "revokeRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "supportsInterface", - "inputs": [ - { - "name": "interfaceId", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "totalClaimableShares", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "treeCid", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "string", - "internalType": "string" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "treeRoot", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "event", - "name": "DistributionDataUpdated", - "inputs": [ - { - "name": "totalClaimableShares", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "treeRoot", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "treeCid", - "type": "string", - "indexed": false, - "internalType": "string" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ERC1155Recovered", - "inputs": [ - { - "name": "token", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "tokenId", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ERC20Recovered", - "inputs": [ - { - "name": "token", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ERC721Recovered", - "inputs": [ - { - "name": "token", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "tokenId", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "EtherRecovered", - "inputs": [ - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "FeeDistributed", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "shares", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleAdminChanged", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "previousAdminRole", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "newAdminRole", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleGranted", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "sender", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleRevoked", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "sender", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "StETHSharesRecovered", - "inputs": [ - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "shares", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "AccessControlBadConfirmation", - "inputs": [] - }, - { - "type": "error", - "name": "AccessControlUnauthorizedAccount", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - }, - { - "name": "neededRole", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "FailedToSendEther", - "inputs": [] - }, - { - "type": "error", - "name": "FeeSharesDecrease", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidInitialization", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidProof", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidShares", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidTreeCID", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidTreeRoot", - "inputs": [] - }, - { - "type": "error", - "name": "NotAccounting", - "inputs": [] - }, - { - "type": "error", - "name": "NotAllowedToRecover", - "inputs": [] - }, - { - "type": "error", - "name": "NotEnoughShares", - "inputs": [] - }, - { - "type": "error", - "name": "NotInitializing", - "inputs": [] - }, - { - "type": "error", - "name": "NotOracle", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroAccountingAddress", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroAdminAddress", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroOracleAddress", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroStEthAddress", - "inputs": [] - } - ] diff --git a/interfaces/csm/CSFeeOracle.json b/interfaces/csm/CSFeeOracle.json deleted file mode 100644 index d08f0a893..000000000 --- a/interfaces/csm/CSFeeOracle.json +++ /dev/null @@ -1,1381 +0,0 @@ -[ - { - "inputs": [ - { - "internalType": "uint256", - "name": "secondsPerSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "genesisTime", - "type": "uint256" - } - ], - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "inputs": [], - "name": "AccessControlBadConfirmation", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "internalType": "bytes32", - "name": "neededRole", - "type": "bytes32" - } - ], - "name": "AccessControlUnauthorizedAccount", - "type": "error" - }, - { - "inputs": [], - "name": "AddressCannotBeSame", - "type": "error" - }, - { - "inputs": [], - "name": "AddressCannotBeZero", - "type": "error" - }, - { - "inputs": [], - "name": "FailedToSendEther", - "type": "error" - }, - { - "inputs": [], - "name": "HashCannotBeZero", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "initialRefSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "processingRefSlot", - "type": "uint256" - } - ], - "name": "InitialRefSlotCannotBeLessThanProcessingOne", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidContractVersion", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidContractVersionIncrement", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidInitialization", - "type": "error" - }, - { - "inputs": [], - "name": "InvalidPerfLeeway", - "type": "error" - }, - { - "inputs": [], - "name": "NoConsensusReportToProcess", - "type": "error" - }, - { - "inputs": [], - "name": "NonZeroContractVersionOnInit", - "type": "error" - }, - { - "inputs": [], - "name": "NotAllowedToRecover", - "type": "error" - }, - { - "inputs": [], - "name": "NotInitializing", - "type": "error" - }, - { - "inputs": [], - "name": "PauseUntilMustBeInFuture", - "type": "error" - }, - { - "inputs": [], - "name": "PausedExpected", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "ProcessingDeadlineMissed", - "type": "error" - }, - { - "inputs": [], - "name": "RefSlotAlreadyProcessing", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "prevRefSlot", - "type": "uint256" - } - ], - "name": "RefSlotCannotDecrease", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "processingRefSlot", - "type": "uint256" - } - ], - "name": "RefSlotMustBeGreaterThanProcessingOne", - "type": "error" - }, - { - "inputs": [], - "name": "ResumedExpected", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "bits", - "type": "uint8" - }, - { - "internalType": "uint256", - "name": "value", - "type": "uint256" - } - ], - "name": "SafeCastOverflowedUintDowncast", - "type": "error" - }, - { - "inputs": [], - "name": "SecondsPerSlotCannotBeZero", - "type": "error" - }, - { - "inputs": [], - "name": "SenderIsNotTheConsensusContract", - "type": "error" - }, - { - "inputs": [], - "name": "SenderNotAllowed", - "type": "error" - }, - { - "inputs": [], - "name": "UnexpectedChainConfig", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "expectedVersion", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "receivedVersion", - "type": "uint256" - } - ], - "name": "UnexpectedConsensusVersion", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "expected", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "received", - "type": "uint256" - } - ], - "name": "UnexpectedContractVersion", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "consensusHash", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "receivedHash", - "type": "bytes32" - } - ], - "name": "UnexpectedDataHash", - "type": "error" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "consensusRefSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "dataRefSlot", - "type": "uint256" - } - ], - "name": "UnexpectedRefSlot", - "type": "error" - }, - { - "inputs": [], - "name": "VersionCannotBeSame", - "type": "error" - }, - { - "inputs": [], - "name": "VersionCannotBeZero", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroAdminAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroFeeDistributorAddress", - "type": "error" - }, - { - "inputs": [], - "name": "ZeroPauseDuration", - "type": "error" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "prevAddr", - "type": "address" - } - ], - "name": "ConsensusHashContractSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "version", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "uint256", - "name": "prevVersion", - "type": "uint256" - } - ], - "name": "ConsensusVersionSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "version", - "type": "uint256" - } - ], - "name": "ContractVersionSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "ERC1155Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "ERC20Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - }, - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - } - ], - "name": "ERC721Recovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "EtherRecovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "address", - "name": "feeDistributorContract", - "type": "address" - } - ], - "name": "FeeDistributorContractSet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint64", - "name": "version", - "type": "uint64" - } - ], - "name": "Initialized", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "duration", - "type": "uint256" - } - ], - "name": "Paused", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": false, - "internalType": "uint256", - "name": "valueBP", - "type": "uint256" - } - ], - "name": "PerfLeewaySet", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - } - ], - "name": "ProcessingStarted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - } - ], - "name": "ReportDiscarded", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "indexed": false, - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "processingDeadlineTime", - "type": "uint256" - } - ], - "name": "ReportSubmitted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [], - "name": "Resumed", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "previousAdminRole", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "bytes32", - "name": "newAdminRole", - "type": "bytes32" - } - ], - "name": "RoleAdminChanged", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleGranted", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "indexed": true, - "internalType": "address", - "name": "account", - "type": "address" - }, - { - "indexed": true, - "internalType": "address", - "name": "sender", - "type": "address" - } - ], - "name": "RoleRevoked", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "address", - "name": "recipient", - "type": "address" - }, - { - "indexed": false, - "internalType": "uint256", - "name": "shares", - "type": "uint256" - } - ], - "name": "StETHSharesRecovered", - "type": "event" - }, - { - "anonymous": false, - "inputs": [ - { - "indexed": true, - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - } - ], - "name": "WarnProcessingMissed", - "type": "event" - }, - { - "inputs": [], - "name": "CONTRACT_MANAGER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "DEFAULT_ADMIN_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "GENESIS_TIME", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MANAGE_CONSENSUS_CONTRACT_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "MANAGE_CONSENSUS_VERSION_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PAUSE_INFINITELY", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "PAUSE_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RECOVERER_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "RESUME_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SECONDS_PER_SLOT", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "SUBMIT_DATA_ROLE", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "avgPerfLeewayBP", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - } - ], - "name": "discardConsensusReport", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "feeDistributor", - "outputs": [ - { - "internalType": "contract ICSFeeDistributor", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getConsensusContract", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getConsensusReport", - "outputs": [ - { - "internalType": "bytes32", - "name": "hash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "processingDeadlineTime", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "processingStarted", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getConsensusVersion", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getContractVersion", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getLastProcessingRefSlot", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "getResumeSinceTimestamp", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleAdmin", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "index", - "type": "uint256" - } - ], - "name": "getRoleMember", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - } - ], - "name": "getRoleMemberCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "grantRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "hasRole", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "admin", - "type": "address" - }, - { - "internalType": "address", - "name": "feeDistributorContract", - "type": "address" - }, - { - "internalType": "address", - "name": "consensusContract", - "type": "address" - }, - { - "internalType": "uint256", - "name": "consensusVersion", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "_avgPerfLeewayBP", - "type": "uint256" - } - ], - "name": "initialize", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "isPaused", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "duration", - "type": "uint256" - } - ], - "name": "pauseFor", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "pauseUntilInclusive", - "type": "uint256" - } - ], - "name": "pauseUntil", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "recoverERC1155", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - } - ], - "name": "recoverERC20", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "token", - "type": "address" - }, - { - "internalType": "uint256", - "name": "tokenId", - "type": "uint256" - } - ], - "name": "recoverERC721", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "recoverEther", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "callerConfirmation", - "type": "address" - } - ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [], - "name": "resume", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, - { - "internalType": "address", - "name": "account", - "type": "address" - } - ], - "name": "revokeRole", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - } - ], - "name": "setConsensusContract", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "version", - "type": "uint256" - } - ], - "name": "setConsensusVersion", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "feeDistributorContract", - "type": "address" - } - ], - "name": "setFeeDistributorContract", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "valueBP", - "type": "uint256" - } - ], - "name": "setPerformanceLeeway", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes32", - "name": "reportHash", - "type": "bytes32" - }, - { - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "deadline", - "type": "uint256" - } - ], - "name": "submitConsensusReport", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "components": [ - { - "internalType": "uint256", - "name": "consensusVersion", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "refSlot", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "treeRoot", - "type": "bytes32" - }, - { - "internalType": "string", - "name": "treeCid", - "type": "string" - }, - { - "internalType": "string", - "name": "logCid", - "type": "string" - }, - { - "internalType": "uint256", - "name": "distributed", - "type": "uint256" - } - ], - "internalType": "struct CSFeeOracle.ReportData", - "name": "data", - "type": "tuple" - }, - { - "internalType": "uint256", - "name": "contractVersion", - "type": "uint256" - } - ], - "name": "submitReportData", - "outputs": [], - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "internalType": "bytes4", - "name": "interfaceId", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - } -] diff --git a/interfaces/csm/CSHashConsensus.json b/interfaces/csm/CSHashConsensus.json deleted file mode 100644 index afa2ea3cf..000000000 --- a/interfaces/csm/CSHashConsensus.json +++ /dev/null @@ -1,1141 +0,0 @@ -[ - { - "type": "constructor", - "inputs": [ - { - "name": "slotsPerEpoch", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "secondsPerSlot", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "genesisTime", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "epochsPerFrame", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "fastLaneLengthSlots", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "admin", - "type": "address", - "internalType": "address" - }, - { - "name": "reportProcessor", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "DEFAULT_ADMIN_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "DISABLE_CONSENSUS_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "MANAGE_FAST_LANE_CONFIG_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "MANAGE_FRAME_CONFIG_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "MANAGE_MEMBERS_AND_QUORUM_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "MANAGE_REPORT_PROCESSOR_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "addMember", - "inputs": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "quorum", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "disableConsensus", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "getChainConfig", - "inputs": [], - "outputs": [ - { - "name": "slotsPerEpoch", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "secondsPerSlot", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "genesisTime", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getConsensusState", - "inputs": [], - "outputs": [ - { - "name": "refSlot", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "consensusReport", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "isReportProcessing", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getConsensusStateForMember", - "inputs": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "result", - "type": "tuple", - "internalType": "struct HashConsensus.MemberConsensusState", - "components": [ - { - "name": "currentFrameRefSlot", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "currentFrameConsensusReport", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "isMember", - "type": "bool", - "internalType": "bool" - }, - { - "name": "isFastLane", - "type": "bool", - "internalType": "bool" - }, - { - "name": "canReport", - "type": "bool", - "internalType": "bool" - }, - { - "name": "lastMemberReportRefSlot", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "currentFrameMemberReport", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getCurrentFrame", - "inputs": [], - "outputs": [ - { - "name": "refSlot", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "reportProcessingDeadlineSlot", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getFastLaneMembers", - "inputs": [], - "outputs": [ - { - "name": "addresses", - "type": "address[]", - "internalType": "address[]" - }, - { - "name": "lastReportedRefSlots", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getFrameConfig", - "inputs": [], - "outputs": [ - { - "name": "initialEpoch", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "epochsPerFrame", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "fastLaneLengthSlots", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getInitialRefSlot", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getIsFastLaneMember", - "inputs": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getIsMember", - "inputs": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getMembers", - "inputs": [], - "outputs": [ - { - "name": "addresses", - "type": "address[]", - "internalType": "address[]" - }, - { - "name": "lastReportedRefSlots", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getQuorum", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getReportProcessor", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getReportVariants", - "inputs": [], - "outputs": [ - { - "name": "variants", - "type": "bytes32[]", - "internalType": "bytes32[]" - }, - { - "name": "support", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleAdmin", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleMember", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "index", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleMemberCount", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "grantRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "hasRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "removeMember", - "inputs": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "quorum", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "renounceRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "callerConfirmation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "revokeRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setFastLaneLengthSlots", - "inputs": [ - { - "name": "fastLaneLengthSlots", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setFrameConfig", - "inputs": [ - { - "name": "epochsPerFrame", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "fastLaneLengthSlots", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setQuorum", - "inputs": [ - { - "name": "quorum", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setReportProcessor", - "inputs": [ - { - "name": "newProcessor", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "submitReport", - "inputs": [ - { - "name": "slot", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "report", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "consensusVersion", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "supportsInterface", - "inputs": [ - { - "name": "interfaceId", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "updateInitialEpoch", - "inputs": [ - { - "name": "initialEpoch", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "ConsensusLost", - "inputs": [ - { - "name": "refSlot", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ConsensusReached", - "inputs": [ - { - "name": "refSlot", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "report", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "support", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "FastLaneConfigSet", - "inputs": [ - { - "name": "fastLaneLengthSlots", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "FrameConfigSet", - "inputs": [ - { - "name": "newInitialEpoch", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newEpochsPerFrame", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "MemberAdded", - "inputs": [ - { - "name": "addr", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newTotalMembers", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newQuorum", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "MemberRemoved", - "inputs": [ - { - "name": "addr", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newTotalMembers", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "newQuorum", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "QuorumSet", - "inputs": [ - { - "name": "newQuorum", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "totalMembers", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "prevQuorum", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ReportProcessorSet", - "inputs": [ - { - "name": "processor", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "prevProcessor", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ReportReceived", - "inputs": [ - { - "name": "refSlot", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "member", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "report", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleAdminChanged", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "previousAdminRole", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "newAdminRole", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleGranted", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "sender", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleRevoked", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "sender", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "AccessControlBadConfirmation", - "inputs": [] - }, - { - "type": "error", - "name": "AccessControlUnauthorizedAccount", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - }, - { - "name": "neededRole", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "AddressCannotBeZero", - "inputs": [] - }, - { - "type": "error", - "name": "AdminCannotBeZero", - "inputs": [] - }, - { - "type": "error", - "name": "ConsensusReportAlreadyProcessing", - "inputs": [] - }, - { - "type": "error", - "name": "DuplicateMember", - "inputs": [] - }, - { - "type": "error", - "name": "DuplicateReport", - "inputs": [] - }, - { - "type": "error", - "name": "EmptyReport", - "inputs": [] - }, - { - "type": "error", - "name": "EpochsPerFrameCannotBeZero", - "inputs": [] - }, - { - "type": "error", - "name": "FastLanePeriodCannotBeLongerThanFrame", - "inputs": [] - }, - { - "type": "error", - "name": "InitialEpochAlreadyArrived", - "inputs": [] - }, - { - "type": "error", - "name": "InitialEpochIsYetToArrive", - "inputs": [] - }, - { - "type": "error", - "name": "InitialEpochRefSlotCannotBeEarlierThanProcessingSlot", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidChainConfig", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidInitialization", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidSlot", - "inputs": [] - }, - { - "type": "error", - "name": "NewProcessorCannotBeTheSame", - "inputs": [] - }, - { - "type": "error", - "name": "NonFastLaneMemberCannotReportWithinFastLaneInterval", - "inputs": [] - }, - { - "type": "error", - "name": "NonMember", - "inputs": [] - }, - { - "type": "error", - "name": "NotInitializing", - "inputs": [] - }, - { - "type": "error", - "name": "NumericOverflow", - "inputs": [] - }, - { - "type": "error", - "name": "QuorumTooSmall", - "inputs": [ - { - "name": "minQuorum", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "receivedQuorum", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "ReportProcessorCannotBeZero", - "inputs": [] - }, - { - "type": "error", - "name": "SafeCastOverflowedUintDowncast", - "inputs": [ - { - "name": "bits", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - } - ] - }, - { - "type": "error", - "name": "StaleReport", - "inputs": [] - }, - { - "type": "error", - "name": "UnexpectedConsensusVersion", - "inputs": [ - { - "name": "expected", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "received", - "type": "uint256", - "internalType": "uint256" - } - ] - } - ] diff --git a/interfaces/csm/CSModule.json b/interfaces/csm/CSModule.json deleted file mode 100644 index d2a5e9255..000000000 --- a/interfaces/csm/CSModule.json +++ /dev/null @@ -1,2986 +0,0 @@ -[ - { - "type": "constructor", - "inputs": [ - { - "name": "moduleType", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "minSlashingPenaltyQuotient", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "elRewardsStealingFine", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "maxKeysPerOperatorEA", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "lidoLocator", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "DEFAULT_ADMIN_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "EL_REWARDS_STEALING_FINE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "INITIAL_SLASHING_PENALTY", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "LIDO_LOCATOR", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract ILidoLocator" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "MAX_SIGNING_KEYS_PER_OPERATOR_BEFORE_PUBLIC_RELEASE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "MODULE_MANAGER_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "PAUSE_INFINITELY", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "PAUSE_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "RECOVERER_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "REPORT_EL_REWARDS_STEALING_PENALTY_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "RESUME_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "SETTLE_EL_REWARDS_STEALING_PENALTY_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "STAKING_ROUTER_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "STETH", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract IStETH" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "VERIFIER_ROLE", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "accounting", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract ICSAccounting" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "activatePublicRelease", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addNodeOperatorETH", - "inputs": [ - { - "name": "keysCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "publicKeys", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "signatures", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "managementProperties", - "type": "tuple", - "internalType": "struct NodeOperatorManagementProperties", - "components": [ - { - "name": "managerAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "rewardAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "extendedManagerPermissions", - "type": "bool", - "internalType": "bool" - } - ] - }, - { - "name": "eaProof", - "type": "bytes32[]", - "internalType": "bytes32[]" - }, - { - "name": "referrer", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "addNodeOperatorStETH", - "inputs": [ - { - "name": "keysCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "publicKeys", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "signatures", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "managementProperties", - "type": "tuple", - "internalType": "struct NodeOperatorManagementProperties", - "components": [ - { - "name": "managerAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "rewardAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "extendedManagerPermissions", - "type": "bool", - "internalType": "bool" - } - ] - }, - { - "name": "permit", - "type": "tuple", - "internalType": "struct ICSAccounting.PermitInput", - "components": [ - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "deadline", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "v", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "r", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "s", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "eaProof", - "type": "bytes32[]", - "internalType": "bytes32[]" - }, - { - "name": "referrer", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addNodeOperatorWstETH", - "inputs": [ - { - "name": "keysCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "publicKeys", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "signatures", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "managementProperties", - "type": "tuple", - "internalType": "struct NodeOperatorManagementProperties", - "components": [ - { - "name": "managerAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "rewardAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "extendedManagerPermissions", - "type": "bool", - "internalType": "bool" - } - ] - }, - { - "name": "permit", - "type": "tuple", - "internalType": "struct ICSAccounting.PermitInput", - "components": [ - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "deadline", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "v", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "r", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "s", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "name": "eaProof", - "type": "bytes32[]", - "internalType": "bytes32[]" - }, - { - "name": "referrer", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addValidatorKeysETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "keysCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "publicKeys", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "signatures", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "addValidatorKeysStETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "keysCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "publicKeys", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "signatures", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "permit", - "type": "tuple", - "internalType": "struct ICSAccounting.PermitInput", - "components": [ - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "deadline", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "v", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "r", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "s", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "addValidatorKeysWstETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "keysCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "publicKeys", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "signatures", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "permit", - "type": "tuple", - "internalType": "struct ICSAccounting.PermitInput", - "components": [ - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "deadline", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "v", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "r", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "s", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "cancelELRewardsStealingPenalty", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "changeNodeOperatorRewardAddress", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "newAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "claimRewardsStETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "stETHAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "cumulativeFeeShares", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "rewardsProof", - "type": "bytes32[]", - "internalType": "bytes32[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "claimRewardsUnstETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "stEthAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "cumulativeFeeShares", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "rewardsProof", - "type": "bytes32[]", - "internalType": "bytes32[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "claimRewardsWstETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "wstETHAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "cumulativeFeeShares", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "rewardsProof", - "type": "bytes32[]", - "internalType": "bytes32[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "cleanDepositQueue", - "inputs": [ - { - "name": "maxItems", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "compensateELRewardsStealingPenalty", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "confirmNodeOperatorManagerAddressChange", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "confirmNodeOperatorRewardAddressChange", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "decreaseVettedSigningKeysCount", - "inputs": [ - { - "name": "nodeOperatorIds", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "vettedSigningKeysCounts", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "depositETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "type": "function", - "name": "depositQueue", - "inputs": [], - "outputs": [ - { - "name": "head", - "type": "uint128", - "internalType": "uint128" - }, - { - "name": "tail", - "type": "uint128", - "internalType": "uint128" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "depositQueueItem", - "inputs": [ - { - "name": "index", - "type": "uint128", - "internalType": "uint128" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "Batch" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "depositStETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "stETHAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "permit", - "type": "tuple", - "internalType": "struct ICSAccounting.PermitInput", - "components": [ - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "deadline", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "v", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "r", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "s", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "depositWstETH", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "wstETHAmount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "permit", - "type": "tuple", - "internalType": "struct ICSAccounting.PermitInput", - "components": [ - { - "name": "value", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "deadline", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "v", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "r", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "s", - "type": "bytes32", - "internalType": "bytes32" - } - ] - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "earlyAdoption", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "contract ICSEarlyAdoption" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getActiveNodeOperatorsCount", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getNodeOperator", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct NodeOperator", - "components": [ - { - "name": "totalAddedKeys", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "totalWithdrawnKeys", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "totalDepositedKeys", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "totalVettedKeys", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "stuckValidatorsCount", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "depositableValidatorsCount", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "targetLimit", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "targetLimitMode", - "type": "uint8", - "internalType": "uint8" - }, - { - "name": "totalExitedKeys", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "enqueuedCount", - "type": "uint32", - "internalType": "uint32" - }, - { - "name": "managerAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "proposedManagerAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "rewardAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "proposedRewardAddress", - "type": "address", - "internalType": "address" - }, - { - "name": "extendedManagerPermissions", - "type": "bool", - "internalType": "bool" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getNodeOperatorIds", - "inputs": [ - { - "name": "offset", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "limit", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "nodeOperatorIds", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getNodeOperatorIsActive", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getNodeOperatorNonWithdrawnKeys", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getNodeOperatorSummary", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "targetLimitMode", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "targetValidatorsCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "stuckValidatorsCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "refundedValidatorsCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "stuckPenaltyEndTimestamp", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "totalExitedValidators", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "totalDepositedValidators", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "depositableValidatorsCount", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getNodeOperatorsCount", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getNonce", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getResumeSinceTimestamp", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleAdmin", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleMember", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "index", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "address", - "internalType": "address" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRoleMemberCount", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getSigningKeys", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "startIndex", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "keysCount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bytes", - "internalType": "bytes" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getSigningKeysWithSignatures", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "startIndex", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "keysCount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "keys", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "signatures", - "type": "bytes", - "internalType": "bytes" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getStakingModuleSummary", - "inputs": [], - "outputs": [ - { - "name": "totalExitedValidators", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "totalDepositedValidators", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "depositableValidatorsCount", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getType", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bytes32", - "internalType": "bytes32" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "grantRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "hasRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "initialize", - "inputs": [ - { - "name": "_accounting", - "type": "address", - "internalType": "address" - }, - { - "name": "_earlyAdoption", - "type": "address", - "internalType": "address" - }, - { - "name": "_keyRemovalCharge", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "admin", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "isPaused", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "isValidatorSlashed", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "keyIndex", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "isValidatorWithdrawn", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "keyIndex", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "keyRemovalCharge", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "normalizeQueue", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "obtainDepositData", - "inputs": [ - { - "name": "depositsCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [ - { - "name": "publicKeys", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "signatures", - "type": "bytes", - "internalType": "bytes" - } - ], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "onExitedAndStuckValidatorsCountsUpdated", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "onRewardsMinted", - "inputs": [ - { - "name": "totalShares", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "onWithdrawalCredentialsChanged", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "pauseFor", - "inputs": [ - { - "name": "duration", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "proposeNodeOperatorManagerAddressChange", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "proposedAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "proposeNodeOperatorRewardAddressChange", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "proposedAddress", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "publicRelease", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "recoverERC1155", - "inputs": [ - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "tokenId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "recoverERC20", - "inputs": [ - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "recoverERC721", - "inputs": [ - { - "name": "token", - "type": "address", - "internalType": "address" - }, - { - "name": "tokenId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "recoverEther", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "recoverStETHShares", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "removeKeys", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "startIndex", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "keysCount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "renounceRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "callerConfirmation", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "reportELRewardsStealingPenalty", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "blockHash", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resetNodeOperatorManagerAddress", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "resume", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "revokeRole", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "setKeyRemovalCharge", - "inputs": [ - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "settleELRewardsStealingPenalty", - "inputs": [ - { - "name": "nodeOperatorIds", - "type": "uint256[]", - "internalType": "uint256[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "submitInitialSlashing", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "keyIndex", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "submitWithdrawal", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "keyIndex", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "amount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "isSlashed", - "type": "bool", - "internalType": "bool" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "supportsInterface", - "inputs": [ - { - "name": "interfaceId", - "type": "bytes4", - "internalType": "bytes4" - } - ], - "outputs": [ - { - "name": "", - "type": "bool", - "internalType": "bool" - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "unsafeUpdateValidatorsCount", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "exitedValidatorsKeysCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "stuckValidatorsKeysCount", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateExitedValidatorsCount", - "inputs": [ - { - "name": "nodeOperatorIds", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "exitedValidatorsCounts", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateRefundedValidatorsCount", - "inputs": [ - { - "name": "", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateStuckValidatorsCount", - "inputs": [ - { - "name": "nodeOperatorIds", - "type": "bytes", - "internalType": "bytes" - }, - { - "name": "stuckValidatorsCounts", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateTargetValidatorsLimits", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "targetLimitMode", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "targetLimit", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "event", - "name": "BatchEnqueued", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "count", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "DepositableSigningKeysCountChanged", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "depositableKeysCount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "DepositedSigningKeysCountChanged", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "depositedKeysCount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ELRewardsStealingPenaltyCancelled", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ELRewardsStealingPenaltyReported", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "proposedBlockHash", - "type": "bytes32", - "indexed": false, - "internalType": "bytes32" - }, - { - "name": "stolenAmount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ELRewardsStealingPenaltySettled", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ERC1155Recovered", - "inputs": [ - { - "name": "token", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "tokenId", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ERC20Recovered", - "inputs": [ - { - "name": "token", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ERC721Recovered", - "inputs": [ - { - "name": "token", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "tokenId", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "EtherRecovered", - "inputs": [ - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "ExitedSigningKeysCountChanged", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "exitedKeysCount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "InitialSlashingSubmitted", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "keyIndex", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Initialized", - "inputs": [ - { - "name": "version", - "type": "uint64", - "indexed": false, - "internalType": "uint64" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "KeyRemovalChargeApplied", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "KeyRemovalChargeSet", - "inputs": [ - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "NodeOperatorAdded", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "managerAddress", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "rewardAddress", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "NodeOperatorManagerAddressChangeProposed", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "oldProposedAddress", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newProposedAddress", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "NodeOperatorManagerAddressChanged", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "oldAddress", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newAddress", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "NodeOperatorRewardAddressChangeProposed", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "oldProposedAddress", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newProposedAddress", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "NodeOperatorRewardAddressChanged", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "oldAddress", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "newAddress", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "NonceChanged", - "inputs": [ - { - "name": "nonce", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Paused", - "inputs": [ - { - "name": "duration", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "PublicRelease", - "inputs": [], - "anonymous": false - }, - { - "type": "event", - "name": "ReferrerSet", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "referrer", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Resumed", - "inputs": [], - "anonymous": false - }, - { - "type": "event", - "name": "RoleAdminChanged", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "previousAdminRole", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "newAdminRole", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleGranted", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "sender", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "RoleRevoked", - "inputs": [ - { - "name": "role", - "type": "bytes32", - "indexed": true, - "internalType": "bytes32" - }, - { - "name": "account", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "sender", - "type": "address", - "indexed": true, - "internalType": "address" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "SigningKeyAdded", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "pubkey", - "type": "bytes", - "indexed": false, - "internalType": "bytes" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "SigningKeyRemoved", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "pubkey", - "type": "bytes", - "indexed": false, - "internalType": "bytes" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "StETHSharesRecovered", - "inputs": [ - { - "name": "recipient", - "type": "address", - "indexed": true, - "internalType": "address" - }, - { - "name": "shares", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "StuckSigningKeysCountChanged", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "stuckKeysCount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TargetValidatorsCountChanged", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "targetLimitMode", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "targetValidatorsCount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "TotalSigningKeysCountChanged", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "totalKeysCount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "VettedSigningKeysCountChanged", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "vettedKeysCount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "VettedSigningKeysCountDecreased", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "WithdrawalSubmitted", - "inputs": [ - { - "name": "nodeOperatorId", - "type": "uint256", - "indexed": true, - "internalType": "uint256" - }, - { - "name": "keyIndex", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - }, - { - "name": "amount", - "type": "uint256", - "indexed": false, - "internalType": "uint256" - } - ], - "anonymous": false - }, - { - "type": "error", - "name": "AccessControlBadConfirmation", - "inputs": [] - }, - { - "type": "error", - "name": "AccessControlUnauthorizedAccount", - "inputs": [ - { - "name": "account", - "type": "address", - "internalType": "address" - }, - { - "name": "neededRole", - "type": "bytes32", - "internalType": "bytes32" - } - ] - }, - { - "type": "error", - "name": "AlreadyActivated", - "inputs": [] - }, - { - "type": "error", - "name": "AlreadyProposed", - "inputs": [] - }, - { - "type": "error", - "name": "AlreadySubmitted", - "inputs": [] - }, - { - "type": "error", - "name": "AlreadyWithdrawn", - "inputs": [] - }, - { - "type": "error", - "name": "EmptyKey", - "inputs": [] - }, - { - "type": "error", - "name": "ExitedKeysDecrease", - "inputs": [] - }, - { - "type": "error", - "name": "ExitedKeysHigherThanTotalDeposited", - "inputs": [] - }, - { - "type": "error", - "name": "FailedToSendEther", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidAmount", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidInitialization", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidInput", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidKeysCount", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidLength", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidReportData", - "inputs": [] - }, - { - "type": "error", - "name": "InvalidVetKeysPointer", - "inputs": [] - }, - { - "type": "error", - "name": "MaxSigningKeysCountExceeded", - "inputs": [] - }, - { - "type": "error", - "name": "MethodCallIsNotAllowed", - "inputs": [] - }, - { - "type": "error", - "name": "NodeOperatorDoesNotExist", - "inputs": [] - }, - { - "type": "error", - "name": "NotAllowedToJoinYet", - "inputs": [] - }, - { - "type": "error", - "name": "NotAllowedToRecover", - "inputs": [] - }, - { - "type": "error", - "name": "NotEnoughKeys", - "inputs": [] - }, - { - "type": "error", - "name": "NotInitializing", - "inputs": [] - }, - { - "type": "error", - "name": "NotSupported", - "inputs": [] - }, - { - "type": "error", - "name": "PauseUntilMustBeInFuture", - "inputs": [] - }, - { - "type": "error", - "name": "PausedExpected", - "inputs": [] - }, - { - "type": "error", - "name": "QueueIsEmpty", - "inputs": [] - }, - { - "type": "error", - "name": "QueueLookupNoLimit", - "inputs": [] - }, - { - "type": "error", - "name": "ResumedExpected", - "inputs": [] - }, - { - "type": "error", - "name": "SameAddress", - "inputs": [] - }, - { - "type": "error", - "name": "SenderIsNotEligible", - "inputs": [] - }, - { - "type": "error", - "name": "SenderIsNotManagerAddress", - "inputs": [] - }, - { - "type": "error", - "name": "SenderIsNotProposedAddress", - "inputs": [] - }, - { - "type": "error", - "name": "SenderIsNotRewardAddress", - "inputs": [] - }, - { - "type": "error", - "name": "SigningKeysInvalidOffset", - "inputs": [] - }, - { - "type": "error", - "name": "StuckKeysHigherThanNonExited", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroAccountingAddress", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroAdminAddress", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroLocatorAddress", - "inputs": [] - }, - { - "type": "error", - "name": "ZeroPauseDuration", - "inputs": [] - } - ] diff --git a/utils/agent.py b/utils/agent.py index 88a7f48dc..9fc0ad270 100644 --- a/utils/agent.py +++ b/utils/agent.py @@ -1,10 +1,17 @@ -from utils.config import contracts, AGENT -from utils.evm_script import encode_call_script -from typing import Tuple, Sequence +from utils.config import network_name, contracts, AGENT +from utils.evm_script import ( + encode_call_script, +) +from typing import ( + Tuple, + Optional, + Sequence, +) def agent_forward(call_script: Sequence[Tuple[str, str]]) -> Tuple[str, str]: agent = contracts.agent + print(f"Forwarding call script to agent: {call_script}") return (AGENT, agent.forward.encode_input(encode_call_script(call_script))) diff --git a/utils/config.py b/utils/config.py index 8e36dc08a..a8877702b 100644 --- a/utils/config.py +++ b/utils/config.py @@ -99,9 +99,9 @@ def local_deployer() -> LocalAccount: def get_deployer_account() -> Union[LocalAccount, Account]: is_live = get_is_live() - deployer = os.environ.get("DEPLOYER") if is_live: + deployer = os.environ.get("DEPLOYER") if deployer is None: raise EnvironmentError("For live deployment please set DEPLOYER env variable to the deployer account name") return accounts.load(deployer) @@ -212,8 +212,17 @@ def csm(self) -> interface.CSModule: @property def cs_early_adoption(self) -> interface.CSEarlyAdoption: + """Deprecated""" return interface.CSEarlyAdoption(CS_EARLY_ADOPTION_ADDRESS) + @property + def cs_permissionless_gate(self) -> interface.CSPermissionlessGate: + return interface.CSPermissionlessGate(CS_PERMISSIONLESS_GATE_ADDRESS) + + @property + def cs_vetted_gate(self) -> interface.CSVettedGate: + return interface.CSVettedGate(CS_VETTED_GATE_ADDRESS) + @property def cs_accounting(self) -> interface.CSAccounting: return interface.CSAccounting(CS_ACCOUNTING_ADDRESS) @@ -234,6 +243,22 @@ def csm_hash_consensus(self) -> interface.CSHashConsensus: def cs_verifier(self) -> interface.CSVerifier: return interface.CSVerifier(CS_VERIFIER_ADDRESS) + @property + def cs_verifier_v2(self) -> interface.CSVerifierV2: + return interface.CSVerifierV2(CS_VERIFIER_V2_ADDRESS) + + @property + def cs_exit_penalties(self) -> interface.CSExitPenalties: + return interface.CSExitPenalties(CS_EXIT_PENALTIES) + + @property + def cs_ejector(self) -> interface.CSEjector: + return interface.CSEjector(CS_EJECTOR_ADDRESS) + + @property + def cs_strikes(self) -> interface.CSStrikes: + return interface.CSStrikes(CS_STRIKES_ADDRESS) + @property def sandbox(self) -> interface.SimpleDVT: return interface.Sandbox(SANDBOX) @@ -286,6 +311,10 @@ def validators_exit_bus_oracle(self) -> interface.ValidatorsExitBusOracle: def oracle_report_sanity_checker(self) -> interface.OracleReportSanityChecker: return interface.OracleReportSanityChecker(ORACLE_REPORT_SANITY_CHECKER) + @property + def triggerable_withdrawals_gateway(self): + return interface.TriggerableWithdrawalsGateway(TRIGGERABLE_WITHDRAWALS_GATEWAY) + @property def withdrawal_queue(self) -> interface.WithdrawalQueueERC721: return interface.WithdrawalQueueERC721(WITHDRAWAL_QUEUE) @@ -406,6 +435,10 @@ def trp_escrow_factory(self) -> interface.VestingEscrowFactory: def token_rate_notifier(self) -> interface.TokenRateNotifier: return interface.TokenRateNotifier(L1_TOKEN_RATE_NOTIFIER) + @property + def validator_exit_verifier(self) -> interface.ValidatorsExitBusOracle: + return interface.ValidatorExitVerifier(VALIDATOR_EXIT_VERIFIER) + @property def dual_governance(self) -> interface.DualGovernance: return interface.DualGovernance(DUAL_GOVERNANCE) diff --git a/utils/test/event_validators/dual_governance.py b/utils/test/event_validators/dual_governance.py index a6b84c833..11d2d5f44 100644 --- a/utils/test/event_validators/dual_governance.py +++ b/utils/test/event_validators/dual_governance.py @@ -8,8 +8,8 @@ def validate_dual_governance_submit_event( proposal_id: int, proposer: str, executor: str, - metadata: str, - proposal_calls: any, + metadata: str = None, + proposal_calls: any = None, emitted_by: list[str] = None, ) -> None: _events_chain = ["LogScriptCall", "ProposalSubmitted", "ProposalSubmitted"] @@ -21,20 +21,21 @@ def validate_dual_governance_submit_event( assert event["ProposalSubmitted"][0]["id"] == proposal_id, "Wrong proposalId" assert event["ProposalSubmitted"][0]["executor"] == executor, "Wrong executor" - assert len(event["ProposalSubmitted"][0]["calls"]) == len(proposal_calls), "Wrong callsCount" - - for i in range(0, len(proposal_calls)): - assert event["ProposalSubmitted"][0]["calls"][i][0] == proposal_calls[i]["target"], "Wrong target" - assert event["ProposalSubmitted"][0]["calls"][i][1] == proposal_calls[i]["value"], "Wrong value" - assert event["ProposalSubmitted"][0]["calls"][i][2] == proposal_calls[i]["data"], "Wrong data" + if proposal_calls: + assert len(event["ProposalSubmitted"][0]["calls"]) == len(proposal_calls), "Wrong callsCount" + for i in range(0, len(proposal_calls)): + assert event["ProposalSubmitted"][0]["calls"][i][0] == proposal_calls[i]["target"], "Wrong target" + assert event["ProposalSubmitted"][0]["calls"][i][1] == proposal_calls[i]["value"], "Wrong value" + assert event["ProposalSubmitted"][0]["calls"][i][2] == proposal_calls[i]["data"], "Wrong data" assert event["ProposalSubmitted"][1]["proposalId"] == proposal_id, "Wrong proposalId" assert event["ProposalSubmitted"][1]["proposerAccount"] == proposer, "Wrong proposer" - assert event["ProposalSubmitted"][1]["metadata"] == metadata, "Wrong metadata" - assert len(event["ProposalSubmitted"]) == len(emitted_by), "Wrong emitted_by count" + if metadata: + assert event["ProposalSubmitted"][1]["metadata"] == metadata, "Wrong metadata" if emitted_by is not None: + assert len(event["ProposalSubmitted"]) == len(emitted_by), "Wrong emitted_by count" for i in range(0, len(emitted_by)): assert convert.to_address(event["ProposalSubmitted"][i]["_emitted_by"]) == convert.to_address( emitted_by[i]