Skip to content

Commit 25bb023

Browse files
authored
Merge pull request #1288 from ethereum/set-auth-from-account-with-code
new(tests): EIP-7702: Sender not EOA test
2 parents d4b536d + f2894be commit 25bb023

File tree

2 files changed

+83
-0
lines changed

2 files changed

+83
-0
lines changed

src/ethereum_clis/clis/execution_specs.py

+4
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,10 @@ def _mapping_data(self):
136136
TransactionException.TYPE_4_EMPTY_AUTHORIZATION_LIST,
137137
"Failed transaction: InvalidBlock()",
138138
),
139+
ExceptionMessage(
140+
TransactionException.SENDER_NOT_EOA,
141+
"Failed transaction: InvalidSenderError('not EOA')",
142+
),
139143
ExceptionMessage(
140144
TransactionException.TYPE_4_TX_CONTRACT_CREATION,
141145
"Failed transaction: ",

tests/prague/eip7702_set_code_tx/test_set_code_txs.py

+79
Original file line numberDiff line numberDiff line change
@@ -3487,3 +3487,82 @@ def test_authorization_reusing_nonce(
34873487
sender: Account(nonce=1),
34883488
},
34893489
)
3490+
3491+
3492+
@pytest.mark.parametrize(
3493+
"set_code_type",
3494+
list(AddressType),
3495+
ids=lambda address_type: address_type.name,
3496+
)
3497+
@pytest.mark.parametrize(
3498+
"self_sponsored",
3499+
[True, False],
3500+
)
3501+
@pytest.mark.execute(pytest.mark.skip(reason="Requires contract-eoa address collision"))
3502+
def test_set_code_from_account_with_non_delegating_code(
3503+
state_test: StateTestFiller,
3504+
pre: Alloc,
3505+
set_code_type: AddressType,
3506+
self_sponsored: bool,
3507+
):
3508+
"""
3509+
Test that a transaction is correctly rejected,
3510+
if the sender account has a non-delegating code set.
3511+
3512+
The auth transaction is sent from sender which has contract code (not delegating)
3513+
But at the same time it has auth tuple that will point this sender account
3514+
To be eoa, delegation, contract .. etc
3515+
"""
3516+
sender = pre.fund_eoa()
3517+
random_address = pre.fund_eoa(0)
3518+
3519+
set_code_to_address: Address
3520+
match set_code_type:
3521+
case AddressType.EMPTY_ACCOUNT:
3522+
set_code_to_address = pre.fund_eoa(0)
3523+
case AddressType.EOA:
3524+
set_code_to_address = pre.fund_eoa(1)
3525+
case AddressType.EOA_WITH_SET_CODE:
3526+
set_code_account = pre.fund_eoa(0)
3527+
set_code_to_address = pre.fund_eoa(1, delegation=set_code_account)
3528+
case AddressType.CONTRACT:
3529+
set_code_to_address = pre.deploy_contract(Op.STOP)
3530+
case _:
3531+
raise ValueError(f"Unsupported set code type: {set_code_type}")
3532+
callee_address = pre.deploy_contract(Op.SSTORE(0, 1) + Op.STOP)
3533+
3534+
# Set the sender account to have some code, that is specifically not a delegation.
3535+
sender_account = pre[sender]
3536+
assert sender_account is not None
3537+
sender_account.code = Bytes(Op.STOP)
3538+
3539+
tx = Transaction(
3540+
gas_limit=100_000,
3541+
to=callee_address,
3542+
authorization_list=[
3543+
AuthorizationTuple(
3544+
address=set_code_to_address,
3545+
nonce=1 if self_sponsored else 0,
3546+
signer=sender if self_sponsored else random_address,
3547+
),
3548+
],
3549+
sender=sender,
3550+
error=TransactionException.SENDER_NOT_EOA,
3551+
)
3552+
3553+
state_test(
3554+
env=Environment(),
3555+
pre=pre,
3556+
tx=tx,
3557+
post={
3558+
set_code_to_address: (
3559+
Account.NONEXISTENT
3560+
if set_code_type == AddressType.EMPTY_ACCOUNT
3561+
else Account(storage={})
3562+
),
3563+
random_address: Account.NONEXISTENT
3564+
if not self_sponsored
3565+
else Account(code=Bytes(Op.STOP)),
3566+
callee_address: Account(storage={0: 0}),
3567+
},
3568+
)

0 commit comments

Comments
 (0)