@@ -75,6 +75,7 @@ pub struct Batcher {
7575 payment_service : BatcherPaymentService ,
7676 payment_service_fallback : BatcherPaymentService ,
7777 service_manager : ServiceManager ,
78+ service_manager_fallback : ServiceManager ,
7879 batch_state : Mutex < BatchState > ,
7980 max_block_interval : u64 ,
8081 min_batch_len : usize ,
@@ -126,6 +127,9 @@ impl Batcher {
126127 let eth_rpc_provider_service_manager =
127128 eth:: get_provider ( config. eth_rpc_url . clone ( ) ) . expect ( "Failed to get provider" ) ;
128129
130+ let eth_rpc_provider_service_manager_fallback =
131+ eth:: get_provider ( config. eth_rpc_url . clone ( ) ) . expect ( "Failed to get provider" ) ;
132+
129133 // FIXME(marian): We are getting just the last block number right now, but we should really
130134 // have the last submitted batch block registered and query it when the batcher is initialized.
131135 let last_uploaded_batch_block = match eth_rpc_provider. get_block_number ( ) . await {
@@ -173,12 +177,20 @@ impl Batcher {
173177
174178 let service_manager = eth:: service_manager:: get_service_manager (
175179 eth_rpc_provider_service_manager,
176- config. ecdsa ,
180+ config. ecdsa . clone ( ) ,
177181 deployment_output. addresses . service_manager . clone ( ) ,
178182 )
179183 . await
180184 . expect ( "Failed to get Service Manager contract" ) ;
181185
186+ let service_manager_fallback = eth:: service_manager:: get_service_manager (
187+ eth_rpc_provider_service_manager_fallback,
188+ config. ecdsa ,
189+ deployment_output. addresses . service_manager ,
190+ )
191+ . await
192+ . expect ( "Failed to get fallback Service Manager contract" ) ;
193+
182194 let mut user_states = HashMap :: new ( ) ;
183195 let mut batch_state = BatchState :: new ( ) ;
184196 let non_paying_config = if let Some ( non_paying_config) = config. batcher . non_paying {
@@ -214,6 +226,7 @@ impl Batcher {
214226 payment_service,
215227 payment_service_fallback,
216228 service_manager,
229+ service_manager_fallback,
217230 max_block_interval : config. batcher . block_interval ,
218231 min_batch_len : config. batcher . batch_size_interval ,
219232 max_proof_size : config. batcher . max_proof_size ,
@@ -393,7 +406,14 @@ impl Batcher {
393406
394407 // When pre-verification is enabled, batcher will verify proofs for faster feedback with clients
395408 if self . pre_verification_is_enabled {
396- let disabled_verifiers = self . disabled_verifiers ( ) . await ;
409+ let disabled_verifiers = match self . disabled_verifiers ( ) . await {
410+ Ok ( disabled_verifiers) => disabled_verifiers,
411+ Err ( e) => {
412+ error ! ( "Failed to get disabled verifiers: {e:?}" ) ;
413+ send_message ( ws_conn_sink. clone ( ) , ValidityResponseMessage :: EthRpcError ) . await ;
414+ return Ok ( ( ) ) ;
415+ }
416+ } ;
397417 let verification_data = nonced_verification_data. verification_data . clone ( ) ;
398418 if disabled_verifiers & ( U256 :: one ( ) << verification_data. proving_system as u64 )
399419 != U256 :: zero ( )
@@ -685,12 +705,16 @@ impl Batcher {
685705 } ;
686706 }
687707
688- async fn disabled_verifiers ( & self ) -> U256 {
689- self . service_manager
690- . disabled_verifiers ( )
691- . call ( )
692- . await
693- . unwrap_or_default ( )
708+ async fn disabled_verifiers ( & self ) -> Result < U256 , ContractError < SignerMiddlewareT > > {
709+ match self . service_manager . disabled_verifiers ( ) . call ( ) . await {
710+ Ok ( disabled_verifiers) => Ok ( disabled_verifiers) ,
711+ Err ( _) => {
712+ self . service_manager_fallback
713+ . disabled_verifiers ( )
714+ . call ( )
715+ . await
716+ }
717+ }
694718 }
695719
696720 async fn get_user_nonce_from_ethereum (
0 commit comments