diff --git a/newsfragments/1514.bugfix.rst b/newsfragments/1514.bugfix.rst new file mode 100644 index 0000000000..4811aa8400 --- /dev/null +++ b/newsfragments/1514.bugfix.rst @@ -0,0 +1 @@ +Fix local_filter_middleware new entries bug diff --git a/tests/core/middleware/test_filter_middleware.py b/tests/core/middleware/test_filter_middleware.py index 3c28343a5b..0d569cdf1e 100644 --- a/tests/core/middleware/test_filter_middleware.py +++ b/tests/core/middleware/test_filter_middleware.py @@ -101,6 +101,18 @@ def test_block_ranges(start, stop, expected): (1, 19), (20, 55), ]), + (0, None, [10], [ + (0, 10), + ]), + (0, 10, [12], [ + (None, None), + ]), + (12, 10, [12], [ + (None, None), + ]), + (12, 10, [None], [ + (None, None), + ]), ]) def test_iter_latest_block_ranges( w3, diff --git a/web3/middleware/filter.py b/web3/middleware/filter.py index 985dc4b4bf..f8b0cb9123 100644 --- a/web3/middleware/filter.py +++ b/web3/middleware/filter.py @@ -121,12 +121,10 @@ def iter_latest_block( """Returns a generator that dispenses the latest block, if any new blocks have been mined since last iteration. - If there are no new blocks None is returned. + If there are no new blocks or the latest block is greater than + the ``to_block`` None is returned. - If ``to_block`` is defined, ``StopIteration`` is raised - after to_block is reached. - - >>> mined_blocks = dispense_mined_blocks(w3, 0, 10) + >>> new_blocks = iter_latest_block(w3, 0, 10) >>> next(new_blocks) # Latest block = 0 0 >>> next(new_blocks) # No new blocks @@ -134,11 +132,7 @@ def iter_latest_block( 1 >>> next(new_blocks) # Latest block = 10 10 - >>> next(new_blocks) - Traceback (most recent call last): - File "", line 1, in - StopIteration - >>> + >>> next(new_blocks) # latest block > to block """ _last = None @@ -151,7 +145,7 @@ def iter_latest_block( latest_block = w3.eth.blockNumber # type ignored b/c is_bounded_range prevents unsupported comparison if is_bounded_range and latest_block > to_block: # type: ignore - return + yield None # No new blocks since last iteration. if _last is not None and _last == latest_block: yield None @@ -256,16 +250,16 @@ def _get_filter_changes(self) -> Iterator[List[LogReceipt]]: for start, stop in iter_latest_block_ranges(self.w3, self.from_block, self.to_block): if None in (start, stop): yield [] - - yield list( - concat( - get_logs_multipart( - self.w3, - start, - stop, - self.address, - self.topics, - max_blocks=MAX_BLOCK_REQUEST))) + else: + yield list( + concat( + get_logs_multipart( + self.w3, + start, + stop, + self.address, + self.topics, + max_blocks=MAX_BLOCK_REQUEST))) def get_logs(self) -> List[LogReceipt]: return list(