Skip to content

test_reentrancy_selfdestruct_revert()

Documentation for tests/cancun/eip6780_selfdestruct/test_reentrancy_selfdestruct_revert.py::test_reentrancy_selfdestruct_revert@49a16fac.

Generate fixtures for these test cases for Prague with:

fill -v tests/cancun/eip6780_selfdestruct/test_reentrancy_selfdestruct_revert.py::test_reentrancy_selfdestruct_revert --fork Prague

Suicide reentrancy scenario.

Call|Callcode|Delegatecall the contract S. S self destructs. Call the revert proxy contract R. R Calls|Callcode|Delegatecall S. S self destructs (for the second time). R reverts (including the effects of the second selfdestruct). It is expected the S is self destructed after the transaction.

Source code in tests/cancun/eip6780_selfdestruct/test_reentrancy_selfdestruct_revert.py
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
@pytest.mark.valid_from("Paris")
@pytest.mark.parametrize("first_suicide", [Op.CALL, Op.CALLCODE, Op.DELEGATECALL])
@pytest.mark.parametrize("second_suicide", [Op.CALL, Op.CALLCODE, Op.DELEGATECALL])
def test_reentrancy_selfdestruct_revert(
    pre: Alloc,
    env: Environment,
    sender: EOA,
    fork: Fork,
    first_suicide: Op,
    second_suicide: Op,
    state_test: StateTestFiller,
    selfdestruct_contract_bytecode: Bytecode,
    selfdestruct_contract_address: Address,
    selfdestruct_contract_init_balance: int,
    revert_contract_address: Address,
    revert_contract_init_balance: int,
    executor_contract_address: Address,
    executor_contract_init_balance: int,
    selfdestruct_recipient_address: Address,
):
    """
    Suicide reentrancy scenario.

    Call|Callcode|Delegatecall the contract S.
    S self destructs.
    Call the revert proxy contract R.
    R Calls|Callcode|Delegatecall S.
    S self destructs (for the second time).
    R reverts (including the effects of the second selfdestruct).
    It is expected the S is self destructed after the transaction.
    """
    post = {
        # Second caller unchanged as call gets reverted
        revert_contract_address: Account(balance=revert_contract_init_balance, storage={}),
    }

    if first_suicide in [Op.CALLCODE, Op.DELEGATECALL]:
        if fork >= Cancun:
            # On Cancun even callcode/delegatecall does not remove the account, so the value remain
            post[executor_contract_address] = Account(
                storage={
                    0x01: 0x01,  # First call to contract S->suicide success
                    0x02: 0x00,  # Second call to contract S->suicide reverted
                    0x03: 16,  # Reverted value to check that revert really worked
                },
            )
        else:
            # Callcode executed first suicide from sender. sender is deleted
            post[executor_contract_address] = Account.NONEXISTENT  # type: ignore

        # Original suicide account remains in state
        post[selfdestruct_contract_address] = Account(
            balance=selfdestruct_contract_init_balance, storage={}
        )
        # Suicide destination
        post[selfdestruct_recipient_address] = Account(
            balance=executor_contract_init_balance,
        )

    # On Cancun suicide no longer destroys the account from state, just cleans the balance
    if first_suicide in [Op.CALL]:
        post[executor_contract_address] = Account(
            storage={
                0x01: 0x01,  # First call to contract S->suicide success
                0x02: 0x00,  # Second call to contract S->suicide reverted
                0x03: 16,  # Reverted value to check that revert really worked
            },
        )
        if fork >= Cancun:
            # On Cancun suicide does not remove the account, just sends the balance
            post[selfdestruct_contract_address] = Account(
                balance=0, code=selfdestruct_contract_bytecode, storage={}
            )
        else:
            post[selfdestruct_contract_address] = Account.NONEXISTENT  # type: ignore

        # Suicide destination
        post[selfdestruct_recipient_address] = Account(
            balance=selfdestruct_contract_init_balance,
        )

    tx = Transaction(
        sender=sender,
        to=executor_contract_address,
        gas_limit=500_000,
        value=0,
    )

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

