@@ -87,48 +87,64 @@ def _wrap_methods_with_retry(self):
87
87
wrapped_prop = property (exponential_retry (func_name = prop_name )(prop .fget ))
88
88
setattr (self .__class__ , prop_name , wrapped_prop )
89
89
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"
92
92
from_block = filter_params ["fromBlock" ]
93
93
to_block = filter_params ["toBlock" ]
94
94
if not isinstance (from_block , int ):
95
95
from_block = self .get_block (from_block )["number" ]
96
96
if not isinstance (to_block , int ):
97
97
to_block = self .get_block (to_block )["number" ]
98
98
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
+
99
108
# 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 :
101
110
results = []
102
111
for filter_start in range (from_block , to_block + 1 , self .filter_block_range ):
103
112
filter_end = min (filter_start + self .filter_block_range - 1 , to_block )
104
113
partial_filter = filter_params .copy ()
105
114
partial_filter ["fromBlock" ] = filter_start
106
115
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 )
108
117
return results
109
118
110
119
# get logs
111
120
try :
112
- return self ._get_logs (filter_params )
121
+ events = self ._get_logs (filter_params )
113
122
except Exception :
114
123
pass
124
+ else :
125
+ if p_bar is not None :
126
+ p_bar .update (num_blocks )
127
+ return events
115
128
116
129
# 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 :
118
131
mid_block = (from_block + to_block ) // 2
119
132
left_filter = filter_params .copy ()
120
133
left_filter ["toBlock" ] = mid_block
121
134
right_filter = filter_params .copy ()
122
135
right_filter ["fromBlock" ] = mid_block + 1
123
136
124
137
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 )
127
140
return results
128
141
129
142
# 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
132
148
133
149
def _find_max_filter_range (self ):
134
150
current_block = self .block_number
0 commit comments