1
+ from time import sleep
2
+
1
3
from web3 .middleware import Web3Middleware
2
4
3
5
from IceCreamSwapWeb3 import Web3Advanced
@@ -16,12 +18,33 @@ def middleware(requests_info) -> list:
16
18
17
19
try :
18
20
response = make_batch_request (requests_info )
19
- if len (response ) == len (requests_info ):
20
- return response
21
- except Exception :
21
+ except Exception as e :
22
22
if len (requests_info ) == 1 :
23
- raise
23
+ print (f"batch RPC call with single request got exception { repr (e )} , waiting 1 sec and trying again" )
24
+ sleep (1 )
25
+ return middleware (requests_info )
26
+ print (f"batch RPC call with { len (requests_info )} requests got exception { repr (e )} , splitting and retrying" )
27
+ else :
28
+ if len (response ) == len (requests_info ):
29
+ # find individual failed requests
30
+ requests_retry = []
31
+ request_indexes : list [tuple [int , int ]] = []
32
+ for i , (request_single , response_single ) in enumerate (zip (requests_info , response )):
33
+ if "error" in response_single or response_single ["result" ] is None :
34
+ request_indexes .append ((i , len (requests_retry )))
35
+ requests_retry .append (request_single )
36
+
37
+ if len (requests_retry ) != 0 :
38
+ # retry failed requests
39
+ print (f"{ len (requests_retry )} /{ len (requests_info )} requests in batch failed, retrying. Example response: { response [request_indexes [0 ][0 ]]} " )
40
+ if len (requests_retry ) == len (requests_info ):
41
+ # all failed, let's wait a moment before retrying
42
+ sleep (1 )
43
+ response_new = middleware (requests_retry )
44
+ for old_idx , new_idx in request_indexes :
45
+ response [old_idx ] = response_new [new_idx ]
24
46
47
+ return response
25
48
middle = len (requests_info ) // 2
26
49
return middleware (requests_info [:middle ]) + middleware (requests_info [middle :])
27
50
return middleware
0 commit comments