@@ -11,6 +11,7 @@ from ethereum_types.numeric import Uint, bool, SetUint, SetUintStruct, SetUintDi
1111from ethereum.prague.blocks import TupleLog, TupleLogStruct, Log
1212from ethereum.prague.vm.gas import GasConstants, charge_gas
1313from ethereum.prague.fork_types import (
14+ Address,
1415 SetAddress,
1516 SetTupleAddressBytes32,
1617 SetTupleAddressBytes32Struct,
@@ -19,6 +20,7 @@ from ethereum.prague.fork_types import (
1920 SetTupleAddressBytes32DictAccess,
2021)
2122
23+ from ethereum.utils.hash_dicts import set_address_add
2224from ethereum.prague.trie import TrieTupleAddressBytes32U256, TrieTupleAddressBytes32U256Struct
2325from ethereum.prague.vm.evm_impl import Evm, EvmStruct, Message, MessageImpl, MessageStruct
2426from ethereum.prague.vm.env_impl import BlockEnvironment, BlockEnvImpl, TransactionEnvImpl
@@ -54,8 +56,10 @@ from ethereum.prague.state import (
5456 set_code,
5557 State,
5658 StateStruct,
59+ get_account,
60+ get_account_code,
5761)
58- from ethereum.prague.vm.eoa_delegation import set_delegation
62+ from ethereum.prague.vm.eoa_delegation import set_delegation, get_delegated_code_address
5963
6064from ethereum.prague.vm.evm_impl import EvmImpl
6165
@@ -557,7 +561,55 @@ func process_message_call{
557561 let range_check96_ptr = cast ([ap - 4 ], felt *);
558562 let add_mod_ptr = cast ([ap - 3 ], ModBuiltin*);
559563 let mul_mod_ptr = cast ([ap - 2 ], ModBuiltin*);
560- let message = Message(cast ([ap - 1 ], MessageStruct*));
564+ tempvar message = Message(cast ([ap - 1 ], MessageStruct*));
565+
566+ let maybe_delegated_address = get_delegated_code_address(message.value.code);
567+ if (maybe_delegated_address.value != 0 ) {
568+ tempvar delegated_address = Address([maybe_delegated_address.value]);
569+ MessageImpl.set_disable_precompiles{message=message } (bool(1 ));
570+ let accessed_addresses = message.value.accessed_addresses;
571+ set_address_add{set_address=accessed_addresses}(delegated_address);
572+ MessageImpl.set_accessed_addresses{message=message}(accessed_addresses);
573+
574+ MessageImpl.set_code_address{message=message}(maybe_delegated_address);
575+
576+ let message_code_address_account_post_delegation = get_account{state=state}(
577+ delegated_address
578+ );
579+ let message_code_post_delegation = get_account_code{state=state}(
580+ delegated_address, message_code_address_account_post_delegation
581+ );
582+ MessageImpl.set_code{message=message}(message_code_post_delegation);
583+
584+ BlockEnvImpl.set_state{block_env=block_env}(state);
585+ MessageImpl.set_block_env{message=message}(block_env);
586+
587+ tempvar range_check_ptr = range_check_ptr;
588+ tempvar bitwise_ptr = bitwise_ptr;
589+ tempvar keccak_ptr = keccak_ptr;
590+ tempvar poseidon_ptr = poseidon_ptr;
591+ tempvar range_check96_ptr = range_check96_ptr;
592+ tempvar add_mod_ptr = add_mod_ptr;
593+ tempvar mul_mod_ptr = mul_mod_ptr;
594+ tempvar message = message;
595+ } else {
596+ tempvar range_check_ptr = range_check_ptr;
597+ tempvar bitwise_ptr = bitwise_ptr;
598+ tempvar keccak_ptr = keccak_ptr;
599+ tempvar poseidon_ptr = poseidon_ptr;
600+ tempvar range_check96_ptr = range_check96_ptr;
601+ tempvar add_mod_ptr = add_mod_ptr;
602+ tempvar mul_mod_ptr = mul_mod_ptr;
603+ tempvar message = message;
604+ }
605+ let range_check_ptr = [ap - 8 ];
606+ let bitwise_ptr = cast ([ap - 7 ], BitwiseBuiltin*);
607+ let keccak_ptr = cast ([ap - 6 ], felt *);
608+ let poseidon_ptr = cast ([ap - 5 ], PoseidonBuiltin*);
609+ let range_check96_ptr = cast ([ap - 4 ], felt *);
610+ let add_mod_ptr = cast ([ap - 3 ], ModBuiltin*);
611+ let mul_mod_ptr = cast ([ap - 2 ], ModBuiltin*);
612+ tempvar message = Message(cast ([ap - 1 ], MessageStruct*));
561613
562614 // Regular message call path
563615 let evm = process_message(message);
@@ -596,7 +648,9 @@ func process_message_call{
596648 if (cast(evm.value.error, felt ) != 0 ) {
597649 finalize_evm{evm=evm } ();
598650 %{ trace_tx_end %}
599- let msg = create_empty_message_call_output(evm.value.gas_left, refund_counter, evm.value.error);
651+ let msg = create_empty_message_call_output(
652+ evm.value.gas_left, refund_counter, evm.value.error
653+ );
600654 return (msg, block_env);
601655 }
602656
0 commit comments