Esempio n. 1
0
def test_block_speficiation_to_number():
    web3 = MockWeb3(1)
    assert block_specification_to_number("latest", web3) == BlockNumber(42)
    assert block_specification_to_number("pending", web3) == BlockNumber(42)

    with pytest.raises(AssertionError):
        block_specification_to_number("whatever", web3)

    assert block_specification_to_number(EMPTY_HASH, web3) == BlockNumber(42)
    assert block_specification_to_number(BlockNumber(56),
                                         web3) == BlockNumber(56)

    with pytest.raises(AssertionError):
        block_specification_to_number([1, 2], web3)
Esempio n. 2
0
    def _do_get_new_entries(self, from_block: BlockSpecification,
                            to_block: BlockSpecification):
        filter_params = self.filter_params.copy()
        filter_params["fromBlock"] = from_block
        filter_params["toBlock"] = to_block

        log.debug("Querying StatelessFilter",
                  from_block=from_block,
                  to_block=to_block)
        result = self.web3.eth.getLogs(filter_params)
        self._last_block = block_specification_to_number(block=to_block,
                                                         web3=self.web3)
        return result
Esempio n. 3
0
    def get_all_entries(self, block_number: BlockNumber = None):
        with self._lock:
            filter_params = self.filter_params.copy()
            block_number = block_number or self.web3.eth.blockNumber

            if self.filter_params.get("toBlock") in ("latest", "pending"):
                filter_params["toBlock"] = block_number

            result = self.web3.eth.getLogs(filter_params)
            to_block = filter_params.get("toBlock")
            if to_block:
                self._last_block = block_specification_to_number(
                    block=to_block, web3=self.web3)
            else:
                self._last_block = block_number

            return result
Esempio n. 4
0
    def get_new_entries(
            self, target_block_number: BlockNumber) -> List[Dict[str, Any]]:
        with self._lock:
            result: List[Dict[str, Any]] = []
            filter_from_number = block_specification_to_number(
                block=self.filter_params.get("fromBlock",
                                             GENESIS_BLOCK_NUMBER),
                web3=self.web3)
            from_block_number = max(filter_from_number, self._last_block + 1)

            # Batch the filter queries in ranges of FILTER_MAX_BLOCK_RANGE
            # to avoid timeout problems
            while from_block_number <= target_block_number:
                to_block = min(from_block_number + FILTER_MAX_BLOCK_RANGE,
                               target_block_number)
                result.extend(
                    self._do_get_new_entries(from_block=from_block_number,
                                             to_block=to_block))
                from_block_number += FILTER_MAX_BLOCK_RANGE

            return result
Esempio n. 5
0
 def from_block_number(self) -> BlockNumber:
     filter_from_number = block_specification_to_number(
         block=self.filter_params.get("fromBlock", GENESIS_BLOCK_NUMBER),
         web3=self.web3)
     return BlockNumber(max(filter_from_number, self._last_block + 1))