Skip to content

Commit

Permalink
feat: mainnet voting tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Amuhar committed Jan 24, 2025
1 parent 43db60f commit 691055d
Showing 1 changed file with 198 additions and 0 deletions.
198 changes: 198 additions & 0 deletions tests/test_after_pectra_upgrade.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
from scripts.after_pectra_upgrade import start_vote
from utils.config import LDO_HOLDER_ADDRESS_FOR_TESTS
from brownie import interface
from utils.test.tx_tracing_helpers import *
from utils.test.event_validators.permission import validate_grant_role_event, validate_revoke_role_event
from utils.test.event_validators.common import validate_events_chain

# Contracts
AGENT = "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c"
VOTING = "0x2e59A20f205bB85a89C53f1936454680651E618e"
ORACLE_SANITY_CHECKER = "0x6232397ebac4f5772e53285b26c47914e9461e75"

# Roles
EXITED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE = "0x60b9982471bc0620c7b74959f48a86c55c92c11876fddc5b0b54d1ec47153e5d"
APPEARED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE = "0x14ca7b84baa11a976283347b0159b8ddf2dcf5fd5cf613cc567a3423cf510119"
INITIAL_SLASHING_AND_PENALTIES_MANAGER_ROLE = "0xebfa317a5d279811b024586b17a50f48924bce86f6293b233927322d7209b507"

# Old values

OLD_INITIAL_SLASHING_AMOUNT_PWEI = 1000
OLD_EXITED_VALIDATORS_PER_DAY_LIMIT = 9000
OLD_APPEARED_VALIDATORS_PER_DAY_LIMIT = 43200

# New values
NEW_INITIAL_SLASHING_AMOUNT_PWEI = 8
NEW_EXITED_VALIDATORS_PER_DAY_LIMIT = 3600
NEW_APPEARED_VALIDATORS_PER_DAY_LIMIT = 1800


def get_voting():
return interface.Voting(VOTING)


def get_sanity_checker():
return interface.OracleReportSanityChecker(ORACLE_SANITY_CHECKER)


def test_vote(helpers, accounts, vote_ids_from_env, bypass_events_decoding):
sanityChecker = get_sanity_checker()
sanity_checker_limits = sanityChecker.getOracleReportLimits()

# Before voting tests
# 1) Aragon Agent doesn't have `EXITED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE` on `OracleReportSanityChecker` contract
agent_has_role = sanityChecker.hasRole(EXITED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE, AGENT)
assert not agent_has_role
# 2) Check `exitedValidatorsPerDayLimit` sanity checker old value
assert sanity_checker_limits["exitedValidatorsPerDayLimit"] == OLD_EXITED_VALIDATORS_PER_DAY_LIMIT
# 3) Aragon Agent doesn't have `APPEARED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE` on `OracleReportSanityChecker` contract
agent_has_role = sanityChecker.hasRole(APPEARED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE, AGENT)
assert not agent_has_role
# 4) Check `appearedValidatorsPerDayLimit` sanity checker old value
assert sanity_checker_limits["appearedValidatorsPerDayLimit"] == OLD_APPEARED_VALIDATORS_PER_DAY_LIMIT
# 5) Aragon Agent doesn't have `INITIAL_SLASHING_AND_PENALTIES_MANAGER_ROLE` on `OracleReportSanityChecker` contract
agent_has_role = sanityChecker.hasRole(INITIAL_SLASHING_AND_PENALTIES_MANAGER_ROLE, AGENT)
assert not agent_has_role
# 6) Check `initialSlashingAmountPWei` sanity checker old value
assert sanity_checker_limits["initialSlashingAmountPWei"] == OLD_INITIAL_SLASHING_AMOUNT_PWEI

# 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)

voting = get_voting()

vote_tx = helpers.execute_vote(accounts, vote_id, voting)

print(f"voteId = {vote_id}, gasUsed = {vote_tx.gas_used}")

sanity_checker_limits = sanityChecker.getOracleReportLimits()

