Skip to content

Commit e77d48e

Browse files
authored
feat(relay): add types to support bid adjustments (#669)
## 📝 Summary Add `BidAdjustmentData` type and refactor `SubmitBlockRequest` types in preparation to support bid adjustments. ## ✅ I have completed the following steps: * [x] Run `make lint` * [x] Run `make test` * [ ] Added tests (if applicable)
1 parent df1b63b commit e77d48e

6 files changed

Lines changed: 432 additions & 69 deletions

File tree

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
use alloy_primitives::{Address, Bytes, B256};
2+
3+
/// The type representing UltraSound bid adjustments.
4+
#[derive(
5+
PartialEq,
6+
Eq,
7+
Clone,
8+
Debug,
9+
serde::Serialize,
10+
serde::Deserialize,
11+
ssz_derive::Encode,
12+
ssz_derive::Decode,
13+
)]
14+
pub struct BidAdjustmentData {
15+
/// State root of the payload.
16+
pub state_root: B256,
17+
/// Transactions root of the payload.
18+
pub transactions_root: B256,
19+
/// Receipts root of the payload.
20+
pub receipts_root: B256,
21+
/// The usual builder address that pays the proposer in the last transaction of the block.
22+
/// When we adjust a bid, this transaction is overwritten by a transaction from the collateral
23+
/// account `fee_payer_address`. If we don't adjust the bid, `builder_address` pays the
24+
/// proposer as per usual.
25+
pub builder_address: Address,
26+
/// The state proof for the builder account.
27+
pub builder_proof: Vec<Bytes>,
28+
/// The proposer's fee recipient.
29+
pub fee_recipient_address: Address,
30+
/// The state proof for the fee recipient account.
31+
pub fee_recipient_proof: Vec<Bytes>,
32+
/// The fee payer address that is custodied by the relay.
33+
pub fee_payer_address: Address,
34+
/// The state proof for the fee payer account.
35+
pub fee_payer_proof: Vec<Bytes>,
36+
/// The merkle proof for the last transaction in the block, which will be overwritten with a
37+
/// payment from `fee_payer` to `fee_recipient` if we adjust the bid.
38+
pub placeholder_transaction_proof: Vec<Bytes>,
39+
/// The merkle proof for the receipt of the placeholder transaction. It's required for
40+
/// adjusting payments to contract addresses.
41+
pub placeholder_receipt_proof: Vec<Bytes>,
42+
}

crates/rbuilder/src/mev_boost/mod.rs

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
pub mod adjustment;
12
mod error;
23
pub mod fake_mev_boost_relay;
34
pub mod rpc;
@@ -18,7 +19,7 @@ use serde::{Deserialize, Serialize};
1819
use serde_with::{serde_as, DisplayFromStr};
1920
use ssz::Encode;
2021
use std::{io::Write, str::FromStr};
21-
use submission::{SubmitBlockRequest, SubmitBlockRequestNoBlobs, SubmitBlockRequestWithMetadata};
22+
use submission::{SubmitBlockRequestNoBlobs, SubmitBlockRequestWithMetadata};
2223
use url::Url;
2324

