From 124f11455eaf17088938f0167091d233c61582d6 Mon Sep 17 00:00:00 2001 From: Yash Mandaviya Date: Sun, 14 Jun 2026 16:43:11 -0400 Subject: [PATCH] fix: handle None ABI in process_log and process_receipt methods - fixes #1648 --- .../contracts/test_extracting_event_data.py | 27 +++++++++++++++++++ web3/contract/base_contract.py | 4 +-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/tests/core/contracts/test_extracting_event_data.py b/tests/core/contracts/test_extracting_event_data.py index 30fcea0c64..f72f29a24f 100644 --- a/tests/core/contracts/test_extracting_event_data.py +++ b/tests/core/contracts/test_extracting_event_data.py @@ -1332,3 +1332,30 @@ def test_receipt_processing_catches_insufficientdatabytes_error_by_default( with pytest.raises(InsufficientDataBytes): returned_log = event_instance.process_receipt(txn_receipt_dict, errors=STRICT) assert len(returned_log) == 0 + + +def test_process_log_with_abi_not_set(w3, emitter, wait_for_transaction): + # process_log should not crash when .abi is None + txn_hash = emitter.functions.logListArgs([b"13"], [b"54"]).transact() + txn_receipt = wait_for_transaction(w3, txn_hash) + + event_instance = emitter.events.LogListArgs + + # .abi can be None if the event is accessed without proper initialization + event_instance.abi = None + + rich_log = event_instance.process_log(txn_receipt["logs"][0]) + assert rich_log["event"] == "LogListArgs" + + +def test_process_receipt_with_abi_not_set(w3, emitter, wait_for_transaction): + # process_receipt should not crash when .abi is None + txn_hash = emitter.functions.logListArgs([b"13"], [b"54"]).transact() + txn_receipt = wait_for_transaction(w3, txn_hash) + + event_instance = emitter.events.LogListArgs + event_instance.abi = None + + processed_logs = event_instance.process_receipt(txn_receipt) + assert len(processed_logs) == 1 + assert processed_logs[0]["event"] == "LogListArgs" diff --git a/web3/contract/base_contract.py b/web3/contract/base_contract.py index 37b9980932..018210cd87 100644 --- a/web3/contract/base_contract.py +++ b/web3/contract/base_contract.py @@ -241,7 +241,7 @@ def _parse_logs( for log in txn_receipt["logs"]: try: - rich_log = get_event_data(self.w3.codec, self.abi, log) + rich_log = get_event_data(self.w3.codec, self._get_event_abi(), log) except ( MismatchedABI, LogTopicError, @@ -271,7 +271,7 @@ def _parse_logs( @combomethod def process_log(self, log: LogReceipt) -> EventData: - return get_event_data(self.w3.codec, self.abi, log) + return get_event_data(self.w3.codec, self._get_event_abi(), log) @combomethod def _get_event_filter_params(