diff --git a/specs/electra/beacon-chain.md b/specs/electra/beacon-chain.md index 83dd728a7..c90345215 100644 --- a/specs/electra/beacon-chain.md +++ b/specs/electra/beacon-chain.md @@ -8,97 +8,99 @@ -- [Introduction](#introduction) -- [Constants](#constants) - - [Misc](#misc) - - [Withdrawal prefixes](#withdrawal-prefixes) - - [Domains](#domains) -- [Preset](#preset) - - [Gwei values](#gwei-values) - - [Rewards and penalties](#rewards-and-penalties) - - [State list lengths](#state-list-lengths) - - [Max operations per block](#max-operations-per-block) - - [Execution](#execution) - - [Withdrawals processing](#withdrawals-processing) - - [Pending deposits processing](#pending-deposits-processing) -- [Configuration](#configuration) - - [Validator cycle](#validator-cycle) -- [Containers](#containers) - - [New containers](#new-containers) - - [`DepositRequest`](#depositrequest) - - [`PendingDeposit`](#pendingdeposit) - - [`PendingPartialWithdrawal`](#pendingpartialwithdrawal) - - [`WithdrawalRequest`](#withdrawalrequest) - - [`ConsolidationRequest`](#consolidationrequest) - - [`PendingConsolidation`](#pendingconsolidation) - - [Modified Containers](#modified-containers) - - [`AttesterSlashing`](#attesterslashing) - - [Extended Containers](#extended-containers) - - [`Attestation`](#attestation) - - [`IndexedAttestation`](#indexedattestation) - - [`BeaconBlockBody`](#beaconblockbody) - - [`ExecutionPayload`](#executionpayload) - - [`ExecutionPayloadHeader`](#executionpayloadheader) - - [`BeaconState`](#beaconstate) -- [Helper functions](#helper-functions) - - [Predicates](#predicates) - - [Updated `compute_proposer_index`](#updated-compute_proposer_index) - - [Updated `is_eligible_for_activation_queue`](#updated-is_eligible_for_activation_queue) - - [New `is_compounding_withdrawal_credential`](#new-is_compounding_withdrawal_credential) - - [New `has_compounding_withdrawal_credential`](#new-has_compounding_withdrawal_credential) - - [New `has_execution_withdrawal_credential`](#new-has_execution_withdrawal_credential) - - [Updated `is_fully_withdrawable_validator`](#updated-is_fully_withdrawable_validator) - - [Updated `is_partially_withdrawable_validator`](#updated-is_partially_withdrawable_validator) - - [Misc](#misc-1) - - [`get_committee_indices`](#get_committee_indices) - - [`get_validator_max_effective_balance`](#get_validator_max_effective_balance) - - [Beacon state accessors](#beacon-state-accessors) - - [New `get_balance_churn_limit`](#new-get_balance_churn_limit) - - [New `get_activation_exit_churn_limit`](#new-get_activation_exit_churn_limit) - - [New `get_consolidation_churn_limit`](#new-get_consolidation_churn_limit) - - [New `get_active_balance`](#new-get_active_balance) - - [New `get_pending_balance_to_withdraw`](#new-get_pending_balance_to_withdraw) - - [Modified `get_attesting_indices`](#modified-get_attesting_indices) - - [New `get_activation_churn_consumption`](#new-get_activation_churn_consumption) - - [Modified `get_next_sync_committee_indices`](#modified-get_next_sync_committee_indices) - - [Beacon state mutators](#beacon-state-mutators) - - [Updated `initiate_validator_exit`](#updated--initiate_validator_exit) - - [New `switch_to_compounding_validator`](#new-switch_to_compounding_validator) - - [New `queue_excess_active_balance`](#new-queue_excess_active_balance) - - [New `queue_entire_balance_and_reset_validator`](#new-queue_entire_balance_and_reset_validator) - - [New `compute_exit_epoch_and_update_churn`](#new-compute_exit_epoch_and_update_churn) - - [New `compute_consolidation_epoch_and_update_churn`](#new-compute_consolidation_epoch_and_update_churn) - - [Updated `slash_validator`](#updated-slash_validator) -- [Beacon chain state transition function](#beacon-chain-state-transition-function) - - [Epoch processing](#epoch-processing) - - [Updated `process_epoch`](#updated-process_epoch) - - [Updated `process_registry_updates`](#updated--process_registry_updates) - - [New `apply_pending_deposit`](#new-apply_pending_deposit) - - [New `process_pending_deposits`](#new-process_pending_deposits) - - [New `process_pending_consolidations`](#new-process_pending_consolidations) - - [Updated `process_effective_balance_updates`](#updated-process_effective_balance_updates) - - [Block processing](#block-processing) - - [Withdrawals](#withdrawals) - - [Updated `get_expected_withdrawals`](#updated-get_expected_withdrawals) - - [Updated `process_withdrawals`](#updated-process_withdrawals) - - [Execution payload](#execution-payload) - - [Modified `process_execution_payload`](#modified-process_execution_payload) - - [Operations](#operations) - - [Modified `process_operations`](#modified-process_operations) - - [Attestations](#attestations) - - [Modified `process_attestation`](#modified-process_attestation) - - [Deposits](#deposits) - - [Updated `apply_deposit`](#updated--apply_deposit) - - [New `is_valid_deposit_signature`](#new-is_valid_deposit_signature) - - [Voluntary exits](#voluntary-exits) - - [Updated `process_voluntary_exit`](#updated-process_voluntary_exit) - - [Execution layer withdrawal requests](#execution-layer-withdrawal-requests) - - [New `process_withdrawal_request`](#new-process_withdrawal_request) - - [Deposit requests](#deposit-requests) - - [New `process_deposit_request`](#new-process_deposit_request) - - [Execution layer consolidation requests](#execution-layer-consolidation-requests) - - [New `process_consolidation_request`](#new-process_consolidation_request) -- [Testing](#testing) +- [Electra -- The Beacon Chain](#electra----the-beacon-chain) + - [Table of contents](#table-of-contents) + - [Introduction](#introduction) + - [Constants](#constants) + - [Misc](#misc) + - [Withdrawal prefixes](#withdrawal-prefixes) + - [Domains](#domains) + - [Preset](#preset) + - [Gwei values](#gwei-values) + - [Rewards and penalties](#rewards-and-penalties) + - [State list lengths](#state-list-lengths) + - [Max operations per block](#max-operations-per-block) + - [Execution](#execution) + - [Withdrawals processing](#withdrawals-processing) + - [Pending deposits processing](#pending-deposits-processing) + - [Configuration](#configuration) + - [Validator cycle](#validator-cycle) + - [Containers](#containers) + - [New containers](#new-containers) + - [`DepositRequest`](#depositrequest) + - [`PendingDeposit`](#pendingdeposit) + - [`PendingPartialWithdrawal`](#pendingpartialwithdrawal) + - [`WithdrawalRequest`](#withdrawalrequest) + - [`ConsolidationRequest`](#consolidationrequest) + - [`PendingConsolidation`](#pendingconsolidation) + - [Modified Containers](#modified-containers) + - [`AttesterSlashing`](#attesterslashing) + - [Extended Containers](#extended-containers) + - [`Attestation`](#attestation) + - [`IndexedAttestation`](#indexedattestation) + - [`BeaconBlockBody`](#beaconblockbody) + - [`ExecutionPayload`](#executionpayload) + - [`ExecutionPayloadHeader`](#executionpayloadheader) + - [`BeaconState`](#beaconstate) + - [Helper functions](#helper-functions) + - [Predicates](#predicates) + - [Updated `compute_proposer_index`](#updated-compute_proposer_index) + - [Updated `is_eligible_for_activation_queue`](#updated-is_eligible_for_activation_queue) + - [New `is_compounding_withdrawal_credential`](#new-is_compounding_withdrawal_credential) + - [New `has_compounding_withdrawal_credential`](#new-has_compounding_withdrawal_credential) + - [New `has_execution_withdrawal_credential`](#new-has_execution_withdrawal_credential) + - [Updated `is_fully_withdrawable_validator`](#updated-is_fully_withdrawable_validator) + - [Updated `is_partially_withdrawable_validator`](#updated-is_partially_withdrawable_validator) + - [Misc](#misc-1) + - [`get_committee_indices`](#get_committee_indices) + - [`get_validator_max_effective_balance`](#get_validator_max_effective_balance) + - [Beacon state accessors](#beacon-state-accessors) + - [New `get_balance_churn_limit`](#new-get_balance_churn_limit) + - [New `get_activation_exit_churn_limit`](#new-get_activation_exit_churn_limit) + - [New `get_consolidation_churn_limit`](#new-get_consolidation_churn_limit) + - [New `get_active_balance`](#new-get_active_balance) + - [New `get_pending_balance_to_withdraw`](#new-get_pending_balance_to_withdraw) + - [Modified `get_attesting_indices`](#modified-get_attesting_indices) + - [New `get_activation_churn_consumption`](#new-get_activation_churn_consumption) + - [Modified `get_next_sync_committee_indices`](#modified-get_next_sync_committee_indices) + - [Beacon state mutators](#beacon-state-mutators) + - [Updated `initiate_validator_exit`](#updated--initiate_validator_exit) + - [New `switch_to_compounding_validator`](#new-switch_to_compounding_validator) + - [New `queue_excess_active_balance`](#new-queue_excess_active_balance) + - [New `queue_entire_balance_and_reset_validator`](#new-queue_entire_balance_and_reset_validator) + - [New `compute_exit_epoch_and_update_churn`](#new-compute_exit_epoch_and_update_churn) + - [New `compute_consolidation_epoch_and_update_churn`](#new-compute_consolidation_epoch_and_update_churn) + - [Updated `slash_validator`](#updated-slash_validator) + - [Beacon chain state transition function](#beacon-chain-state-transition-function) + - [Epoch processing](#epoch-processing) + - [Updated `process_epoch`](#updated-process_epoch) + - [Updated `process_registry_updates`](#updated--process_registry_updates) + - [New `apply_pending_deposit`](#new-apply_pending_deposit) + - [New `process_pending_deposits`](#new-process_pending_deposits) + - [New `process_pending_consolidations`](#new-process_pending_consolidations) + - [Updated `process_effective_balance_updates`](#updated-process_effective_balance_updates) + - [Block processing](#block-processing) + - [Withdrawals](#withdrawals) + - [Updated `get_expected_withdrawals`](#updated-get_expected_withdrawals) + - [Updated `process_withdrawals`](#updated-process_withdrawals) + - [Execution payload](#execution-payload) + - [Modified `process_execution_payload`](#modified-process_execution_payload) + - [Operations](#operations) + - [Modified `process_operations`](#modified-process_operations) + - [Attestations](#attestations) + - [Modified `process_attestation`](#modified-process_attestation) + - [Deposits](#deposits) + - [Updated `apply_deposit`](#updated--apply_deposit) + - [New `is_valid_deposit_signature`](#new-is_valid_deposit_signature) + - [Voluntary exits](#voluntary-exits) + - [Updated `process_voluntary_exit`](#updated-process_voluntary_exit) + - [Execution layer withdrawal requests](#execution-layer-withdrawal-requests) + - [New `process_withdrawal_request`](#new-process_withdrawal_request) + - [Deposit requests](#deposit-requests) + - [New `process_deposit_request`](#new-process_deposit_request) + - [Execution layer consolidation requests](#execution-layer-consolidation-requests) + - [New `process_consolidation_request`](#new-process_consolidation_request) + - [Testing](#testing) @@ -954,7 +956,7 @@ def process_pending_deposits(state: BeaconState) -> None: break # Check if number of processed deposits has not reached the limit, otherwise, stop processing. - if next_deposit_index > MAX_PENDING_DEPOSITS_PER_EPOCH_PROCESSING: + if next_deposit_index > MAX_PENDING_DEPOSITS_PER_EPOCH_PROCESSING-1: break # Check if deposit fits in the churn, otherwise, do no more deposit processing in this epoch. diff --git a/tests/core/pyspec/eth2spec/test/electra/epoch_processing/test_process_pending_deposits.py b/tests/core/pyspec/eth2spec/test/electra/epoch_processing/test_process_pending_deposits.py index 1318f7f6f..25352a05a 100644 --- a/tests/core/pyspec/eth2spec/test/electra/epoch_processing/test_process_pending_deposits.py +++ b/tests/core/pyspec/eth2spec/test/electra/epoch_processing/test_process_pending_deposits.py @@ -279,3 +279,42 @@ def test_processing_deposit_of_withdrawable_validator_does_not_get_churned(spec, # First deposit does not consume any. assert state.deposit_balance_to_consume == spec.get_activation_exit_churn_limit(state) assert state.pending_deposits == [build_pending_deposit_top_up(spec, state, validator_index=1, amount=amount)] + +@with_electra_and_later +@spec_state_test +def test_pending_deposit_over_max(spec, state): + # pick an amount that adds to less than churn limit + amount = 100 + overmax = spec.MAX_PENDING_DEPOSITS_PER_EPOCH_PROCESSING + 1 + for i in range(overmax): + state.pending_deposits.append(spec.PendingDeposit( + pubkey=state.validators[i].pubkey, + withdrawal_credentials=state.validators[i].withdrawal_credentials, + amount=amount, + slot=state.slot + )) + + assert len(state.pending_deposits) == overmax,"pending deposits is not over max" + yield from run_process_pending_deposits(spec, state) + # the remaining deposit over MAX_PENDING_DEPOSITS_PER_EPOCH_PROCESSING should remain in pending_deposits + assert len(state.pending_deposits) == 1 + +@with_electra_and_later +@spec_state_test +def test_pending_deposit_deposit_not_finalized(spec, state): + amount = spec.MIN_ACTIVATION_BALANCE + slot=spec.compute_start_slot_at_epoch(state.finalized_checkpoint.epoch) + # deposit is not finalized yet, so it is postponed + state.pending_deposits.append(spec.PendingDeposit( + pubkey=state.validators[0].pubkey, + withdrawal_credentials=state.validators[0].withdrawal_credentials, + amount=amount, + slot=slot, + )) + # set deposit_balance_to_consume to some initial amount to see its removal later on in the test + state.deposit_balance_to_consume = amount + yield from run_process_pending_deposits(spec, state) + # deposit_balance_to_consume was reset to 0 + assert state.deposit_balance_to_consume == 0 + # deposit was postponed and not processed + assert len(state.pending_deposits) == 1