Skip to content

Commit 42d408a

Browse files
echonet: refactor, move match func to l1_blocks class (#10585)
1 parent 651ea7b commit 42d408a

File tree

4 files changed

+55
-55
lines changed

4 files changed

+55
-55
lines changed

echonet/l1_blocks.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,33 @@
88

99

1010
class L1Blocks:
11+
@staticmethod
12+
def l1_event_matches_feeder_tx(l1_event: L1Events.L1Event, feeder_tx: dict) -> bool:
13+
"""
14+
Compares L1Event with an L1_HANDLER feeder tx using only contract_address, entry_point_selector, nonce, and calldata.
15+
Transaction hashes are ignored.
16+
"""
17+
if feeder_tx.get("type") != "L1_HANDLER":
18+
return False
19+
20+
feeder_contract = hex(int(feeder_tx["contract_address"], 16))
21+
if l1_event.contract_address != feeder_contract:
22+
return False
23+
24+
feeder_selector = int(feeder_tx["entry_point_selector"], 16)
25+
if l1_event.entry_point_selector != feeder_selector:
26+
return False
27+
28+
feeder_nonce = int(feeder_tx["nonce"], 16)
29+
if l1_event.nonce != feeder_nonce:
30+
return False
31+
32+
feeder_calldata = [int(item, 16) for item in feeder_tx["calldata"]]
33+
if l1_event.calldata != feeder_calldata:
34+
return False
35+
36+
return True
37+
1138
@staticmethod
1239
# TODO(Ayelet): Consider changing timestamp params to datetime.
1340
def find_l1_block_for_tx(
@@ -38,7 +65,7 @@ def find_l1_block_for_tx(
3865
for log in logs:
3966
l1_event = L1Events.decode_log(log)
4067

41-
if L1Events.l1_event_matches_feeder_tx(l1_event, feeder_tx):
68+
if L1Blocks.l1_event_matches_feeder_tx(l1_event, feeder_tx):
4269
logger.info(
4370
f"Found matching L1 block: {l1_event.block_number} for L1 tx: {feeder_tx['transaction_hash']}"
4471
)

echonet/l1_events.py

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -64,30 +64,3 @@ def decode_log(log: dict) -> "L1Events.L1Event":
6464
block_timestamp=int(log["blockTimestamp"], 16),
6565
block_number=int(log["blockNumber"], 16),
6666
)
67-
68-
@staticmethod
69-
def l1_event_matches_feeder_tx(l1_event: L1Event, feeder_tx: dict) -> bool:
70-
"""
71-
Compares L1Event with an L1_HANDLER feeder tx using only contract_address, entry_point_selector, nonce, and calldata.
72-
Transaction hashes are ignored.
73-
"""
74-
if feeder_tx.get("type") != "L1_HANDLER":
75-
return False
76-
77-
feeder_contract = hex(int(feeder_tx["contract_address"], 16))
78-
if l1_event.contract_address != feeder_contract:
79-
return False
80-
81-
feeder_selector = int(feeder_tx["entry_point_selector"], 16)
82-
if l1_event.entry_point_selector != feeder_selector:
83-
return False
84-
85-
feeder_nonce = int(feeder_tx["nonce"], 16)
86-
if l1_event.nonce != feeder_nonce:
87-
return False
88-
89-
feeder_calldata = [int(item, 16) for item in feeder_tx["calldata"]]
90-
if l1_event.calldata != feeder_calldata:
91-
return False
92-
93-
return True

echonet/tests/test_l1_blocks.py

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from test_utils import TestUtils
1212

1313

14-
class TestFindL1BlockForTx(unittest.TestCase):
14+
class TestL1Blocks(unittest.TestCase):
1515
def mock_log(self, block_number: int, nonce: int) -> dict:
1616
nonce_hex = f"{nonce:064x}"
1717
return {
@@ -78,6 +78,32 @@ def test_find_l1_block_for_tx_no_logs_found(self):
7878

7979
self.assertIsNone(result)
8080

81+
def test_matches_l1_handler_tx_success(self):
82+
l1_event = TestUtils.L1_EVENT
83+
84+
feeder_tx = TestUtils.FEEDER_TX
85+
86+
self.assertTrue(L1Blocks.l1_event_matches_feeder_tx(l1_event, feeder_tx))
87+
88+
def test_matches_l1_handler_tx_mismatches(self):
89+
l1_event = TestUtils.L1_EVENT
90+
91+
base_feeder_tx = TestUtils.FEEDER_TX
92+
93+
mismatch_cases = [
94+
("type", {"type": "INVOKE"}),
95+
("contract", {"contract_address": "0x1"}),
96+
("selector", {"entry_point_selector": "0x1"}),
97+
("nonce", {"nonce": "0x1"}),
98+
("calldata", {"calldata": ["0xabc"]}),
99+
]
100+
101+
for field_name, overrides in mismatch_cases:
102+
with self.subTest(field=field_name):
103+
# Builds a tx that is valid except for one mismatching field
104+
feeder_tx = {**base_feeder_tx, **overrides}
105+
self.assertFalse(L1Blocks.l1_event_matches_feeder_tx(l1_event, feeder_tx))
106+
81107

82108
if __name__ == "__main__":
83109
unittest.main()

echonet/tests/test_l1_events.py

Lines changed: 0 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -31,32 +31,6 @@ def test_decode_log_wrong_signature_raises_error(self):
3131
with self.assertRaisesRegex(ValueError, "Unhandled event signature"):
3232
L1Events.decode_log(log)
3333

34-
def test_matches_l1_handler_tx_success(self):
35-
l1_event = TestUtils.L1_EVENT
36-
37-
feeder_tx = TestUtils.FEEDER_TX
38-
39-
self.assertTrue(L1Events.l1_event_matches_feeder_tx(l1_event, feeder_tx))
40-
41-
def test_matches_l1_handler_tx_mismatches(self):
42-
l1_event = TestUtils.L1_EVENT
43-
44-
base_feeder_tx = TestUtils.FEEDER_TX
45-
46-
mismatch_cases = [
47-
("type", {"type": "INVOKE"}),
48-
("contract", {"contract_address": "0x1"}),
49-
("selector", {"entry_point_selector": "0x1"}),
50-
("nonce", {"nonce": "0x1"}),
51-
("calldata", {"calldata": ["0xabc"]}),
52-
]
53-
54-
for field_name, overrides in mismatch_cases:
55-
with self.subTest(field=field_name):
56-
# Builds a tx that is valid except for one mismatching field
57-
feeder_tx = {**base_feeder_tx, **overrides}
58-
self.assertFalse(L1Events.l1_event_matches_feeder_tx(l1_event, feeder_tx))
59-
6034

6135
if __name__ == "__main__":
6236
unittest.main()

0 commit comments

Comments
 (0)