@@ -4,8 +4,8 @@ use axum::http::{HeaderMap, HeaderValue};
44use cb_common:: {
55 pbs:: {
66 error:: { PbsError , ValidationError } ,
7- BlindedBeaconBlock , BlindedBeaconBlockElectra , PayloadAndBlobsElectra , RelayClient ,
8- SignedBlindedBeaconBlock , SubmitBlindedBlockResponse , VersionedResponse ,
7+ BlindedBeaconBlock , BlindedBeaconBlockElectra , BuilderApiVersion , PayloadAndBlobsElectra ,
8+ RelayClient , SignedBlindedBeaconBlock , SubmitBlindedBlockResponse , VersionedResponse ,
99 HEADER_START_TIME_UNIX_MS ,
1010 } ,
1111 utils:: { get_user_agent_with_version, read_chunked_body_with_max, utcnow_ms} ,
@@ -23,12 +23,15 @@ use crate::{
2323 state:: { BuilderApiState , PbsState } ,
2424} ;
2525
26- /// Implements https://ethereum.github.io/builder-specs/#/Builder/submitBlindedBlock
26+ /// Implements https://ethereum.github.io/builder-specs/#/Builder/submitBlindedBlock and
27+ /// https://ethereum.github.io/builder-specs/#/Builder/submitBlindedBlockV2. Use `api_version` to
28+ /// distinguish between the two.
2729pub async fn submit_block < S : BuilderApiState > (
2830 signed_blinded_block : SignedBlindedBeaconBlock ,
2931 req_headers : HeaderMap ,
3032 state : PbsState < S > ,
31- ) -> eyre:: Result < SubmitBlindedBlockResponse > {
33+ api_version : & BuilderApiVersion ,
34+ ) -> eyre:: Result < Option < SubmitBlindedBlockResponse > > {
3235 // prepare headers
3336 let mut send_headers = HeaderMap :: new ( ) ;
3437 send_headers. insert ( HEADER_START_TIME_UNIX_MS , HeaderValue :: from ( utcnow_ms ( ) ) ) ;
@@ -42,6 +45,7 @@ pub async fn submit_block<S: BuilderApiState>(
4245 relay,
4346 send_headers. clone ( ) ,
4447 state. pbs_config ( ) . timeout_get_payload_ms ,
48+ api_version,
4549 ) ) ) ;
4650 }
4751
@@ -59,8 +63,9 @@ async fn submit_block_with_timeout(
5963 relay : & RelayClient ,
6064 headers : HeaderMap ,
6165 timeout_ms : u64 ,
62- ) -> Result < SubmitBlindedBlockResponse , PbsError > {
63- let url = relay. submit_block_url ( ) ?;
66+ api_version : & BuilderApiVersion ,
67+ ) -> Result < Option < SubmitBlindedBlockResponse > , PbsError > {
68+ let url = relay. submit_block_url ( * api_version) ?;
6469 let mut remaining_timeout_ms = timeout_ms;
6570 let mut retry = 0 ;
6671 let mut backoff = Duration :: from_millis ( 250 ) ;
@@ -74,6 +79,7 @@ async fn submit_block_with_timeout(
7479 headers. clone ( ) ,
7580 remaining_timeout_ms,
7681 retry,
82+ api_version,
7783 )
7884 . await
7985 {
@@ -107,7 +113,8 @@ async fn send_submit_block(
107113 headers : HeaderMap ,
108114 timeout_ms : u64 ,
109115 retry : u32 ,
110- ) -> Result < SubmitBlindedBlockResponse , PbsError > {
116+ api_version : & BuilderApiVersion ,
117+ ) -> Result < Option < SubmitBlindedBlockResponse > , PbsError > {
111118 let start_request = Instant :: now ( ) ;
112119 let res = match relay
113120 . client
@@ -151,6 +158,10 @@ async fn send_submit_block(
151158 warn ! ( relay_id = relay. id. as_ref( ) , retry, %err, "failed to get payload (this might be ok if other relays have it)" ) ;
152159 return Err ( err) ;
153160 } ;
161+ if api_version != & BuilderApiVersion :: V1 {
162+ // v2 response is going to be empty, so just break here
163+ return Ok ( None ) ;
164+ }
154165
155166 let block_response = match serde_json:: from_slice :: < SubmitBlindedBlockResponse > ( & response_bytes)
156167 {
@@ -187,7 +198,7 @@ async fn send_submit_block(
187198 ) => validate_unblinded_block_electra ( signed_blinded_block, block_response) ,
188199 } ?;
189200
190- Ok ( block_response)
201+ Ok ( Some ( block_response) )
191202}
192203
193204fn validate_unblinded_block_electra (
0 commit comments