From bb94be2e431b51a0cb8e8e7d3cf6400478041c03 Mon Sep 17 00:00:00 2001 From: reaper-o-lykos <199024505+reaper-o-lykos@users.noreply.github.com> Date: Mon, 20 Oct 2025 04:28:50 -0400 Subject: [PATCH 1/2] chore: send bundle hashes instead of uuid to fake relay --- crates/rbuilder-primitives/src/lib.rs | 7 ++++ .../rbuilder-primitives/src/mev_boost/mod.rs | 3 +- .../live_builder/block_output/relay_submit.rs | 3 +- crates/rbuilder/src/mev_boost/mod.rs | 37 ++++++++----------- 4 files changed, 27 insertions(+), 23 deletions(-) diff --git a/crates/rbuilder-primitives/src/lib.rs b/crates/rbuilder-primitives/src/lib.rs index e00c9ab03..2d4e1241e 100644 --- a/crates/rbuilder-primitives/src/lib.rs +++ b/crates/rbuilder-primitives/src/lib.rs @@ -1151,6 +1151,13 @@ impl Order { } } + pub fn bundle_hash(&self) -> Option { + match self { + Order::Bundle(b) => b.external_hash, + _ => None, + } + } + pub fn is_tx(&self) -> bool { matches!(self, Order::Tx(_)) } diff --git a/crates/rbuilder-primitives/src/mev_boost/mod.rs b/crates/rbuilder-primitives/src/mev_boost/mod.rs index 01514c20f..b8652de57 100644 --- a/crates/rbuilder-primitives/src/mev_boost/mod.rs +++ b/crates/rbuilder-primitives/src/mev_boost/mod.rs @@ -1,5 +1,5 @@ use crate::OrderId; -use alloy_primitives::{Address, Bytes, U256}; +use alloy_primitives::{Address, Bytes, B256, U256}; use alloy_rpc_types_beacon::{ relay::BidTrace, requests::ExecutionRequestsV4, BlsPublicKey, BlsSignature, }; @@ -200,6 +200,7 @@ pub struct BloxrouteRegionalEndpoint { pub struct BidMetadata { pub value: BidValueMetadata, pub order_ids: Vec, + pub bundle_hashes: Vec, } #[derive(Clone, Copy, Default, Debug)] 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 5c200e8db..004bcb5e9 100644 --- a/crates/rbuilder/src/live_builder/block_output/relay_submit.rs +++ b/crates/rbuilder/src/live_builder/block_output/relay_submit.rs @@ -202,7 +202,8 @@ async fn run_submit_to_relays_job( coinbase_reward: block.trace.coinbase_reward, top_competitor_bid: block.trace.seen_competition_bid, }, - order_ids: executed_orders.map(|o| o.id()).collect(), + order_ids: executed_orders.clone().map(|o| o.id()).collect(), + bundle_hashes: executed_orders.filter_map(|o| o.bundle_hash()).collect(), }; let latency = block.trace.orders_sealed_at - block.trace.orders_closed_at; diff --git a/crates/rbuilder/src/mev_boost/mod.rs b/crates/rbuilder/src/mev_boost/mod.rs index a7cd5d867..ef973683f 100644 --- a/crates/rbuilder/src/mev_boost/mod.rs +++ b/crates/rbuilder/src/mev_boost/mod.rs @@ -750,27 +750,22 @@ impl RelayClient { builder = builder.header(TOP_BID_HEADER, top_competitor_bid.to_string()); } if !metadata.order_ids.is_empty() { - const MAX_BUNDLE_IDS: usize = 150; - let bundle_ids: Vec<_> = metadata - .order_ids - .iter() - .filter_map(|order| match order { - rbuilder_primitives::OrderId::Tx(_fixed_bytes) => None, - rbuilder_primitives::OrderId::Bundle(uuid) => Some(uuid), - rbuilder_primitives::OrderId::ShareBundle(_fixed_bytes) => None, - }) - .collect(); - let total_bundles = bundle_ids.len(); - let mut bundle_ids = bundle_ids - .iter() - .take(MAX_BUNDLE_IDS) - .map(|uuid| format!("{uuid:?}")); - let bundle_ids = if total_bundles > MAX_BUNDLE_IDS { - bundle_ids.join(",") + ",CAPPED" - } else { - bundle_ids.join(",") - }; - builder = builder.header(BUNDLE_HASHES_HEADER, bundle_ids); + const MAX_BUNDLE_HASHES: usize = 150; + if !metadata.bundle_hashes.is_empty() { + let mut bundle_hashes: Vec<_> = metadata + .bundle_hashes + .iter() + .take(MAX_BUNDLE_HASHES) + .map(|h| format!("{h:?}")) + .collect(); + + let bundle_hashes = if bundle_hashes.len() > MAX_BUNDLE_HASHES { + bundle_hashes.join(",") + ",CAPPED" + } else { + bundle_hashes.join(",") + }; + builder = builder.header(BUNDLE_HASHES_HEADER, bundle_hashes); + } let sent_at = std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) From acdb19eb68540eb7db7287ed01b218edd77fe928 Mon Sep 17 00:00:00 2001 From: reaper-o-lykos <199024505+reaper-o-lykos@users.noreply.github.com> Date: Mon, 20 Oct 2025 05:58:34 -0400 Subject: [PATCH 2/2] nits: fix lint and rename confusing function --- crates/rbuilder-primitives/src/lib.rs | 2 +- .../live_builder/block_output/relay_submit.rs | 4 +- crates/rbuilder/src/mev_boost/mod.rs | 45 +++++++++---------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/crates/rbuilder-primitives/src/lib.rs b/crates/rbuilder-primitives/src/lib.rs index 2d4e1241e..d403c7c0c 100644 --- a/crates/rbuilder-primitives/src/lib.rs +++ b/crates/rbuilder-primitives/src/lib.rs @@ -1151,7 +1151,7 @@ impl Order { } } - pub fn bundle_hash(&self) -> Option { + pub fn external_bundle_hash(&self) -> Option { match self { Order::Bundle(b) => b.external_hash, _ => None, 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 004bcb5e9..3e4c0a622 100644 --- a/crates/rbuilder/src/live_builder/block_output/relay_submit.rs +++ b/crates/rbuilder/src/live_builder/block_output/relay_submit.rs @@ -203,7 +203,9 @@ async fn run_submit_to_relays_job( top_competitor_bid: block.trace.seen_competition_bid, }, order_ids: executed_orders.clone().map(|o| o.id()).collect(), - bundle_hashes: executed_orders.filter_map(|o| o.bundle_hash()).collect(), + bundle_hashes: executed_orders + .filter_map(|o| o.external_bundle_hash()) + .collect(), }; let latency = block.trace.orders_sealed_at - block.trace.orders_closed_at; diff --git a/crates/rbuilder/src/mev_boost/mod.rs b/crates/rbuilder/src/mev_boost/mod.rs index ef973683f..3f38d940f 100644 --- a/crates/rbuilder/src/mev_boost/mod.rs +++ b/crates/rbuilder/src/mev_boost/mod.rs @@ -3,7 +3,6 @@ use alloy_primitives::{utils::parse_ether, Address, BlockHash, U256}; use alloy_rpc_types_beacon::BlsPublicKey; use flate2::{write::GzEncoder, Compression}; use governor::{DefaultDirectRateLimiter, Quota, RateLimiter}; -use itertools::Itertools; use rbuilder_primitives::mev_boost::{ HeaderSubmissionOptimisticV3, KnownRelay, MevBoostRelayID, RelayMode, SubmitBlockRequestNoBlobs, SubmitBlockRequestWithMetadata, ValidatorRegistration, @@ -749,30 +748,29 @@ impl RelayClient { if let Some(top_competitor_bid) = metadata.value.top_competitor_bid { builder = builder.header(TOP_BID_HEADER, top_competitor_bid.to_string()); } - if !metadata.order_ids.is_empty() { - const MAX_BUNDLE_HASHES: usize = 150; - if !metadata.bundle_hashes.is_empty() { - let mut bundle_hashes: Vec<_> = metadata - .bundle_hashes - .iter() - .take(MAX_BUNDLE_HASHES) - .map(|h| format!("{h:?}")) - .collect(); - - let bundle_hashes = if bundle_hashes.len() > MAX_BUNDLE_HASHES { - bundle_hashes.join(",") + ",CAPPED" - } else { - bundle_hashes.join(",") - }; - builder = builder.header(BUNDLE_HASHES_HEADER, bundle_hashes); - } - let sent_at = std::time::SystemTime::now() - .duration_since(std::time::UNIX_EPOCH) - .unwrap_or_default() - .as_secs_f64(); - builder = builder.header("X-BuilderNet-SentAt", sent_at.to_string()); + const MAX_BUNDLE_HASHES: usize = 150; + if !metadata.bundle_hashes.is_empty() { + let bundle_hashes: Vec<_> = metadata + .bundle_hashes + .iter() + .take(MAX_BUNDLE_HASHES) + .map(|h| format!("{h:?}")) + .collect(); + + let bundle_hashes = if bundle_hashes.len() > MAX_BUNDLE_HASHES { + bundle_hashes.join(",") + ",CAPPED" + } else { + bundle_hashes.join(",") + }; + builder = builder.header(BUNDLE_HASHES_HEADER, bundle_hashes); } + + let sent_at = std::time::SystemTime::now() + .duration_since(std::time::UNIX_EPOCH) + .unwrap_or_default() + .as_secs_f64(); + builder = builder.header("X-BuilderNet-SentAt", sent_at.to_string()); } let response = builder @@ -1255,6 +1253,7 @@ mod tests { top_competitor_bid: None, }, order_ids: vec![], + bundle_hashes: vec![], }, }; let registration = ValidatorSlotData {