@@ -33,18 +33,30 @@ class Web3Advanced(Web3):
33
33
], reverse = True )
34
34
assert FILTER_RANGES_TO_TRY [- 1 ] == 1
35
35
36
+ BATCH_SIZES_TO_TRY = sorted ([
37
+ 1_000 ,
38
+ 500 ,
39
+ 200 ,
40
+ 100 ,
41
+ 50 ,
42
+ 20 ,
43
+ 10 ,
44
+ 5 ,
45
+ 2 ,
46
+ 1
47
+ ], reverse = True )
48
+ assert BATCH_SIZES_TO_TRY [- 1 ] == 1
49
+
36
50
def __init__ (
37
51
self ,
38
52
node_url : str ,
39
53
should_retry : bool = True ,
40
54
unstable_blocks : int = int (os .getenv ("UNSTABLE_BLOCKS" , 5 )), # not all nodes might have latest n blocks, these are seen as unstable
41
- rpc_batch_max_size : int = int (os .getenv ("RPC_BATCH_MAX_SIZE" , 1000 )), # split batch requests up if they are larger
42
55
):
43
56
patch_error_formatters ()
44
57
self .node_url = node_url
45
58
self .should_retry = should_retry
46
59
self .unstable_blocks = unstable_blocks
47
- self .rpc_batch_max_size = rpc_batch_max_size
48
60
49
61
provider = self ._construct_provider (node_url = self .node_url )
50
62
@@ -54,16 +66,18 @@ def __init__(
54
66
55
67
super ().__init__ (provider = provider , modules = modules )
56
68
57
- self .middleware_onion .inject (BatchRetryMiddleware , layer = 0 , name = "batch_retry" ) # split and retry batch requests
58
69
self .middleware_onion .inject (ExtraDataToPOAMiddleware , layer = 0 , name = "poa" ) # required for pos chains
59
70
60
71
self .latest_seen_block = self .eth .get_block_number (ignore_latest_seen_block = True )
61
72
62
73
self .filter_block_range = self ._find_max_filter_range ()
74
+ self .rpc_batch_max_size = self ._find_max_batch_size ()
63
75
self .revert_reason_available : bool = self ._check_revert_reason_available ()
64
76
if not self .revert_reason_available :
65
77
print (f"RPC { self .node_url } does not return revert reasons" )
66
78
79
+ self .middleware_onion .inject (BatchRetryMiddleware , layer = 0 , name = "batch_retry" ) # split and retry batch requests
80
+
67
81
@staticmethod
68
82
def _construct_provider (node_url ):
69
83
assert "://" in node_url
@@ -96,6 +110,19 @@ def _find_max_filter_range(self):
96
110
print (f"Can not use eth_getLogs with RPC { self .node_url } " )
97
111
return 0
98
112
113
+ def _find_max_batch_size (self ):
114
+ for batch_size in self .BATCH_SIZES_TO_TRY :
115
+ try :
116
+ with self .batch_requests () as batch :
117
+ for _ in range (batch_size ):
118
+ batch .add (self .eth ._gas_price ())
119
+ result = batch .execute ()
120
+ assert len (result ) == batch_size
121
+ return batch_size
122
+ except Exception :
123
+ pass
124
+ raise
125
+
99
126
def _check_revert_reason_available (self ):
100
127
with files ("IceCreamSwapWeb3" ).joinpath ("./abi/RevertTester.abi" ).open ('r' ) as f :
101
128
revert_tester_abi = f .read ()
0 commit comments