Skip to content

test_extdelegate_call_targets()

Documentation for tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_extdelegate_call_targets@v4.4.0.

Generate fixtures for these test cases for Osaka with:

fill -v tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py::test_extdelegate_call_targets --fork Osaka

Test EOF contracts extdelegatecalling various targets, especially resolved via 7702 delegation.

Source code in tests/osaka/eip7692_eof_v1/eip7069_extcall/test_calls.py
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
@pytest.mark.parametrize("target_account_type", TargetAccountType)
@pytest.mark.parametrize("delegate", [True, False])
@pytest.mark.parametrize("call_from_initcode", [True, False])
def test_extdelegate_call_targets(
    state_test: StateTestFiller,
    pre: Alloc,
    target_account_type: TargetAccountType,
    target_address: Address,
    delegate: bool,
    call_from_initcode: bool,
):
    """
    Test EOF contracts extdelegatecalling various targets, especially resolved via 7702
    delegation.
    """
    env = Environment()

    if delegate:
        target_address = pre.fund_eoa(0, delegation=target_address)

    sender = pre.fund_eoa()
    delegate_call_code = Op.SSTORE(
        slot_call_result, Op.EXTDELEGATECALL(address=target_address)
    ) + Op.SSTORE(slot_code_worked, value_code_worked)

    if call_from_initcode:
        # Call from initcode
        caller_contract = Container(
            sections=[
                Section.Code(
                    code=delegate_call_code + Op.RETURNCODE[0](0, 0),
                ),
                Section.Container(Container.Code(Op.STOP)),
            ]
        )
        initcode_hash = caller_contract.hash
        factory_address = pre.deploy_contract(
            code=Op.TXCREATE(tx_initcode_hash=initcode_hash) + Op.STOP,
        )
        tx = Transaction(
            sender=sender,
            to=factory_address,
            data=caller_contract,
            gas_limit=4_000_000,
            initcodes=[caller_contract],
        )
        calling_contract_address = compute_eofcreate_address(factory_address, 0)
    else:
        # Normal call from existing contract
        caller_contract = Container.Code(
            delegate_call_code + Op.STOP,
        )
        calling_contract_address = pre.deploy_contract(caller_contract)

        tx = Transaction(
            sender=sender,
            to=calling_contract_address,
            gas_limit=4_000_000,
        )

    calling_storage = {
        slot_code_worked: value_code_worked,
        slot_call_result: EXTCALL_SUCCESS
        if target_account_type == TargetAccountType.EOF_CONTRACT
        else EXTCALL_FAILURE
        if target_account_type == TargetAccountType.EOF_CONTRACT_INVALID
        else EXTCALL_REVERT,
    }

    post = {
        calling_contract_address: Account(storage=calling_storage),
    }

    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) call_from_initcode delegate target_account_type
