|
8 | 8 |
|
9 | 9 | import pycron # type: ignore[import-untyped] |
10 | 10 | from ape.api.networks import LOCAL_NETWORK_NAME |
11 | | -from ape.contracts import ContractEvent, ContractEventWrapper, ContractInstance |
| 11 | +from ape.contracts import ContractEvent, ContractEventWrapper |
12 | 12 | from ape.logging import logger |
13 | 13 | from ape.managers.chain import BlockContainer |
14 | 14 | from ape.types import AddressType, ContractLog |
@@ -436,12 +436,21 @@ def broker_task_decorator( |
436 | 436 | raise ContainerTypeMismatchError(task_type, container) |
437 | 437 |
|
438 | 438 | elif isinstance(container, ContractEventWrapper): |
439 | | - if len(container.events) != 1: |
440 | | - raise InvalidContainerConfigurationError( |
441 | | - f"Requires exactly 1 event to unwrap: {container.events}" |
442 | | - ) |
| 439 | + if len(container.events) != 1 and filter_args: |
| 440 | + for event in container.events: |
| 441 | + if all(f"indexed {argname}" in event.abi.signature for argname in filter_args): |
| 442 | + container = event |
| 443 | + break |
| 444 | + |
| 445 | + else: |
| 446 | + raise InvalidContainerConfigurationError( |
| 447 | + f"Requires exactly 1 event to unwrap: {container.events}" |
| 448 | + ) |
443 | 449 |
|
444 | | - container = container.events[0] |
| 450 | + else: # Just pick the last event, all are duplicates anyways |
| 451 | + # NOTE: More likely to pick generic `ContractContainer.at` instances |
| 452 | + # (e.g. `Token.at` from `ape_tokens`) |
| 453 | + container = container.events[-1] |
445 | 454 |
|
446 | 455 | # Register user function as task handler with our broker |
447 | 456 | def add_taskiq_task( |
@@ -625,20 +634,24 @@ def on_( |
625 | 634 |
|
626 | 635 | return self.broker_task_decorator(TaskType.NEW_BLOCK, container=container) |
627 | 636 |
|
628 | | - elif isinstance(container, ContractEvent): |
629 | | - if isinstance(container.contract, ContractInstance): |
| 637 | + elif isinstance(container, (ContractEvent, ContractEventWrapper)): |
| 638 | + if isinstance(container, ContractEvent): |
630 | 639 | key = container.contract.address |
631 | | - if new_block_timeout is not None: |
632 | | - if key in self.poll_settings: |
633 | | - self.poll_settings[key]["new_block_timeout"] = new_block_timeout |
634 | | - else: |
635 | | - self.poll_settings[key] = {"new_block_timeout": new_block_timeout} |
636 | | - |
637 | | - if start_block is not None: |
638 | | - if key in self.poll_settings: |
639 | | - self.poll_settings[key]["start_block"] = start_block |
640 | | - else: |
641 | | - self.poll_settings[key] = {"start_block": start_block} |
| 640 | + |
| 641 | + else: # isinstance(container, ContractEventWrapper): |
| 642 | + key = container.events[0].contract.address |
| 643 | + |
| 644 | + if new_block_timeout is not None: |
| 645 | + if key in self.poll_settings: |
| 646 | + self.poll_settings[key]["new_block_timeout"] = new_block_timeout |
| 647 | + else: |
| 648 | + self.poll_settings[key] = {"new_block_timeout": new_block_timeout} |
| 649 | + |
| 650 | + if start_block is not None: |
| 651 | + if key in self.poll_settings: |
| 652 | + self.poll_settings[key]["start_block"] = start_block |
| 653 | + else: |
| 654 | + self.poll_settings[key] = {"start_block": start_block} |
642 | 655 |
|
643 | 656 | if filter_args: |
644 | 657 | filter_kwargs.update(filter_args) |
|
0 commit comments