Skip to content

test_all_opcodes_stack_underflow()

Documentation for tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py::test_all_opcodes_stack_underflow@49a16fac.

Generate fixtures for these test cases for Osaka with:

fill -v tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py::test_all_opcodes_stack_underflow --fork Osaka

Test stack underflow on all opcodes that require at least one item on the stack.

Source code in tests/osaka/eip7692_eof_v1/eip3540_eof_v1/test_all_opcodes_in_container.py
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
@pytest.mark.parametrize(
    "opcode",
    sorted(op for op in valid_eof_opcodes if op.min_stack_height > 0)
    + [
        # Opcodes that have variable min_stack_height
        Op.SWAPN[0x00],
        Op.SWAPN[0xFF],
        Op.DUPN[0x00],
        Op.DUPN[0xFF],
        Op.EXCHANGE[0x00],
        Op.EXCHANGE[0xFF],
    ],
)
def test_all_opcodes_stack_underflow(
    eof_test: EOFTestFiller,
    opcode: Opcode,
):
    """Test stack underflow on all opcodes that require at least one item on the stack."""
    sections: List[Section]
    if opcode == Op.EOFCREATE:
        sections = [
            Section.Code(code=Op.PUSH0 * (opcode.min_stack_height - 1) + opcode[0] + Op.STOP),
            Section.Container(
                container=Container(
                    sections=[
                        Section.Code(code=Op.RETURNCONTRACT[0](0, 0)),
                        Section.Container(Container.Code(code=Op.STOP)),
                    ]
                )
            ),
        ]
    elif opcode == Op.RETURNCONTRACT:
        sections = [
            Section.Code(code=Op.EOFCREATE[0](0, 0, 0, 0) + Op.STOP),
            Section.Container(
                container=Container(
                    sections=[
                        Section.Code(code=Op.PUSH0 * (opcode.min_stack_height - 1) + opcode[0]),
                        Section.Container(Container.Code(code=Op.STOP)),
                    ]
                )
            ),
        ]
    else:
        bytecode = Op.PUSH0 * (opcode.min_stack_height - 1)
        if opcode.has_data_portion():
            bytecode += opcode[0]
        else:
            bytecode += opcode
        bytecode += Op.STOP
        sections = [Section.Code(code=bytecode)]
    eof_code = Container(sections=sections)

    eof_test(
        container=eof_code,
        expect_exception=EOFException.STACK_UNDERFLOW,
    )

Parametrized Test Cases

The interactive table below is also available as a standalone page.

