Skip to content

test_dupn_jump_to_immediate_byte_0x5b_succeeds()

Documentation for tests/amsterdam/eip8024_dupn_swapn_exchange/test_dupn.py::test_dupn_jump_to_immediate_byte_0x5b_succeeds@c74f1a67.

Generate fixtures for these test cases for Amsterdam with:

fill -v tests/amsterdam/eip8024_dupn_swapn_exchange/test_dupn.py::test_dupn_jump_to_immediate_byte_0x5b_succeeds --fork Amsterdam

Test that jumping to 0x5b after DUPN succeeds (backward compatibility).

Bytecode: PUSH1(4) JUMP DUPN[0x5b] Hex: 6004 56 e6 5b Position 4 contains 0x5b which is an INVALID immediate for DUPN. Per EIP-8024, 0x5b is preserved as valid JUMPDEST for compatibility. The DUPN instruction is never executed due to the jump.

Source code in tests/amsterdam/eip8024_dupn_swapn_exchange/test_dupn.py
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
def test_dupn_jump_to_immediate_byte_0x5b_succeeds(
    pre: Alloc,
    state_test: StateTestFiller,
) -> None:
    """
    Test that jumping to 0x5b after DUPN succeeds (backward compatibility).

    Bytecode: PUSH1(4) JUMP DUPN[0x5b]
    Hex: 6004 56 e6 5b
    Position 4 contains 0x5b which is an INVALID immediate for DUPN.
    Per EIP-8024, 0x5b is preserved as valid JUMPDEST for compatibility.
    The DUPN instruction is never executed due to the jump.
    """
    sender = pre.fund_eoa()

    # Build code that jumps to 0x5b after DUPN opcode
    code = Bytecode()
    code += Op.PUSH1(4)  # Push jump target (position 4)
    code += Op.JUMP  # Jump to position 4
    # Pass as bytes (raw immediate byte for testing)
    code += Op.DUPN[b"\x5b"]  # Position 3-4: DUPN + 0x5b (invalid immediate)

    # This SHOULD execute because 0x5b is a valid JUMPDEST
    code += Op.SSTORE(0, 0x42)
    code += Op.STOP

    contract_address = pre.deploy_contract(code=code)

    tx = Transaction(to=contract_address, sender=sender)

    # Transaction succeeds - 0x5b is preserved as valid JUMPDEST
    post = {contract_address: Account(storage={0: 0x42})}

    state_test(pre=pre, post=post, tx=tx)

Parametrized Test Cases

This test generates 1 parametrized test case across 1 fork.