diff --git a/src/cli/dtvm.cpp b/src/cli/dtvm.cpp index aba274676..4ddfb1719 100644 --- a/src/cli/dtvm.cpp +++ b/src/cli/dtvm.cpp @@ -303,6 +303,10 @@ int main(int argc, char *argv[]) { #ifdef ZEN_ENABLE_EVM if (Config.Format == InputFormat::EVM) { auto MockedEVMHost = std::make_unique(); + // Set tx_origin from sender address before loading state, + // so loadState() can override it if tx_origin is present in state.json + MockedEVMHost->tx_context.tx_origin = + zen::utils::parseAddress(SenderAddress); // Load state if specified if (!LoadStateFile.empty() && !zen::utils::loadState(*MockedEVMHost, LoadStateFile)) { @@ -379,6 +383,7 @@ int main(int argc, char *argv[]) { .SenderAddress = SenderAddress, .ContractAddress = ContractAddress}; evmc_message Msg = createEvmMessage(MockedHost, MsgConfig, Bytecode); + RT->callEVMMain(*Inst, Msg, ExeResult); if (EVMC_CREATE == MsgKind && ExeResult.status_code == EVMC_SUCCESS) { diff --git a/src/tests/evm_interp_tests.cpp b/src/tests/evm_interp_tests.cpp index 057866830..0a2953764 100644 --- a/src/tests/evm_interp_tests.cpp +++ b/src/tests/evm_interp_tests.cpp @@ -169,6 +169,7 @@ EVMExecutionResult executeEvmBytecodeFile(const std::string &FilePath, Config.Mode = Mode; auto MockedHost = std::make_unique(); + MockedHost->tx_context.tx_origin = zen::evm::DEFAULT_DEPLOYER_ADDRESS; auto RT = Runtime::newEVMRuntime(Config, MockedHost.get()); EXPECT_TRUE(RT != nullptr) << "Failed to create runtime"; if (!RT) { @@ -268,6 +269,7 @@ TEST_P(EVMSampleTest, ExecuteSample) { Config.Mode = common::RunMode::InterpMode; auto MockedHost = std::make_unique(); + MockedHost->tx_context.tx_origin = zen::evm::DEFAULT_DEPLOYER_ADDRESS; auto RT = Runtime::newEVMRuntime(Config, MockedHost.get()); ASSERT_TRUE(RT != nullptr) << "Failed to create runtime"; diff --git a/src/utils/evm.cpp b/src/utils/evm.cpp index fd4fd6545..5aa940299 100644 --- a/src/utils/evm.cpp +++ b/src/utils/evm.cpp @@ -269,6 +269,10 @@ bool saveState(const evmc::MockedHost &Host, const std::string &FilePath) { File << " \"block_base_fee\": "; writeJsonString(File, toHex(Host.tx_context.block_base_fee.bytes, sizeof(Host.tx_context.block_base_fee.bytes))); + File << ",\n"; + File << " \"tx_origin\": "; + writeJsonString(File, toHex(Host.tx_context.tx_origin.bytes, + sizeof(Host.tx_context.tx_origin.bytes))); File << "\n"; File << " }\n"; @@ -418,6 +422,11 @@ bool loadState(evmc::MockedHost &Host, const std::string &FilePath) { Host.tx_context.block_base_fee = zen::utils::parseUint256(TxContext["block_base_fee"].GetString()); } + + if (TxContext.HasMember("tx_origin") && TxContext["tx_origin"].IsString()) { + Host.tx_context.tx_origin = + zen::utils::parseAddress(TxContext["tx_origin"].GetString()); + } } return true; diff --git a/tests/evm_asm/origin.expected b/tests/evm_asm/origin.expected index 481e245e2..66a32f68b 100644 --- a/tests/evm_asm/origin.expected +++ b/tests/evm_asm/origin.expected @@ -1,8 +1,8 @@ status: success error_code: 0 stack: [] -memory: '0000000000000000000000000000000000000000000000000000000000000000' +memory: '0000000000000000000000001000000000000000000000000000000000000000' storage: {} transient_storage: {} -return: '0000000000000000000000000000000000000000000000000000000000000000' +return: '0000000000000000000000001000000000000000000000000000000000000000' events: []