Test ID (Abbreviated) opcode
...fork_Osaka-eof_test-opcode_ADD ADD
...fork_Osaka-eof_test-opcode_MUL MUL
...fork_Osaka-eof_test-opcode_SUB SUB
...fork_Osaka-eof_test-opcode_DIV DIV
...fork_Osaka-eof_test-opcode_SDIV SDIV
...fork_Osaka-eof_test-opcode_MOD MOD
...fork_Osaka-eof_test-opcode_SMOD SMOD
...fork_Osaka-eof_test-opcode_ADDMOD ADDMOD
...fork_Osaka-eof_test-opcode_MULMOD MULMOD
...fork_Osaka-eof_test-opcode_EXP EXP
...fork_Osaka-eof_test-opcode_SIGNEXTEND SIGNEXTEND
...fork_Osaka-eof_test-opcode_LT LT
...fork_Osaka-eof_test-opcode_GT GT
...fork_Osaka-eof_test-opcode_SLT SLT
...fork_Osaka-eof_test-opcode_SGT SGT
...fork_Osaka-eof_test-opcode_EQ EQ
...fork_Osaka-eof_test-opcode_ISZERO ISZERO
...fork_Osaka-eof_test-opcode_AND AND
...fork_Osaka-eof_test-opcode_OR OR
...fork_Osaka-eof_test-opcode_XOR XOR
...fork_Osaka-eof_test-opcode_NOT NOT
...fork_Osaka-eof_test-opcode_BYTE BYTE
...fork_Osaka-eof_test-opcode_SHL SHL
...fork_Osaka-eof_test-opcode_SHR SHR
...fork_Osaka-eof_test-opcode_SAR SAR
...fork_Osaka-eof_test-opcode_SHA3 SHA3
...fork_Osaka-eof_test-opcode_BALANCE BALANCE
...fork_Osaka-eof_test-opcode_CALLDATALOAD CALLDATALOAD
...fork_Osaka-eof_test-opcode_CALLDATACOPY CALLDATACOPY
...fork_Osaka-eof_test-opcode_RETURNDATACOPY RETURNDATACOPY
...fork_Osaka-eof_test-opcode_BLOCKHASH BLOCKHASH
...fork_Osaka-eof_test-opcode_BLOBHASH BLOBHASH
...fork_Osaka-eof_test-opcode_POP POP
...fork_Osaka-eof_test-opcode_MLOAD MLOAD
...fork_Osaka-eof_test-opcode_MSTORE MSTORE
...fork_Osaka-eof_test-opcode_MSTORE8 MSTORE8
...fork_Osaka-eof_test-opcode_SLOAD SLOAD
...fork_Osaka-eof_test-opcode_SSTORE SSTORE
...fork_Osaka-eof_test-opcode_TLOAD TLOAD
...fork_Osaka-eof_test-opcode_TSTORE TSTORE
...fork_Osaka-eof_test-opcode_MCOPY MCOPY
...fork_Osaka-eof_test-opcode_DUP1 DUP1
...fork_Osaka-eof_test-opcode_DUP2 DUP2
...fork_Osaka-eof_test-opcode_DUP3 DUP3
...fork_Osaka-eof_test-opcode_DUP4 DUP4
...fork_Osaka-eof_test-opcode_DUP5 DUP5
...fork_Osaka-eof_test-opcode_DUP6 DUP6
...fork_Osaka-eof_test-opcode_DUP7 DUP7
...fork_Osaka-eof_test-opcode_DUP8 DUP8
...fork_Osaka-eof_test-opcode_DUP9 DUP9
...fork_Osaka-eof_test-opcode_DUP10 DUP10
...fork_Osaka-eof_test-opcode_DUP11 DUP11
...fork_Osaka-eof_test-opcode_DUP12 DUP12
...fork_Osaka-eof_test-opcode_DUP13 DUP13
...fork_Osaka-eof_test-opcode_DUP14 DUP14
...fork_Osaka-eof_test-opcode_DUP15 DUP15
...fork_Osaka-eof_test-opcode_DUP16 DUP16
...fork_Osaka-eof_test-opcode_SWAP1 SWAP1
...fork_Osaka-eof_test-opcode_SWAP2 SWAP2
...fork_Osaka-eof_test-opcode_SWAP3 SWAP3
...fork_Osaka-eof_test-opcode_SWAP4 SWAP4
...fork_Osaka-eof_test-opcode_SWAP5 SWAP5
...fork_Osaka-eof_test-opcode_SWAP6 SWAP6
...fork_Osaka-eof_test-opcode_SWAP7 SWAP7
...fork_Osaka-eof_test-opcode_SWAP8 SWAP8
...fork_Osaka-eof_test-opcode_SWAP9 SWAP9
...fork_Osaka-eof_test-opcode_SWAP10 SWAP10
...fork_Osaka-eof_test-opcode_SWAP11 SWAP11
...fork_Osaka-eof_test-opcode_SWAP12 SWAP12
...fork_Osaka-eof_test-opcode_SWAP13 SWAP13
...fork_Osaka-eof_test-opcode_SWAP14 SWAP14
...fork_Osaka-eof_test-opcode_SWAP15 SWAP15
...fork_Osaka-eof_test-opcode_SWAP16 SWAP16
...fork_Osaka-eof_test-opcode_LOG0 LOG0
...fork_Osaka-eof_test-opcode_LOG1 LOG1
...fork_Osaka-eof_test-opcode_LOG2 LOG2
...fork_Osaka-eof_test-opcode_LOG3 LOG3
...fork_Osaka-eof_test-opcode_LOG4 LOG4
...fork_Osaka-eof_test-opcode_DATALOAD DATALOAD
...fork_Osaka-eof_test-opcode_DATACOPY DATACOPY
...fork_Osaka-eof_test-opcode_RJUMPI RJUMPI
...fork_Osaka-eof_test-opcode_RJUMPV RJUMPV
...fork_Osaka-eof_test-opcode_EOFCREATE EOFCREATE
...fork_Osaka-eof_test-opcode_RETURNCONTRACT RETURNCONTRACT
...fork_Osaka-eof_test-opcode_RETURN RETURN
...fork_Osaka-eof_test-opcode_RETURNDATALOAD RETURNDATALOAD
...fork_Osaka-eof_test-opcode_EXTCALL EXTCALL
...fork_Osaka-eof_test-opcode_EXTDELEGATECALL EXTDELEGATECALL
...fork_Osaka-eof_test-opcode_EXTSTATICCALL EXTSTATICCALL
...fork_Osaka-eof_test-opcode_REVERT REVERT
...fork_Osaka-eof_test-opcode_SWAPN_0x00 SWAPN_0x00
...fork_Osaka-eof_test-opcode_SWAPN_0xff SWAPN_0xff
...fork_Osaka-eof_test-opcode_DUPN_0x00 DUPN_0x00
...fork_Osaka-eof_test-opcode_DUPN_0xff DUPN_0xff
...fork_Osaka-eof_test-opcode_EXCHANGE_0x00 EXCHANGE_0x00
...fork_Osaka-eof_test-opcode_EXCHANGE_0xff EXCHANGE_0xff