Skip to content

Commit 2a74743

Browse files
hugo-dcchfast
andauthored
new(tests): EOF validation JUMPF stack overflow (#1397)
New EOF validation tests for JUMPF stack height. Co-authored-by: Paweł Bylica <pawel@ethereum.org>
1 parent fe6abd9 commit 2a74743

File tree

4 files changed

+291
-17
lines changed

4 files changed

+291
-17
lines changed

converted-ethereum-tests.txt

+7
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@ EOFTests/efStack/backwards_rjumpi_variable_stack_.json
2323
EOFTests/efStack/backwards_rjumpv_.json
2424
EOFTests/efStack/backwards_rjumpv_variable_stack_.json
2525
EOFTests/efStack/jumpf_stack_overflow_.json
26+
EOFTests/efStack/jumpf_stack_overflow_variable_stack_.json
27+
EOFTests/efStack/jumpf_to_nonreturning_.json
28+
EOFTests/efStack/jumpf_to_nonreturning_variable_stack_.json
29+
EOFTests/efStack/jumpf_to_returning_.json
30+
EOFTests/efStack/jumpf_to_returning_variable_stack_.json
31+
EOFTests/efStack/jumpf_with_inputs_stack_overflow_.json
32+
EOFTests/efStack/jumpf_with_inputs_stack_overflow_variable_stack_.json
2633
EOFTests/efStack/retf_stack_validation_.json
2734
EOFTests/efStack/retf_variable_stack_.json
2835
EOFTests/efStack/forwards_rjump_.json

tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py

+89
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from ethereum_test_tools.vm.opcode import Opcodes as Op
99

1010
from .. import EOF_FORK_NAME
11+
from ..eip4750_functions.test_code_validation import MAX_RUNTIME_OPERAND_STACK_HEIGHT
1112
from .helpers import slot_code_worked, value_code_worked
1213

1314
REFERENCE_SPEC_GIT_PATH = "EIPS/eip-6206.md"
@@ -275,3 +276,91 @@ def test_jumpf_diff_min_stack_height(
275276
),
276277
expect_exception=expected_exception,
277278
)
279+
280+
281+
def test_jumpf_self_variadic_stack_overflow(eof_test: EOFTestFiller):
282+
"""Test JUMPF calling self causing EOF validation stack overflow."""
283+
container = Container(
284+
name="jumpf_stack_overflow_variable_stack_0",
285+
sections=[
286+
Section.Code(
287+
code=Op.PUSH0 + Op.RJUMPI[2](0) + Op.PUSH0 * 511 + Op.JUMPF[0],
288+
max_stack_height=512,
289+
),
290+
],
291+
)
292+
eof_test(container=container)
293+
294+
295+
@pytest.mark.parametrize("stack_height", [512, 1022, 1023])
296+
@pytest.mark.parametrize("callee_stack_height", [0, 1, 2, 5, 511, 512, 513])
297+
def test_jumpf_variadic_stack_overflow(
298+
eof_test: EOFTestFiller, stack_height: int, callee_stack_height: int
299+
):
300+
"""Test JUMPF stack validation causing stack overflow with variable stack height."""
301+
container = Container(
302+
sections=[
303+
Section.Code(
304+
code=Op.PUSH0 + Op.RJUMPI[2](0) + Op.PUSH0 * (stack_height - 1) + Op.JUMPF[1],
305+
max_stack_height=stack_height,
306+
),
307+
Section.Code(
308+
code=Op.PUSH0 * callee_stack_height + Op.STOP,
309+
max_stack_height=callee_stack_height,
310+
),
311+
],
312+
validity_error=EOFException.STACK_OVERFLOW
313+
if stack_height + callee_stack_height > MAX_RUNTIME_OPERAND_STACK_HEIGHT
314+
else None,
315+
)
316+
eof_test(container=container)
317+
318+
319+
@pytest.mark.parametrize("stack_height", [1022, 1023])
320+
@pytest.mark.parametrize("callee_stack_increase", [0, 1, 2])
321+
def test_jumpf_with_inputs_stack_overflow(
322+
eof_test: EOFTestFiller, stack_height: int, callee_stack_increase: int
323+
):
324+
"""Test validation of JUMPF with inputs causing stack overflow."""
325+
container = Container(
326+
sections=[
327+
Section.Code(
328+
code=Op.PUSH0 * stack_height + Op.JUMPF[1],
329+
max_stack_height=stack_height,
330+
),
331+
Section.Code(
332+
code=Op.PUSH0 * callee_stack_increase + Op.STOP,
333+
code_inputs=2,
334+
max_stack_height=2 + callee_stack_increase,
335+
),
336+
],
337+
validity_error=EOFException.STACK_OVERFLOW
338+
if stack_height + callee_stack_increase > MAX_RUNTIME_OPERAND_STACK_HEIGHT
339+
else None,
340+
)
341+
eof_test(container=container)
342+
343+
344+
@pytest.mark.parametrize("stack_height", [1022, 1023])
345+
@pytest.mark.parametrize("callee_stack_increase", [0, 1, 2])
346+
def test_jumpf_with_inputs_stack_overflow_variable_stack(
347+
eof_test: EOFTestFiller, stack_height: int, callee_stack_increase: int
348+
):
349+
"""Test JUMPF with variable stack depending on RJUMPI calling function with inputs."""
350+
container = Container(
351+
sections=[
352+
Section.Code(
353+
code=Op.PUSH0 + Op.RJUMPI[2](0) + Op.PUSH0 * (stack_height - 1) + Op.JUMPF[1],
354+
max_stack_height=stack_height,
355+
),
356+
Section.Code(
357+
code=Op.PUSH0 * callee_stack_increase + Op.STOP,
358+
code_inputs=2,
359+
max_stack_height=2 + callee_stack_increase,
360+
),
361+
],
362+
validity_error=EOFException.STACK_OVERFLOW
363+
if stack_height + callee_stack_increase > MAX_RUNTIME_OPERAND_STACK_HEIGHT
364+
else None,
365+
)
366+
eof_test(container=container)

tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py

+177
Original file line numberDiff line numberDiff line change
@@ -180,3 +180,180 @@ def test_jumpf_other_stack_overflow(
180180
container=container,
181181
expect_exception=EOFException.STACK_OVERFLOW if stack_overflow else None,
182182
)
183+
184+
185+
@pytest.mark.parametrize("code_inputs", [0, 3])
186+
@pytest.mark.parametrize("stack_height", [0, 2, 3, 4])
187+
def test_jumpf_to_non_returning(eof_test: EOFTestFiller, stack_height: int, code_inputs: int):
188+
"""Test JUMPF jumping to a non-returning function."""
189+
container = Container(
190+
sections=[
191+
Section.Code(
192+
code=Op.PUSH0 * stack_height + Op.JUMPF[1], max_stack_height=stack_height
193+
),
194+
Section.Code(code=Op.STOP, code_inputs=code_inputs, max_stack_height=code_inputs),
195+
],
196+
)
197+
eof_test(
198+
container=container,
199+
expect_exception=EOFException.STACK_UNDERFLOW if stack_height < code_inputs else None,
200+
)
201+
202+
203+
@pytest.mark.parametrize("code_inputs", [0, 1, 3, 5])
204+
def test_jumpf_to_non_returning_variable_stack(eof_test: EOFTestFiller, code_inputs: int):
205+
"""Test JUMPF jumping to a non-returning function with stack depending on RJUMPI."""
206+
container = Container(
207+
sections=[
208+
Section.Code(
209+
code=Op.PUSH0 + Op.RJUMPI[2](0) + Op.PUSH0 * 2 + Op.JUMPF[1],
210+
max_stack_height=3,
211+
),
212+
Section.Code(code=Op.INVALID, code_inputs=code_inputs, max_stack_height=code_inputs),
213+
],
214+
)
215+
eof_test(
216+
container=container,
217+
expect_exception=EOFException.STACK_UNDERFLOW if code_inputs >= 3 else None,
218+
)
219+
220+
221+
@pytest.mark.parametrize("code_inputs", [0, 3])
222+
@pytest.mark.parametrize("code_outputs", [1, 2])
223+
@pytest.mark.parametrize("stack_height", [0, 1, 2, 3, 4, 5])
224+
def test_jumpf_to_returning(
225+
eof_test: EOFTestFiller, code_inputs: int, code_outputs: int, stack_height: int
226+
):
227+
"""Test JUMPF jumping to a returning function."""
228+
exceptions = []
229+
if code_inputs > stack_height or (stack_height - code_inputs + code_outputs) < 2:
230+
exceptions.append(EOFException.STACK_UNDERFLOW)
231+
if stack_height - code_inputs + code_outputs > 2:
232+
exceptions.append(EOFException.STACK_HIGHER_THAN_OUTPUTS)
233+
234+
third_cs_stack_height = code_inputs if code_inputs > code_outputs else code_outputs
235+
third_cs = None
236+
if code_outputs < code_inputs:
237+
third_cs = Op.POP * (code_inputs - code_outputs) + Op.RETF
238+
else:
239+
third_cs = Op.PUSH0 * (code_outputs - code_inputs) + Op.RETF
240+
241+
container = Container(
242+
sections=[
243+
Section.Code(code=Op.CALLF[1] + Op.STOP, max_stack_height=2),
244+
Section.Code(code=Op.PUSH0 * stack_height + Op.JUMPF[2], code_outputs=2),
245+
Section.Code(
246+
code=third_cs,
247+
code_inputs=code_inputs,
248+
code_outputs=code_outputs,
249+
max_stack_height=third_cs_stack_height,
250+
),
251+
],
252+
)
253+
254+
eof_test(
255+
container=container,
256+
expect_exception=exceptions if exceptions else None,
257+
)
258+
259+
260+
@pytest.mark.parametrize("code_inputs", [0, 1, 3, 5])
261+
@pytest.mark.parametrize("code_outputs", [1, 3])
262+
@pytest.mark.parametrize("stack_increase", [0, 1, 2, 3, 4])
263+
def test_jumpf_to_returning_variable_stack_1(
264+
eof_test: EOFTestFiller,
265+
code_inputs: int,
266+
code_outputs: int,
267+
stack_increase: int,
268+
):
269+
"""Test JUMPF with variable stack jumping to a returning function increasing the stack."""
270+
exception = None
271+
if code_inputs >= 3 or code_outputs + 1 < 3: # 3 = Section 1's max stack
272+
exception = EOFException.STACK_UNDERFLOW
273+
if 3 - code_inputs + code_outputs > 3:
274+
exception = EOFException.STACK_HIGHER_THAN_OUTPUTS
275+
276+
container = Container(
277+
sections=[
278+
Section.Code(code=Op.CALLF[1] + Op.STOP, max_stack_height=3),
279+
Section.Code(
280+
code=Op.PUSH0 + Op.RJUMPI[2](0) + Op.PUSH0 * 2 + Op.JUMPF[2],
281+
code_outputs=3,
282+
max_stack_height=3,
283+
),
284+
Section.Code(
285+
code=Op.PUSH0 * stack_increase + Op.RETF,
286+
code_inputs=code_inputs,
287+
code_outputs=code_outputs,
288+
max_stack_height=code_inputs if code_inputs > code_outputs else code_outputs,
289+
),
290+
],
291+
)
292+
293+
eof_test(
294+
container=container,
295+
expect_exception=exception,
296+
)
297+
298+
299+
@pytest.mark.parametrize("code_inputs", [1, 3, 5])
300+
@pytest.mark.parametrize("code_outputs", [1])
301+
@pytest.mark.parametrize("stack_decrease", [0, 2, 4])
302+
def test_jumpf_to_returning_variable_stack_2(
303+
eof_test: EOFTestFiller,
304+
code_inputs: int,
305+
code_outputs: int,
306+
stack_decrease: int,
307+
):
308+
"""Test JUMPF with variable stack jumping to a returning function decreasing the stack."""
309+
exceptions = []
310+
if code_inputs >= 3 or code_outputs + 1 < 3: # 3 = Section 1's max stack
311+
exceptions.append(EOFException.STACK_UNDERFLOW)
312+
if 3 - code_inputs + code_outputs > 2:
313+
exceptions.append(EOFException.STACK_HIGHER_THAN_OUTPUTS)
314+
315+
container = Container(
316+
sections=[
317+
Section.Code(code=Op.CALLF[1] + Op.STOP, max_stack_height=2),
318+
Section.Code(
319+
code=Op.PUSH0 + Op.RJUMPI[2](0) + Op.PUSH0 * 2 + Op.JUMPF[2],
320+
code_outputs=2,
321+
max_stack_height=3,
322+
),
323+
Section.Code(
324+
code=Op.POP * stack_decrease + Op.RETF,
325+
code_inputs=code_inputs,
326+
code_outputs=code_outputs,
327+
max_stack_height=code_inputs if code_inputs > code_outputs else code_outputs,
328+
),
329+
],
330+
)
331+
332+
eof_test(
333+
container=container,
334+
expect_exception=exceptions,
335+
)
336+
337+
338+
def test_jumpf_to_returning_variable_stack_3(eof_test: EOFTestFiller):
339+
"""Test JUMPF with variable stack jumping to a returning function increasing the stack."""
340+
container = Container(
341+
sections=[
342+
Section.Code(code=Op.CALLF[1] + Op.STOP, max_stack_height=2),
343+
Section.Code(
344+
code=Op.PUSH0 + Op.PUSH1[0] + Op.RJUMPI[2] + Op.PUSH0 * 2 + Op.JUMPF[2],
345+
code_outputs=2,
346+
max_stack_height=3,
347+
),
348+
Section.Code(
349+
code=Op.PUSH0 + Op.RETF,
350+
code_outputs=1,
351+
max_stack_height=1,
352+
),
353+
],
354+
)
355+
356+
eof_test(
357+
container=container,
358+
expect_exception=EOFException.STACK_HIGHER_THAN_OUTPUTS,
359+
)

