diff --git a/src/ape/types/events.py b/src/ape/types/events.py index 1c638b4b47..ce3a0b62ae 100644 --- a/src/ape/types/events.py +++ b/src/ape/types/events.py @@ -38,7 +38,7 @@ class LogFilter(BaseModel): @classmethod def compute_selectors(cls, values): values["selectors"] = { - encode_hex(keccak(text=event.selector)): event for event in values.get("events", []) + encode_hex(keccak(text=event.selector)): event for event in values.get("events") or [] } return values @@ -48,6 +48,16 @@ def compute_selectors(cls, values): def validate_start_block(cls, value): return value or 0 + @field_validator("addresses", "events", "topic_filter", mode="before") + @classmethod + def _convert_none_to_empty_list(cls, value): + return value or [] + + @field_validator("selectors", mode="before") + @classmethod + def _convert_none_to_dict(cls, value): + return value or {} + def model_dump(self, *args, **kwargs): _Hash32 = Union[Hash32, HexBytes, HexStr] topics = cast(Sequence[Optional[Union[_Hash32, Sequence[_Hash32]]]], self.topic_filter) diff --git a/tests/functional/test_types.py b/tests/functional/test_types.py index 220cc48836..5a0a4c85f0 100644 --- a/tests/functional/test_types.py +++ b/tests/functional/test_types.py @@ -117,6 +117,16 @@ def test_topic_filter_encoding(): ] +def test_log_filter_model_validate_coerces_nones(): + log_filter = LogFilter.model_validate( + {"addresses": None, "events": None, "topic_filter": None, "selectors": None} + ) + assert log_filter.addresses == [] + assert log_filter.events == [] + assert log_filter.topic_filter == [] + assert log_filter.selectors == {} + + def test_address_type(owner): class MyModel(BaseModel): addr: AddressType