diff --git a/crates/rbuilder/src/live_builder/block_output/bid_observer.rs b/crates/rbuilder/src/live_builder/block_output/bid_observer.rs index 3a3531322..e73254a7b 100644 --- a/crates/rbuilder/src/live_builder/block_output/bid_observer.rs +++ b/crates/rbuilder/src/live_builder/block_output/bid_observer.rs @@ -1,7 +1,10 @@ use alloy_primitives::U256; use reth_primitives::SealedBlock; -use crate::{building::BuiltBlockTrace, mev_boost::submission::SubmitBlockRequest}; +use crate::{ + building::BuiltBlockTrace, live_builder::payload_events::MevBoostSlotData, + mev_boost::submission::SubmitBlockRequest, +}; /// Trait that receives every bid made by us to the relays. pub trait BidObserver: std::fmt::Debug { @@ -9,9 +12,10 @@ pub trait BidObserver: std::fmt::Debug { /// This should NOT block since it's executed in the submitting thread. fn block_submitted( &self, - sealed_block: SealedBlock, - submit_block_request: SubmitBlockRequest, - built_block_trace: BuiltBlockTrace, + slot_data: &MevBoostSlotData, + sealed_block: &SealedBlock, + submit_block_request: &SubmitBlockRequest, + built_block_trace: &BuiltBlockTrace, builder_name: String, best_bid_value: U256, ); @@ -23,9 +27,10 @@ pub struct NullBidObserver {} impl BidObserver for NullBidObserver { fn block_submitted( &self, - _sealed_block: SealedBlock, - _submit_block_request: SubmitBlockRequest, - _built_block_trace: BuiltBlockTrace, + _slot_data: &MevBoostSlotData, + _sealed_block: &SealedBlock, + _submit_block_request: &SubmitBlockRequest, + _built_block_trace: &BuiltBlockTrace, _builder_name: String, _best_bid_value: U256, ) { diff --git a/crates/rbuilder/src/live_builder/block_output/bid_observer_multiplexer.rs b/crates/rbuilder/src/live_builder/block_output/bid_observer_multiplexer.rs new file mode 100644 index 000000000..230cab0da --- /dev/null +++ b/crates/rbuilder/src/live_builder/block_output/bid_observer_multiplexer.rs @@ -0,0 +1,49 @@ +use reth_primitives::SealedBlock; + +use crate::{ + building::BuiltBlockTrace, live_builder::payload_events::MevBoostSlotData, + mev_boost::submission::SubmitBlockRequest, +}; + +use super::bid_observer::BidObserver; + +/// Implements BidObserver forwarding all calls to several BidObservers. +#[derive(Default)] +pub struct BidObserverMultiplexer { + observers: Vec>, +} + +impl std::fmt::Debug for BidObserverMultiplexer { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + f.debug_struct("BidObserverMultiplexer").finish() + } +} + +impl BidObserverMultiplexer { + pub fn push(&mut self, obs: Box) { + self.observers.push(obs); + } +} + +impl BidObserver for BidObserverMultiplexer { + fn block_submitted( + &self, + slot_data: &MevBoostSlotData, + sealed_block: &SealedBlock, + submit_block_request: &SubmitBlockRequest, + built_block_trace: &BuiltBlockTrace, + builder_name: String, + best_bid_value: alloy_primitives::U256, + ) { + for obs in &self.observers { + obs.block_submitted( + slot_data, + sealed_block, + submit_block_request, + built_block_trace, + builder_name.clone(), + best_bid_value, + ); + } + } +} diff --git a/crates/rbuilder/src/live_builder/block_output/mod.rs b/crates/rbuilder/src/live_builder/block_output/mod.rs index 3c7c5f316..b0c3e1c2f 100644 --- a/crates/rbuilder/src/live_builder/block_output/mod.rs +++ b/crates/rbuilder/src/live_builder/block_output/mod.rs @@ -1,4 +1,5 @@ pub mod bid_observer; +pub mod bid_observer_multiplexer; pub mod bid_value_source; pub mod bidding; pub mod block_sealing_bidder_factory; diff --git a/crates/rbuilder/src/live_builder/block_output/relay_submit.rs b/crates/rbuilder/src/live_builder/block_output/relay_submit.rs index 996e50bcc..963e2bc8a 100644 --- a/crates/rbuilder/src/live_builder/block_output/relay_submit.rs +++ b/crates/rbuilder/src/live_builder/block_output/relay_submit.rs @@ -332,9 +332,10 @@ async fn run_submit_to_relays_job( submission_span.in_scope(|| { // NOTE: we only notify normal submission here because they have the same contents but different pubkeys config.bid_observer.block_submitted( - block.sealed_block, - normal_signed_submission.submission, - block.trace, + &slot_data, + &block.sealed_block, + &normal_signed_submission.submission, + &block.trace, builder_name, bid_metadata.value.top_competitor_bid.unwrap_or_default(), );