Skip to content

test_slotnum_value()

Documentation for tests/amsterdam/eip7843_slotnum/test_slotnum.py::test_slotnum_value@c17999c0.

Generate fixtures for these test cases for Amsterdam with:

fill -v tests/amsterdam/eip7843_slotnum/test_slotnum.py::test_slotnum_value --fork Amsterdam

Test that SLOTNUM opcode returns the correct slot number.

The slot number is provided by the consensus layer and should be accessible via the SLOTNUM opcode (0x4B).

Storage key 0 starts at a nonzero canary so the zero-slot case is distinguishable from a transaction that failed before the SSTORE.

Source code in tests/amsterdam/eip7843_slotnum/test_slotnum.py
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
@EIPChecklist.Opcode.Test.GasUsage.ExtraGas()
@pytest.mark.parametrize(
    "slot_number",
    [
        pytest.param(0, id="slot_zero"),
        pytest.param(1, id="slot_one"),
        pytest.param(0x1000, id="slot_4096"),
        pytest.param(2**32, id="slot_large"),
        pytest.param(2**64 - 1, id="slot_max_u64"),
    ],
)
def test_slotnum_value(
    state_test: StateTestFiller,
    pre: Alloc,
    slot_number: int,
) -> None:
    """
    Test that SLOTNUM opcode returns the correct slot number.

    The slot number is provided by the consensus layer and should be
    accessible via the SLOTNUM opcode (0x4B).

    Storage key 0 starts at a nonzero canary so the zero-slot case is
    distinguishable from a transaction that failed before the SSTORE.
    """
    # Store SLOTNUM result at storage key 0
    code = Op.SSTORE(0, Op.SLOTNUM)
    code_address = pre.deploy_contract(code, storage={0: 0xBA5E})

    tx = Transaction(
        sender=pre.fund_eoa(),
        to=code_address,
    )

    post = {
        code_address: Account(
            storage={0: slot_number},
        ),
    }

    state_test(
        env=Environment(slot_number=slot_number),
        pre=pre,
        tx=tx,
        post=post,
    )

Parametrized Test Cases

This test generates 5 parametrized test cases across 1 fork.