Skip to content

Test Selfdestruct

Documentation for tests/frontier/opcodes/test_selfdestruct.py.

Generate fixtures for these test cases with:

fill -v tests/frontier/opcodes/test_selfdestruct.py

Test the SELFDESTRUCT opcode.

test_double_kill(blockchain_test, pre)

Test that when two transactions attempt to destruct a contract, the second transaction actually resurrects the contract as an empty account (prior to Spurious Dragon).

Source code in tests/frontier/opcodes/test_selfdestruct.py
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
@pytest.mark.valid_from("Frontier")
@pytest.mark.valid_until("Homestead")
def test_double_kill(blockchain_test: BlockchainTestFiller, pre: Alloc):
    """
    Test that when two transactions attempt to destruct a contract,
    the second transaction actually resurrects the contract as an empty account (prior to Spurious
    Dragon).
    """
    env = Environment()
    sender = pre.fund_eoa()

    deploy_code = Op.SELFDESTRUCT(Op.ADDRESS)

    initcode = Initcode(deploy_code=deploy_code)

    create_tx = Transaction(
        gas_limit=100000000,
        protected=False,
        to=None,
        data=initcode,
        sender=sender,
    )

    block_1 = Block(txs=[create_tx])

    first_kill = Transaction(
        gas_limit=100000000,
        protected=False,
        to=create_tx.created_contract,
        sender=sender,
    )

    second_kill = Transaction(
        gas_limit=100000000,
        protected=False,
        to=create_tx.created_contract,
        sender=sender,
    )

    block_2 = Block(txs=[first_kill, second_kill])

    post = {
        create_tx.created_contract: Account(
            nonce=0,
            balance=0,
            code=b"",
            storage={},
        ),
    }

    blockchain_test(genesis_environment=env, pre=pre, post=post, blocks=[block_1, block_2])