From ae68ab07ef80ba2529d188e687120383727af4b3 Mon Sep 17 00:00:00 2001 From: antazoey Date: Tue, 11 Feb 2025 11:37:33 -0600 Subject: [PATCH] fix: missing 0x on tx hash contract log --- src/ape/types/events.py | 14 +++++++++++++- tests/functional/test_contract_event.py | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/ape/types/events.py b/src/ape/types/events.py index 8eb6d106df..632b1a2ff6 100644 --- a/src/ape/types/events.py +++ b/src/ape/types/events.py @@ -6,7 +6,7 @@ from eth_abi.packed import encode_packed from eth_pydantic_types import HexBytes from eth_typing import Hash32, HexStr -from eth_utils import encode_hex, keccak, to_hex +from eth_utils import encode_hex, is_hex, keccak, to_hex from ethpm_types.abi import EventABI from pydantic import BaseModel, field_serializer, field_validator, model_validator from web3.types import FilterParams @@ -193,6 +193,18 @@ class ContractLog(ExtraAttributesMixin, BaseContractLog): Is `None` when from the pending block. """ + @field_validator("transaction_hash", mode="before") + @classmethod + def _validate_transaction_hash(cls, transaction_hash): + if ( + isinstance(transaction_hash, str) + and is_hex(transaction_hash) + and not transaction_hash.startswith("0x") + ): + return f"0x{transaction_hash}" + + return transaction_hash + @field_serializer("transaction_hash", "block_hash") def _serialize_hashes(self, value, info): return self._serialize_value(value, info) diff --git a/tests/functional/test_contract_event.py b/tests/functional/test_contract_event.py index 26877d13c3..0b5ac112bb 100644 --- a/tests/functional/test_contract_event.py +++ b/tests/functional/test_contract_event.py @@ -471,3 +471,17 @@ def test_model_dump_json(): '"MyEvent","log_index":0,' '"transaction_hash":"0x00000000000000000000000004d21f074916369e"}' ) + + +def test_transaction_hash(): + event_arguments = {"key": 123, "validators": [HexBytes(123)]} + txn_hash = "a3430927834bd23" + event = ContractLog( + block_number=123, + block_hash="block-hash", + event_arguments=event_arguments, + event_name="MyEvent", + log_index=0, + transaction_hash=txn_hash, + ) + assert event.transaction_hash == f"0x{txn_hash}"