Skip to content

Test Container Validation

Documentation for tests/prague/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py.

Generate fixtures for these test cases for Prague with:

Prague only:

fill -v tests/prague/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py --fork=Prague --evm-bin=/path/to/evm-tool-dev-version
For all forks up to and including Prague:
fill -v tests/prague/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py --until=Prague --evm-bin=/path/to/evm-tool-dev-version

EOF validation tests for EIP-3540 container format

test_magic_validation(eof_test, magic_0, magic_1)

Verify EOF container 2-byte magic

Source code in tests/prague/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
@pytest.mark.parametrize("magic_0", [0, 1, 0xEE, 0xEF, 0xF0, 0xFF])
@pytest.mark.parametrize("magic_1", [0, 1, 2, 0xFE, 0xFF])
def test_magic_validation(
    eof_test: EOFTestFiller,
    magic_0: int,
    magic_1: int,
):
    """
    Verify EOF container 2-byte magic
    """
    code = bytearray(bytes(VALID_CONTAINER))
    code[0] = magic_0
    code[1] = magic_1
    eof_test(
        data=bytes(code),
        expect_exception=None if magic_0 == 0xEF and magic_1 == 0 else EOFException.INVALID_MAGIC,
    )

test_version_validation(eof_test, version)

Verify EOF container version

Source code in tests/prague/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py
42
43
44
45
46
47
48
49
50
51
52
53
54
55
@pytest.mark.parametrize("version", [0, 1, 2, 0xFE, 0xFF])
def test_version_validation(
    eof_test: EOFTestFiller,
    version: int,
):
    """
    Verify EOF container version
    """
    code = bytearray(bytes(VALID_CONTAINER))
    code[2] = version
    eof_test(
        data=bytes(code),
        expect_exception=None if version == 1 else EOFException.INVALID_VERSION,
    )

test_single_code_section(eof_test, plus_data, plus_container)

Verify EOF container maximum number of code sections

Source code in tests/prague/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
@pytest.mark.parametrize("plus_data", [False, True])
@pytest.mark.parametrize("plus_container", [False, True])
def test_single_code_section(
    eof_test: EOFTestFiller,
    plus_data: bool,
    plus_container: bool,
):
    """
    Verify EOF container maximum number of code sections
    """
    sections = [Section.Code(Op.RETURNCONTRACT[0](0, 0) if plus_container else Op.STOP)]
    if plus_container:
        sections.append(
            Section.Container(
                container=Container(
                    sections=[
                        Section.Code(Op.JUMPF[i + 1] if i < (MAX_CODE_SECTIONS - 1) else Op.STOP)
                        for i in range(MAX_CODE_SECTIONS)
                    ],
                )
            )
        )
    if plus_data:
        sections.append(Section.Data(data=b"\0"))
    eof_test(
        data=Container(
            name="max_code_sections",
            sections=sections,
            kind=ContainerKind.INITCODE if plus_container else ContainerKind.RUNTIME,
        ),
    )

test_max_code_sections(eof_test, plus_data, plus_container)

Verify EOF container maximum number of code sections

Source code in tests/prague/eip7692_eof_v1/eip3540_eof_v1/test_container_validation.py
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
@pytest.mark.parametrize("plus_data", [False, True])
@pytest.mark.parametrize("plus_container", [False, True])
def test_max_code_sections(
    eof_test: EOFTestFiller,
    plus_data: bool,
    plus_container: bool,
):
    """
    Verify EOF container maximum number of code sections
    """
    if plus_container:
        sections = [
            Section.Code(
                Op.JUMPF[i + 1] if i < (MAX_CODE_SECTIONS - 1) else Op.RETURNCONTRACT[0](0, 0)
            )
            for i in range(MAX_CODE_SECTIONS)
        ]
        sections.append(
            Section.Container(
                container=Container(
                    sections=[
                        Section.Code(Op.JUMPF[i + 1] if i < (MAX_CODE_SECTIONS - 1) else Op.STOP)
                        for i in range(MAX_CODE_SECTIONS)
                    ],
                )
            )
        )
    else:
        sections = [
            Section.Code(Op.JUMPF[i + 1] if i < (MAX_CODE_SECTIONS - 1) else Op.STOP)
            for i in range(MAX_CODE_SECTIONS)
        ]
    if plus_data:
        sections.append(Section.Data(data=b"\0"))
    eof_test(
        data=Container(
            name="max_code_sections",
            sections=sections,
            kind=ContainerKind.INITCODE if plus_container else ContainerKind.RUNTIME,
        ),
    )