Skip to content

Test Returncontract

Documentation for tests/prague/eip7692_eof_v1/eip7620_eof_create/test_returncontract.py.

Generate fixtures for these test cases for Prague with:

Prague only:

fill -v tests/prague/eip7692_eof_v1/eip7620_eof_create/test_returncontract.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/eip7620_eof_create/test_returncontract.py --until=Prague --evm-bin=/path/to/evm-tool-dev-version

Tests for RETURNCONTRACT instruction validation

test_returncontract_valid_index_0(eof_test)

Deploy container index 0

Source code in tests/prague/eip7692_eof_v1/eip7620_eof_create/test_returncontract.py
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def test_returncontract_valid_index_0(
    eof_test: EOFTestFiller,
):
    """Deploy container index 0"""
    eof_test(
        container_kind=ContainerKind.INITCODE,
        data=Container(
            sections=[
                Section.Code(
                    code=Op.RETURNCONTRACT[0](0, 0),
                ),
                Section.Container(container=Container(sections=[Section.Code(code=Op.INVALID)])),
            ],
        ),
    )

test_returncontract_valid_index_1(eof_test)

Deploy container index 1

Source code in tests/prague/eip7692_eof_v1/eip7620_eof_create/test_returncontract.py
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
def test_returncontract_valid_index_1(
    eof_test: EOFTestFiller,
):
    """Deploy container index 1"""
    eof_test(
        container_kind=ContainerKind.INITCODE,
        data=Container(
            sections=[
                Section.Code(
                    code=Op.RJUMPI[6](0) + Op.RETURNCONTRACT[0](0, 0) + Op.RETURNCONTRACT[1](0, 0),
                    max_stack_height=2,
                ),
                Section.Container(container=Container(sections=[Section.Code(code=Op.INVALID)])),
                Section.Container(container=Container(sections=[Section.Code(code=Op.INVALID)])),
            ],
        ),
    )

test_returncontract_valid_index_255(eof_test)

Deploy container index 255

Source code in tests/prague/eip7692_eof_v1/eip7620_eof_create/test_returncontract.py
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
def test_returncontract_valid_index_255(
    eof_test: EOFTestFiller,
):
    """Deploy container index 255"""
    eof_test(
        container_kind=ContainerKind.INITCODE,
        data=Container(
            sections=[
                Section.Code(
                    sum((Op.RJUMPI[6](0) + Op.RETURNCONTRACT[i](0, 0)) for i in range(256))
                    + Op.REVERT(0, 0),
                    max_stack_height=2,
                )
            ]
            + [Section.Container(container=Container(sections=[Section.Code(code=Op.INVALID)]))]
            * 256
        ),
    )

test_returncontract_invalid_truncated_immediate(eof_test)

Truncated immediate

Source code in tests/prague/eip7692_eof_v1/eip7620_eof_create/test_returncontract.py
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
def test_returncontract_invalid_truncated_immediate(
    eof_test: EOFTestFiller,
):
    """Truncated immediate"""
    eof_test(
        container_kind=ContainerKind.INITCODE,
        data=Container(
            sections=[
                Section.Code(
                    code=Op.PUSH0 + Op.PUSH0 + Op.RETURNCONTRACT,
                ),
            ],
        ),
        expect_exception=EOFException.TRUNCATED_INSTRUCTION,
    )

test_returncontract_invalid_index_0(eof_test)

Referring to non-existent container section index 0

Source code in tests/prague/eip7692_eof_v1/eip7620_eof_create/test_returncontract.py
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
def test_returncontract_invalid_index_0(
    eof_test: EOFTestFiller,
):
    """Referring to non-existent container section index 0"""
    eof_test(
        container_kind=ContainerKind.INITCODE,
        data=Container(
            sections=[
                Section.Code(
                    code=Op.RETURNCONTRACT[0](0, 0),
                ),
            ],
        ),
        expect_exception=EOFException.INVALID_CONTAINER_SECTION_INDEX,
    )

test_returncontract_invalid_index_1(eof_test)

Referring to non-existent container section index 1

Source code in tests/prague/eip7692_eof_v1/eip7620_eof_create/test_returncontract.py
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
def test_returncontract_invalid_index_1(
    eof_test: EOFTestFiller,
):
    """Referring to non-existent container section index 1"""
    eof_test(
        container_kind=ContainerKind.INITCODE,
        data=Container(
            sections=[
                Section.Code(
                    code=Op.RETURNCONTRACT[1](0, 0),
                ),
                Section.Container(container=Container(sections=[Section.Code(code=Op.INVALID)])),
            ],
        ),
        expect_exception=EOFException.INVALID_CONTAINER_SECTION_INDEX,
    )

test_returncontract_invalid_index_255(eof_test)

Referring to non-existent container section index 255

Source code in tests/prague/eip7692_eof_v1/eip7620_eof_create/test_returncontract.py
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
def test_returncontract_invalid_index_255(
    eof_test: EOFTestFiller,
):
    """Referring to non-existent container section index 255"""
    eof_test(
        container_kind=ContainerKind.INITCODE,
        data=Container(
            sections=[
                Section.Code(
                    code=Op.RETURNCONTRACT[255](0, 0),
                ),
                Section.Container(container=Container(sections=[Section.Code(code=Op.INVALID)])),
            ],
        ),
        expect_exception=EOFException.INVALID_CONTAINER_SECTION_INDEX,
    )

test_returncontract_terminating(eof_test)

Unreachable code after RETURNCONTRACT

Source code in tests/prague/eip7692_eof_v1/eip7620_eof_create/test_returncontract.py
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
def test_returncontract_terminating(
    eof_test: EOFTestFiller,
):
    """Unreachable code after RETURNCONTRACT"""
    eof_test(
        container_kind=ContainerKind.INITCODE,
        data=Container(
            sections=[
                Section.Code(
                    code=Op.RETURNCONTRACT[0](0, 0) + Op.REVERT(0, 0),
                ),
                Section.Container(container=Container(sections=[Section.Code(code=Op.INVALID)])),
            ],
        ),
        expect_exception=EOFException.UNREACHABLE_INSTRUCTIONS,
    )