コード例 #1
0
    def get_all_pools(self):
        bfactory = BFactory(self._addresses.get(BFactory.CONTRACT_NAME))
        event_name = 'BPoolRegistered'
        event = getattr(bfactory.events, event_name)
        latest_block = self._web3.eth.blockNumber
        _from = self.bfactory_block
        chunk = 10000
        pools = []
        while _from < latest_block:
            event_filter = EventFilter(event_name,
                                       event,
                                       None,
                                       from_block=_from,
                                       to_block=_from + chunk - 1)
            try:
                logs = event_filter.get_all_entries(max_tries=10)
                logs = sorted(logs, key=lambda l: l.blockNumber)
                pools.extend([l.args.bpoolAddress for l in logs])
            except ValueError as e:
                logger.error(
                    f'get_all_pools BFactory {bfactory.address}, fromBlock {_from}, toBlock{_from+chunk-1}: {e}'
                )
            _from += chunk

        return pools
コード例 #2
0
ファイル: event_listener.py プロジェクト: dirkkadijk/ocean.py
 def make_event_filter(self):
     """Create a new event filter."""
     event_filter = EventFilter(self.event_name,
                                self.event,
                                self.filters,
                                from_block=self.from_block,
                                to_block=self.to_block)
     event_filter.set_poll_interval(0.5)
     return event_filter
コード例 #3
0
    def get_event_logs(
        self, event_name, filter_args=None, from_block=0, to_block="latest"
    ):
        event = getattr(self.events, event_name)
        filter_params = filter_args or {}
        event_filter = EventFilter(
            event_name, event, filter_params, from_block=from_block, to_block=to_block
        )

        logs = event_filter.get_all_entries(max_tries=10)
        if not logs:
            return []

        return logs
コード例 #4
0
    def get_token_minter(self, token_address):
        event = getattr(self.events, "TokenRegistered")
        # TODO: use the filter on tokenAddress when it is set as indexed in the contract event.
        filter_params = {}  # {'tokenAddress': token_address}
        event_filter = EventFilter(
            "TokenRegistered", event, filter_params, from_block=0, to_block="latest"
        )
        logs = event_filter.get_all_entries(max_tries=10)
        for log in logs:
            # assert log.args.tokenAddress == token_address
            if log.args.tokenAddress == token_address:
                return log.args.registeredBy

        return None
コード例 #5
0
 def make_event_filter(self) -> EventFilter:
     """Create a new event filter."""
     event_filter = EventFilter(
         self.event(),
         argument_filters=self.filters,
         from_block=self.from_block,
         to_block=self.to_block,
     )
     return event_filter
コード例 #6
0
    def get_transfer_event(self, block_number, sender, receiver):
        event = getattr(self.events, 'Transfer')
        filter_params = {'from': sender, 'to': receiver}
        event_filter = EventFilter('Transfer',
                                   event,
                                   filter_params,
                                   from_block=block_number - 1,
                                   to_block=block_number + 10)

        logs = event_filter.get_all_entries(max_tries=10)
        if not logs:
            return None

        if len(logs) > 1:
            raise AssertionError(
                f'Expected a single transfer event at '
                f'block {block_number}, but found {len(logs)} events.')

        return logs[0]
コード例 #7
0
    def get_transfer_event(self, block_number, sender, receiver):
        event = getattr(self.events, "Transfer")
        filter_params = {"from": sender, "to": receiver}
        event_filter = EventFilter(
            "Transfer",
            event,
            filter_params,
            from_block=block_number - 1,
            to_block=block_number + 10,
        )

        logs = event_filter.get_all_entries(max_tries=10)
        if not logs:
            return None

        if len(logs) > 1:
            raise AssertionError(
                f"Expected a single transfer event at "
                f"block {block_number}, but found {len(logs)} events.")

        return logs[0]
コード例 #8
0
    def watch_one_event(
        event_filter: EventFilter,
        callback: Callable,
        timeout_callback: Optional[Callable],
        timeout: int,
        args: list,
        start_time: Optional[int] = None,
    ) -> None:
        """
        Start to watch one event.

        :param event_filter:
        :param callback:
        :param timeout_callback:
        :param timeout:
        :param args:
        :param start_time:
        :return:
        """
        if timeout and not start_time:
            start_time = int(datetime.now().timestamp())

        if not args:
            args = []

        while True:
            try:
                events = event_filter.get_all_entries()
                if events:
                    callback(events[0], *args)
                    return

            except (ValueError, Exception) as err:
                # ignore error, but log it
                logger.debug(f"Got error grabbing keeper events: {str(err)}")

            time.sleep(0.5)
            if timeout:
                elapsed = int(datetime.now().timestamp()) - start_time
                if elapsed > timeout:
                    if timeout_callback is not None:
                        timeout_callback(*args)
                    elif callback is not None:
                        callback(None, *args)
                    break
コード例 #9
0
def test_transfer_event_filter(alice_ocean, alice_wallet, alice_address,
                               bob_address):
    token = alice_ocean.create_data_token("DataToken1",
                                          "DT1",
                                          from_wallet=alice_wallet,
                                          blob="foo_blob")

    token.mint(alice_address, to_base_18(100.0), from_wallet=alice_wallet)
    token.approve(bob_address, to_base_18(1.0), from_wallet=alice_wallet)
    token.transfer(bob_address, to_base_18(5.0), from_wallet=alice_wallet)

    block = alice_ocean.web3.eth.blockNumber
    event = getattr(token.events, "Transfer")
    event_filter = EventFilter("Transfer", event, None, block, block)

    assert event_filter.filter_id

    event_filter.uninstall()
    event_filter.recreate_filter()

    assert event_filter.get_new_entries() == []
コード例 #10
0
def test_transfer_event_filter(alice_ocean, alice_wallet, alice_address,
                               bob_address):
    token = alice_ocean.create_data_token("DataToken1",
                                          "DT1",
                                          from_wallet=alice_wallet,
                                          blob="foo_blob")

    token.mint(alice_address, to_wei(100), from_wallet=alice_wallet)
    token.approve(bob_address, to_wei(1), from_wallet=alice_wallet)
    token.transfer(bob_address, to_wei(5), from_wallet=alice_wallet)

    block = alice_ocean.web3.eth.block_number
    event_filter = EventFilter(token.events.Transfer(),
                               from_block=block,
                               to_block=block)

    assert event_filter.filter_id, "Event filter ID is None."

    event_filter.uninstall()
    event_filter.recreate_filter()

    assert (event_filter.get_new_entries() == []
            ), "There are new entries for EventFilter."