From 02a3d35885767768b6b302a8b72d87e09f8399e5 Mon Sep 17 00:00:00 2001 From: shane-moore Date: Tue, 19 Aug 2025 13:05:18 -0700 Subject: [PATCH 1/4] add process_builder_pending_payments to epoch processing --- .../src/per_epoch_processing/altair.rs | 6 ++ .../process_builder_pending_payments.rs | 62 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 consensus/state_processing/src/per_epoch_processing/altair/process_builder_pending_payments.rs diff --git a/consensus/state_processing/src/per_epoch_processing/altair.rs b/consensus/state_processing/src/per_epoch_processing/altair.rs index d9e69647304..86a690ee8ce 100644 --- a/consensus/state_processing/src/per_epoch_processing/altair.rs +++ b/consensus/state_processing/src/per_epoch_processing/altair.rs @@ -12,6 +12,7 @@ use crate::per_epoch_processing::{ pub use inactivity_updates::process_inactivity_updates_slow; pub use justification_and_finalization::process_justification_and_finalization; pub use participation_flag_updates::process_participation_flag_updates; +pub use process_builder_pending_payments::process_builder_pending_payments; pub use rewards_and_penalties::process_rewards_and_penalties_slow; pub use sync_committee_updates::process_sync_committee_updates; use types::{BeaconState, ChainSpec, EthSpec, RelativeEpoch}; @@ -19,6 +20,7 @@ use types::{BeaconState, ChainSpec, EthSpec, RelativeEpoch}; pub mod inactivity_updates; pub mod justification_and_finalization; pub mod participation_flag_updates; +pub mod process_builder_pending_payments; pub mod rewards_and_penalties; pub mod sync_committee_updates; @@ -77,6 +79,10 @@ pub fn process_epoch( process_sync_committee_updates(state, spec)?; + if state.fork_name_unchecked().gloas_enabled() { + process_builder_pending_payments(state, spec)?; + } + // Rotate the epoch caches to suit the epoch transition. state.advance_caches()?; update_progressive_balances_on_epoch_transition(state, spec)?; diff --git a/consensus/state_processing/src/per_epoch_processing/altair/process_builder_pending_payments.rs b/consensus/state_processing/src/per_epoch_processing/altair/process_builder_pending_payments.rs new file mode 100644 index 00000000000..d0e0697720a --- /dev/null +++ b/consensus/state_processing/src/per_epoch_processing/altair/process_builder_pending_payments.rs @@ -0,0 +1,62 @@ +use super::Error; +use safe_arith::SafeArith; +use types::{BeaconState, BuilderPendingPayment, ChainSpec, EthSpec, Vector}; + +pub fn process_builder_pending_payments( + state: &mut BeaconState, + spec: &ChainSpec, +) -> Result<(), Error> { + let quorum = get_builder_payment_quorum_threshold(state, spec)?; + + // Collect qualifying payments + let qualifying_payments = state + .builder_pending_payments()? + .iter() + .take(E::slots_per_epoch() as usize) + .filter(|payment| payment.weight > quorum) + .cloned() + .collect::>(); + + // Update `builder_pending_withdrawals` with qualifying `builder_pending_payments` + qualifying_payments + .into_iter() + .try_for_each(|payment| -> Result<(), Error> { + let exit_queue_epoch = + state.compute_exit_epoch_and_update_churn(payment.withdrawal.amount, spec)?; + let withdrawable_epoch = + exit_queue_epoch.safe_add(spec.min_validator_withdrawability_delay)?; + + let mut withdrawal = payment.withdrawal.clone(); + withdrawal.withdrawable_epoch = withdrawable_epoch; + state.builder_pending_withdrawals_mut()?.push(withdrawal)?; + Ok(()) + })?; + + // Move remaining `builder_pending_payments` to start of list and set the rest to default + let new_payments = state + .builder_pending_payments()? + .iter() + .skip(E::slots_per_epoch() as usize) + .cloned() + .chain((0..E::slots_per_epoch() as usize).map(|_| BuilderPendingPayment::default())) + .collect::>(); + + *state.builder_pending_payments_mut()? = Vector::new(new_payments)?; + + Ok(()) +} + +pub fn get_builder_payment_quorum_threshold( + state: &BeaconState, + spec: &ChainSpec, +) -> Result { + let total_active_balance = state.get_total_active_balance()?; + + let quorum = total_active_balance + .safe_div(E::slots_per_epoch())? + .safe_mul(spec.builder_payment_threshold_numerator)?; + + quorum + .safe_div(spec.builder_payment_threshold_denominator) + .map_err(Error::from) +} From 25595b0ad6e280d3716597b93f18136775024cea Mon Sep 17 00:00:00 2001 From: shane-moore Date: Tue, 19 Aug 2025 14:02:30 -0700 Subject: [PATCH 2/4] per_slot_processing modified --- .../src/per_epoch_processing.rs | 1 + .../src/per_epoch_processing/altair.rs | 6 +++--- .../src/per_epoch_processing/gloas.rs | 3 +++ .../process_builder_pending_payments.rs | 18 ++++++++++-------- .../src/per_slot_processing.rs | 19 +++++++++++++++++++ 5 files changed, 36 insertions(+), 11 deletions(-) create mode 100644 consensus/state_processing/src/per_epoch_processing/gloas.rs rename consensus/state_processing/src/per_epoch_processing/{altair => gloas}/process_builder_pending_payments.rs (81%) diff --git a/consensus/state_processing/src/per_epoch_processing.rs b/consensus/state_processing/src/per_epoch_processing.rs index 8de6054bd2e..c393d31fbb0 100644 --- a/consensus/state_processing/src/per_epoch_processing.rs +++ b/consensus/state_processing/src/per_epoch_processing.rs @@ -18,6 +18,7 @@ pub mod capella; pub mod effective_balance_updates; pub mod epoch_processing_summary; pub mod errors; +pub mod gloas; pub mod historical_roots_update; pub mod justification_and_finalization_state; pub mod registry_updates; diff --git a/consensus/state_processing/src/per_epoch_processing/altair.rs b/consensus/state_processing/src/per_epoch_processing/altair.rs index 86a690ee8ce..fa94f5787d6 100644 --- a/consensus/state_processing/src/per_epoch_processing/altair.rs +++ b/consensus/state_processing/src/per_epoch_processing/altair.rs @@ -6,13 +6,13 @@ use crate::epoch_cache::initialize_epoch_cache; use crate::per_epoch_processing::single_pass::{SinglePassConfig, process_epoch_single_pass}; use crate::per_epoch_processing::{ capella::process_historical_summaries_update, + gloas::process_builder_pending_payments, historical_roots_update::process_historical_roots_update, resets::{process_eth1_data_reset, process_randao_mixes_reset, process_slashings_reset}, }; pub use inactivity_updates::process_inactivity_updates_slow; pub use justification_and_finalization::process_justification_and_finalization; pub use participation_flag_updates::process_participation_flag_updates; -pub use process_builder_pending_payments::process_builder_pending_payments; pub use rewards_and_penalties::process_rewards_and_penalties_slow; pub use sync_committee_updates::process_sync_committee_updates; use types::{BeaconState, ChainSpec, EthSpec, RelativeEpoch}; @@ -20,7 +20,6 @@ use types::{BeaconState, ChainSpec, EthSpec, RelativeEpoch}; pub mod inactivity_updates; pub mod justification_and_finalization; pub mod participation_flag_updates; -pub mod process_builder_pending_payments; pub mod rewards_and_penalties; pub mod sync_committee_updates; @@ -79,7 +78,8 @@ pub fn process_epoch( process_sync_committee_updates(state, spec)?; - if state.fork_name_unchecked().gloas_enabled() { + if state.builder_pending_payments().is_ok() { + // Post-Gloas process_builder_pending_payments(state, spec)?; } diff --git a/consensus/state_processing/src/per_epoch_processing/gloas.rs b/consensus/state_processing/src/per_epoch_processing/gloas.rs new file mode 100644 index 00000000000..a9a030ecbe1 --- /dev/null +++ b/consensus/state_processing/src/per_epoch_processing/gloas.rs @@ -0,0 +1,3 @@ +pub use process_builder_pending_payments::process_builder_pending_payments; + +mod process_builder_pending_payments; diff --git a/consensus/state_processing/src/per_epoch_processing/altair/process_builder_pending_payments.rs b/consensus/state_processing/src/per_epoch_processing/gloas/process_builder_pending_payments.rs similarity index 81% rename from consensus/state_processing/src/per_epoch_processing/altair/process_builder_pending_payments.rs rename to consensus/state_processing/src/per_epoch_processing/gloas/process_builder_pending_payments.rs index d0e0697720a..580366bb8cd 100644 --- a/consensus/state_processing/src/per_epoch_processing/altair/process_builder_pending_payments.rs +++ b/consensus/state_processing/src/per_epoch_processing/gloas/process_builder_pending_payments.rs @@ -1,11 +1,13 @@ -use super::Error; +use crate::EpochProcessingError; use safe_arith::SafeArith; use types::{BeaconState, BuilderPendingPayment, ChainSpec, EthSpec, Vector}; +/// TODO(EIP-7732): Add EF consensus-spec tests for `process_builder_pending_payments` +/// Currently blocked by EF consensus-spec-tests for Gloas not yet integrated. pub fn process_builder_pending_payments( state: &mut BeaconState, spec: &ChainSpec, -) -> Result<(), Error> { +) -> Result<(), EpochProcessingError> { let quorum = get_builder_payment_quorum_threshold(state, spec)?; // Collect qualifying payments @@ -18,9 +20,8 @@ pub fn process_builder_pending_payments( .collect::>(); // Update `builder_pending_withdrawals` with qualifying `builder_pending_payments` - qualifying_payments - .into_iter() - .try_for_each(|payment| -> Result<(), Error> { + qualifying_payments.into_iter().try_for_each( + |payment| -> Result<(), EpochProcessingError> { let exit_queue_epoch = state.compute_exit_epoch_and_update_churn(payment.withdrawal.amount, spec)?; let withdrawable_epoch = @@ -30,7 +31,8 @@ pub fn process_builder_pending_payments( withdrawal.withdrawable_epoch = withdrawable_epoch; state.builder_pending_withdrawals_mut()?.push(withdrawal)?; Ok(()) - })?; + }, + )?; // Move remaining `builder_pending_payments` to start of list and set the rest to default let new_payments = state @@ -49,7 +51,7 @@ pub fn process_builder_pending_payments( pub fn get_builder_payment_quorum_threshold( state: &BeaconState, spec: &ChainSpec, -) -> Result { +) -> Result { let total_active_balance = state.get_total_active_balance()?; let quorum = total_active_balance @@ -58,5 +60,5 @@ pub fn get_builder_payment_quorum_threshold( quorum .safe_div(spec.builder_payment_threshold_denominator) - .map_err(Error::from) + .map_err(EpochProcessingError::from) } diff --git a/consensus/state_processing/src/per_slot_processing.rs b/consensus/state_processing/src/per_slot_processing.rs index 8695054e1e7..10ce216c3c5 100644 --- a/consensus/state_processing/src/per_slot_processing.rs +++ b/consensus/state_processing/src/per_slot_processing.rs @@ -13,6 +13,7 @@ pub enum Error { EpochProcessingError(EpochProcessingError), ArithError(ArithError), InconsistentStateFork(InconsistentFork), + BitfieldError(ssz::BitfieldError), } impl From for Error { @@ -21,6 +22,12 @@ impl From for Error { } } +impl From for Error { + fn from(e: ssz::BitfieldError) -> Self { + Self::BitfieldError(e) + } +} + /// Advances a state forward by one slot, performing per-epoch processing if required. /// /// If the root of the supplied `state` is known, then it can be passed as `state_root`. If @@ -49,6 +56,18 @@ pub fn per_slot_processing( state.slot_mut().safe_add_assign(1)?; + // Unset the next payload availability + if state.fork_name_unchecked().gloas_enabled() { + let next_slot_index = state + .slot() + .as_usize() + .safe_add(1)? + .safe_rem(E::slots_per_historical_root())?; + state + .execution_payload_availability_mut()? + .set(next_slot_index, false)?; + } + // Process fork upgrades here. Note that multiple upgrades can potentially run // in sequence if they are scheduled in the same Epoch (common in testnets) if state.slot().safe_rem(E::slots_per_epoch())? == 0 { From 794b5d14257b7bad06bbb03903f006fd01cf2819 Mon Sep 17 00:00:00 2001 From: shane-moore Date: Thu, 6 Nov 2025 19:11:40 -0800 Subject: [PATCH 3/4] add process_builder_pending_payments to single pass process epoch --- .../src/per_epoch_processing.rs | 1 - .../src/per_epoch_processing/altair.rs | 6 -- .../src/per_epoch_processing/gloas.rs | 3 - .../gloas/process_builder_pending_payments.rs | 64 ----------------- .../src/per_epoch_processing/single_pass.rs | 72 ++++++++++++++++++- 5 files changed, 71 insertions(+), 75 deletions(-) delete mode 100644 consensus/state_processing/src/per_epoch_processing/gloas.rs delete mode 100644 consensus/state_processing/src/per_epoch_processing/gloas/process_builder_pending_payments.rs diff --git a/consensus/state_processing/src/per_epoch_processing.rs b/consensus/state_processing/src/per_epoch_processing.rs index c393d31fbb0..8de6054bd2e 100644 --- a/consensus/state_processing/src/per_epoch_processing.rs +++ b/consensus/state_processing/src/per_epoch_processing.rs @@ -18,7 +18,6 @@ pub mod capella; pub mod effective_balance_updates; pub mod epoch_processing_summary; pub mod errors; -pub mod gloas; pub mod historical_roots_update; pub mod justification_and_finalization_state; pub mod registry_updates; diff --git a/consensus/state_processing/src/per_epoch_processing/altair.rs b/consensus/state_processing/src/per_epoch_processing/altair.rs index fa94f5787d6..d9e69647304 100644 --- a/consensus/state_processing/src/per_epoch_processing/altair.rs +++ b/consensus/state_processing/src/per_epoch_processing/altair.rs @@ -6,7 +6,6 @@ use crate::epoch_cache::initialize_epoch_cache; use crate::per_epoch_processing::single_pass::{SinglePassConfig, process_epoch_single_pass}; use crate::per_epoch_processing::{ capella::process_historical_summaries_update, - gloas::process_builder_pending_payments, historical_roots_update::process_historical_roots_update, resets::{process_eth1_data_reset, process_randao_mixes_reset, process_slashings_reset}, }; @@ -78,11 +77,6 @@ pub fn process_epoch( process_sync_committee_updates(state, spec)?; - if state.builder_pending_payments().is_ok() { - // Post-Gloas - process_builder_pending_payments(state, spec)?; - } - // Rotate the epoch caches to suit the epoch transition. state.advance_caches()?; update_progressive_balances_on_epoch_transition(state, spec)?; diff --git a/consensus/state_processing/src/per_epoch_processing/gloas.rs b/consensus/state_processing/src/per_epoch_processing/gloas.rs deleted file mode 100644 index a9a030ecbe1..00000000000 --- a/consensus/state_processing/src/per_epoch_processing/gloas.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub use process_builder_pending_payments::process_builder_pending_payments; - -mod process_builder_pending_payments; diff --git a/consensus/state_processing/src/per_epoch_processing/gloas/process_builder_pending_payments.rs b/consensus/state_processing/src/per_epoch_processing/gloas/process_builder_pending_payments.rs deleted file mode 100644 index 580366bb8cd..00000000000 --- a/consensus/state_processing/src/per_epoch_processing/gloas/process_builder_pending_payments.rs +++ /dev/null @@ -1,64 +0,0 @@ -use crate::EpochProcessingError; -use safe_arith::SafeArith; -use types::{BeaconState, BuilderPendingPayment, ChainSpec, EthSpec, Vector}; - -/// TODO(EIP-7732): Add EF consensus-spec tests for `process_builder_pending_payments` -/// Currently blocked by EF consensus-spec-tests for Gloas not yet integrated. -pub fn process_builder_pending_payments( - state: &mut BeaconState, - spec: &ChainSpec, -) -> Result<(), EpochProcessingError> { - let quorum = get_builder_payment_quorum_threshold(state, spec)?; - - // Collect qualifying payments - let qualifying_payments = state - .builder_pending_payments()? - .iter() - .take(E::slots_per_epoch() as usize) - .filter(|payment| payment.weight > quorum) - .cloned() - .collect::>(); - - // Update `builder_pending_withdrawals` with qualifying `builder_pending_payments` - qualifying_payments.into_iter().try_for_each( - |payment| -> Result<(), EpochProcessingError> { - let exit_queue_epoch = - state.compute_exit_epoch_and_update_churn(payment.withdrawal.amount, spec)?; - let withdrawable_epoch = - exit_queue_epoch.safe_add(spec.min_validator_withdrawability_delay)?; - - let mut withdrawal = payment.withdrawal.clone(); - withdrawal.withdrawable_epoch = withdrawable_epoch; - state.builder_pending_withdrawals_mut()?.push(withdrawal)?; - Ok(()) - }, - )?; - - // Move remaining `builder_pending_payments` to start of list and set the rest to default - let new_payments = state - .builder_pending_payments()? - .iter() - .skip(E::slots_per_epoch() as usize) - .cloned() - .chain((0..E::slots_per_epoch() as usize).map(|_| BuilderPendingPayment::default())) - .collect::>(); - - *state.builder_pending_payments_mut()? = Vector::new(new_payments)?; - - Ok(()) -} - -pub fn get_builder_payment_quorum_threshold( - state: &BeaconState, - spec: &ChainSpec, -) -> Result { - let total_active_balance = state.get_total_active_balance()?; - - let quorum = total_active_balance - .safe_div(E::slots_per_epoch())? - .safe_mul(spec.builder_payment_threshold_numerator)?; - - quorum - .safe_div(spec.builder_payment_threshold_denominator) - .map_err(EpochProcessingError::from) -} diff --git a/consensus/state_processing/src/per_epoch_processing/single_pass.rs b/consensus/state_processing/src/per_epoch_processing/single_pass.rs index 1584e932bdf..bd2531f0976 100644 --- a/consensus/state_processing/src/per_epoch_processing/single_pass.rs +++ b/consensus/state_processing/src/per_epoch_processing/single_pass.rs @@ -32,6 +32,7 @@ pub struct SinglePassConfig { pub pending_consolidations: bool, pub effective_balance_updates: bool, pub proposer_lookahead: bool, + pub builder_pending_payments: bool, } impl Default for SinglePassConfig { @@ -51,6 +52,7 @@ impl SinglePassConfig { pending_consolidations: true, effective_balance_updates: true, proposer_lookahead: true, + builder_pending_payments: true, } } @@ -64,6 +66,7 @@ impl SinglePassConfig { pending_consolidations: false, effective_balance_updates: false, proposer_lookahead: false, + builder_pending_payments: false, } } } @@ -469,10 +472,14 @@ pub fn process_epoch_single_pass( process_proposer_lookahead(state, spec)?; } + if conf.builder_pending_payments && fork_name.gloas_enabled() { + process_builder_pending_payments(state, spec)?; + } + Ok(summary) } -// TOOO(EIP-7917): use balances cache +// TODO(EIP-7917): use balances cache pub fn process_proposer_lookahead( state: &mut BeaconState, spec: &ChainSpec, @@ -502,6 +509,69 @@ pub fn process_proposer_lookahead( Ok(()) } +/// Calculate the quorum threshold for builder payments based on total active balance. +pub fn get_builder_payment_quorum_threshold( + state: &BeaconState, + spec: &ChainSpec, +) -> Result { + let total_active_balance = state.get_total_active_balance()?; + + let quorum = total_active_balance + .safe_div(E::slots_per_epoch())? + .safe_mul(spec.builder_payment_threshold_numerator)?; + + quorum + .safe_div(spec.builder_payment_threshold_denominator) + .map_err(Error::from) +} + +/// Process builder pending payments, moving qualifying payments to withdrawals. +/// TODO(EIP-7732): Add EF consensus-spec tests for `process_builder_pending_payments` +/// Currently blocked by EF consensus-spec-tests for Gloas not yet integrated. +pub fn process_builder_pending_payments( + state: &mut BeaconState, + spec: &ChainSpec, +) -> Result<(), Error> { + let quorum = get_builder_payment_quorum_threshold(state, spec)?; + + // Collect qualifying payments + let qualifying_payments = state + .builder_pending_payments()? + .iter() + .take(E::slots_per_epoch() as usize) + .filter(|payment| payment.weight > quorum) + .cloned() + .collect::>(); + + // Update `builder_pending_withdrawals` with qualifying `builder_pending_payments` + qualifying_payments + .into_iter() + .try_for_each(|payment| -> Result<(), Error> { + let exit_queue_epoch = + state.compute_exit_epoch_and_update_churn(payment.withdrawal.amount, spec)?; + let withdrawable_epoch = + exit_queue_epoch.safe_add(spec.min_validator_withdrawability_delay)?; + + let mut withdrawal = payment.withdrawal.clone(); + withdrawal.withdrawable_epoch = withdrawable_epoch; + state.builder_pending_withdrawals_mut()?.push(withdrawal)?; + Ok(()) + })?; + + // Move remaining `builder_pending_payments` to start of list and set the rest to default + let new_payments = state + .builder_pending_payments()? + .iter() + .skip(E::slots_per_epoch() as usize) + .cloned() + .chain((0..E::slots_per_epoch() as usize).map(|_| types::BuilderPendingPayment::default())) + .collect::>(); + + *state.builder_pending_payments_mut()? = Vector::new(new_payments)?; + + Ok(()) +} + fn process_single_inactivity_update( inactivity_score: &mut Cow, validator_info: &ValidatorInfo, From b1d539bf0a2d6b894d52ab84c35d26977943e17d Mon Sep 17 00:00:00 2001 From: shane-moore Date: Mon, 24 Nov 2025 16:48:22 -0300 Subject: [PATCH 4/4] update process_builder_pending_payments per latest spec --- .../src/per_epoch_processing/single_pass.rs | 35 ++++++++++--------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/consensus/state_processing/src/per_epoch_processing/single_pass.rs b/consensus/state_processing/src/per_epoch_processing/single_pass.rs index bd2531f0976..db4d02e088b 100644 --- a/consensus/state_processing/src/per_epoch_processing/single_pass.rs +++ b/consensus/state_processing/src/per_epoch_processing/single_pass.rs @@ -13,8 +13,8 @@ use std::cmp::{max, min}; use std::collections::{BTreeSet, HashMap}; use tracing::instrument; use types::{ - ActivationQueue, BeaconState, BeaconStateError, ChainSpec, Checkpoint, DepositData, Epoch, - EthSpec, ExitCache, ForkName, List, ParticipationFlags, PendingDeposit, + ActivationQueue, BeaconState, BeaconStateError, BuilderPendingPayment, ChainSpec, Checkpoint, + DepositData, Epoch, EthSpec, ExitCache, ForkName, List, ParticipationFlags, PendingDeposit, ProgressiveBalancesCache, RelativeEpoch, Unsigned, Validator, Vector, consts::altair::{ NUM_FLAG_INDICES, PARTICIPATION_FLAG_WEIGHTS, TIMELY_HEAD_FLAG_INDEX, @@ -457,6 +457,12 @@ pub fn process_epoch_single_pass( )?; } + // Process builder pending payments outside the single-pass loop, as they depend on balances for multiple + // validators and cannot be computed accurately inside the loop. + if fork_name.gloas_enabled() && conf.builder_pending_payments { + process_builder_pending_payments(state, state_ctxt, spec)?; + } + // Finally, finish updating effective balance caches. We need this to happen *after* processing // of pending consolidations, which recomputes some effective balances. if conf.effective_balance_updates { @@ -472,10 +478,6 @@ pub fn process_epoch_single_pass( process_proposer_lookahead(state, spec)?; } - if conf.builder_pending_payments && fork_name.gloas_enabled() { - process_builder_pending_payments(state, spec)?; - } - Ok(summary) } @@ -510,16 +512,14 @@ pub fn process_proposer_lookahead( } /// Calculate the quorum threshold for builder payments based on total active balance. -pub fn get_builder_payment_quorum_threshold( - state: &BeaconState, +fn get_builder_payment_quorum_threshold( + state_ctxt: &StateContext, spec: &ChainSpec, ) -> Result { - let total_active_balance = state.get_total_active_balance()?; - - let quorum = total_active_balance - .safe_div(E::slots_per_epoch())? - .safe_mul(spec.builder_payment_threshold_numerator)?; - + let per_slot_balance = state_ctxt + .total_active_balance + .safe_div(E::slots_per_epoch())?; + let quorum = per_slot_balance.safe_mul(spec.builder_payment_threshold_numerator)?; quorum .safe_div(spec.builder_payment_threshold_denominator) .map_err(Error::from) @@ -528,11 +528,12 @@ pub fn get_builder_payment_quorum_threshold( /// Process builder pending payments, moving qualifying payments to withdrawals. /// TODO(EIP-7732): Add EF consensus-spec tests for `process_builder_pending_payments` /// Currently blocked by EF consensus-spec-tests for Gloas not yet integrated. -pub fn process_builder_pending_payments( +fn process_builder_pending_payments( state: &mut BeaconState, + state_ctxt: &StateContext, spec: &ChainSpec, ) -> Result<(), Error> { - let quorum = get_builder_payment_quorum_threshold(state, spec)?; + let quorum = get_builder_payment_quorum_threshold::(state_ctxt, spec)?; // Collect qualifying payments let qualifying_payments = state @@ -564,7 +565,7 @@ pub fn process_builder_pending_payments( .iter() .skip(E::slots_per_epoch() as usize) .cloned() - .chain((0..E::slots_per_epoch() as usize).map(|_| types::BuilderPendingPayment::default())) + .chain((0..E::slots_per_epoch() as usize).map(|_| BuilderPendingPayment::default())) .collect::>(); *state.builder_pending_payments_mut()? = Vector::new(new_payments)?;