Skip to content

Commit 6995b71

Browse files
authored
fix: handle ContractEventWrapper containers better (#275)
* fix: handle ContractEventWrapper containers better * style: line too long
1 parent 57adede commit 6995b71

File tree

1 file changed

+32
-19
lines changed

1 file changed

+32
-19
lines changed

silverback/main.py

Lines changed: 32 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
import pycron # type: ignore[import-untyped]
1010
from ape.api.networks import LOCAL_NETWORK_NAME
11-
from ape.contracts import ContractEvent, ContractEventWrapper, ContractInstance
11+
from ape.contracts import ContractEvent, ContractEventWrapper
1212
from ape.logging import logger
1313
from ape.managers.chain import BlockContainer
1414
from ape.types import AddressType, ContractLog
@@ -436,12 +436,21 @@ def broker_task_decorator(
436436
raise ContainerTypeMismatchError(task_type, container)
437437

438438
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+
)
443449

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]
445454

446455
# Register user function as task handler with our broker
447456
def add_taskiq_task(
@@ -625,20 +634,24 @@ def on_(
625634

626635
return self.broker_task_decorator(TaskType.NEW_BLOCK, container=container)
627636

628-
elif isinstance(container, ContractEvent):
629-
if isinstance(container.contract, ContractInstance):
637+
elif isinstance(container, (ContractEvent, ContractEventWrapper)):
638+
if isinstance(container, ContractEvent):
630639
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}
642655

643656
if filter_args:
644657
filter_kwargs.update(filter_args)

0 commit comments

Comments
 (0)