2425
pub use error::*;
@@ -500,11 +501,7 @@ impl RelayClient {
500501
// SSZ vs JSON
501502
let (mut body_data, content_type) = if ssz {
502503
(
503-
match &submission_with_metadata.submission {
504-
SubmitBlockRequest::Capella(data) => data.0.as_ssz_bytes(),
505-
SubmitBlockRequest::Deneb(data) => data.0.as_ssz_bytes(),
506-
SubmitBlockRequest::Electra(data) => data.0.as_ssz_bytes(),
507-
},
504+
submission_with_metadata.submission.as_ssz_bytes(),
508505
SSZ_CONTENT_TYPE,
509506
)
510507
} else {
@@ -694,7 +691,9 @@ mod tests {
694691
use submission::{BidMetadata, BidValueMetadata};
695692

696693
use super::{rpc::TestDataGenerator, *};
697-
use crate::mev_boost::fake_mev_boost_relay::FakeMevBoostRelay;
694+
use crate::mev_boost::{
695+
fake_mev_boost_relay::FakeMevBoostRelay, submission::SubmitBlockRequest,
696+
};
698697

699698
use std::str::FromStr;
700699

crates/rbuilder/src/mev_boost/rpc.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,15 @@ pub struct TestDataGenerator {
1919

2020
impl TestDataGenerator {
2121
pub fn create_deneb_submit_block_request(&mut self) -> DenebSubmitBlockRequest {
22-
DenebSubmitBlockRequest(SignedBidSubmissionV3 {
23-
message: self.create_bid_trace(),
24-
execution_payload: self.create_deneb_payload(),
25-
blobs_bundle: self.create_txs_blobs_sidecars(),
26-
signature: self.create_signature(),
27-
})
22+
DenebSubmitBlockRequest {
23+
submission: SignedBidSubmissionV3 {
24+
message: self.create_bid_trace(),
25+
execution_payload: self.create_deneb_payload(),
26+
blobs_bundle: self.create_txs_blobs_sidecars(),
27+
signature: self.create_signature(),
28+
},
29+
adjustment_data: None,
30+
}
2831
}
2932

3033
pub fn create_txs_blobs_sidecars(&mut self) -> BlobsBundleV1 {

crates/rbuilder/src/mev_boost/sign_payload.rs

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@ use super::submission::{
33
SubmitBlockRequest,
44
};
55
use crate::utils::u256decimal_serde_helper;
6-
use alloy_eips::eip7685::Requests;
7-
use alloy_eips::{eip2718::Encodable2718, eip4844::BlobTransactionSidecar};
6+
use alloy_eips::{eip2718::Encodable2718, eip4844::BlobTransactionSidecar, eip7685::Requests};
87
use alloy_primitives::{Address, BlockHash, Bytes, FixedBytes, B256, U256};
9-
use alloy_rpc_types_beacon::requests::ExecutionRequestsV4;
108
use alloy_rpc_types_beacon::{
119
events::PayloadAttributesData,
1210
relay::{BidTrace, SignedBidSubmissionV2, SignedBidSubmissionV3, SignedBidSubmissionV4},
11+
requests::ExecutionRequestsV4,
1312
BlsPublicKey,
1413
};
1514
use alloy_rpc_types_engine::{
@@ -127,6 +126,9 @@ pub fn sign_block_for_relay(
127126
pubkey: H384,
128127
value: U256,
129128
) -> eyre::Result<SubmitBlockRequest> {
129+
// TODO: add support for bid adjustments
130+
let adjustment_data = None;
131+
130132
let message = BidTrace {
131133
slot: attrs.proposal_slot,
132134
parent_hash: attrs.parent_block_hash,
@@ -185,7 +187,7 @@ pub fn sign_block_for_relay(
185187
.unwrap_or_default(),
186188
};
187189

188-
let submit_block_request = if chain_spec.is_cancun_active_at_timestamp(sealed_block.timestamp) {
190+
let request = if chain_spec.is_cancun_active_at_timestamp(sealed_block.timestamp) {
189191
let execution_payload = ExecutionPayloadV3 {
190192
payload_inner: capella_payload,
191193
blob_gas_used: sealed_block
@@ -200,31 +202,33 @@ pub fn sign_block_for_relay(
200202
let execution_requests =
201203
ExecutionRequestsV4::try_from(Requests::new(execution_requests.to_vec()))?;
202204
if chain_spec.is_prague_active_at_timestamp(sealed_block.timestamp) {
203-
SubmitBlockRequest::Electra(ElectraSubmitBlockRequest(SignedBidSubmissionV4 {
205+
let submission = SignedBidSubmissionV4 {
204206
message,
205207
execution_payload,
206208
blobs_bundle,
207209
signature,
208210
execution_requests,
209-
}))
211+
};
212+
SubmitBlockRequest::electra(ElectraSubmitBlockRequest::new(submission, adjustment_data))
210213
} else {
211-
SubmitBlockRequest::Deneb(DenebSubmitBlockRequest(SignedBidSubmissionV3 {
214+
let submission = SignedBidSubmissionV3 {
212215
message,
213216
execution_payload,
214217
blobs_bundle,
215218
signature,
216-
}))
219+
};
220+
SubmitBlockRequest::deneb(DenebSubmitBlockRequest::new(submission, adjustment_data))
217221
}
218222
} else {
219-
let execution_payload = capella_payload;
220-
SubmitBlockRequest::Capella(CapellaSubmitBlockRequest(SignedBidSubmissionV2 {
223+
let submission = SignedBidSubmissionV2 {
221224
message,
222-
execution_payload,
225+
execution_payload: capella_payload,
223226
signature,
224-
}))
227+
};
228+
SubmitBlockRequest::capella(CapellaSubmitBlockRequest::new(submission, adjustment_data))
225229
};
226230

227-
Ok(submit_block_request)
231+
Ok(request)
228232
}
229233

230234
fn flatten_marshal<Source>(

0 commit comments

Comments
 (0)