Parametrized Test Cases

The interactive table below is also available as a standalone page.

Test ID (Abbreviated) second_suicide first_suicide
...fork_Paris-blockchain_test-second_suicide_CALL-first_suicide_CALL CALL CALL
...fork_Paris-blockchain_test-second_suicide_CALL-first_suicide_CALLCODE CALL CALLCODE
...fork_Paris-blockchain_test-second_suicide_CALL-first_suicide_DELEGATECALL CALL DELEGATECALL
...fork_Paris-blockchain_test-second_suicide_CALLCODE-first_suicide_CALL CALLCODE CALL
...fork_Paris-blockchain_test-second_suicide_CALLCODE-first_suicide_CALLCODE CALLCODE CALLCODE
...fork_Paris-blockchain_test-second_suicide_CALLCODE-first_suicide_DELEGATECALL CALLCODE DELEGATECALL
...fork_Paris-blockchain_test-second_suicide_DELEGATECALL-first_suicide_CALL DELEGATECALL CALL
...fork_Paris-blockchain_test-second_suicide_DELEGATECALL-first_suicide_CALLCODE DELEGATECALL CALLCODE
...fork_Paris-blockchain_test-second_suicide_DELEGATECALL-first_suicide_DELEGATECALL DELEGATECALL DELEGATECALL
...fork_Paris-state_test-second_suicide_CALL-first_suicide_CALL CALL CALL
...fork_Paris-state_test-second_suicide_CALL-first_suicide_CALLCODE CALL CALLCODE
...fork_Paris-state_test-second_suicide_CALL-first_suicide_DELEGATECALL CALL DELEGATECALL
...fork_Paris-state_test-second_suicide_CALLCODE-first_suicide_CALL CALLCODE CALL
...fork_Paris-state_test-second_suicide_CALLCODE-first_suicide_CALLCODE CALLCODE CALLCODE
...fork_Paris-state_test-second_suicide_CALLCODE-first_suicide_DELEGATECALL CALLCODE DELEGATECALL
...fork_Paris-state_test-second_suicide_DELEGATECALL-first_suicide_CALL DELEGATECALL CALL
...fork_Paris-state_test-second_suicide_DELEGATECALL-first_suicide_CALLCODE DELEGATECALL CALLCODE
...fork_Paris-state_test-second_suicide_DELEGATECALL-first_suicide_DELEGATECALL DELEGATECALL DELEGATECALL
...fork_Shanghai-blockchain_test-second_suicide_CALL-first_suicide_CALL CALL CALL
...fork_Shanghai-blockchain_test-second_suicide_CALL-first_suicide_CALLCODE CALL CALLCODE
...fork_Shanghai-blockchain_test-second_suicide_CALL-first_suicide_DELEGATECALL CALL DELEGATECALL
...fork_Shanghai-blockchain_test-second_suicide_CALLCODE-first_suicide_CALL CALLCODE CALL
...fork_Shanghai-blockchain_test-second_suicide_CALLCODE-first_suicide_CALLCODE CALLCODE CALLCODE
...fork_Shanghai-blockchain_test-second_suicide_CALLCODE-first_suicide_DELEGATECALL CALLCODE DELEGATECALL
...fork_Shanghai-blockchain_test-second_suicide_DELEGATECALL-first_suicide_CALL DELEGATECALL CALL
...fork_Shanghai-blockchain_test-second_suicide_DELEGATECALL-first_suicide_CALLCODE DELEGATECALL CALLCODE
...fork_Shanghai-blockchain_test-second_suicide_DELEGATECALL-first_suicide_DELEGATECALL DELEGATECALL DELEGATECALL
...fork_Shanghai-state_test-second_suicide_CALL-first_suicide_CALL CALL CALL
...fork_Shanghai-state_test-second_suicide_CALL-first_suicide_CALLCODE CALL CALLCODE
...fork_Shanghai-state_test-second_suicide_CALL-first_suicide_DELEGATECALL CALL DELEGATECALL
...fork_Shanghai-state_test-second_suicide_CALLCODE-first_suicide_CALL CALLCODE CALL
...fork_Shanghai-state_test-second_suicide_CALLCODE-first_suicide_CALLCODE CALLCODE CALLCODE
...fork_Shanghai-state_test-second_suicide_CALLCODE-first_suicide_DELEGATECALL CALLCODE DELEGATECALL
...fork_Shanghai-state_test-second_suicide_DELEGATECALL-first_suicide_CALL DELEGATECALL CALL
...fork_Shanghai-state_test-second_suicide_DELEGATECALL-first_suicide_CALLCODE DELEGATECALL CALLCODE
...fork_Shanghai-state_test-second_suicide_DELEGATECALL-first_suicide_DELEGATECALL DELEGATECALL DELEGATECALL
...fork_Cancun-blockchain_test-second_suicide_CALL-first_suicide_CALL CALL CALL
...fork_Cancun-blockchain_test-second_suicide_CALL-first_suicide_CALLCODE CALL CALLCODE
...fork_Cancun-blockchain_test-second_suicide_CALL-first_suicide_DELEGATECALL CALL DELEGATECALL
...fork_Cancun-blockchain_test-second_suicide_CALLCODE-first_suicide_CALL CALLCODE CALL
...fork_Cancun-blockchain_test-second_suicide_CALLCODE-first_suicide_CALLCODE CALLCODE CALLCODE
...fork_Cancun-blockchain_test-second_suicide_CALLCODE-first_suicide_DELEGATECALL CALLCODE DELEGATECALL
...fork_Cancun-blockchain_test-second_suicide_DELEGATECALL-first_suicide_CALL DELEGATECALL CALL
...fork_Cancun-blockchain_test-second_suicide_DELEGATECALL-first_suicide_CALLCODE DELEGATECALL CALLCODE
...fork_Cancun-blockchain_test-second_suicide_DELEGATECALL-first_suicide_DELEGATECALL DELEGATECALL DELEGATECALL
...fork_Cancun-state_test-second_suicide_CALL-first_suicide_CALL CALL CALL
...fork_Cancun-state_test-second_suicide_CALL-first_suicide_CALLCODE CALL CALLCODE
...fork_Cancun-state_test-second_suicide_CALL-first_suicide_DELEGATECALL CALL DELEGATECALL
...fork_Cancun-state_test-second_suicide_CALLCODE-first_suicide_CALL CALLCODE CALL
...fork_Cancun-state_test-second_suicide_CALLCODE-first_suicide_CALLCODE CALLCODE CALLCODE
...fork_Cancun-state_test-second_suicide_CALLCODE-first_suicide_DELEGATECALL CALLCODE DELEGATECALL
...fork_Cancun-state_test-second_suicide_DELEGATECALL-first_suicide_CALL DELEGATECALL CALL
...fork_Cancun-state_test-second_suicide_DELEGATECALL-first_suicide_CALLCODE DELEGATECALL CALLCODE
...fork_Cancun-state_test-second_suicide_DELEGATECALL-first_suicide_DELEGATECALL DELEGATECALL DELEGATECALL
...fork_Prague-blockchain_test-second_suicide_CALL-first_suicide_CALL CALL CALL
...fork_Prague-blockchain_test-second_suicide_CALL-first_suicide_CALLCODE CALL CALLCODE
...fork_Prague-blockchain_test-second_suicide_CALL-first_suicide_DELEGATECALL CALL DELEGATECALL
...fork_Prague-blockchain_test-second_suicide_CALLCODE-first_suicide_CALL CALLCODE CALL
...fork_Prague-blockchain_test-second_suicide_CALLCODE-first_suicide_CALLCODE CALLCODE CALLCODE
...fork_Prague-blockchain_test-second_suicide_CALLCODE-first_suicide_DELEGATECALL CALLCODE DELEGATECALL
...fork_Prague-blockchain_test-second_suicide_DELEGATECALL-first_suicide_CALL DELEGATECALL CALL
...fork_Prague-blockchain_test-second_suicide_DELEGATECALL-first_suicide_CALLCODE DELEGATECALL CALLCODE
...fork_Prague-blockchain_test-second_suicide_DELEGATECALL-first_suicide_DELEGATECALL DELEGATECALL DELEGATECALL
...fork_Prague-state_test-second_suicide_CALL-first_suicide_CALL CALL CALL
...fork_Prague-state_test-second_suicide_CALL-first_suicide_CALLCODE CALL CALLCODE
...fork_Prague-state_test-second_suicide_CALL-first_suicide_DELEGATECALL CALL DELEGATECALL
...fork_Prague-state_test-second_suicide_CALLCODE-first_suicide_CALL CALLCODE CALL
...fork_Prague-state_test-second_suicide_CALLCODE-first_suicide_CALLCODE CALLCODE CALLCODE
...fork_Prague-state_test-second_suicide_CALLCODE-first_suicide_DELEGATECALL CALLCODE DELEGATECALL
...fork_Prague-state_test-second_suicide_DELEGATECALL-first_suicide_CALL DELEGATECALL CALL
...fork_Prague-state_test-second_suicide_DELEGATECALL-first_suicide_CALLCODE DELEGATECALL CALLCODE
...fork_Prague-state_test-second_suicide_DELEGATECALL-first_suicide_DELEGATECALL DELEGATECALL DELEGATECALL
...fork_Osaka-blockchain_test-second_suicide_CALL-first_suicide_CALL CALL CALL
...fork_Osaka-blockchain_test-second_suicide_CALL-first_suicide_CALLCODE CALL CALLCODE
...fork_Osaka-blockchain_test-second_suicide_CALL-first_suicide_DELEGATECALL CALL DELEGATECALL
...fork_Osaka-blockchain_test-second_suicide_CALLCODE-first_suicide_CALL CALLCODE CALL
...fork_Osaka-blockchain_test-second_suicide_CALLCODE-first_suicide_CALLCODE CALLCODE CALLCODE
...fork_Osaka-blockchain_test-second_suicide_CALLCODE-first_suicide_DELEGATECALL CALLCODE DELEGATECALL
...fork_Osaka-blockchain_test-second_suicide_DELEGATECALL-first_suicide_CALL DELEGATECALL CALL
...fork_Osaka-blockchain_test-second_suicide_DELEGATECALL-first_suicide_CALLCODE DELEGATECALL CALLCODE
...fork_Osaka-blockchain_test-second_suicide_DELEGATECALL-first_suicide_DELEGATECALL DELEGATECALL DELEGATECALL
...fork_Osaka-state_test-second_suicide_CALL-first_suicide_CALL CALL CALL
...fork_Osaka-state_test-second_suicide_CALL-first_suicide_CALLCODE CALL CALLCODE
...fork_Osaka-state_test-second_suicide_CALL-first_suicide_DELEGATECALL CALL DELEGATECALL
...fork_Osaka-state_test-second_suicide_CALLCODE-first_suicide_CALL CALLCODE CALL
...fork_Osaka-state_test-second_suicide_CALLCODE-first_suicide_CALLCODE CALLCODE CALLCODE
...fork_Osaka-state_test-second_suicide_CALLCODE-first_suicide_DELEGATECALL CALLCODE DELEGATECALL
...fork_Osaka-state_test-second_suicide_DELEGATECALL-first_suicide_CALL DELEGATECALL CALL
...fork_Osaka-state_test-second_suicide_DELEGATECALL-first_suicide_CALLCODE DELEGATECALL CALLCODE
...fork_Osaka-state_test-second_suicide_DELEGATECALL-first_suicide_DELEGATECALL DELEGATECALL DELEGATECALL