Skip to content

Commit 4295414

Browse files
committed
automatically detecting max batch size of RPC
1 parent 22bd5ec commit 4295414

File tree

1 file changed

+30
-3
lines changed

1 file changed

+30
-3
lines changed

IceCreamSwapWeb3/Web3Advanced.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,18 +33,30 @@ class Web3Advanced(Web3):
3333
], reverse=True)
3434
assert FILTER_RANGES_TO_TRY[-1] == 1
3535

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+
3650
def __init__(
3751
self,
3852
node_url: str,
3953
should_retry: bool = True,
4054
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
4255
):
4356
patch_error_formatters()
4457
self.node_url = node_url
4558
self.should_retry = should_retry
4659
self.unstable_blocks = unstable_blocks
47-
self.rpc_batch_max_size = rpc_batch_max_size
4860

4961
provider = self._construct_provider(node_url=self.node_url)
5062

@@ -54,16 +66,18 @@ def __init__(
5466

5567
super().__init__(provider=provider, modules=modules)
5668

57-
self.middleware_onion.inject(BatchRetryMiddleware, layer=0, name="batch_retry") # split and retry batch requests
5869
self.middleware_onion.inject(ExtraDataToPOAMiddleware, layer=0, name="poa") # required for pos chains
5970

6071
self.latest_seen_block = self.eth.get_block_number(ignore_latest_seen_block=True)
6172

6273
self.filter_block_range = self._find_max_filter_range()
74+
self.rpc_batch_max_size = self._find_max_batch_size()
6375
self.revert_reason_available: bool = self._check_revert_reason_available()
6476
if not self.revert_reason_available:
6577
print(f"RPC {self.node_url} does not return revert reasons")
6678

79+
self.middleware_onion.inject(BatchRetryMiddleware, layer=0, name="batch_retry") # split and retry batch requests
80+
6781
@staticmethod
6882
def _construct_provider(node_url):
6983
assert "://" in node_url
@@ -96,6 +110,19 @@ def _find_max_filter_range(self):
96110
print(f"Can not use eth_getLogs with RPC {self.node_url}")
97111
return 0
98112

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+
99126
def _check_revert_reason_available(self):
100127
with files("IceCreamSwapWeb3").joinpath("./abi/RevertTester.abi").open('r') as f:
101128
revert_tester_abi = f.read()

0 commit comments

Comments
 (0)