Skip to content

Commit 24378cf

Browse files
committed
added optional progress bar via tqdm to w3.eth.get_logs
1 parent db95ab5 commit 24378cf

File tree

1 file changed

+26
-10
lines changed

1 file changed

+26
-10
lines changed

IceCreamSwapWeb3/EthAdvanced.py

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,48 +87,64 @@ def _wrap_methods_with_retry(self):
8787
wrapped_prop = property(exponential_retry(func_name=prop_name)(prop.fget))
8888
setattr(self.__class__, prop_name, wrapped_prop)
8989

90-
def get_logs(self, filter_params: FilterParams) -> list[LogReceipt]:
91-
# note: fromBlock and toBlock are both inclusive. e.g. 5 to 6 are 2 blocks
90+
def get_logs(self, filter_params: FilterParams, show_progress_bar=False, p_bar=None) -> list[LogReceipt]:
91+
# getting the respective block numbers, could be block hashes or strings like "latest"
9292
from_block = filter_params["fromBlock"]
9393
to_block = filter_params["toBlock"]
9494
if not isinstance(from_block, int):
9595
from_block = self.get_block(from_block)["number"]
9696
if not isinstance(to_block, int):
9797
to_block = self.get_block(to_block)["number"]
9898

99+
# note: fromBlock and toBlock are both inclusive. e.g. 5 to 6 are 2 blocks
100+
num_blocks = to_block - from_block + 1
101+
102+
# check if progress bar needs initialization
103+
if show_progress_bar and p_bar is None:
104+
# local import as tqdm is an optional dependency of this package
105+
from tqdm import tqdm
106+
p_bar = tqdm(total=num_blocks)
107+
99108
# if we already know that the filter range is too large, split it
100-
if to_block - from_block + 1 > self.filter_block_range:
109+
if num_blocks > self.filter_block_range:
101110
results = []
102111
for filter_start in range(from_block, to_block + 1, self.filter_block_range):
103112
filter_end = min(filter_start + self.filter_block_range - 1, to_block)
104113
partial_filter = filter_params.copy()
105114
partial_filter["fromBlock"] = filter_start
106115
partial_filter["toBlock"] = filter_end
107-
results += self.get_logs(partial_filter)
116+
results += self.get_logs(partial_filter, show_progress_bar=show_progress_bar, p_bar=p_bar)
108117
return results
109118

110119
# get logs
111120
try:
112-
return self._get_logs(filter_params)
121+
events = self._get_logs(filter_params)
113122
except Exception:
114123
pass
124+
else:
125+
if p_bar is not None:
126+
p_bar.update(num_blocks)
127+
return events
115128

116129
# if directly getting logs did not work, split the filter range and try again
117-
if from_block != to_block:
130+
if num_blocks > 1:
118131
mid_block = (from_block + to_block) // 2
119132
left_filter = filter_params.copy()
120133
left_filter["toBlock"] = mid_block
121134
right_filter = filter_params.copy()
122135
right_filter["fromBlock"] = mid_block + 1
123136

124137
results = []
125-
results += self.get_logs(left_filter)
126-
results += self.get_logs(right_filter)
138+
results += self.get_logs(left_filter, show_progress_bar=show_progress_bar, p_bar=p_bar)
139+
results += self.get_logs(right_filter, show_progress_bar=show_progress_bar, p_bar=p_bar)
127140
return results
128141

129142
# filter is trying to get a single block, retrying till it works
130-
assert from_block == to_block
131-
return exponential_retry(func_name="get_logs")(self._get_logs)(filter_params)
143+
assert from_block == to_block and num_blocks == 1
144+
events = exponential_retry(func_name="get_logs")(self._get_logs)(filter_params)
145+
if p_bar is not None:
146+
p_bar.update(num_blocks)
147+
return events
132148

133149
def _find_max_filter_range(self):
134150
current_block = self.block_number

0 commit comments

Comments
 (0)