@@ -26,6 +26,36 @@ pub enum Error {
2626 BlockNotFound ( BlockId ) ,
2727}
2828
29+ /// Errors that can occur when using [`RobustProvider`].
30+ #[ derive( Error , Debug , Clone ) ]
31+ pub ( crate ) enum CommonError {
32+ #[ error( "Operation timed out" ) ]
33+ Timeout ,
34+ #[ error( "RPC call failed after exhausting all retry attempts: {0}" ) ]
35+ RpcError ( Arc < RpcError < TransportErrorKind > > ) ,
36+ }
37+
38+ impl From < RpcError < TransportErrorKind > > for CommonError {
39+ fn from ( err : RpcError < TransportErrorKind > ) -> Self {
40+ CommonError :: RpcError ( Arc :: new ( err) )
41+ }
42+ }
43+
44+ impl From < CommonError > for Error {
45+ fn from ( err : CommonError ) -> Self {
46+ match err {
47+ CommonError :: Timeout => Error :: Timeout ,
48+ CommonError :: RpcError ( e) => Error :: RpcError ( e) ,
49+ }
50+ }
51+ }
52+
53+ impl From < TokioError :: Elapsed > for CommonError {
54+ fn from ( _: TokioError :: Elapsed ) -> Self {
55+ CommonError :: Timeout
56+ }
57+ }
58+
2959impl From < RpcError < TransportErrorKind > > for Error {
3060 fn from ( err : RpcError < TransportErrorKind > ) -> Self {
3161 Error :: RpcError ( Arc :: new ( err) )
@@ -134,7 +164,8 @@ impl<N: Network> RobustProvider<N> {
134164 move |provider| async move { provider. get_block_number ( ) . await } ,
135165 false ,
136166 )
137- . await ;
167+ . await
168+ . map_err ( Error :: from) ;
138169 if let Err ( e) = & result {
139170 error ! ( error = %e, "eth_getBlockNumber failed" ) ;
140171 }
@@ -222,7 +253,8 @@ impl<N: Network> RobustProvider<N> {
222253 move |provider| async move { provider. get_logs ( filter) . await } ,
223254 false ,
224255 )
225- . await ;
256+ . await
257+ . map_err ( Error :: from) ;
226258 if let Err ( e) = & result {
227259 error ! ( error = %e, "eth_getLogs failed" ) ;
228260 }
@@ -256,7 +288,7 @@ impl<N: Network> RobustProvider<N> {
256288 Ok ( sub) => Ok ( RobustSubscription :: new ( sub, self . clone ( ) ) ) ,
257289 Err ( e) => {
258290 error ! ( error = %e, "eth_subscribe failed" ) ;
259- Err ( e)
291+ Err ( e. into ( ) )
260292 }
261293 }
262294 }
@@ -285,7 +317,7 @@ impl<N: Network> RobustProvider<N> {
285317 & self ,
286318 operation : F ,
287319 require_pubsub : bool ,
288- ) -> Result < T , Error >
320+ ) -> Result < T , CommonError >
289321 where
290322 F : Fn ( RootProvider < N > ) -> Fut ,
291323 Fut : Future < Output = Result < T , RpcError < TransportErrorKind > > > ,
@@ -306,8 +338,8 @@ impl<N: Network> RobustProvider<N> {
306338 & self ,
307339 operation : F ,
308340 require_pubsub : bool ,
309- last_error : Error ,
310- ) -> Result < T , Error >
341+ last_error : CommonError ,
342+ ) -> Result < T , CommonError >
311343 where
312344 F : Fn ( RootProvider < N > ) -> Fut ,
313345 Fut : Future < Output = Result < T , RpcError < TransportErrorKind > > > ,
@@ -321,9 +353,9 @@ impl<N: Network> RobustProvider<N> {
321353 & self ,
322354 operation : F ,
323355 require_pubsub : bool ,
324- mut last_error : Error ,
356+ mut last_error : CommonError ,
325357 start_index : usize ,
326- ) -> Result < ( T , usize ) , Error >
358+ ) -> Result < ( T , usize ) , CommonError >
327359 where
328360 F : Fn ( RootProvider < N > ) -> Fut ,
329361 Fut : Future < Output = Result < T , RpcError < TransportErrorKind > > > ,
@@ -362,7 +394,7 @@ impl<N: Network> RobustProvider<N> {
362394 & self ,
363395 provider : & RootProvider < N > ,
364396 operation : F ,
365- ) -> Result < T , Error >
397+ ) -> Result < T , CommonError >
366398 where
367399 F : Fn ( RootProvider < N > ) -> Fut ,
368400 Fut : Future < Output = Result < T , RpcError < TransportErrorKind > > > ,
@@ -381,8 +413,8 @@ impl<N: Network> RobustProvider<N> {
381413 . sleep ( tokio:: time:: sleep) ,
382414 )
383415 . await
384- . map_err ( Error :: from) ?
385- . map_err ( Error :: from)
416+ . map_err ( CommonError :: from) ?
417+ . map_err ( CommonError :: from)
386418 }
387419
388420 /// Check if a provider supports pubsub
@@ -484,7 +516,7 @@ mod tests {
484516
485517 let call_count = AtomicUsize :: new ( 0 ) ;
486518
487- let result: Result < ( ) , Error > = provider
519+ let result: Result < ( ) , CommonError > = provider
488520 . try_operation_with_failover (
489521 |_| async {
490522 call_count. fetch_add ( 1 , Ordering :: SeqCst ) ;
@@ -494,7 +526,7 @@ mod tests {
494526 )
495527 . await ;
496528
497- assert ! ( matches!( result, Err ( Error :: RpcError ( _) ) ) ) ;
529+ assert ! ( matches!( result, Err ( CommonError :: RpcError ( _) ) ) ) ;
498530 assert_eq ! ( call_count. load( Ordering :: SeqCst ) , 3 ) ;
499531 }
500532
@@ -513,7 +545,7 @@ mod tests {
513545 )
514546 . await ;
515547
516- assert ! ( matches!( result, Err ( Error :: Timeout ) ) ) ;
548+ assert ! ( matches!( result, Err ( CommonError :: Timeout ) ) ) ;
517549 }
518550
519551 #[ tokio:: test]
0 commit comments