Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions crates/bid-scraper/src/bloxroute_ws_publisher.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@ use tokio_tungstenite::{
};
use tracing::{debug, error, info};

pub type BloxrouteWsPublisher = Service<BloxrouteWsConnectionHandler>;

#[derive(Debug, Clone, Deserialize, PartialEq)]
pub struct BloxrouteWsPublisherConfig {
/// Url to connect to. Example: "wss://mev-eth.blxrbdn.com/ws"
Expand Down Expand Up @@ -189,5 +191,3 @@ mod tests {
assert!(serde_json::from_str::<BloxrouteWsBid>(raw).is_ok());
}
}

pub type BloxrouteWsPublisher = Service<BloxrouteWsConnectionHandler>;
19 changes: 15 additions & 4 deletions crates/rbuilder-operator/src/blocks_processor.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use alloy_primitives::{Address, BlockHash, B256, U256};
use alloy_rpc_types_beacon::relay::SubmitBlockRequest as AlloySubmitBlockRequest;
use exponential_backoff::Backoff;
use jsonrpsee::core::{client::ClientT, traits::ToRpcParams};
use rbuilder::{
Expand All @@ -9,7 +10,6 @@ use rbuilder::{
utils::error_storage::store_error_event,
};
use rbuilder_primitives::{
mev_boost::SubmitBlockRequest,
serialize::{RawBundle, RawShareBundle},
Bundle, Order, OrderId,
};
Expand Down Expand Up @@ -135,12 +135,23 @@ impl<HttpClientType: ClientT> BlocksProcessorClient<HttpClientType> {
}
pub async fn submit_built_block(
&self,
submit_block_request: &SubmitBlockRequest,
submit_block_request: &AlloySubmitBlockRequest,
built_block_trace: &BuiltBlockTrace,
builder_name: String,
best_bid_value: U256,
) -> eyre::Result<()> {
let execution_payload_v1 = submit_block_request.execution_payload_v1();
let execution_payload_v1 = match submit_block_request {
AlloySubmitBlockRequest::Capella(request) => &request.execution_payload.payload_inner,
AlloySubmitBlockRequest::Deneb(request) => {
&request.execution_payload.payload_inner.payload_inner
}
AlloySubmitBlockRequest::Electra(request) => {
&request.execution_payload.payload_inner.payload_inner
}
AlloySubmitBlockRequest::Fulu(request) => {
&request.execution_payload.payload_inner.payload_inner
}
};
let header = BlocksProcessorHeader {
hash: execution_payload_v1.block_hash,
gas_limit: U256::from(execution_payload_v1.gas_limit),
Expand Down Expand Up @@ -345,7 +356,7 @@ impl<HttpClientType: ClientT + Clone + Send + Sync + std::fmt::Debug + 'static>
fn block_submitted(
&self,
_slot_data: &MevBoostSlotData,
submit_block_request: &SubmitBlockRequest,
submit_block_request: &AlloySubmitBlockRequest,
built_block_trace: &BuiltBlockTrace,
builder_name: String,
best_bid_value: U256,
Expand Down
4 changes: 2 additions & 2 deletions crates/rbuilder-operator/src/flashbots_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
//! @Pending make this copy/paste generic code on the library

use alloy_primitives::U256;
use alloy_rpc_types_beacon::relay::SubmitBlockRequest as AlloySubmitBlockRequest;
use alloy_signer_local::PrivateKeySigner;
use derivative::Derivative;
use eyre::Context;
Expand All @@ -29,7 +30,6 @@ use rbuilder::{
utils::build_info::Version,
};
use rbuilder_config::EnvOrValue;
use rbuilder_primitives::mev_boost::SubmitBlockRequest;
use serde::Deserialize;
use serde_with::serde_as;
use tokio_util::sync::CancellationToken;
Expand Down Expand Up @@ -431,7 +431,7 @@ impl BidObserver for RbuilderOperatorBidObserver {
fn block_submitted(
&self,
slot_data: &MevBoostSlotData,
submit_block_request: &SubmitBlockRequest,
submit_block_request: &AlloySubmitBlockRequest,
built_block_trace: &BuiltBlockTrace,
builder_name: String,
best_bid_value: U256,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
use alloy_rpc_types_beacon::relay::SubmitBlockRequest as AlloySubmitBlockRequest;
use alloy_signer_local::PrivateKeySigner;
use rbuilder::{
building::BuiltBlockTrace,
live_builder::{
block_output::bidding_service_interface::BidObserver, payload_events::MevBoostSlotData,
},
};
use rbuilder_primitives::mev_boost::SubmitBlockRequest;
use redis::RedisError;
use tokio_util::sync::CancellationToken;

Expand Down Expand Up @@ -73,7 +73,7 @@ impl BidObserver for BestTrueValueObserver {
fn block_submitted(
&self,
slot_data: &MevBoostSlotData,
_submit_block_request: &SubmitBlockRequest,
_submit_block_request: &AlloySubmitBlockRequest,
built_block_trace: &BuiltBlockTrace,
builder_name: String,
_best_bid_value: alloy_primitives::U256,
Expand Down
61 changes: 11 additions & 50 deletions crates/rbuilder-primitives/src/built_block.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
use crate::mev_boost::{
BidAdjustmentDataV1, CapellaSubmitBlockRequest, DenebSubmitBlockRequest,
ElectraSubmitBlockRequest, FuluSubmitBlockRequest, SubmitBlockRequest,
};
use alloy_eips::{
eip2718::Encodable2718,
eip4844::BlobTransactionSidecar,
Expand All @@ -10,6 +6,7 @@ use alloy_eips::{
};
use alloy_primitives::{Bytes, U256};
use alloy_rpc_types::Withdrawals;
use alloy_rpc_types_beacon::relay::SubmitBlockRequest as AlloySubmitBlockRequest;
use alloy_rpc_types_beacon::{
events::PayloadAttributesData,
relay::{
Expand Down Expand Up @@ -37,90 +34,54 @@ pub struct SignedBuiltBlock {
}

impl SignedBuiltBlock {
/// Convert the signed block into [`SubmitBlockRequest`].
/// NOTE: This does not set bid adjustment data. Use [`Self::into_request_with_adjustment_data`] instead.
pub fn into_request(self, chain_spec: &ChainSpec) -> eyre::Result<SubmitBlockRequest> {
self.into_request_inner(chain_spec, None)
}

/// Convert the signed block into [`SubmitBlockRequest`] with ad
pub fn into_request_with_adjustment_data(
self,
chain_spec: &ChainSpec,
adjustment_data: Option<BidAdjustmentDataV1>,
) -> eyre::Result<SubmitBlockRequest> {
self.into_request_inner(chain_spec, adjustment_data)
}

/// Convert the signed block into [`SubmitBlockRequest`].
/// NOTE:
fn into_request_inner(
self,
chain_spec: &ChainSpec,
adjustment_data: Option<BidAdjustmentDataV1>,
) -> eyre::Result<SubmitBlockRequest> {
/// Convert the signed block into [`SubmitBlockRequest`](`alloy_rpc_types_beacon::relay::SubmitBlockRequest`).
pub fn into_request(self, chain_spec: &ChainSpec) -> eyre::Result<AlloySubmitBlockRequest> {
match self.execution_payload {
ExecutionPayload::V1(_v1) => {
eyre::bail!("v1 payloads are not supported");
}
ExecutionPayload::V2(v2) => {
let submission = SignedBidSubmissionV2 {
Ok(AlloySubmitBlockRequest::Capella(SignedBidSubmissionV2 {
message: self.message,
execution_payload: v2,
signature: self.signature,
};
Ok(SubmitBlockRequest::capella(CapellaSubmitBlockRequest::new(
submission,
adjustment_data,
)))
}))
}
ExecutionPayload::V3(v3) => {
if chain_spec.is_osaka_active_at_timestamp(v3.timestamp()) {
let execution_requests = ExecutionRequestsV4::try_from(Requests::new(
self.execution_requests.to_vec(),
))?;
let blobs_bundle_v2 = marshall_txs_blobs_sidecars_v2(&self.blob_sidecars);
let submission = SignedBidSubmissionV5 {
return Ok(AlloySubmitBlockRequest::Fulu(SignedBidSubmissionV5 {
message: self.message,
execution_payload: v3,
blobs_bundle: blobs_bundle_v2,
signature: self.signature,
execution_requests,
};
return Ok(SubmitBlockRequest::fulu(FuluSubmitBlockRequest::new(
submission,
adjustment_data,
)));
}));
}

let blobs_bundle = marshal_txs_blobs_sidecars(&self.blob_sidecars);
if chain_spec.is_prague_active_at_timestamp(v3.timestamp()) {
let execution_requests = ExecutionRequestsV4::try_from(Requests::new(
self.execution_requests.to_vec(),
))?;
let submission = SignedBidSubmissionV4 {
return Ok(AlloySubmitBlockRequest::Electra(SignedBidSubmissionV4 {
message: self.message,
execution_payload: v3,
blobs_bundle,
signature: self.signature,
execution_requests,
};
return Ok(SubmitBlockRequest::electra(ElectraSubmitBlockRequest::new(
submission,
adjustment_data,
)));
}));
}

let submission = SignedBidSubmissionV3 {
Ok(AlloySubmitBlockRequest::Deneb(SignedBidSubmissionV3 {
message: self.message,
execution_payload: v3,
blobs_bundle,
signature: self.signature,
};
Ok(SubmitBlockRequest::deneb(DenebSubmitBlockRequest::new(
submission,
adjustment_data,
)))
}))
}
}
}
Expand Down
88 changes: 3 additions & 85 deletions crates/rbuilder-primitives/src/mev_boost/mod.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
use crate::OrderId;
use alloy_primitives::{Address, Bytes, B256, U256};
use alloy_rpc_types_beacon::{
relay::BidTrace, requests::ExecutionRequestsV4, BlsPublicKey, BlsSignature,
};
use alloy_rpc_types_engine::{BlobsBundleV1, BlobsBundleV2, ExecutionPayloadV3};
use alloy_rpc_types_beacon::BlsPublicKey;
use reqwest::Url;
use serde::{Deserialize, Serialize};
use serde_with::{serde_as, DisplayFromStr};
use std::{sync::Arc, time::Duration};
use std::time::Duration;

mod submit_block;
pub use submit_block::*;
Expand Down Expand Up @@ -216,85 +213,6 @@ pub struct BidValueMetadata {

#[derive(Clone, Debug)]
pub struct SubmitBlockRequestWithMetadata {
pub submission: Arc<SubmitBlockRequest>,
pub submission: SubmitBlockRequest,
pub metadata: BidMetadata,
}

/// Signed bid submission that is serialized without blobs bundle.
#[derive(Debug)]
pub struct SubmitBlockRequestNoBlobs<'a>(pub &'a SubmitBlockRequest);

impl serde::Serialize for SubmitBlockRequestNoBlobs<'_> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
match self.0 {
SubmitBlockRequest::Capella(v2) => v2.serialize(serializer),
SubmitBlockRequest::Deneb(v3) => {
#[derive(serde::Serialize)]
struct SignedBidSubmissionV3Ref<'a> {
message: &'a BidTrace,
#[serde(with = "alloy_rpc_types_beacon::payload::beacon_payload_v3")]
execution_payload: &'a ExecutionPayloadV3,
blobs_bundle: &'a BlobsBundleV1,
signature: &'a BlsSignature,
#[serde(skip_serializing_if = "Option::is_none")]
adjustment_data: &'a Option<BidAdjustmentDataV1>,
}

SignedBidSubmissionV3Ref {
message: &v3.message,
execution_payload: &v3.execution_payload,
blobs_bundle: &BlobsBundleV1::new([]), // override blobs bundle with empty one
signature: &v3.signature,
adjustment_data: &v3.adjustment_data,
}
.serialize(serializer)
}
SubmitBlockRequest::Electra(v4) => {
#[derive(serde::Serialize)]
struct SignedBidSubmissionV4Ref<'a> {
message: &'a BidTrace,
#[serde(with = "alloy_rpc_types_beacon::payload::beacon_payload_v3")]
execution_payload: &'a ExecutionPayloadV3,
blobs_bundle: &'a BlobsBundleV1,
execution_requests: &'a ExecutionRequestsV4,
signature: &'a BlsSignature,
#[serde(skip_serializing_if = "Option::is_none")]
adjustment_data: &'a Option<BidAdjustmentDataV1>,
}

SignedBidSubmissionV4Ref {
message: &v4.message,
execution_payload: &v4.execution_payload,
blobs_bundle: &BlobsBundleV1::new([]), // override blobs bundle with empty one
signature: &v4.signature,
execution_requests: &v4.execution_requests,
adjustment_data: &v4.adjustment_data,
}
.serialize(serializer)
}
SubmitBlockRequest::Fulu(v5) => {
#[derive(serde::Serialize)]
struct SignedBidSubmissionV5Ref<'a> {
message: &'a BidTrace,
#[serde(with = "alloy_rpc_types_beacon::payload::beacon_payload_v3")]
execution_payload: &'a ExecutionPayloadV3,
blobs_bundle: &'a BlobsBundleV2,
execution_requests: &'a ExecutionRequestsV4,
signature: &'a BlsSignature,
}

SignedBidSubmissionV5Ref {
message: &v5.message,
execution_payload: &v5.execution_payload,
blobs_bundle: &BlobsBundleV2::new([]), // override blobs bundle with empty one
signature: &v5.signature,
execution_requests: &v5.execution_requests,
}
.serialize(serializer)
}
}
}
}
Loading
Loading