Skip to content

Commit 615cbad

Browse files
committed
Raise error if error flag is not an accepted value
1 parent 684e61d commit 615cbad

File tree

4 files changed

+53
-46
lines changed

4 files changed

+53
-46
lines changed

docs/contracts.rst

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -742,14 +742,14 @@ For example:
742742

743743
.. code-block:: python
744744
745-
>>> from web3._utils.events import EventLogErrorFlags
745+
>>> from web3._utils.events import STRICT, IGNORE, DISCARD, WARN
746746
747747
>>> tx_hash = contract.functions.myFunction(12345).transact({'to':contract_address})
748748
>>> tx_receipt = w3.eth.getTransactionReceipt(tx_hash)
749-
>>> returned_logs = contract.events.myEvent().processReceipt(tx_receipt, errors=EventLogErrorFlags.ignore)
749+
>>> returned_logs = contract.events.myEvent().processReceipt(tx_receipt, errors=IGNORE)
750750
>>> assert returned_logs[0] == tx_receipt['logs'][0]
751751
True
752-
>>> returned_logs = contract.events.myEvent().processReceipt(tx_receipt, errors=EventLogErrorFlags.discard)
752+
>>> returned_logs = contract.events.myEvent().processReceipt(tx_receipt, errors=DISCARD)
753753
>>> assert returned_logs == ()
754754
True
755755

tests/core/contracts/test_extracting_event_data.py

Lines changed: 23 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@
55
)
66

77
from web3._utils.events import (
8+
EventLogErrorFlags,
89
DISCARD,
910
IGNORE,
1011
STRICT,
12+
WARN,
1113
get_event_data,
1214
)
1315

@@ -271,46 +273,21 @@ def test_event_rich_log(
271273

272274

273275
@pytest.mark.parametrize(
274-
'errors',
276+
'error_flag',
275277
(
278+
(DISCARD),
279+
(IGNORE),
276280
(STRICT),
277-
(),
278-
)
279-
)
280-
def test_event_processing_with_strict_error_flag(
281-
web3,
282-
event_contract,
283-
indexed_event_contract,
284-
wait_for_transaction,
285-
errors):
286-
287-
txn_hash = indexed_event_contract.functions.logTwoEvents(12345).transact()
288-
wait_for_transaction(web3, txn_hash)
289-
290-
event_instance = indexed_event_contract.events.LogSingleWithIndex()
291-
292-
event_contract_fn = event_contract.functions.logTwoEvents
293-
dup_txn_hash = event_contract_fn(12345).transact()
294-
dup_txn_receipt = wait_for_transaction(web3, dup_txn_hash)
295-
296-
with pytest.raises(ValueError, match="Expected 1 log topics. Got 0"):
297-
event_instance.processReceipt(dup_txn_receipt, errors=errors)
298-
299-
300-
@pytest.mark.parametrize(
301-
'errors,rich_log_length',
302-
(
303-
(DISCARD, 0),
304-
(IGNORE, 1),
281+
(WARN),
282+
('something_else'),
305283
)
306284
)
307285
def test_event_processing_with_caught_errors(
308286
web3,
309287
event_contract,
310288
indexed_event_contract,
311289
wait_for_transaction,
312-
errors,
313-
rich_log_length):
290+
error_flag):
314291

315292
emitter_fn = indexed_event_contract.functions.logTwoEvents
316293

