@pytest.mark.ported_from(
[
"https://github.com/ethereum/tests/blob/v13.3/src/GeneralStateTestsFiller/stBadOpcode/badOpcodesFiller.json",
"https://github.com/ethereum/tests/blob/v13.3/src/GeneralStateTestsFiller/stBugs/evmBytecodeFiller.json",
],
pr=["https://github.com/ethereum/execution-spec-tests/pull/748"],
)
@pytest.mark.valid_from("Frontier")
@pytest.mark.eels_base_coverage
def test_all_opcodes(
state_test: StateTestFiller, pre: Alloc, fork: Fork
) -> None:
"""
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] = {}
valid_opcodes = set(fork.valid_opcodes())
all_opcodes = set(Opcode(i) for i in range(0xFF + 1))
for opcode in sorted(valid_opcodes | all_opcodes):
test_opcode: Opcode | Bytecode = opcode
if opcode.has_data_portion():
if opcode in [Op.SWAPN, Op.DUPN]:
test_opcode = opcode[17]
elif opcode == Op.EXCHANGE:
test_opcode = opcode[1, 2]
else:
test_opcode = opcode[0]
code_contract[opcode] = pre.deploy_contract(
balance=10,
code=prepare_stack(opcode) + test_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()),
# Limit gas to limit the gas consumed by the exceptional aborts
# in each subcall that uses an undefined opcode.
Op.CALL(35_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 if opcode != Op.REVERT else 0
for opcode in fork.valid_opcodes()
},
code_worked: 1,
}
),
}
tx = Transaction(
sender=pre.fund_eoa(),
gas_limit=9_000_000,
to=contract_address,
protected=fork.supports_protected_txs(),
)
state_test(pre=pre, post=post, tx=tx)