Skip to content

Commit 35a8be9

Browse files
committed
new(tests): EIP-7685: Add invalid request type tests
1 parent d6d6ddf commit 35a8be9

File tree

2 files changed

+131
-6
lines changed

2 files changed

+131
-6
lines changed

tests/prague/eip7685_general_purpose_el_requests/conftest.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
Fixtures for the EIP-7685 deposit tests.
33
"""
44

5-
from typing import List
5+
from typing import List, SupportsBytes
66

77
import pytest
88

@@ -27,6 +27,12 @@ def block_body_override_requests() -> List[
2727
return None
2828

2929

30+
@pytest.fixture
31+
def block_body_extra_requests() -> List[SupportsBytes]:
32+
"""List of requests that overwrite the requests in the header. None by default."""
33+
return []
34+
35+
3036
@pytest.fixture
3137
def exception() -> BlockException | None:
3238
"""Block exception expected by the tests. None by default."""
@@ -41,8 +47,11 @@ def blocks(
4147
| WithdrawalRequestInteractionBase
4248
| ConsolidationRequestInteractionBase
4349
],
44-
block_body_override_requests: List[DepositRequest | WithdrawalRequest | ConsolidationRequest]
50+
block_body_override_requests: List[
51+
DepositRequest | WithdrawalRequest | ConsolidationRequest | SupportsBytes
52+
]
4553
| None,
54+
block_body_extra_requests: List[SupportsBytes],
4655
exception: BlockException | None,
4756
) -> List[Block]:
4857
"""List of blocks that comprise the test."""
@@ -60,14 +69,16 @@ def blocks(
6069
included_withdrawal_requests += r.valid_requests(withdrawal_request_fee)
6170
elif isinstance(r, ConsolidationRequestInteractionBase):
6271
included_consolidation_requests += r.valid_requests(consolidation_request_fee)
63-
72+
valid_requests = (
73+
included_deposit_requests + included_withdrawal_requests + included_consolidation_requests
74+
)
75+
if block_body_override_requests is None and block_body_extra_requests is not None:
76+
block_body_override_requests = valid_requests + block_body_extra_requests
6477
return [
6578
Block(
6679
txs=sum((r.transactions() for r in requests), []),
6780
header_verify=Header(
68-
requests_hash=included_deposit_requests
69-
+ included_withdrawal_requests
70-
+ included_consolidation_requests,
81+
requests_hash=valid_requests,
7182
),
7283
requests=block_body_override_requests,
7384
exception=exception,
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
"""
2+
Test the request types that can be included in a block by the given fork.
3+
"""
4+
from typing import List
5+
6+
import pytest
7+
8+
from ethereum_test_exceptions import BlockException
9+
from ethereum_test_forks import Fork
10+
from ethereum_test_tools import Alloc, Block, BlockchainTestFiller, Environment
11+
12+
from ..eip6110_deposits.helpers import DepositInteractionBase, DepositRequest, DepositTransaction
13+
from ..eip7002_el_triggerable_withdrawals.helpers import (
14+
WithdrawalRequest,
15+
WithdrawalRequestInteractionBase,
16+
WithdrawalRequestTransaction,
17+
)
18+
from ..eip7251_consolidations.helpers import (
19+
ConsolidationRequest,
20+
ConsolidationRequestInteractionBase,
21+
ConsolidationRequestTransaction,
22+
)
23+
from .spec import ref_spec_7685
24+
25+
REFERENCE_SPEC_GIT_PATH = ref_spec_7685.git_path
26+
REFERENCE_SPEC_VERSION = ref_spec_7685.version
27+
28+
pytestmark = pytest.mark.valid_from("Prague")
29+
30+
31+
@pytest.fixture
32+
def block_body_extra_requests(fork: Fork, invalid_request_data: bytes) -> List[bytes]:
33+
"""List of requests that overwrite the requests in the header. None by default."""
34+
invalid_request_type = fork.max_request_type() + 1
35+
return [bytes([invalid_request_type]) + invalid_request_data]
36+
37+
38+
@pytest.fixture
39+
def requests(
40+
fork: Fork,
41+
include_valid_requests: bool,
42+
) -> List[
43+
DepositInteractionBase | WithdrawalRequestInteractionBase | ConsolidationRequestInteractionBase
44+
]:
45+
"""List of valid requests that are added along with the invalid request."""
46+
if not include_valid_requests:
47+
return []
48+
if fork.max_request_type() == 2:
49+
return [
50+
DepositTransaction(
51+
requests=[
52+
DepositRequest(
53+
pubkey=1,
54+
withdrawal_credentials=2,
55+
amount=1_000_000_000,
56+
signature=3,
57+
index=0,
58+
)
59+
]
60+
),
61+
WithdrawalRequestTransaction(
62+
requests=[
63+
WithdrawalRequest(
64+
validator_pubkey=1,
65+
amount=0,
66+
fee=1,
67+
)
68+
]
69+
),
70+
ConsolidationRequestTransaction(
71+
requests=[
72+
ConsolidationRequest(
73+
source_pubkey=2,
74+
target_pubkey=5,
75+
fee=1,
76+
)
77+
]
78+
),
79+
]
80+
raise NotImplementedError(f"Unsupported fork: {fork}")
81+
82+
83+
@pytest.mark.parametrize(
84+
"include_valid_requests",
85+
[False, True],
86+
)
87+
@pytest.mark.parametrize(
88+
"invalid_request_data",
89+
[
90+
pytest.param(b"", id="no_data"),
91+
pytest.param(b"\0", id="single_byte"),
92+
pytest.param(b"\0" * 32, id="32_bytes"),
93+
],
94+
)
95+
@pytest.mark.parametrize(
96+
"exception",
97+
[
98+
pytest.param(BlockException.INVALID_REQUESTS, id=""),
99+
],
100+
)
101+
def test_invalid_request_type(
102+
blockchain_test: BlockchainTestFiller,
103+
pre: Alloc,
104+
blocks: List[Block],
105+
):
106+
"""
107+
Test sending a block with an invalid request type.
108+
"""
109+
blockchain_test(
110+
genesis_environment=Environment(),
111+
pre=pre,
112+
post={},
113+
blocks=blocks,
114+
)

0 commit comments

Comments
 (0)