Skip to content

test_delegation_clearing()

Documentation for tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_delegation_clearing@21507778.

Generate fixtures for these test cases for Amsterdam with:

fill -v tests/prague/eip7702_set_code_tx/test_set_code_txs.py::test_delegation_clearing --fork Amsterdam

Test clearing the delegation of an account under a variety of circumstances.

  • pre_set_delegation_code: The code to set on the account before clearing delegation, or None if the account should not have any code set.
  • self_sponsored: Whether the delegation clearing transaction is self-sponsored.
Source code in tests/prague/eip7702_set_code_tx/test_set_code_txs.py
3626
3627
3628
3629
3630
3631
3632
3633
3634
3635
3636
3637
3638
3639
3640
3641
3642
3643
3644
3645
3646
3647
3648
3649
3650
3651
3652
3653
3654
3655
3656
3657
3658
3659
3660
3661
3662
3663
3664
3665
3666
3667
3668
3669
3670
3671
3672
3673
3674
3675
3676
3677
3678
3679
3680
3681
3682
3683
3684
3685
3686
3687
3688
3689
3690
3691
3692
3693
3694
3695
3696
3697
3698
3699
3700
3701
3702
3703
3704
3705
3706
3707
3708
3709
3710
3711
3712
3713
3714
3715
3716
3717
3718
@pytest.mark.parametrize(
    "self_sponsored",
    [
        pytest.param(False, id="not_self_sponsored"),
        pytest.param(True, id="self_sponsored"),
    ],
)
@pytest.mark.parametrize(
    "pre_set_delegation_code",
    [
        pytest.param(Op.RETURN(0, 1), id="delegated_account"),
        pytest.param(None, id="undelegated_account"),
    ],
)
def test_delegation_clearing(
    state_test: StateTestFiller,
    pre: Alloc,
    pre_set_delegation_code: Bytecode | None,
    self_sponsored: bool,
) -> None:
    """
    Test clearing the delegation of an account under a variety of
    circumstances.

    - pre_set_delegation_code: The code to set on the account before clearing
                               delegation, or None if the account should not
                               have any code set.
    - self_sponsored: Whether the delegation clearing transaction is
                      self-sponsored.
    """  # noqa: D417
    pre_set_delegation_address: Address | None = None
    if pre_set_delegation_code is not None:
        pre_set_delegation_address = pre.deploy_contract(
            pre_set_delegation_code
        )

    if self_sponsored:
        auth_signer = pre.fund_eoa(delegation=pre_set_delegation_address)
    else:
        auth_signer = pre.fund_eoa(0, delegation=pre_set_delegation_address)

    success_slot = 1
    return_slot = 2
    ext_code_size_slot = 3
    ext_code_hash_slot = 4
    ext_code_copy_slot = 5
    entry_code = (
        Op.SSTORE(success_slot, 1)
        + Op.CALL(address=auth_signer)
        + Op.SSTORE(return_slot, Op.RETURNDATASIZE)
        + Op.SSTORE(ext_code_size_slot, Op.EXTCODESIZE(address=auth_signer))
        + Op.SSTORE(ext_code_hash_slot, Op.EXTCODEHASH(address=auth_signer))
        + Op.EXTCODECOPY(address=auth_signer, size=32)
        + Op.SSTORE(ext_code_copy_slot, Op.MLOAD(0))
        + Op.STOP
    )
    entry_address = pre.deploy_contract(entry_code)

    authorization = AuthorizationTuple(
        address=Spec.RESET_DELEGATION_ADDRESS,  # Reset
        nonce=auth_signer.nonce + (1 if self_sponsored else 0),
        signer=auth_signer,
    )

    tx = Transaction(
        gas_limit=200_000,
        to=entry_address,
        value=0,
        authorization_list=[authorization],
        sender=pre.fund_eoa() if not self_sponsored else auth_signer,
    )

    state_test(
        env=Environment(),
        pre=pre,
        tx=tx,
        post={
            auth_signer: Account(
                nonce=auth_signer.nonce + 1,
                code=b"",
                storage={},
            ),
            entry_address: Account(
                storage={
                    success_slot: 1,
                    return_slot: 0,
                    ext_code_size_slot: 0,
                    ext_code_hash_slot: Bytes().keccak256(),
                    ext_code_copy_slot: 0,
                },
            ),
        },
    )

Parametrized Test Cases

This test generates 4 parametrized test cases across 3 forks.