@@ -78,7 +78,7 @@ use std::{
7878 sync:: Arc ,
7979 time:: Duration ,
8080} ;
81- use tokio:: sync:: Mutex as TokioMutex ;
81+ use tokio:: { sync:: Mutex as TokioMutex , task :: JoinHandle } ;
8282use tokio_util:: sync:: CancellationToken ;
8383use tracing:: { info, warn} ;
8484use url:: Url ;
@@ -395,7 +395,11 @@ impl L1Config {
395395 } )
396396 }
397397
398- /// Creates the RelaySubmitSinkFactory and also returns the associated relays (MevBoostRelaySlotInfoProvider).
398+ /// Creates:
399+ /// - RelaySubmitSinkFactory
400+ /// - The associated relays (MevBoostRelaySlotInfoProvider).
401+ /// - A hashmap of adjustment fee payers.
402+ /// - JoinHandle for the optimistic V3 server.
399403 #[ allow( clippy:: type_complexity) ]
400404 pub fn create_relays_sealed_sink_factory (
401405 & self ,
@@ -408,6 +412,7 @@ impl L1Config {
408412 RelaySubmitSinkFactory ,
409413 Vec < MevBoostRelaySlotInfoProvider > ,
410414 ahash:: HashMap < MevBoostRelayID , Address > ,
415+ Option < JoinHandle < ( ) > > ,
411416 ) > {
412417 let signing_domain = get_signing_domain (
413418 chain_spec. chain ,
@@ -416,7 +421,7 @@ impl L1Config {
416421 ) ?;
417422
418423 let mut optimistic_v3_config = None ;
419- if self
424+ let optimistic_v3_server_join_handle = if self
420425 . relays
421426 . iter ( )
422427 . any ( |r| r. submit_config . as_ref ( ) . is_some_and ( |c| c. optimistic_v3 ) )
@@ -433,7 +438,7 @@ impl L1Config {
433438 }
434439
435440 let optimistic_v3_cache = OptimisticV3BlockCache :: default ( ) ;
436- optimistic_v3:: spawn_server (
441+ let optimistic_v3_server_join_handle = optimistic_v3:: spawn_server (
437442 address,
438443 signing_domain,
439444 self . optimistic_v3_relay_pubkeys . clone ( ) ,
@@ -444,8 +449,11 @@ impl L1Config {
444449 optimistic_v3_config = Some ( OptimisticV3Config {
445450 builder_url : builder_url. into_bytes ( ) ,
446451 cache : optimistic_v3_cache,
447- } )
448- }
452+ } ) ;
453+ Some ( optimistic_v3_server_join_handle)
454+ } else {
455+ None
456+ } ;
449457
450458 let submission_config = self . submission_config (
451459 chain_spec,
@@ -479,7 +487,12 @@ impl L1Config {
479487 } )
480488 . collect ( ) ;
481489
482- Ok ( ( sink_factory, slot_info_providers, adjustment_fee_payers) )
490+ Ok ( (
491+ sink_factory,
492+ slot_info_providers,
493+ adjustment_fee_payers,
494+ optimistic_v3_server_join_handle,
495+ ) )
483496 }
484497
485498 pub fn registration_update_interval ( & self ) -> Duration {
@@ -516,20 +529,24 @@ impl LiveBuilderConfig for Config {
516529 let ( wallet_balance_watcher, _) =
517530 create_wallet_balance_watcher ( provider. clone ( ) , & self . base_config ) . await ?;
518531
519- let ( sink_factory, slot_info_provider, adjustment_fee_payers) =
520- create_sink_factory_and_relays (
521- & self . base_config ,
522- & self . l1_config ,
523- bidding_service. relay_sets ( ) ,
524- wallet_balance_watcher,
525- Box :: new ( NullBidObserver { } ) ,
526- Box :: new ( AlwaysSubmitPolicy { } ) ,
527- bidding_service,
528- cancellation_token. clone ( ) ,
529- )
530- . await ?;
531-
532- let live_builder = create_builder_from_sink (
532+ let (
533+ sink_factory,
534+ slot_info_provider,
535+ adjustment_fee_payers,
536+ optimistic_v3_server_join_handle,
537+ ) = create_sink_factory_and_relays (
538+ & self . base_config ,
539+ & self . l1_config ,
540+ bidding_service. relay_sets ( ) ,
541+ wallet_balance_watcher,
542+ Box :: new ( NullBidObserver { } ) ,
543+ Box :: new ( AlwaysSubmitPolicy { } ) ,
544+ bidding_service,
545+ cancellation_token. clone ( ) ,
546+ )
547+ . await ?;
548+
549+ let mut live_builder = create_builder_from_sink (
533550 & self . base_config ,
534551 & self . l1_config ,
535552 provider,
@@ -544,6 +561,9 @@ impl LiveBuilderConfig for Config {
544561 self . live_builders ( ) ?,
545562 self . base_config . max_order_execution_duration_warning ( ) ,
546563 ) ;
564+ if let Some ( optimistic_v3_server_join_handle) = optimistic_v3_server_join_handle {
565+ live_builder. add_critical_task ( optimistic_v3_server_join_handle) ;
566+ }
547567 Ok ( live_builder. with_builders ( builders) )
548568 }
549569
@@ -1082,6 +1102,11 @@ where
10821102 . await ??)
10831103}
10841104
1105+ /// Returns:
1106+ /// - UnfinishedBuiltBlocksInputFactory
1107+ /// - The associated relays (MevBoostRelaySlotInfoProvider).
1108+ /// - A hashmap of adjustment fee payers.
1109+ /// - JoinHandle for the optimistic V3 server.
10851110#[ allow( clippy:: too_many_arguments) ]
10861111pub async fn create_sink_factory_and_relays < P > (
10871112 base_config : & BaseConfig ,
@@ -1096,18 +1121,23 @@ pub async fn create_sink_factory_and_relays<P>(
10961121 UnfinishedBuiltBlocksInputFactory < P > ,
10971122 Vec < MevBoostRelaySlotInfoProvider > ,
10981123 ahash:: HashMap < MevBoostRelayID , Address > ,
1124+ Option < JoinHandle < ( ) > > ,
10991125) >
11001126where
11011127 P : StateProviderFactory + Clone + ' static ,
11021128{
1103- let ( sink_sealed_factory, slot_info_provider, adjustment_fee_payers) = l1_config
1104- . create_relays_sealed_sink_factory (
1105- base_config. chain_spec ( ) ?,
1106- relay_sets. clone ( ) ,
1107- bid_observer,
1108- submission_policy,
1109- cancellation_token. clone ( ) ,
1110- ) ?;
1129+ let (
1130+ sink_sealed_factory,
1131+ slot_info_provider,
1132+ adjustment_fee_payers,
1133+ optimistic_v3_server_join_handle,
1134+ ) = l1_config. create_relays_sealed_sink_factory (
1135+ base_config. chain_spec ( ) ?,
1136+ relay_sets. clone ( ) ,
1137+ bid_observer,
1138+ submission_policy,
1139+ cancellation_token. clone ( ) ,
1140+ ) ?;
11111141
11121142 if !l1_config. relay_bid_scrapers . is_empty ( ) {
11131143 let sender = Arc :: new ( BiddingService2BidSender :: new ( bidding_service. clone ( ) ) ) ;
@@ -1126,7 +1156,12 @@ where
11261156 relay_sets,
11271157 ) ;
11281158
1129- Ok ( ( sink_factory, slot_info_provider, adjustment_fee_payers) )
1159+ Ok ( (
1160+ sink_factory,
1161+ slot_info_provider,
1162+ adjustment_fee_payers,
1163+ optimistic_v3_server_join_handle,
1164+ ) )
11301165}
11311166
11321167/// Take the end of the pipeline (sink_factory) + pre-created slot_info_provider and creates an empty builder (it still needs the with_builders to be called)
0 commit comments