@@ -24,7 +24,7 @@ use reth_node_api::{Block, NodePrimitives, PayloadBuilderError};
2424use reth_optimism_consensus:: { calculate_receipt_root_no_memo_optimism, isthmus} ;
2525use reth_optimism_evm:: { OpEvmConfig , OpNextBlockEnvAttributes } ;
2626use reth_optimism_forks:: OpHardforks ;
27- use reth_optimism_node:: { OpBuiltPayload , OpPayloadBuilderAttributes } ;
27+ use reth_optimism_node:: { OpBuiltPayload , OpEngineTypes , OpPayloadBuilderAttributes } ;
2828use reth_optimism_primitives:: { OpPrimitives , OpReceipt , OpTransactionSigned } ;
2929use reth_payload_util:: BestPayloadTransactions ;
3030use reth_primitives_traits:: RecoveredBlock ;
@@ -48,6 +48,8 @@ use std::{
4848 } ,
4949 time:: Instant ,
5050} ;
51+ use std:: sync:: Mutex ;
52+ use reth_payload_builder_primitives:: Events ;
5153use tokio:: sync:: {
5254 mpsc,
5355 mpsc:: { error:: SendError , Sender } ,
@@ -119,6 +121,8 @@ pub struct OpPayloadBuilder<Pool, Client, BT> {
119121 /// The end of builder transaction type
120122 #[ allow( dead_code) ]
121123 pub builder_tx : BT ,
124+ /// Builder events handle to send BuiltPayload events
125+ payload_builder_handle : Arc < Mutex < Option < tokio:: sync:: broadcast:: Sender < Events < OpEngineTypes > > > > >
122126}
123127
124128impl < Pool , Client , BT > OpPayloadBuilder < Pool , Client , BT > {
@@ -129,6 +133,7 @@ impl<Pool, Client, BT> OpPayloadBuilder<Pool, Client, BT> {
129133 client : Client ,
130134 config : BuilderConfig < FlashblocksConfig > ,
131135 builder_tx : BT ,
136+ payload_builder_handle : Arc < Mutex < Option < tokio:: sync:: broadcast:: Sender < Events < OpEngineTypes > > > > >
132137 ) -> eyre:: Result < Self > {
133138 let metrics = Arc :: new ( OpRBuilderMetrics :: default ( ) ) ;
134139 let ws_pub = WebSocketPublisher :: new ( config. specific . ws_addr , Arc :: clone ( & metrics) ) ?. into ( ) ;
@@ -140,6 +145,7 @@ impl<Pool, Client, BT> OpPayloadBuilder<Pool, Client, BT> {
140145 config,
141146 metrics,
142147 builder_tx,
148+ payload_builder_handle,
143149 } )
144150 }
145151}
@@ -290,6 +296,8 @@ where
290296 let ( payload, fb_payload) = build_block ( & mut state, & ctx, & mut info) ?;
291297
292298 best_payload. set ( payload. clone ( ) ) ;
299+ self . send_payload_to_engine ( payload) ;
300+
293301 self . ws_pub
294302 . publish ( & fb_payload)
295303 . map_err ( PayloadBuilderError :: other) ?;
@@ -536,6 +544,7 @@ where
536544 . record ( info. executed_transactions . len ( ) as f64 ) ;
537545
538546 best_payload. set ( new_payload. clone ( ) ) ;
547+ self . send_payload_to_engine ( new_payload) ;
539548 // Update bundle_state for next iteration
540549 total_gas_per_batch += gas_per_batch;
541550 if let Some ( da_limit) = da_per_batch {
@@ -605,6 +614,27 @@ where
605614 span. record ( "flashblock_count" , ctx. flashblock_index ( ) ) ;
606615 }
607616
617+ /// Sends built payload via payload builder handle broadcast channel to the engine
618+ pub fn send_payload_to_engine ( & self , payload : OpBuiltPayload ) {
619+ // Send built payload as create one
620+ match self . payload_builder_handle . lock ( ) . as_deref ( ) {
621+ Ok ( Some ( handle) ) => {
622+ let res = handle. send ( Events :: BuiltPayload ( payload. clone ( ) . into ( ) ) ) ;
623+ if let Err ( e) = res {
624+ error ! (
625+ message = "Failed to send payload via payload builder handle" ,
626+ error = ?e,
627+ ) ;
628+ }
629+ } ,
630+ Ok ( None ) => error ! ( message = "Payload builder handle is not setup, skipping sending payload" ) ,
631+ Err ( e) => error ! (
632+ message = "Failed to get access to payload builder handle" ,
633+ error = ?e.
634+ ) ,
635+ }
636+ }
637+
608638 /// Spawn task that will send new flashblock level cancel token in steady intervals (first interval
609639 /// may vary if --flashblocks.dynamic enabled)
610640 pub fn spawn_timer_task (
0 commit comments