# After voting tests
# 1) Aragon Agent doesn't have `EXITED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE` on `OracleReportSanityChecker` contract
agent_has_role = sanityChecker.hasRole(EXITED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE, AGENT)
assert not agent_has_role
# 2) Check `exitedValidatorsPerDayLimit` sanity checker value after voting equal to 3600
assert sanity_checker_limits["exitedValidatorsPerDayLimit"] == NEW_EXITED_VALIDATORS_PER_DAY_LIMIT
# 3) Aragon Agent doesn't have `APPEARED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE` on `OracleReportSanityChecker` contract
agent_has_role = sanityChecker.hasRole(APPEARED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE, AGENT)
assert not agent_has_role
# 4) Check `appearedValidatorsPerDayLimit` sanity checker value after voting equal to 1800
assert sanity_checker_limits["appearedValidatorsPerDayLimit"] == NEW_APPEARED_VALIDATORS_PER_DAY_LIMIT
# 5) Aragon Agent doesn't have `INITIAL_SLASHING_AND_PENALTIES_MANAGER_ROLE` on `OracleReportSanityChecker` contract
agent_has_role = sanityChecker.hasRole(INITIAL_SLASHING_AND_PENALTIES_MANAGER_ROLE, AGENT)
assert not agent_has_role
# 6) Check `initialSlashingAmountPWei` sanity checker value to 8
assert sanity_checker_limits["initialSlashingAmountPWei"] == NEW_INITIAL_SLASHING_AMOUNT_PWEI

# Events check
display_voting_events(vote_tx)
events = group_voting_events(vote_tx)

assert len(events) == 9

# Validate exitedValidatorsPerDayLimit sanity checker value set to `NEW_EXITED_VALIDATORS_PER_DAY_LIMIT`
validate_sc_exited_validators_limit_update(events[:3], NEW_EXITED_VALIDATORS_PER_DAY_LIMIT)
# Validate appearedValidatorsPerDayLimit sanity checker value set to `NEW_APPEARED_VALIDATORS_PER_DAY_LIMIT`
validate_appeared_validators_limit_update(events[3:6], NEW_APPEARED_VALIDATORS_PER_DAY_LIMIT)
# Validate initialSlashingAmountPWei sanity checker value set to `NEW_INITIAL_SLASHING_AMOUNT_PWEI`
validate_initial_slashing_and_penalties_update(events[6:9], NEW_INITIAL_SLASHING_AMOUNT_PWEI)


# Events check


def validate_sc_exited_validators_limit_update(events: list[EventDict], exitedValidatorsPerDayLimit):
validate_grant_role_event(
events[0],
EXITED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE,
AGENT,
AGENT,
)
validate_exited_validators_per_day_limit_event(events[1], exitedValidatorsPerDayLimit)
validate_revoke_role_event(
events[2],
EXITED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE,
AGENT,
AGENT,
)


def validate_appeared_validators_limit_update(events: list[EventDict], appearedValidatorsPerDayLimit):
validate_grant_role_event(
events[0],
APPEARED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE,
AGENT,
AGENT,
)
validate_appeared_validators_limit_event(events[1], appearedValidatorsPerDayLimit)
validate_revoke_role_event(
events[2],
APPEARED_VALIDATORS_PER_DAY_LIMIT_MANAGER_ROLE,
AGENT,
AGENT,
)


def validate_initial_slashing_and_penalties_update(events: list[EventDict], initialSlashingAmountPWei):
validate_grant_role_event(
events[0],
INITIAL_SLASHING_AND_PENALTIES_MANAGER_ROLE,
AGENT,
AGENT,
)
validate_initial_slashing_and_penalties_event(events[1], initialSlashingAmountPWei)
validate_revoke_role_event(
events[2],
INITIAL_SLASHING_AND_PENALTIES_MANAGER_ROLE,
AGENT,
AGENT,
)


def validate_exited_validators_per_day_limit_event(event: EventDict, value: int):
_events_chain = [
"LogScriptCall",
"LogScriptCall",
"ExitedValidatorsPerDayLimitSet",
"ScriptResult",
]

validate_events_chain([e.name for e in event], _events_chain)

assert event.count("ExitedValidatorsPerDayLimitSet") == 1

assert event["ExitedValidatorsPerDayLimitSet"]["exitedValidatorsPerDayLimit"] == value


def validate_appeared_validators_limit_event(event: EventDict, value: int):
_events_chain = [
"LogScriptCall",
"LogScriptCall",
"AppearedValidatorsPerDayLimitSet",
"ScriptResult",
]

validate_events_chain([e.name for e in event], _events_chain)

assert event.count("AppearedValidatorsPerDayLimitSet") == 1

assert event["AppearedValidatorsPerDayLimitSet"]["appearedValidatorsPerDayLimit"] == value


def validate_initial_slashing_and_penalties_event(event: EventDict, value: int):
_events_chain = [
"LogScriptCall",
"LogScriptCall",
"InitialSlashingAmountSet",
"ScriptResult",
]

validate_events_chain([e.name for e in event], _events_chain)

assert event.count("InitialSlashingAmountSet") == 1

assert event["InitialSlashingAmountSet"]["initialSlashingAmountPWei"] == value

0 comments on commit 691055d

Please sign in to comment.