Skip to content

test_all_opcodes()

Documentation for tests/frontier/opcodes/test_all_opcodes.py::test_all_opcodes@21fb11c8.

Generate fixtures for these test cases for Prague with:

fill -v tests/frontier/opcodes/test_all_opcodes.py::test_all_opcodes --fork Prague

Test each possible opcode on the fork with a single contract that calls each opcode in succession. Check that each subcall passes if the opcode is supported and fails otherwise.

Source code in tests/frontier/opcodes/test_all_opcodes.py
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
@pytest.mark.valid_from("Frontier")
def test_all_opcodes(state_test: StateTestFiller, pre: Alloc, fork: Fork):
    """
    Test each possible opcode on the fork with a single contract that
    calls each opcode in succession. Check that each subcall passes
    if the opcode is supported and fails otherwise.
    """
    code_worked = 1000

    code_contract: Dict[Opcode, Address] = {}
    for opcode in sorted(set(Op) | set(UndefinedOpcodes)):
        code_contract[opcode] = pre.deploy_contract(
            balance=10,
            code=prepare_stack(opcode) + opcode + prepare_suffix(opcode),
            storage={},
        )

    # EVM code to make the call and store the result
    contract_address = pre.deploy_contract(
        code=sum(
            Op.SSTORE(
                Op.PUSH1(opcode.int()),
                Op.CALL(1_000_000, opcode_address, 0, 0, 0, 0, 0),
            )
            for opcode, opcode_address in code_contract.items()
        )
        + Op.SSTORE(code_worked, 1)
        + Op.STOP,
    )

    post = {
        contract_address: Account(
            storage={**{opcode.int(): 1 for opcode in fork.valid_opcodes()}, code_worked: 1}
        ),
    }

    tx = Transaction(
        sender=pre.fund_eoa(),
        gas_limit=500_000_000,
        to=contract_address,
        data=b"",
        value=0,
        protected=False,
    )

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

Parametrized Test Cases

This test case is only parametrized by fork and fixture format.

Test ID (Abbreviated)
...fork_Frontier-state_test
...fork_Frontier-blockchain_test_from_state_test
...fork_Homestead-state_test
...fork_Homestead-blockchain_test_from_state_test
...fork_Byzantium-state_test
...fork_Byzantium-blockchain_test_from_state_test
...fork_Constantinople-state_test
...fork_Constantinople-blockchain_test_from_state_test
...fork_ConstantinopleFix-state_test
...fork_ConstantinopleFix-blockchain_test_from_state_test
...fork_Istanbul-state_test
...fork_Istanbul-blockchain_test_from_state_test
...fork_Berlin-state_test
...fork_Berlin-blockchain_test_from_state_test
...fork_London-state_test
...fork_London-blockchain_test_from_state_test
...fork_Paris-state_test
...fork_Paris-blockchain_test_from_state_test
...fork_Shanghai-state_test
...fork_Shanghai-blockchain_test_from_state_test
...fork_Cancun-state_test
...fork_Cancun-blockchain_test_from_state_test
...fork_Prague-state_test
...fork_Prague-blockchain_test_from_state_test
...fork_Osaka-state_test
...fork_Osaka-blockchain_test_from_state_test