@pytest.mark.stub_parametrize("factory_stub", "bloatnet_factory_")
def test_call_value_to_existing(
benchmark_test: BenchmarkTestFiller,
pre: Alloc,
fork: Fork,
gas_benchmark_value: int,
tx_gas_limit: int,
factory_stub: str,
) -> None:
"""Benchmark CALL with value transfer to cold existing contracts."""
factory_address = pre.deploy_contract(
code=Bytecode(),
stub=factory_stub,
)
# Contract Construction
setup = Bytecode()
setup += Conditional(
condition=Op.STATICCALL(
gas=Op.GAS,
address=factory_address,
args_offset=0,
args_size=0,
ret_offset=96,
ret_size=64,
# gas accounting
address_warm=False,
old_memory_size=0,
new_memory_size=160,
),
if_false=Op.INVALID,
)
create2_preimage = Create2PreimageLayout(
factory_address=factory_address,
salt=Op.CALLDATALOAD(32),
init_code_hash=Op.MLOAD(128),
old_memory_size=160,
)
setup += create2_preimage
setup += Op.CALLDATALOAD(0) # [num_contract]
# CALL with value=1 to factory contracts.
# The address is computed inline via SHA3, avoiding DUP depth issues.
# gas=1: subcall gets 1 + 2300 stipend, still not enough for 24KB
# bytecode → subcall fails, but cold + value gas costs are charged.
call_value_op = Op.POP(
Op.CALL(
gas=1,
address=create2_preimage.address_op(),
value=1,
args_offset=0,
args_size=0,
ret_offset=0,
ret_size=0,
# gas accounting
value_transfer=True,
)
)
loop = While(
body=(call_value_op + create2_preimage.increment_salt_op()),
condition=DECREMENT_COUNTER_CONDITION,
)
# Contract Deployment
code = setup + loop
attack_contract_address = pre.deploy_contract(code=code)
# Gas Accounting
txs, total_gas_consumed = build_benchmark_txs(
pre=pre,
fork=fork,
gas_benchmark_value=gas_benchmark_value,
tx_gas_limit=tx_gas_limit,
attack_contract_address=attack_contract_address,
setup_cost=setup.gas_cost(fork),
iteration_cost=loop.gas_cost(fork),
)
benchmark_test(
pre=pre,
blocks=[Block(txs=txs)],
expected_benchmark_gas_used=total_gas_consumed,
skip_gas_used_validation=True,
)