@@ -323,18 +300,27 @@ def test_event_processing_with_caught_errors(
323300

324301
event_instance = indexed_event_contract.events.LogSingleWithIndex()
325302

326-
returned_logs = event_instance.processReceipt(dup_txn_receipt, errors=errors)
327-
328-
assert len(returned_logs) == rich_log_length
329-
330-
if len(returned_logs) == 0:
303+
if error_flag is DISCARD:
304+
returned_logs = event_instance.processReceipt(dup_txn_receipt, errors=error_flag)
331305
assert returned_logs == ()
332-
elif len(returned_logs) == 1:
306+
elif error_flag is IGNORE:
307+
returned_logs = event_instance.processReceipt(dup_txn_receipt, errors=error_flag)
308+
assert len(returned_logs) == 1
333309
returned_log = dict(returned_logs[0])
334310

335311
assert repr(returned_log['errors']) == "ValueError('Expected 1 log topics. Got 0')"
336312
del returned_log['errors']
337313
assert returned_log == dup_txn_receipt['logs'][0]
338314
assert is_same_address(returned_log['address'], event_contract.address)
315+
elif error_flag is WARN:
316+
with pytest.warns(UserWarning, match="Expected 1 log topics. Got 0"):
317+
returned_log = event_instance.processReceipt(dup_txn_receipt, errors=error_flag)
318+
assert len(returned_log) == 0
319+
elif error_flag is STRICT:
320+
with pytest.raises(ValueError, match="Expected 1 log topics. Got 0"):
321+
event_instance.processReceipt(dup_txn_receipt, errors=error_flag)
322+
elif error_flag is 'something_else':
323+
with pytest.raises(AttributeError, match="Error flag must be one of:"):
324+
returned_log = event_instance.processReceipt(dup_txn_receipt, errors=error_flag)
339325
else:
340326
raise Exception('Unreachable!')

web3/_utils/events.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -450,11 +450,13 @@ def _encode(self, value):
450450

451451

452452
class EventLogErrorFlags(Enum):
453-
STRICT = 'strict'
454-
IGNORE = 'ignore'
455-
DISCARD = 'discard'
453+
Discard = 'discard'
454+
Ignore = 'ignore'
455+
Strict = 'strict'
456+
Warn = 'warn'
456457

457458

458-
STRICT = EventLogErrorFlags.STRICT
459-
IGNORE = EventLogErrorFlags.IGNORE
460-
DISCARD = EventLogErrorFlags.DISCARD
459+
DISCARD = EventLogErrorFlags.Discard
460+
IGNORE = EventLogErrorFlags.Ignore
461+
STRICT = EventLogErrorFlags.Strict
462+
WARN = EventLogErrorFlags.Warn

web3/contract.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"""
44
import copy
55
import itertools
6+
import warnings
67

78
from eth_abi import (
89
decode_abi,
@@ -65,6 +66,8 @@
6566
DISCARD,
6667
IGNORE,
6768
STRICT,
69+
WARN,
70+
EventLogErrorFlags,
6871
EventFilterBuilder,
6972
get_event_data,
7073
is_dynamic_sized_type,
@@ -991,8 +994,17 @@ def _get_event_abi(cls):
991994

992995
@combomethod
993996
def processReceipt(self, txn_receipt, errors=STRICT):
997+
self.check_for_valid_error_flag(errors)
994998
return self._parse_logs(txn_receipt, errors)
995999

1000+
def check_for_valid_error_flag(self, errors):
1001+
keys = [key.upper() for key in EventLogErrorFlags.__members__.keys()]
1002+
try:
1003+
errors.name
1004+
except AttributeError:
1005+
raise AttributeError(f'Error flag must be one of: {keys}')
1006+
1007+
9961008
@to_tuple
9971009
def _parse_logs(self, txn_receipt, errors):
9981010
for log in txn_receipt['logs']:
@@ -1007,6 +1019,13 @@ def _parse_logs(self, txn_receipt, errors):
10071019
new_log = MutableAttributeDict(log)
10081020
new_log["errors"] = e
10091021
rich_log = AttributeDict(new_log)
1022+
elif errors == WARN:
1023+
warnings.warn(
1024+
f"The log with transaction hash: {log.transactionHash} and \
1025+
logIndex: {log.logIndex} encountered the following \
1026+
error during processing: {e}. It has been discarded"
1027+
)
1028+
continue
10101029
else:
10111030
raise e
10121031
yield rich_log

0 commit comments

Comments
 (0)