@@ -117,13 +117,17 @@ def __init__(
117117 max_retries : int = 5 ,
118118 retry_timeout : float = 60.0 ,
119119 _mock : bool = False ,
120+ archive_nodes : Optional [list [str ]] = None ,
120121 ):
121122 fallback_chains = fallback_chains or []
122123 self .fallback_chains = (
123124 iter (fallback_chains )
124125 if not retry_forever
125126 else cycle (fallback_chains + [url ])
126127 )
128+ self .archive_nodes = (
129+ iter (archive_nodes ) if not retry_forever else cycle (archive_nodes )
130+ )
127131 self .use_remote_preset = use_remote_preset
128132 self .chain_name = chain_name
129133 self ._mock = _mock
@@ -174,20 +178,32 @@ def _retry(self, method, *args, **kwargs):
174178 EOFError ,
175179 ConnectionClosed ,
176180 TimeoutError ,
181+ socket .gaierror ,
182+ StateDiscardedError ,
177183 ) as e :
184+ use_archive = isinstance (e , StateDiscardedError )
178185 try :
179- self ._reinstantiate_substrate (e )
186+ self ._reinstantiate_substrate (e , use_archive = use_archive )
180187 return method_ (* args , ** kwargs )
181188 except StopIteration :
182189 logger .error (
183190 f"Max retries exceeded with { self .url } . No more fallback chains."
184191 )
185192 raise MaxRetriesExceeded
186193
187- def _reinstantiate_substrate (self , e : Optional [Exception ] = None ) -> None :
188- next_network = next (self .fallback_chains )
194+ def _reinstantiate_substrate (
195+ self , e : Optional [Exception ] = None , use_archive : bool = False
196+ ) -> None :
197+ if use_archive :
198+ bh = getattr (e , "block_hash" , "Unknown Block Hash" )
199+ logger .info (
200+ f"Attempt made to { bh } failed for state discarded. Attempting to switch to archive node."
201+ )
202+ next_network = next (self .archive_nodes )
203+ else :
204+ next_network = next (self .fallback_chains )
189205 self .ws .close ()
190- if e . __class__ == MaxRetriesExceeded :
206+ if isinstance ( e , MaxRetriesExceeded ) :
191207 logger .error (
192208 f"Max retries exceeded with { self .url } . Retrying with { next_network } ."
193209 )
@@ -287,7 +303,7 @@ async def _reinstantiate_substrate(
287303 next_network = next (self .archive_nodes )
288304 else :
289305 next_network = next (self .fallback_chains )
290- if e . __class__ == MaxRetriesExceeded :
306+ if isinstance ( e , MaxRetriesExceeded ) :
291307 logger .error (
292308 f"Max retries exceeded with { self .url } . Retrying with { next_network } ."
293309 )
0 commit comments