tests/osaka/eip7692_eof_v1/eof_tracker.md

+18-17
Original file line numberDiff line numberDiff line change
@@ -265,14 +265,15 @@
265265

266266
#### JUMPF
267267

268-
- [ ] Extra items on stack are allowed for JUMPF to non-returning function (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_to_nonreturning_Copier.json src/EOFTestsFiller/efStack/jumpf_to_nonreturning_variable_stack_Copier.json)
269-
- [ ] JUMPF stack underflows (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_to_nonreturning_Copier.json src/EOFTestsFiller/efStack/jumpf_to_returning_Copier.json)
270-
- [ ] JUMPF stack underflow in a variable stack segment - only min underflow (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_to_nonreturning_variable_stack_Copier.json)
271-
- [ ] JUMPF stack underflow in a variable stack segment - both min and max underflow (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_to_nonreturning_variable_stack_Copier.json)
272-
- [ ] JUMPF into function with the same number of outputs (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_to_returning_Copier.json)
273-
- [ ] JUMPF into function with fewer outputs than current one (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_to_returning_Copier.json)
274-
- [ ] Extra items on stack are allowed for JUMPF to returning function (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_to_returning_Copier.json)
275-
- [ ] JUMPF to returning in a variable stack segment is not allowed (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_to_returning_variable_stack_Copier.json)
268+
- [x] Extra items on stack are allowed for JUMPF to non-returning function ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning.md) [`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning_variable_stack`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning_variable_stack.md))
269+
- [x] JUMPF stack underflows ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning.md) [`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning.md))
270+
- [x] JUMPF stack underflow in a variable stack segment - only min underflow ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning_variable_stack`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning_variable_stack.md))
271+
- [x] JUMPF stack underflow in a variable stack segment - both min and max underflow ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_non_returning_variable_stack`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_non_returning_variable_stack.md))
272+
- [x] JUMPF into function with the same number of outputs ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning.md))
273+
- [x] JUMPF into function with fewer outputs than current one ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning.md))
274+
- [x] Extra items on stack are allowed for JUMPF to returning function ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning.md))
275+
- [x] JUMPF to returning in a variable stack segment is not allowed ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning_variable_stack_1`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning_variable_stack_1.md) [`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning_variable_stack_2`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning_variable_stack_2.md) [`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_to_returning_variable_stack_3`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_to_returning_variable_stack_3.md))
276+
- (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_to_returning_variable_stack_Copier.json)
276277
- [x] Invalid JUMPF in a non-returning function ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_nonreturning_validation.py::test_retf_in_nonreturning`](./eip6206_jumpf/test_nonreturning_validation/test_retf_in_nonreturning.md))
277278
- [ ] Truncated JUMPF immediate
278279

@@ -294,15 +295,15 @@
294295

295296
- [x] Max allowed stack height reached in JUMPF-ed function ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_other_stack_overflow`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_other_stack_overflow.md))
296297
- [x] JUMPF validation time stack overflow ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_validation.py::test_jumpf_other_stack_overflow`](./eip6206_jumpf/test_jumpf_validation/test_jumpf_other_stack_overflow.md))
297-
- [ ] Max allowed stack height reached in JUMPF-ed function with inputs
298-
- [ ] JUMPF validation time stack overflow in function with inputs (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_with_inputs_stack_overflow_Copier.json)
299-
- [ ] JUMPF validation time stack overflow in function with inputs, variable stack segment, only max overflow (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_with_inputs_stack_overflow_variable_stack_Copier.json)
300-
- [ ] JUMPF validation time stack overflow in function with inputs, variable stack segment, both max and min overflow (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_with_inputs_stack_overflow_variable_stack_Copier.json)
301-
- [ ] Max allowed stack height reached in JUMPF-ed function. JUMPF in variable stack segment. (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_stack_overflow_variable_stack_Copier.json)
302-
- [ ] JUMPF validation time stack overflow in variable stack segment - only max overflow. (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_stack_overflow_variable_stack_Copier.json)
303-
- [ ] JUMPF validation time stack overflow in variable stack segment - both min and max overflow. (ethereum/tests: src/EOFTestsFiller/efStack/jumpf_stack_overflow_variable_stack_Copier.json)
304-
- [ ] Max allowed stack height reached in JUMPF-ed function with inputs. JUMPF in variable stack segment.
305-
- [ ] JUMPF validation time stack overflow in function with inputs in variable stack segment.
298+
- [x] Max allowed stack height reached in JUMPF-ed function with inputs ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow.md))
299+
- [x] JUMPF validation time stack overflow in function with inputs ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow.md))
300+
- [x] JUMPF validation time stack overflow in function with inputs, variable stack segment, only max overflow ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow_variable_stack`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow_variable_stack.md))
301+
- [x] JUMPF validation time stack overflow in function with inputs, variable stack segment, both max and min overflow ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow_variable_stack`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow_variable_stack.md))
302+
- [x] Max allowed stack height reached in JUMPF-ed function. JUMPF in variable stack segment. ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_variadic_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_variadic_stack_overflow.md))
303+
- [x] JUMPF validation time stack overflow in variable stack segment - only max overflow. ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_variadic_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_variadic_stack_overflow.md))
304+
- [x] JUMPF validation time stack overflow in variable stack segment - both min and max overflow. ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_variadic_stack_overflow`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_variadic_stack_overflow.md))
305+
- [x] Max allowed stack height reached in JUMPF-ed function with inputs. JUMPF in variable stack segment. ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow_variable_stack`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow_variable_stack.md))
306+
- [x] JUMPF validation time stack overflow in function with inputs in variable stack segment. ([`tests/osaka/eip7692_eof_v1/eip6206_jumpf/test_jumpf_stack.py::test_jumpf_with_inputs_stack_overflow_variable_stack`](./eip6206_jumpf/test_jumpf_stack/test_jumpf_with_inputs_stack_overflow_variable_stack.md))
306307

307308
#### SWAPN/DUPN/EXCHANGE
308309

0 commit comments

Comments
 (0)