diff --git a/src/modules/accounting/accounting.py b/src/modules/accounting/accounting.py index b283d96a7..e06e38ea4 100644 --- a/src/modules/accounting/accounting.py +++ b/src/modules/accounting/accounting.py @@ -219,8 +219,7 @@ def _get_consensus_lido_state(self, blockstamp: ReferenceBlockStamp) -> tuple[Va consensus_version = self.w3.lido_contracts.accounting_oracle.get_consensus_version(blockstamp.block_hash) if consensus_version > 2: - spec = self.w3.cc.get_config_spec() - if blockstamp.ref_epoch >= int(spec.ELECTRA_FORK_EPOCH): + if self.w3.cc.is_electra_activated(blockstamp.ref_epoch): state = self.w3.cc.get_state_view(blockstamp) total_lido_eth1_bridge_deposits_amount = self.w3.lido_validators.calculate_total_eth1_bridge_deposits_amount( lido_validators, state.pending_deposits diff --git a/src/modules/ejector/ejector.py b/src/modules/ejector/ejector.py index 0aa7a728c..a40cde0da 100644 --- a/src/modules/ejector/ejector.py +++ b/src/modules/ejector/ejector.py @@ -236,12 +236,11 @@ def _get_predicted_withdrawable_epoch( """ Returns epoch when all validators in queue and validators_to_eject will be withdrawn. """ - spec = self.w3.cc.get_config_spec() - if blockstamp.ref_epoch < int(spec.ELECTRA_FORK_EPOCH): - return self._get_predicted_withdrawable_epoch_pre_electra(blockstamp, validators_to_eject) + if self.w3.cc.is_electra_activated(blockstamp.ref_epoch): + return self._get_predicted_withdrawable_epoch_post_electra(blockstamp, validators_to_eject) - return self._get_predicted_withdrawable_epoch_post_electra(blockstamp, validators_to_eject) + return self._get_predicted_withdrawable_epoch_pre_electra(blockstamp, validators_to_eject) def _get_predicted_withdrawable_epoch_pre_electra( self, @@ -320,11 +319,10 @@ def _get_latest_exit_epoch(self, blockstamp: ReferenceBlockStamp) -> tuple[Epoch @lru_cache(maxsize=1) def _get_sweep_delay_in_epochs(self, blockstamp: ReferenceBlockStamp) -> int: """Returns amount of epochs that will take to sweep all validators in chain.""" - spec = self.w3.cc.get_config_spec() - chain_config = self.get_chain_config(blockstamp) - electra_epoch = int(spec.ELECTRA_FORK_EPOCH) - if self.get_consensus_version(blockstamp) < 3 or blockstamp.ref_epoch < electra_epoch: + if self.get_consensus_version(blockstamp) < 3 or not self.w3.cc.is_electra_activated(blockstamp.ref_epoch): return self._get_sweep_delay_in_epochs_pre_pectra(blockstamp) + + chain_config = self.get_chain_config(blockstamp) state = self.w3.cc.get_state_view(blockstamp) return get_sweep_delay_in_epochs_post_pectra(state, chain_config) diff --git a/src/providers/consensus/client.py b/src/providers/consensus/client.py index c0fc6b9c8..2fcf9cc9c 100644 --- a/src/providers/consensus/client.py +++ b/src/providers/consensus/client.py @@ -40,6 +40,7 @@ class ConsensusClient(HTTPProvider): state_id State identifier. Can be one of: "head" (canonical head in node's view), "genesis", "finalized", "justified", , . """ + PROVIDER_EXCEPTION = ConsensusClientError PROMETHEUS_HISTOGRAM = CL_REQUESTS_DURATION @@ -52,6 +53,10 @@ class ConsensusClient(HTTPProvider): API_GET_SPEC = 'eth/v1/config/spec' API_GET_GENESIS = 'eth/v1/beacon/genesis' + def is_electra_activated(self, epoch: EpochNumber) -> bool: + spec = self.get_config_spec() + return epoch >= spec.ELECTRA_FORK_EPOCH + def get_config_spec(self) -> BeaconSpecResponse: """Spec: https://ethereum.github.io/beacon-APIs/#/Config/getSpec""" data, _ = self._get(self.API_GET_SPEC) diff --git a/src/providers/consensus/types.py b/src/providers/consensus/types.py index 77176408e..2c673487b 100644 --- a/src/providers/consensus/types.py +++ b/src/providers/consensus/types.py @@ -13,7 +13,7 @@ class BeaconSpecResponse(FromResponse): SECONDS_PER_SLOT: str DEPOSIT_CONTRACT_ADDRESS: str SLOTS_PER_HISTORICAL_ROOT: str - ELECTRA_FORK_EPOCH: str = str(FAR_FUTURE_EPOCH) + ELECTRA_FORK_EPOCH: int = FAR_FUTURE_EPOCH @dataclass diff --git a/src/services/bunker.py b/src/services/bunker.py index 34f8b2dd5..15d25a1a7 100644 --- a/src/services/bunker.py +++ b/src/services/bunker.py @@ -74,11 +74,17 @@ def is_bunker_mode( logger.info({"msg": "Bunker ON. CL rebase is negative"}) return True - cl_spec = self.w3.cc.get_config_spec() consensus_version = self.w3.lido_contracts.accounting_oracle.get_consensus_version(blockstamp.block_hash) web3_converter = Web3Converter(chain_config, frame_config) high_midterm_slashing_penalty = MidtermSlashingPenalty.is_high_midterm_slashing_penalty( - blockstamp, consensus_version, cl_spec, web3_converter, all_validators, lido_validators, current_report_cl_rebase, last_report_ref_slot + blockstamp, + consensus_version, + self.w3.cc.is_electra_activated, + web3_converter, + all_validators, + lido_validators, + current_report_cl_rebase, + last_report_ref_slot, ) if high_midterm_slashing_penalty: logger.info({"msg": "Bunker ON. High midterm slashing penalty"}) diff --git a/src/services/bunker_cases/abnormal_cl_rebase.py b/src/services/bunker_cases/abnormal_cl_rebase.py index e29020451..9721458df 100644 --- a/src/services/bunker_cases/abnormal_cl_rebase.py +++ b/src/services/bunker_cases/abnormal_cl_rebase.py @@ -226,8 +226,7 @@ def _get_lido_validators_balance_with_vault( consensus_version = self.w3.lido_contracts.accounting_oracle.get_consensus_version(blockstamp.block_hash) if consensus_version > 2: epoch = EpochNumber(blockstamp.slot_number // self.c_conf.slots_per_epoch) - spec = self.w3.cc.get_config_spec() - if epoch >= int(spec.ELECTRA_FORK_EPOCH): + if self.w3.cc.is_electra_activated(epoch): state = self.w3.cc.get_state_view(blockstamp) pending_deposits_sum = LidoValidatorsProvider.calculate_total_eth1_bridge_deposits_amount( lido_validators, state.pending_deposits diff --git a/src/services/bunker_cases/midterm_slashing_penalty.py b/src/services/bunker_cases/midterm_slashing_penalty.py index 3d3d08b22..1f46c294a 100644 --- a/src/services/bunker_cases/midterm_slashing_penalty.py +++ b/src/services/bunker_cases/midterm_slashing_penalty.py @@ -1,15 +1,16 @@ import logging from collections import defaultdict +from typing import Callable from src.constants import ( + EFFECTIVE_BALANCE_INCREMENT, EPOCHS_PER_SLASHINGS_VECTOR, + MAX_EFFECTIVE_BALANCE, MIN_VALIDATOR_WITHDRAWABILITY_DELAY, PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX, - EFFECTIVE_BALANCE_INCREMENT, - MAX_EFFECTIVE_BALANCE, ) -from src.providers.consensus.types import Validator, BeaconSpecResponse -from src.types import EpochNumber, Gwei, ReferenceBlockStamp, FrameNumber, SlotNumber +from src.providers.consensus.types import Validator +from src.types import EpochNumber, FrameNumber, Gwei, ReferenceBlockStamp, SlotNumber from src.utils.validator_state import calculate_total_active_effective_balance from src.utils.web3converter import Web3Converter from src.web3py.extensions.lido_validators import LidoValidator @@ -20,17 +21,16 @@ class MidtermSlashingPenalty: - @staticmethod def is_high_midterm_slashing_penalty( blockstamp: ReferenceBlockStamp, consensus_version: int, - cl_spec: BeaconSpecResponse, + is_electra_activated: Callable[[EpochNumber], bool], web3_converter: Web3Converter, all_validators: list[Validator], lido_validators: list[LidoValidator], current_report_cl_rebase: Gwei, - last_report_ref_slot: SlotNumber + last_report_ref_slot: SlotNumber, ) -> bool: """ Check if there is a high midterm slashing penalty in the future frames. @@ -66,8 +66,14 @@ def is_high_midterm_slashing_penalty( blockstamp.ref_epoch, all_slashed_validators, total_balance, future_frames_lido_validators ) else: - frames_lido_midterm_penalties = MidtermSlashingPenalty.get_future_midterm_penalty_sum_in_frames_post_electra( - blockstamp.ref_epoch, cl_spec, all_slashed_validators, total_balance, future_frames_lido_validators, + frames_lido_midterm_penalties = ( + MidtermSlashingPenalty.get_future_midterm_penalty_sum_in_frames_post_electra( + blockstamp.ref_epoch, + is_electra_activated, + all_slashed_validators, + total_balance, + future_frames_lido_validators, + ) ) max_lido_midterm_penalty = max(frames_lido_midterm_penalties.values()) logger.info({"msg": f"Max lido midterm penalty: {max_lido_midterm_penalty}"}) @@ -84,8 +90,7 @@ def is_high_midterm_slashing_penalty( @staticmethod def get_slashed_validators_with_impact_on_midterm_penalties( - validators: list[Validator], - ref_epoch: EpochNumber + validators: list[Validator], ref_epoch: EpochNumber ) -> list[Validator]: """ Get slashed validators which have impact on midterm penalties @@ -104,6 +109,7 @@ def get_slashed_validators_with_impact_on_midterm_penalties( https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#slash_validator """ + def is_have_impact(v: Validator) -> bool: return v.validator.slashed and int(v.validator.withdrawable_epoch) > ref_epoch @@ -169,11 +175,10 @@ def get_future_midterm_penalty_sum_in_frames_pre_electra( """Calculate sum of midterm penalties in each frame""" per_frame_midterm_penalty_sum: dict[FrameNumber, Gwei] = {} for (frame_number, _), validators_in_future_frame in per_frame_validators.items(): - per_frame_midterm_penalty_sum[frame_number] = MidtermSlashingPenalty.predict_midterm_penalty_in_frame_pre_electra( - ref_epoch, - all_slashed_validators, - total_balance, - validators_in_future_frame + per_frame_midterm_penalty_sum[frame_number] = ( + MidtermSlashingPenalty.predict_midterm_penalty_in_frame_pre_electra( + ref_epoch, all_slashed_validators, total_balance, validators_in_future_frame + ) ) return per_frame_midterm_penalty_sum @@ -183,7 +188,7 @@ def predict_midterm_penalty_in_frame_pre_electra( ref_epoch: EpochNumber, all_slashed_validators: list[Validator], total_balance: Gwei, - midterm_penalized_validators_in_frame: list[LidoValidator] + midterm_penalized_validators_in_frame: list[LidoValidator], ) -> Gwei: """Predict penalty in frame""" penalty_in_frame = 0 @@ -200,7 +205,7 @@ def predict_midterm_penalty_in_frame_pre_electra( @staticmethod def get_future_midterm_penalty_sum_in_frames_post_electra( ref_epoch: EpochNumber, - cl_spec: BeaconSpecResponse, + is_electra_activated: Callable[[EpochNumber], bool], all_slashed_validators: list[Validator], total_balance: Gwei, per_frame_validators: SlashedValidatorsFrameBuckets, @@ -208,13 +213,15 @@ def get_future_midterm_penalty_sum_in_frames_post_electra( """Calculate sum of midterm penalties in each frame""" per_frame_midterm_penalty_sum: dict[FrameNumber, Gwei] = {} for (frame_number, frame_ref_epoch), validators_in_future_frame in per_frame_validators.items(): - per_frame_midterm_penalty_sum[frame_number] = MidtermSlashingPenalty.predict_midterm_penalty_in_frame_post_electra( - ref_epoch, - frame_ref_epoch, - cl_spec, - all_slashed_validators, - total_balance, - validators_in_future_frame + per_frame_midterm_penalty_sum[frame_number] = ( + MidtermSlashingPenalty.predict_midterm_penalty_in_frame_post_electra( + ref_epoch, + frame_ref_epoch, + is_electra_activated, + all_slashed_validators, + total_balance, + validators_in_future_frame, + ) ) return per_frame_midterm_penalty_sum @@ -223,10 +230,10 @@ def get_future_midterm_penalty_sum_in_frames_post_electra( def predict_midterm_penalty_in_frame_post_electra( report_ref_epoch: EpochNumber, frame_ref_epoch: EpochNumber, - cl_spec: BeaconSpecResponse, + is_electra_activated: Callable[[EpochNumber], bool], all_slashed_validators: list[Validator], total_balance: Gwei, - midterm_penalized_validators_in_frame: list[LidoValidator] + midterm_penalized_validators_in_frame: list[LidoValidator], ) -> Gwei: """Predict penalty in frame""" penalty_in_frame = 0 @@ -236,7 +243,7 @@ def predict_midterm_penalty_in_frame_post_electra( report_ref_epoch, all_slashed_validators, EpochNumber(midterm_penalty_epoch) ) - if frame_ref_epoch < int(cl_spec.ELECTRA_FORK_EPOCH): + if not is_electra_activated(frame_ref_epoch): penalty_in_frame += MidtermSlashingPenalty.get_validator_midterm_penalty( validator, len(bound_slashed_validators), total_balance ) @@ -250,7 +257,7 @@ def predict_midterm_penalty_in_frame_post_electra( def get_validator_midterm_penalty( validator: LidoValidator, bound_slashed_validators_count: int, - total_balance: Gwei + total_balance: Gwei, ) -> Gwei: """ Calculate midterm penalty for particular validator @@ -312,7 +319,7 @@ def get_frame_cl_rebase_from_report_cl_rebase( web3_converter: Web3Converter, report_cl_rebase: Gwei, curr_report_blockstamp: ReferenceBlockStamp, - last_report_ref_slot: SlotNumber + last_report_ref_slot: SlotNumber, ) -> Gwei: """Get frame rebase from report rebase""" last_report_ref_epoch = web3_converter.get_epoch_by_slot(last_report_ref_slot) diff --git a/tests/modules/accounting/bunker/test_bunker_midterm_penalty.py b/tests/modules/accounting/bunker/test_bunker_midterm_penalty.py index 8932bb1df..0d0e58a31 100644 --- a/tests/modules/accounting/bunker/test_bunker_midterm_penalty.py +++ b/tests/modules/accounting/bunker/test_bunker_midterm_penalty.py @@ -2,12 +2,12 @@ import pytest -from src.constants import MAX_EFFECTIVE_BALANCE_ELECTRA, MAX_EFFECTIVE_BALANCE +from src.constants import MAX_EFFECTIVE_BALANCE, MAX_EFFECTIVE_BALANCE_ELECTRA from src.modules.submodules.consensus import FrameConfig from src.modules.submodules.types import ChainConfig from src.providers.consensus.types import Validator, ValidatorState from src.services.bunker_cases.midterm_slashing_penalty import MidtermSlashingPenalty -from src.types import EpochNumber, ReferenceBlockStamp, Gwei +from src.types import EpochNumber, Gwei, ReferenceBlockStamp, SlotNumber from src.utils.web3converter import Web3Converter @@ -45,15 +45,6 @@ def simple_validators( return validators -TEST_ELECTRA_FORK_EPOCH = 450 - - -@pytest.fixture(params=[TEST_ELECTRA_FORK_EPOCH]) -def spec_with_electra(request): - # sets the electra fork epoch to the test value for calculating the penalty - return Mock(ELECTRA_FORK_EPOCH=request.param) - - @pytest.mark.unit @pytest.mark.parametrize( ("blockstamp", "all_validators", "lido_validators", "report_cl_rebase", "expected_result"), @@ -122,7 +113,6 @@ def spec_with_electra(request): def test_is_high_midterm_slashing_penalty_pre_electra( blockstamp, all_validators, lido_validators, report_cl_rebase, expected_result ): - cl_spec = Mock() chain_config = ChainConfig( slots_per_epoch=32, seconds_per_slot=12, @@ -136,7 +126,14 @@ def test_is_high_midterm_slashing_penalty_pre_electra( web3_converter = Web3Converter(chain_config, frame_config) result = MidtermSlashingPenalty.is_high_midterm_slashing_penalty( - blockstamp, 2, cl_spec, web3_converter, all_validators, lido_validators, report_cl_rebase, 0 + blockstamp, + 2, + lambda _: True, # FIXME: doens't affect the test outcome + web3_converter, + all_validators, + lido_validators, + report_cl_rebase, + 0, ) assert result == expected_result @@ -207,7 +204,7 @@ def test_is_high_midterm_slashing_penalty_pre_electra( ], ) def test_is_high_midterm_slashing_penalty_post_electra( - blockstamp, spec_with_electra, all_validators, lido_validators, report_cl_rebase, expected_result + blockstamp, all_validators, lido_validators, report_cl_rebase, expected_result ): chain_config = ChainConfig( slots_per_epoch=32, @@ -223,12 +220,12 @@ def test_is_high_midterm_slashing_penalty_post_electra( result = MidtermSlashingPenalty.is_high_midterm_slashing_penalty( blockstamp, 3, - spec_with_electra, + lambda _: True, # FIXME: It doesn't change the test outcome. web3_converter, all_validators, lido_validators, report_cl_rebase, - 0, + SlotNumber(0), ) assert result == expected_result @@ -259,7 +256,7 @@ def test_is_high_midterm_slashing_penalty_post_electra( ), ], ) -def test_get_possible_slashed_epochs(validator, spec_with_electra, ref_epoch, expected_result): +def test_get_possible_slashed_epochs(validator, ref_epoch, expected_result): result = MidtermSlashingPenalty.get_possible_slashed_epochs(validator, ref_epoch) assert result == expected_result @@ -297,7 +294,7 @@ def test_get_possible_slashed_epochs(validator, spec_with_electra, ref_epoch, ex ], ) def test_get_per_frame_lido_validators_with_future_midterm_epoch( - ref_epoch, spec_with_electra, future_midterm_penalty_lido_slashed_validators, expected_result + ref_epoch, future_midterm_penalty_lido_slashed_validators, expected_result ): chain_config = ChainConfig( slots_per_epoch=32, @@ -393,7 +390,7 @@ def test_get_future_midterm_penalty_sum_in_frames_pre_electra( @pytest.mark.parametrize( ( "ref_epoch", - "spec_with_electra", + "is_electra_activated", "per_frame_validators", "all_slashed_validators", "active_validators_count", @@ -404,7 +401,7 @@ def test_get_future_midterm_penalty_sum_in_frames_pre_electra( ( # one is slashed before electra 225, - 4500, + lambda epoch: epoch >= 4500, {(18, 4049): simple_validators(0, 0, slashed=True)}, simple_validators(0, 0, slashed=True), 50000, @@ -413,7 +410,7 @@ def test_get_future_midterm_penalty_sum_in_frames_pre_electra( ( # one is slashed after electra 225, - 225, + lambda epoch: epoch >= 225, {(18, 4049): simple_validators(0, 0, slashed=True)}, simple_validators(0, 0, slashed=True), 50000, @@ -422,7 +419,7 @@ def test_get_future_midterm_penalty_sum_in_frames_pre_electra( ( # all are slashed before electra 225, - 4500, + lambda epoch: epoch >= 4500, {(18, 4049): simple_validators(0, 99, slashed=True)}, simple_validators(0, 99, slashed=True), 50000, @@ -431,7 +428,7 @@ def test_get_future_midterm_penalty_sum_in_frames_pre_electra( ( # all are slashed after electra 225, - 225, + lambda epoch: epoch >= 225, {(18, 4049): simple_validators(0, 99, slashed=True)}, simple_validators(0, 99, slashed=True), 50000, @@ -440,7 +437,7 @@ def test_get_future_midterm_penalty_sum_in_frames_pre_electra( ( # slashed in different frames with determined slashing epochs in different forks 225, - 4500, + lambda epoch: epoch >= 4500, { (18, 4049): simple_validators(0, 0, slashed=True), (19, 4724): simple_validators(10, 59, slashed=True, exit_epoch="8000", withdrawable_epoch="8417"), @@ -455,7 +452,7 @@ def test_get_future_midterm_penalty_sum_in_frames_pre_electra( ( # slashed in different epochs in different frames without determined slashing epochs in different forks 225, - 4500, + lambda epoch: epoch >= 4500, { (18, 4049): [ *simple_validators(0, 5), @@ -476,11 +473,10 @@ def test_get_future_midterm_penalty_sum_in_frames_pre_electra( {18: 0, 19: 5_760_000_000}, ), ], - indirect=["spec_with_electra"], ) def test_get_future_midterm_penalty_sum_in_frames_post_electra( ref_epoch, - spec_with_electra, + is_electra_activated, per_frame_validators, all_slashed_validators, active_validators_count, @@ -488,7 +484,7 @@ def test_get_future_midterm_penalty_sum_in_frames_post_electra( ): result = MidtermSlashingPenalty.get_future_midterm_penalty_sum_in_frames_post_electra( EpochNumber(ref_epoch), - spec_with_electra, + is_electra_activated, all_slashed_validators, active_validators_count * 32 * 10**9, per_frame_validators, @@ -556,7 +552,7 @@ def test_predict_midterm_penalty_in_frame_pre_electra( @pytest.mark.parametrize( ( "ref_epoch", - "is_after_electra", + "is_electra_activated", "all_slashed_validators", "total_balance", "validators_in_frame", @@ -568,7 +564,7 @@ def test_predict_midterm_penalty_in_frame_pre_electra( ( # one is slashed 225, - False, + lambda _: False, simple_validators(0, 0, slashed=True), 100 * 32 * 10**9, simple_validators(0, 0, slashed=True), @@ -577,7 +573,7 @@ def test_predict_midterm_penalty_in_frame_pre_electra( ( # all are slashed 225, - False, + lambda _: False, simple_validators(0, 99, slashed=True), 100 * 32 * 10**9, simple_validators(0, 99, slashed=True), @@ -586,7 +582,7 @@ def test_predict_midterm_penalty_in_frame_pre_electra( ( # several are slashed 225, - False, + lambda _: False, simple_validators(0, 9, slashed=True), 100 * 32 * 10**9, simple_validators(0, 9, slashed=True), @@ -595,7 +591,7 @@ def test_predict_midterm_penalty_in_frame_pre_electra( ( # slashed in different epochs in different frames without determined slashing epochs 225, - False, + lambda _: False, [ *simple_validators(0, 5, slashed=True), *simple_validators(6, 9, slashed=True, exit_epoch="8192", withdrawable_epoch="8197"), @@ -608,11 +604,18 @@ def test_predict_midterm_penalty_in_frame_pre_electra( 10 * 9 * 10**9, ), # AFTER ELECTRA - (225, True, [], 100 * 32 * 10**9, [], 0), + ( + 225, + lambda _: True, + [], + 100 * 32 * 10**9, + [], + 0, + ), ( # one is slashed 225, - True, + lambda _: True, simple_validators(0, 0, slashed=True), 100 * 32 * 10**9, simple_validators(0, 0, slashed=True), @@ -621,7 +624,7 @@ def test_predict_midterm_penalty_in_frame_pre_electra( ( # all are slashed 225, - True, + lambda _: True, simple_validators(0, 99, slashed=True), 100 * 32 * 10**9, simple_validators(0, 99, slashed=True), @@ -630,7 +633,7 @@ def test_predict_midterm_penalty_in_frame_pre_electra( ( # several are slashed 225, - True, + lambda _: True, simple_validators(0, 9, slashed=True), 100 * 32 * 10**9, simple_validators(0, 9, slashed=True), @@ -639,7 +642,7 @@ def test_predict_midterm_penalty_in_frame_pre_electra( ( # slashed in different epochs in different frames without determined slashing epochs 225, - True, + lambda _: True, [ *simple_validators(0, 5, slashed=True), *simple_validators(6, 9, slashed=True, exit_epoch="8192", withdrawable_epoch="8197"), @@ -655,19 +658,16 @@ def test_predict_midterm_penalty_in_frame_pre_electra( ) def test_predict_midterm_penalty_in_frame_post_electra( ref_epoch, - is_after_electra, + is_electra_activated, all_slashed_validators, total_balance, validators_in_frame, expected_result, - spec_with_electra, ): result = MidtermSlashingPenalty.predict_midterm_penalty_in_frame_post_electra( report_ref_epoch=EpochNumber(ref_epoch), - frame_ref_epoch=EpochNumber( - spec_with_electra.ELECTRA_FORK_EPOCH if is_after_electra else spec_with_electra.ELECTRA_FORK_EPOCH - 1 - ), - cl_spec=spec_with_electra, + frame_ref_epoch=Mock(), + is_electra_activated=is_electra_activated, all_slashed_validators=all_slashed_validators, total_balance=total_balance, midterm_penalized_validators_in_frame=validators_in_frame, diff --git a/tests/modules/ejector/test_ejector.py b/tests/modules/ejector/test_ejector.py index 2d7c29799..7146232eb 100644 --- a/tests/modules/ejector/test_ejector.py +++ b/tests/modules/ejector/test_ejector.py @@ -221,7 +221,7 @@ def test_is_contract_reportable(ejector: Ejector, blockstamp: BlockStamp) -> Non @pytest.mark.unit def test_get_predicted_withdrawable_epoch_pre_electra(ejector: Ejector) -> None: ejector.w3.cc = Mock() - ejector.w3.cc.get_config_spec = Mock(return_value=Mock(ELECTRA_FORK_EPOCH=FAR_FUTURE_EPOCH)) + ejector.w3.cc.is_electra_activated = Mock(return_value=False) ejector._get_latest_exit_epoch = Mock(return_value=[1, 32]) ejector._get_churn_limit = Mock(return_value=2) ref_blockstamp = ReferenceBlockStampFactory.build(ref_epoch=3546) diff --git a/tests/providers/consensus/test_consensus_client.py b/tests/providers/consensus/test_consensus_client.py index 79dde0f6b..81b1c3a24 100644 --- a/tests/providers/consensus/test_consensus_client.py +++ b/tests/providers/consensus/test_consensus_client.py @@ -7,7 +7,7 @@ from src.providers.consensus.client import ConsensusClient from src.providers.consensus.types import Validator -from src.types import SlotNumber +from src.types import EpochNumber, SlotNumber from src.utils.blockstamp import build_blockstamp from src.variables import CONSENSUS_CLIENT_URI from tests.factory.blockstamp import BlockStampFactory @@ -36,7 +36,7 @@ def test_get_block_attestations(consensus_client: ConsensusClient): root = consensus_client.get_block_root('finalized').root attestations = list(consensus_client.get_block_attestations(root)) - assert attestations + assert not attestations @pytest.mark.integration @@ -79,9 +79,8 @@ def test_get_state_view(consensus_client: ConsensusClient): state_view = consensus_client.get_state_view(blockstamp) assert state_view.slot == blockstamp.slot_number - spec = consensus_client.get_config_spec() - epoch = int(state_view.slot) // 32 - if epoch >= int(spec.ELECTRA_FORK_EPOCH): + epoch = EpochNumber(state_view.slot // 32) + if consensus_client.is_electra_activated(epoch): assert state_view.earliest_exit_epoch != 0 assert state_view.exit_balance_to_consume >= 0