Skip to content

test_create_tx_collision_refunds_reservoir()

Documentation for tests/amsterdam/eip8037_state_creation_gas_cost_increase/test_state_gas_create.py::test_create_tx_collision_refunds_reservoir@5c024cbb.

Generate fixtures for these test cases for Amsterdam with:

fill -v tests/amsterdam/eip8037_state_creation_gas_cost_increase/test_state_gas_create.py::test_create_tx_collision_refunds_reservoir --fork Amsterdam

Verify the state-gas reservoir is refunded on a depth-0 CREATE-tx address collision when gas_limit > TX_MAX_GAS_LIMIT.

EIP-8037 splits gas_limit into the capped regular budget and a state-gas reservoir. On collision the inner regular gas is burnt and intrinsic_state_gas is refunded; the reservoir must also be refunded to the sender. header.gas_used is fixed at the regular cap regardless of reservoir handling, so the sender's post-balance is the primary discriminating assertion.

Source code in tests/amsterdam/eip8037_state_creation_gas_cost_increase/test_state_gas_create.py
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
@pytest.mark.pre_alloc_mutable()
@pytest.mark.execute(pytest.mark.skip(reason="Requires specific gas price"))
@pytest.mark.valid_from("EIP8037")
def test_create_tx_collision_refunds_reservoir(
    blockchain_test: BlockchainTestFiller,
    pre: Alloc,
    fork: Fork,
) -> None:
    """
    Verify the state-gas reservoir is refunded on a depth-0 CREATE-tx
    address collision when `gas_limit > TX_MAX_GAS_LIMIT`.

    EIP-8037 splits `gas_limit` into the capped regular budget and a
    state-gas reservoir. On collision the inner regular gas is burnt
    and `intrinsic_state_gas` is refunded; the reservoir must also
    be refunded to the sender. `header.gas_used` is fixed at the
    regular cap regardless of reservoir handling, so the sender's
    post-balance is the primary discriminating assertion.
    """
    gas_limit_cap = fork.transaction_gas_limit_cap()
    assert gas_limit_cap is not None

    init_code = Op.STOP
    # +1 above intrinsic_state_gas (= create_state_gas(code_size=0)
    # for empty-code CREATE-tx) makes message.state_gas_reservoir > 0.
    reservoir = fork.create_state_gas(code_size=0) + 1
    gas_limit = gas_limit_cap + reservoir
    initial_fund = 10**18

    sender = pre.fund_eoa(initial_fund)
    collision_target = compute_create_address(address=sender, nonce=0)
    pre[collision_target] = Account(nonce=1)

    tx_gas_price = 7
    tx = Transaction(
        to=None,
        data=init_code,
        gas_limit=gas_limit,
        sender=sender,
        gas_price=tx_gas_price,
    )

    blockchain_test(
        pre=pre,
        blocks=[
            Block(
                txs=[tx],
                header_verify=Header(gas_used=gas_limit_cap),
            ),
        ],
        post={
            sender: Account(
                balance=initial_fund - gas_limit_cap * tx_gas_price,
                nonce=1,
            ),
            collision_target: Account(nonce=1, code=b"", storage={}),
        },
    )

Parametrized Test Cases

This test generates 1 parametrized test case across 1 fork.