diff --git a/crates/rbuilder-primitives/src/mev_boost/adjustment.rs b/crates/rbuilder-primitives/src/mev_boost/adjustment.rs index c24c98baa..666d78d89 100644 --- a/crates/rbuilder-primitives/src/mev_boost/adjustment.rs +++ b/crates/rbuilder-primitives/src/mev_boost/adjustment.rs @@ -1,46 +1,5 @@ use alloy_primitives::{Address, Bloom, Bytes, B256}; -/// The type representing UltraSound bid adjustments. -#[derive( - PartialEq, - Eq, - Clone, - Debug, - serde::Serialize, - serde::Deserialize, - ssz_derive::Encode, - ssz_derive::Decode, -)] -pub struct BidAdjustmentDataV1 { - /// State root of the payload. - pub state_root: B256, - /// Transactions root of the payload. - pub transactions_root: B256, - /// Receipts root of the payload. - pub receipts_root: B256, - /// The usual builder address that pays the proposer in the last transaction of the block. - /// When we adjust a bid, this transaction is overwritten by a transaction from the collateral - /// account `fee_payer_address`. If we don't adjust the bid, `builder_address` pays the - /// proposer as per usual. - pub builder_address: Address, - /// The state proof for the builder account. - pub builder_proof: Vec, - /// The proposer's fee recipient. - pub fee_recipient_address: Address, - /// The state proof for the fee recipient account. - pub fee_recipient_proof: Vec, - /// The fee payer address that is custodied by the relay. - pub fee_payer_address: Address, - /// The state proof for the fee payer account. - pub fee_payer_proof: Vec, - /// The merkle proof for the last transaction in the block, which will be overwritten with a - /// payment from `fee_payer` to `fee_recipient` if we adjust the bid. - pub placeholder_transaction_proof: Vec, - /// The merkle proof for the receipt of the placeholder transaction. It's required for - /// adjusting payments to contract addresses. - pub placeholder_receipt_proof: Vec, -} - /// The type for bid adjustments in optimistic v3. /// Ref: #[derive( @@ -53,7 +12,7 @@ pub struct BidAdjustmentDataV1 { ssz_derive::Encode, ssz_derive::Decode, )] -pub struct BidAdjustmentDataV2 { +pub struct BidAdjustmentDataV3 { /// Transactions root of the payload. pub el_transactions_root: B256, /// Withdrawals root of the payload. @@ -76,75 +35,16 @@ pub struct BidAdjustmentDataV2 { /// The merkle proof for the last transaction in the block, which will be overwritten with a /// payment from `fee_payer` to `fee_recipient` if we adjust the bid. pub el_placeholder_transaction_proof: Vec, - /// New in V2: SSZ merkle proof for last transaction - pub cl_placeholder_transaction_proof: Vec, - /// The merkle proof for the receipt of the placeholder transaction. It's required for - /// adjusting payments to contract addresses. - pub placeholder_receipt_proof: Vec, - /// New in V2: Logs bloom accrued until but not including the last (payment) transaction. - pub pre_payment_logs_bloom: Bloom, -} - -/// Common bid adjustment information that can be used for creating bid adjustment data. -#[derive(Clone, Debug)] -pub struct BidAdjustmentData { - /// State root of the payload. - pub state_root: B256, - /// Transactions root of the payload. - pub el_transactions_root: B256, - /// Withdrawals root of the payload. - pub el_withdrawals_root: B256, - /// Receipts root of the payload. - pub receipts_root: B256, - /// The merkle proof for the last transaction in the block, which will be overwritten with a - /// payment from `fee_payer` to `fee_recipient` if we adjust the bid. - pub el_placeholder_transaction_proof: Vec, - /// New in V2: SSZ merkle proof for last transaction + /// SSZ merkle proof for last transaction pub cl_placeholder_transaction_proof: Vec, /// The merkle proof for the receipt of the placeholder transaction. It's required for /// adjusting payments to contract addresses. - pub placeholder_receipt_proof: Vec, - /// New in V2: Logs bloom accrued until but not including the last (payment) transaction. + pub el_placeholder_receipt_proof: Vec, + /// Logs bloom accrued until but not including the last (payment) transaction. pub pre_payment_logs_bloom: Bloom, - /// State proofs. - pub state_proofs: BidAdjustmentStateProofs, -} - -impl BidAdjustmentData { - /// Convert bid adjustment data into [`BidAdjustmentDataV1`]. - pub fn into_v1(self) -> BidAdjustmentDataV1 { - BidAdjustmentDataV1 { - state_root: self.state_root, - transactions_root: self.el_transactions_root, - receipts_root: self.receipts_root, - builder_address: self.state_proofs.builder_address, - builder_proof: self.state_proofs.builder_proof, - fee_recipient_address: self.state_proofs.fee_recipient_address, - fee_recipient_proof: self.state_proofs.fee_recipient_proof, - fee_payer_address: self.state_proofs.fee_payer_address, - fee_payer_proof: self.state_proofs.fee_payer_proof, - placeholder_transaction_proof: self.el_placeholder_transaction_proof, - placeholder_receipt_proof: self.placeholder_receipt_proof, - } - } - - /// Convert bid adjustment data into [`BidAdjustmentDataV2`]. - pub fn into_v2(self) -> BidAdjustmentDataV2 { - BidAdjustmentDataV2 { - el_transactions_root: self.el_transactions_root, - el_withdrawals_root: self.el_withdrawals_root, - builder_address: self.state_proofs.builder_address, - builder_proof: self.state_proofs.builder_proof, - fee_recipient_address: self.state_proofs.fee_recipient_address, - fee_recipient_proof: self.state_proofs.fee_recipient_proof, - fee_payer_address: self.state_proofs.fee_payer_address, - fee_payer_proof: self.state_proofs.fee_payer_proof, - el_placeholder_transaction_proof: self.el_placeholder_transaction_proof, - cl_placeholder_transaction_proof: self.cl_placeholder_transaction_proof, - placeholder_receipt_proof: self.placeholder_receipt_proof, - pre_payment_logs_bloom: self.pre_payment_logs_bloom, - } - } + /// Gas used by the placeholder (payout) transaction. Required for V3 to relax the + /// gas_limit == gas_used requirement. + pub placeholder_gas_used: u64, } /// Bid adjustment state proofs. diff --git a/crates/rbuilder-primitives/src/mev_boost/submit_block.rs b/crates/rbuilder-primitives/src/mev_boost/submit_block.rs index dabc76eaa..1340ab6c8 100644 --- a/crates/rbuilder-primitives/src/mev_boost/submit_block.rs +++ b/crates/rbuilder-primitives/src/mev_boost/submit_block.rs @@ -1,4 +1,4 @@ -use crate::mev_boost::BidAdjustmentDataV1; +use crate::mev_boost::BidAdjustmentDataV3; use alloy_rpc_types_beacon::{ relay::{ BidTrace, SignedBidSubmissionV2, SignedBidSubmissionV3, SignedBidSubmissionV4, @@ -22,7 +22,7 @@ pub struct SubmitBlockRequest { pub request: Arc, /// Bid adjustment data if present. #[serde(skip_serializing_if = "Option::is_none")] - pub adjustment_data: Option, + pub adjustment_data: Option, } impl ssz::Encode for SubmitBlockRequest { @@ -56,7 +56,7 @@ impl ssz::Encode for SubmitBlockRequest { }; // Add adjustment data offset if present. if self.adjustment_data.is_some() { - offset += ::ssz_fixed_len(); + offset += ::ssz_fixed_len(); } let mut encoder = ssz::SszEncoder::container(buf, offset); @@ -122,7 +122,7 @@ impl ssz::Encode for SubmitBlockRequest { fn ssz_bytes_len(&self) -> usize { let mut len = ::ssz_bytes_len(&self.request); if let Some(adjustment) = &self.adjustment_data { - len += ::ssz_bytes_len(adjustment); + len += ::ssz_bytes_len(adjustment); } len } @@ -216,7 +216,7 @@ impl SubmitBlockRequest { } /// Set the bid adjustment data on the request. - pub fn set_adjustment_data(&mut self, data: BidAdjustmentDataV1) { + pub fn set_adjustment_data(&mut self, data: BidAdjustmentDataV3) { self.adjustment_data = Some(data); } @@ -313,7 +313,7 @@ mod ssz_helpers { message: BidTrace, execution_payload: ExecutionPayloadV2, signature: BlsSignature, - adjustment_data: BidAdjustmentDataV1, + adjustment_data: BidAdjustmentDataV3, } impl From for SubmitBlockRequest { @@ -341,7 +341,7 @@ mod ssz_helpers { execution_payload: ExecutionPayloadV3, blobs_bundle: BlobsBundleV1, signature: BlsSignature, - adjustment_data: BidAdjustmentDataV1, + adjustment_data: BidAdjustmentDataV3, } impl From for SubmitBlockRequest { @@ -372,7 +372,7 @@ mod ssz_helpers { blobs_bundle: BlobsBundleV1, execution_requests: ExecutionRequestsV4, signature: BlsSignature, - adjustment_data: BidAdjustmentDataV1, + adjustment_data: BidAdjustmentDataV3, } impl From for SubmitBlockRequest { @@ -405,7 +405,7 @@ mod ssz_helpers { blobs_bundle: BlobsBundleV2, execution_requests: ExecutionRequestsV4, signature: BlsSignature, - adjustment_data: BidAdjustmentDataV1, + adjustment_data: BidAdjustmentDataV3, } impl From for SubmitBlockRequest { diff --git a/crates/rbuilder-primitives/src/mev_boost/submit_header.rs b/crates/rbuilder-primitives/src/mev_boost/submit_header.rs index 70f625135..b41531acb 100644 --- a/crates/rbuilder-primitives/src/mev_boost/submit_header.rs +++ b/crates/rbuilder-primitives/src/mev_boost/submit_header.rs @@ -1,5 +1,5 @@ use crate::mev_boost::{ - adjustment::BidAdjustmentDataV2, + adjustment::BidAdjustmentDataV3, ssz_roots::{calculate_transactions_root_ssz, calculate_withdrawals_root_ssz}, BidMetadata, }; @@ -35,7 +35,7 @@ pub struct SubmitHeaderRequest { /// The number of transactions in the block. pub tx_count: u32, /// The signed header data. This is the same structure used by - /// the Optimistic V2 'SignedHeaderSubmission'. + /// the Optimistic V3 'SignedHeaderSubmission'. pub submission: SignedHeaderSubmission, } @@ -84,8 +84,8 @@ pub struct HeaderSubmissionElectra { pub execution_requests: ExecutionRequestsV4, /// Blob KZG commitments. pub commitments: Vec, - /// Bid adjustment data V2. - pub adjustment_data: Option, + /// Bid adjustment data V3. + pub adjustment_data: Option, } impl ssz::Encode for HeaderSubmissionElectra { @@ -99,7 +99,7 @@ impl ssz::Encode for HeaderSubmissionElectra { + ::ssz_fixed_len() + as ssz::Encode>::ssz_fixed_len(); if self.adjustment_data.is_some() { - offset += ::ssz_fixed_len(); + offset += ::ssz_fixed_len(); } let mut encoder = ssz::SszEncoder::container(buf, offset); @@ -123,7 +123,7 @@ impl ssz::Encode for HeaderSubmissionElectra { + ::ssz_bytes_len(&self.execution_requests) + as ssz::Encode>::ssz_bytes_len(&self.commitments); if let Some(adjustment) = &self.adjustment_data { - len += ::ssz_bytes_len(adjustment); + len += ::ssz_bytes_len(adjustment); } len } @@ -141,7 +141,7 @@ impl ssz::Decode for HeaderSubmissionElectra { execution_payload_header: ExecutionPayloadHeaderElectra, execution_requests: ExecutionRequestsV4, commitments: Vec, - adjustment_data: BidAdjustmentDataV2, + adjustment_data: BidAdjustmentDataV3, } #[derive(ssz_derive::Decode)] diff --git a/crates/rbuilder/src/building/builders/mod.rs b/crates/rbuilder/src/building/builders/mod.rs index fe65d7651..4313b820e 100644 --- a/crates/rbuilder/src/building/builders/mod.rs +++ b/crates/rbuilder/src/building/builders/mod.rs @@ -18,7 +18,7 @@ use crate::{ use ahash::HashSet; use alloy_eips::eip7594::BlobTransactionSidecarVariant; use alloy_primitives::{Address, Bytes}; -use rbuilder_primitives::{mev_boost::BidAdjustmentData, AccountNonce, OrderId, SimulatedOrder}; +use rbuilder_primitives::{mev_boost::BidAdjustmentDataV3, AccountNonce, OrderId, SimulatedOrder}; use reth::primitives::SealedBlock; use std::{ collections::HashMap, @@ -49,7 +49,7 @@ pub struct Block { /// The Pectra execution requests for this bid. pub execution_requests: Vec, /// Bid adjustment data by fee payer address. - pub bid_adjustments: HashMap, + pub bid_adjustments: HashMap, } /// Id to uniquely identify every block built (unique even among different algorithms). diff --git a/crates/rbuilder/src/building/mod.rs b/crates/rbuilder/src/building/mod.rs index acc3b44cb..b3f41e0f2 100644 --- a/crates/rbuilder/src/building/mod.rs +++ b/crates/rbuilder/src/building/mod.rs @@ -39,7 +39,7 @@ use evm::EthCachedEvmFactory; use jsonrpsee::core::Serialize; use parking_lot::Mutex; use rbuilder_primitives::{ - mev_boost::BidAdjustmentData, BlockSpace, Order, SimValue, SimulatedOrder, + mev_boost::BidAdjustmentDataV3, BlockSpace, Order, SimValue, SimulatedOrder, TransactionSignedEcRecoveredWithBlobs, }; use reth::{ @@ -613,7 +613,7 @@ pub struct FinalizeResult { /// The Pectra execution requests for this bid. pub execution_requests: Vec, /// Bid adjustment data. - pub bid_adjustments: HashMap, + pub bid_adjustments: HashMap, /// Duration of root hash calculation. pub root_hash_time: Duration, } @@ -1141,21 +1141,30 @@ impl, + maybe_adjustment_data: Option<&BidAdjustmentDataV3>, adjustment_data_required: bool, ) -> eyre::Result { - let maybe_adjustment_data_v2 = maybe_adjustment_data.map(|d| d.clone().into_v2()); - if maybe_adjustment_data_v2.is_none() && adjustment_data_required { + if maybe_adjustment_data.is_none() && adjustment_data_required { eyre::bail!("adjustment data is required") } @@ -347,7 +346,7 @@ fn create_optimistic_v3_request( ), execution_requests: request.execution_requests.clone(), commitments: request.blobs_bundle.commitments.clone(), - adjustment_data: maybe_adjustment_data_v2, + adjustment_data: maybe_adjustment_data.cloned(), }), signature: request.signature, }; @@ -368,7 +367,7 @@ fn create_optimistic_v3_request( ), execution_requests: request.execution_requests.clone(), commitments: request.blobs_bundle.commitments.clone(), - adjustment_data: maybe_adjustment_data_v2, + adjustment_data: maybe_adjustment_data.cloned(), }), signature: request.signature, }; @@ -388,7 +387,7 @@ fn create_optimistic_v3_request( fn submit_block_to_relays( request: Arc, bid_metadata: &BidMetadata, - bid_adjustments: &std::collections::HashMap, + bid_adjustments: &std::collections::HashMap, relays: &Vec, registrations: &HashMap, optimistic_v3_config: &Option, @@ -442,7 +441,7 @@ fn submit_block_to_relays( // For optimistic v3, it is already included in the header submission. adjustment_data: maybe_adjustment_data .filter(|_| optimistic_v3.is_none()) - .map(|adjustment_data| adjustment_data.clone().into_v1()), + .cloned(), }, metadata: bid_metadata.clone(), };