diff --git a/mev-build-rs/src/builder.rs b/mev-build-rs/src/builder.rs index 0293669c..f3c0d40b 100644 --- a/mev-build-rs/src/builder.rs +++ b/mev-build-rs/src/builder.rs @@ -32,7 +32,7 @@ fn make_attributes_for_proposer( let proposal = ProposalAttributes { builder_fee_recipient, builder_signer, - suggested_gas_limit: proposer.gas_limit, + proposer_gas_limit: proposer.gas_limit, proposer_fee_recipient: proposer.fee_recipient, }; let mut attributes = attributes.clone(); diff --git a/mev-build-rs/src/payload/builder_attributes.rs b/mev-build-rs/src/payload/builder_attributes.rs index 3f064c9d..32eacb52 100644 --- a/mev-build-rs/src/payload/builder_attributes.rs +++ b/mev-build-rs/src/payload/builder_attributes.rs @@ -35,7 +35,7 @@ pub fn payload_id_with_bytes( } if let Some(proposal) = proposal { - hasher.update(proposal.suggested_gas_limit.to_be_bytes()); + hasher.update(proposal.proposer_gas_limit.to_be_bytes()); hasher.update(proposal.proposer_fee_recipient.as_slice()); } @@ -52,7 +52,7 @@ pub fn mix_proposal_into_payload_id( hasher.update(payload_id); hasher.update(proposal.builder_fee_recipient.as_slice()); - hasher.update(proposal.suggested_gas_limit.to_be_bytes()); + hasher.update(proposal.proposer_gas_limit.to_be_bytes()); hasher.update(proposal.proposer_fee_recipient.as_slice()); let out = hasher.finalize(); @@ -65,8 +65,7 @@ pub struct ProposalAttributes { pub builder_fee_recipient: Address, // TODO: move to payload builder pub builder_signer: Arc, - // TODO: ensure this is being used, and mapped to correct value - pub suggested_gas_limit: u64, + pub proposer_gas_limit: u64, pub proposer_fee_recipient: Address, } diff --git a/mev-build-rs/src/payload/job_generator.rs b/mev-build-rs/src/payload/job_generator.rs index c1711f3b..507cb4e5 100644 --- a/mev-build-rs/src/payload/job_generator.rs +++ b/mev-build-rs/src/payload/job_generator.rs @@ -3,10 +3,11 @@ use crate::{ utils::payload_job::PayloadTaskGuard, }; use ethereum_consensus::clock::duration_until; +use mev_rs::compute_preferred_gas_limit; use reth::{ api::PayloadBuilderAttributes, payload::{self, database::CachedReads, error::PayloadBuilderError}, - primitives::{BlockNumberOrTag, Bytes, ChainSpec, B256}, + primitives::{BlockNumberOrTag, Bytes, ChainSpec, B256, U256}, providers::{BlockReaderIdExt, BlockSource, CanonStateNotification, StateProviderFactory}, tasks::TaskSpawner, transaction_pool::TransactionPool, @@ -14,10 +15,14 @@ use reth::{ use reth_basic_payload_builder::{PayloadConfig, PrecachedState}; use std::{sync::Arc, time::Duration}; +fn apply_gas_limit

(config: &mut PayloadConfig

, gas_limit: u64) { + config.initialized_block_env.gas_limit = U256::from(gas_limit); +} + #[derive(Debug, Clone)] pub struct PayloadJobGeneratorConfig { pub extradata: Bytes, - // TODO: remove or use? + // NOTE: currently ignored, see: https://github.com/paradigmxyz/reth/issues/7948 pub _max_gas_limit: u64, pub interval: Duration, pub deadline: Duration, @@ -105,21 +110,29 @@ where block.seal(attributes.parent()) }; - let until = if attributes.proposal.is_some() { - self.job_deadline(attributes.timestamp()) + let (until, gas_limit) = if let Some(proposal) = attributes.proposal.as_ref() { + let until = self.job_deadline(attributes.timestamp()); + let gas_limit = + compute_preferred_gas_limit(proposal.proposer_gas_limit, parent_block.gas_limit); + (until, Some(gas_limit)) } else { // If there is no attached proposal, then terminate the payload job immediately - tokio::time::Instant::now() + let until = tokio::time::Instant::now(); + (until, None) }; let deadline = Box::pin(tokio::time::sleep_until(until)); - let config = PayloadConfig::new( + let mut config = PayloadConfig::new( Arc::new(parent_block), self.config.extradata.clone(), attributes, Arc::clone(&self.chain_spec), ); + if let Some(gas_limit) = gas_limit { + apply_gas_limit(&mut config, gas_limit); + } + let cached_reads = self.maybe_pre_cached(config.parent_block.hash()); Ok(PayloadJob {