Skip to content

test_contract_creation_transaction()

Documentation for tests/osaka/eip7951_p256verify_precompiles/test_p256verify.py::test_contract_creation_transaction@ffe48572.

Generate fixtures for these test cases for Bogota with:

fill -v tests/osaka/eip7951_p256verify_precompiles/test_p256verify.py::test_contract_creation_transaction --fork Bogota

Test the contract creation for the P256VERIFY precompile.

Source code in tests/osaka/eip7951_p256verify_precompiles/test_p256verify.py
@pytest.mark.parametrize(
    "input_data,expected_output",
    [
        pytest.param(
            Spec.H0 + Spec.R0 + Spec.S0 + Spec.X0 + Spec.Y0,
            Spec.SUCCESS_RETURN_VALUE,
            id="valid_input",
        ),
        pytest.param(
            b"\x00" * 160,
            Spec.INVALID_RETURN_VALUE,
            id="invalid_input",
        ),
    ],
)
@pytest.mark.parametrize("precompile_address", [Spec.P256VERIFY], ids=[""])
@EIPChecklist.Precompile.Test.CallContexts.Initcode.Tx()
def test_contract_creation_transaction(
    state_test: StateTestFiller,
    pre: Alloc,
    tx: Transaction,
    input_data: bytes,
    expected_output: bytes,
    fork: Fork,
) -> None:
    """Test the contract creation for the P256VERIFY precompile."""
    sender = pre.fund_eoa()

    storage = Storage()
    contract_address = compute_create_address(address=sender, nonce=0)
    contract_bytecode = (
        Op.CODECOPY(0, Op.SUB(Op.CODESIZE, len(input_data)), len(input_data))
        + Op.CALL(
            gas=fork.gas_costs().PRECOMPILE_P256VERIFY,
            address=Spec.P256VERIFY,
            value=0,
            args_offset=0,
            args_size=len(input_data),
            ret_offset=0,
            ret_size=32,
        )
        + Op.SSTORE(storage.store_next(True), Op.DUP1())
        + Op.SSTORE(storage.store_next(expected_output), Op.MLOAD(0))
        + Op.SSTORE(
            storage.store_next(len(expected_output)), Op.RETURNDATASIZE()
        )
        + Op.STOP
    )

    tx = Transaction(
        sender=sender,
        to=None,
        data=contract_bytecode + input_data,
    )

    post = {
        contract_address: {
            "storage": storage,
        }
    }
    state_test(env=Environment(), pre=pre, post=post, tx=tx)

Parametrized Test Cases

This test generates 2 parametrized test cases across 3 forks.