3
3
from web3 .middleware import Web3Middleware
4
4
5
5
from IceCreamSwapWeb3 import Web3Advanced
6
+ from IceCreamSwapWeb3 .EthAdvanced import exponential_retry
6
7
7
8
8
9
class BatchRetryMiddleware (Web3Middleware ):
9
10
_w3 : Web3Advanced
10
11
11
12
def wrap_make_batch_request (self , make_batch_request ):
12
13
def middleware (requests_info ) -> list :
13
- if self ._w3 .rpc_batch_max_size == 0 :
14
- # RPC does not support batch requests at all, splitting batch into single, non batch, requests
15
- return [make_batch_request .__self__ .make_request (method , params ) for method , params in requests_info ]
14
+ if len (requests_info ) == 0 :
15
+ # early return if batch to request is empty
16
+ return []
17
+
18
+ if self ._w3 .rpc_batch_max_size == 0 or len (requests_info ) == 1 :
19
+ # if RPC does not support batch requests or single request in batch, make individual requests
20
+ return [
21
+ exponential_retry (method )(make_batch_request .__self__ .make_request )(
22
+ method ,
23
+ params ,
24
+ no_retry = not self ._w3 .should_retry
25
+ )
26
+ for method , params in requests_info
27
+ ]
16
28
17
29
if len (requests_info ) > self ._w3 .rpc_batch_max_size :
18
30
response = []
@@ -23,10 +35,7 @@ def middleware(requests_info) -> list:
23
35
try :
24
36
response = make_batch_request (requests_info )
25
37
except Exception as e :
26
- if len (requests_info ) == 1 :
27
- print (f"batch RPC call with single request got exception { repr (e )} , waiting 1 sec and trying again" )
28
- sleep (1 )
29
- return middleware (requests_info )
38
+ assert len (requests_info ) > 1
30
39
print (f"batch RPC call with { len (requests_info )} requests got exception { repr (e )} , splitting and retrying" )
31
40
else :
32
41
if len (response ) == len (requests_info ):
@@ -49,6 +58,8 @@ def middleware(requests_info) -> list:
49
58
response [old_idx ] = response_new [new_idx ]
50
59
51
60
return response
61
+ else :
62
+ print (f"made batch request with size { len (requests_info )} but only received { len (response )} results. splitting and retrying.{ f' Sample response: { response [0 ]} ' if len (response ) != 0 else '' } " )
52
63
middle = len (requests_info ) // 2
53
64
return middleware (requests_info [:middle ]) + middleware (requests_info [middle :])
54
65
return middleware
0 commit comments