...fork_Osaka-state_test-call_from_initcode_True-delegate_True-target_account_type_EMPTY True True EMPTY
...fork_Osaka-state_test-call_from_initcode_True-delegate_True-target_account_type_EOA True True EOA
...fork_Osaka-state_test-call_from_initcode_True-delegate_True-target_account_type_LEGACY_CONTRACT True True LEGACY_CONTRACT
...fork_Osaka-state_test-call_from_initcode_True-delegate_True-target_account_type_EOF_CONTRACT True True EOF_CONTRACT
...fork_Osaka-state_test-call_from_initcode_True-delegate_True-target_account_type_LEGACY_CONTRACT_INVALID True True LEGACY_CONTRACT_INVALID
...fork_Osaka-state_test-call_from_initcode_True-delegate_True-target_account_type_EOF_CONTRACT_INVALID True True EOF_CONTRACT_INVALID
...fork_Osaka-state_test-call_from_initcode_True-delegate_True-target_account_type_LEGACY_CONTRACT_REVERT True True LEGACY_CONTRACT_REVERT
...fork_Osaka-state_test-call_from_initcode_True-delegate_True-target_account_type_EOF_CONTRACT_REVERT True True EOF_CONTRACT_REVERT
...fork_Osaka-state_test-call_from_initcode_True-delegate_True-target_account_type_IDENTITY_PRECOMPILE True True IDENTITY_PRECOMPILE
...fork_Osaka-state_test-call_from_initcode_True-delegate_False-target_account_type_EMPTY True False EMPTY
...fork_Osaka-state_test-call_from_initcode_True-delegate_False-target_account_type_EOA True False EOA
...fork_Osaka-state_test-call_from_initcode_True-delegate_False-target_account_type_LEGACY_CONTRACT True False LEGACY_CONTRACT
...fork_Osaka-state_test-call_from_initcode_True-delegate_False-target_account_type_EOF_CONTRACT True False EOF_CONTRACT
...fork_Osaka-state_test-call_from_initcode_True-delegate_False-target_account_type_LEGACY_CONTRACT_INVALID True False LEGACY_CONTRACT_INVALID
...fork_Osaka-state_test-call_from_initcode_True-delegate_False-target_account_type_EOF_CONTRACT_INVALID True False EOF_CONTRACT_INVALID
...fork_Osaka-state_test-call_from_initcode_True-delegate_False-target_account_type_LEGACY_CONTRACT_REVERT True False LEGACY_CONTRACT_REVERT
...fork_Osaka-state_test-call_from_initcode_True-delegate_False-target_account_type_EOF_CONTRACT_REVERT True False EOF_CONTRACT_REVERT
...fork_Osaka-state_test-call_from_initcode_True-delegate_False-target_account_type_IDENTITY_PRECOMPILE True False IDENTITY_PRECOMPILE
...fork_Osaka-state_test-call_from_initcode_False-delegate_True-target_account_type_EMPTY False True EMPTY
...fork_Osaka-state_test-call_from_initcode_False-delegate_True-target_account_type_EOA False True EOA
...fork_Osaka-state_test-call_from_initcode_False-delegate_True-target_account_type_LEGACY_CONTRACT False True LEGACY_CONTRACT
...fork_Osaka-state_test-call_from_initcode_False-delegate_True-target_account_type_EOF_CONTRACT False True EOF_CONTRACT
...fork_Osaka-state_test-call_from_initcode_False-delegate_True-target_account_type_LEGACY_CONTRACT_INVALID False True LEGACY_CONTRACT_INVALID
...fork_Osaka-state_test-call_from_initcode_False-delegate_True-target_account_type_EOF_CONTRACT_INVALID False True EOF_CONTRACT_INVALID
...fork_Osaka-state_test-call_from_initcode_False-delegate_True-target_account_type_LEGACY_CONTRACT_REVERT False True LEGACY_CONTRACT_REVERT
...fork_Osaka-state_test-call_from_initcode_False-delegate_True-target_account_type_EOF_CONTRACT_REVERT False True EOF_CONTRACT_REVERT
...fork_Osaka-state_test-call_from_initcode_False-delegate_True-target_account_type_IDENTITY_PRECOMPILE False True IDENTITY_PRECOMPILE
...fork_Osaka-state_test-call_from_initcode_False-delegate_False-target_account_type_EMPTY False False EMPTY
...fork_Osaka-state_test-call_from_initcode_False-delegate_False-target_account_type_EOA False False EOA
...fork_Osaka-state_test-call_from_initcode_False-delegate_False-target_account_type_LEGACY_CONTRACT False False LEGACY_CONTRACT
...fork_Osaka-state_test-call_from_initcode_False-delegate_False-target_account_type_EOF_CONTRACT False False EOF_CONTRACT
...fork_Osaka-state_test-call_from_initcode_False-delegate_False-target_account_type_LEGACY_CONTRACT_INVALID False False LEGACY_CONTRACT_INVALID
...fork_Osaka-state_test-call_from_initcode_False-delegate_False-target_account_type_EOF_CONTRACT_INVALID False False EOF_CONTRACT_INVALID
...fork_Osaka-state_test-call_from_initcode_False-delegate_False-target_account_type_LEGACY_CONTRACT_REVERT False False LEGACY_CONTRACT_REVERT
...fork_Osaka-state_test-call_from_initcode_False-delegate_False-target_account_type_EOF_CONTRACT_REVERT False False EOF_CONTRACT_REVERT
...fork_Osaka-state_test-call_from_initcode_False-delegate_False-target_account_type_IDENTITY_PRECOMPILE False False IDENTITY_PRECOMPILE
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_True-target_account_type_EMPTY True True EMPTY
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_True-target_account_type_EOA True True EOA
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_True-target_account_type_LEGACY_CONTRACT True True LEGACY_CONTRACT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_True-target_account_type_EOF_CONTRACT True True EOF_CONTRACT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_True-target_account_type_LEGACY_CONTRACT_INVALID True True LEGACY_CONTRACT_INVALID
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_True-target_account_type_EOF_CONTRACT_INVALID True True EOF_CONTRACT_INVALID
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_True-target_account_type_LEGACY_CONTRACT_REVERT True True LEGACY_CONTRACT_REVERT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_True-target_account_type_EOF_CONTRACT_REVERT True True EOF_CONTRACT_REVERT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_True-target_account_type_IDENTITY_PRECOMPILE True True IDENTITY_PRECOMPILE
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_False-target_account_type_EMPTY True False EMPTY
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_False-target_account_type_EOA True False EOA
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_False-target_account_type_LEGACY_CONTRACT True False LEGACY_CONTRACT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_False-target_account_type_EOF_CONTRACT True False EOF_CONTRACT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_False-target_account_type_LEGACY_CONTRACT_INVALID True False LEGACY_CONTRACT_INVALID
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_False-target_account_type_EOF_CONTRACT_INVALID True False EOF_CONTRACT_INVALID
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_False-target_account_type_LEGACY_CONTRACT_REVERT True False LEGACY_CONTRACT_REVERT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_False-target_account_type_EOF_CONTRACT_REVERT True False EOF_CONTRACT_REVERT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_True-delegate_False-target_account_type_IDENTITY_PRECOMPILE True False IDENTITY_PRECOMPILE
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_True-target_account_type_EMPTY False True EMPTY
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_True-target_account_type_EOA False True EOA
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_True-target_account_type_LEGACY_CONTRACT False True LEGACY_CONTRACT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_True-target_account_type_EOF_CONTRACT False True EOF_CONTRACT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_True-target_account_type_LEGACY_CONTRACT_INVALID False True LEGACY_CONTRACT_INVALID
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_True-target_account_type_EOF_CONTRACT_INVALID False True EOF_CONTRACT_INVALID
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_True-target_account_type_LEGACY_CONTRACT_REVERT False True LEGACY_CONTRACT_REVERT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_True-target_account_type_EOF_CONTRACT_REVERT False True EOF_CONTRACT_REVERT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_True-target_account_type_IDENTITY_PRECOMPILE False True IDENTITY_PRECOMPILE
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_False-target_account_type_EMPTY False False EMPTY
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_False-target_account_type_EOA False False EOA
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_False-target_account_type_LEGACY_CONTRACT False False LEGACY_CONTRACT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_False-target_account_type_EOF_CONTRACT False False EOF_CONTRACT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_False-target_account_type_LEGACY_CONTRACT_INVALID False False LEGACY_CONTRACT_INVALID
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_False-target_account_type_EOF_CONTRACT_INVALID False False EOF_CONTRACT_INVALID
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_False-target_account_type_LEGACY_CONTRACT_REVERT False False LEGACY_CONTRACT_REVERT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_False-target_account_type_EOF_CONTRACT_REVERT False False EOF_CONTRACT_REVERT
...fork_Osaka-blockchain_test_from_state_test-call_from_initcode_False-delegate_False-target_account_type_IDENTITY_PRECOMPILE False False IDENTITY_PRECOMPILE