Skip to content

test_self_destructing_initcode_create_tx()

Documentation for tests/cancun/eip6780_selfdestruct/test_selfdestruct.py::test_self_destructing_initcode_create_tx@ffe48572.

Generate fixtures for these test cases for Bogota with:

fill -v tests/cancun/eip6780_selfdestruct/test_selfdestruct.py::test_self_destructing_initcode_create_tx --fork Bogota

Use a Create Transaction to execute a self-destructing initcode.

Behavior should be the same before and after EIP-6780.

Test using
  • Different initial balances for the self-destructing contract
  • Different transaction value amounts
Source code in tests/cancun/eip6780_selfdestruct/test_selfdestruct.py
@pytest.mark.parametrize("tx_value", [0, 100_000])
@pytest.mark.parametrize(
    "selfdestruct_contract_initial_balance",
    [0, 100_000],
)
@pytest.mark.valid_from("Shanghai")
def test_self_destructing_initcode_create_tx(
    state_test: StateTestFiller,
    pre: Alloc,
    sender: EOA,
    fork: Fork,
    tx_value: int,
    selfdestruct_code: Bytecode,
    sendall_recipient_addresses: List[Address],
    selfdestruct_contract_initial_balance: int,
) -> None:
    """
    Use a Create Transaction to execute a self-destructing initcode.

    Behavior should be the same before and after EIP-6780.

    Test using:
      - Different initial balances for the self-destructing contract
      - Different transaction value amounts
    """
    tx = Transaction(
        sender=sender,
        value=tx_value,
        data=selfdestruct_code,
        to=None,
    )
    selfdestruct_contract_address = tx.created_contract
    if selfdestruct_contract_initial_balance > 0:
        pre.fund_address(
            selfdestruct_contract_address,
            selfdestruct_contract_initial_balance,
        )

    # Our entry point is an initcode that in turn creates a self-destructing
    # contract
    sendall_amount = selfdestruct_contract_initial_balance + tx_value

    post: Dict[Address, Account] = {
        selfdestruct_contract_address: Account.NONEXISTENT,  # type: ignore
        sendall_recipient_addresses[0]: Account(
            balance=sendall_amount, storage={0: 1}
        ),
    }

    if fork.is_eip_enabled(7708):
        expected_logs = []
        if tx_value > 0:
            expected_logs.append(
                transfer_log(sender, selfdestruct_contract_address, tx_value)
            )
        if sendall_amount > 0:
            expected_logs.append(
                transfer_log(
                    selfdestruct_contract_address,
                    sendall_recipient_addresses[0],
                    sendall_amount,
                )
            )
        tx.expected_receipt = TransactionReceipt(logs=expected_logs)

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

Parametrized Test Cases

This test generates 4 parametrized test cases across 6 forks.