Skip to content

Commit 9103650

Browse files
committed
added RPC batching split and retry middleware
1 parent 378b8ef commit 9103650

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
from web3.middleware import Web3Middleware
2+
3+
from IceCreamSwapWeb3 import Web3Advanced
4+
5+
6+
class BatchRetryMiddleware(Web3Middleware):
7+
_w3: Web3Advanced
8+
9+
def wrap_make_batch_request(self, make_batch_request):
10+
def middleware(requests_info) -> list:
11+
if len(requests_info) > self._w3.rpc_batch_max_size:
12+
response = []
13+
for start in range(0, len(requests_info), self._w3.rpc_batch_max_size):
14+
response += middleware(requests_info[start:start + self._w3.rpc_batch_max_size])
15+
return response
16+
17+
try:
18+
response = make_batch_request(requests_info)
19+
if len(response) == len(requests_info):
20+
return response
21+
except Exception:
22+
if len(requests_info) == 1:
23+
raise
24+
25+
middle = len(requests_info) // 2
26+
return middleware(requests_info[:middle]) + middleware(requests_info[middle:])
27+
return middleware

IceCreamSwapWeb3/Web3Advanced.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from web3.main import get_default_modules
88
from web3.middleware import ExtraDataToPOAMiddleware
99

10+
from .BatchRetryMiddleware import BatchRetryMiddleware
1011
from .EthAdvanced import EthAdvanced
1112
from .Multicall import MultiCall
1213
from .Web3ErrorHandlerPatch import patch_error_formatters
@@ -37,11 +38,13 @@ def __init__(
3738
node_url: str,
3839
should_retry: bool = True,
3940
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", 500)), # split batch requests up if they are larger
4042
):
4143
patch_error_formatters()
4244
self.node_url = node_url
4345
self.should_retry = should_retry
4446
self.unstable_blocks = unstable_blocks
47+
self.rpc_batch_max_size = rpc_batch_max_size
4548

4649
provider = self._construct_provider(node_url=self.node_url)
4750

@@ -51,6 +54,7 @@ def __init__(
5154

5255
super().__init__(provider=provider, modules=modules)
5356

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

5660
self.latest_seen_block = self.eth.get_block_number(ignore_latest_seen_block=True)

0 commit comments

Comments
 (0)