@@ -20,6 +20,8 @@ use l1_watcher::L1Watcher;
2020use metrics:: MetricsGatherer ;
2121use proof_coordinator:: ProofCoordinator ;
2222use reqwest:: Url ;
23+ use spawned_concurrency:: tasks:: GenServerHandle ;
24+ use std:: pin:: Pin ;
2325use tokio_util:: sync:: CancellationToken ;
2426use tracing:: { error, info} ;
2527use utils:: get_needed_proof_types;
@@ -49,7 +51,14 @@ pub async fn start_l2(
4951 _l2_url : Url ,
5052 genesis : Genesis ,
5153 checkpoints_dir : PathBuf ,
52- ) -> Result < ( ) , errors:: SequencerError > {
54+ ) -> Result <
55+ (
56+ Option < GenServerHandle < L1Committer > > ,
57+ Option < GenServerHandle < BlockProducer > > ,
58+ Pin < Box < dyn Future < Output = Result < ( ) , errors:: SequencerError > > + Send > > ,
59+ ) ,
60+ errors:: SequencerError ,
61+ > {
5362 let initial_status = if cfg. based . enabled {
5463 SequencerStatus :: default ( )
5564 } else {
@@ -76,7 +85,11 @@ pub async fn start_l2(
7685 )
7786 . await
7887 . inspect_err ( |e| error ! ( "Error starting Sequencer: {e}" ) ) else {
79- return Ok ( ( ) ) ;
88+ return Ok ( (
89+ None ,
90+ None ,
91+ Box :: pin ( async { Ok :: < ( ) , errors:: SequencerError > ( ( ) ) } ) ,
92+ ) ) ;
8093 } ;
8194
8295 if needed_proof_types. contains ( & ProverType :: TDX )
@@ -85,7 +98,11 @@ pub async fn start_l2(
8598 error ! (
8699 "A private key for TDX is required. Please set the flag `--proof-coordinator.tdx-private-key <KEY>` or use the `ETHREX_PROOF_COORDINATOR_TDX_PRIVATE_KEY` environment variable to set the private key"
87100 ) ;
88- return Ok ( ( ) ) ;
101+ return Ok ( (
102+ None ,
103+ None ,
104+ Box :: pin ( async { Ok :: < ( ) , errors:: SequencerError > ( ( ) ) } ) ,
105+ ) ) ;
89106 }
90107
91108 let l1_watcher = L1Watcher :: spawn (
@@ -120,7 +137,6 @@ pub async fn start_l2(
120137 . inspect_err ( |err| {
121138 error ! ( "Error starting Proof Coordinator: {err}" ) ;
122139 } ) ;
123-
124140 let l1_proof_sender = L1ProofSender :: spawn (
125141 cfg. clone ( ) ,
126142 shared_state. clone ( ) ,
@@ -196,15 +212,17 @@ pub async fn start_l2(
196212 . await ?;
197213 }
198214
215+ let l1_committer_handle = l1_committer. ok ( ) ;
216+ let block_producer_handle = block_producer. ok ( ) ;
199217 let admin_server = start_api (
200218 format ! (
201219 "{}:{}" ,
202220 cfg. admin_server. listen_ip, cfg. admin_server. listen_port
203221 ) ,
204- l1_committer . ok ( ) ,
222+ l1_committer_handle . clone ( ) ,
205223 l1_watcher. ok ( ) ,
206224 l1_proof_sender. ok ( ) ,
207- block_producer . ok ( ) ,
225+ block_producer_handle . clone ( ) ,
208226 #[ cfg( feature = "metrics" ) ]
209227 metrics_gatherer. ok ( ) ,
210228 )
@@ -214,26 +232,27 @@ pub async fn start_l2(
214232 } )
215233 . ok ( ) ;
216234
217- match ( verifier_handle, admin_server) {
218- ( Some ( handle) , Some ( admin_server) ) => {
219- let ( server_res, verifier_res) = tokio:: join!( admin_server. into_future( ) , handle) ;
220- if let Err ( e) = server_res {
221- error ! ( "Admin server task error: {e}" ) ;
235+ let driver = Box :: pin ( async move {
236+ match ( verifier_handle, admin_server) {
237+ ( Some ( handle) , Some ( admin_server) ) => {
238+ let ( server_res, verifier_res) = tokio:: join!( admin_server. into_future( ) , handle) ;
239+ if let Err ( e) = server_res {
240+ error ! ( "Admin server task error: {e}" ) ;
241+ }
242+ handle_verifier_result ( verifier_res) . await ;
222243 }
223- handle_verifier_result ( verifier_res) . await ;
224- }
225- ( Some ( handle) , None ) => {
226- handle_verifier_result ( tokio:: join!( handle) . 0 ) . await ;
227- }
228- ( None , Some ( admin_server) ) => {
229- if let Err ( e) = admin_server. into_future ( ) . await {
230- error ! ( "Admin server task error: {e}" ) ;
244+ ( Some ( handle) , None ) => handle_verifier_result ( tokio:: join!( handle) . 0 ) . await ,
245+ ( None , Some ( admin_server) ) => {
246+ if let Err ( e) = admin_server. into_future ( ) . await {
247+ error ! ( "Admin server task error: {e}" ) ;
248+ }
231249 }
250+ ( None , None ) => { }
232251 }
233- ( None , None ) => { }
234- }
235252
236- Ok ( ( ) )
253+ Ok ( ( ) )
254+ } ) ;
255+ Ok ( ( l1_committer_handle, block_producer_handle, driver) )
237256}
238257
239258async fn handle_verifier_result ( res : Result < Result < ( ) , SequencerError > , tokio:: task:: JoinError > ) {
0 commit comments