From 71481d98555028a22d3b3ee355d6c989cdd88f86 Mon Sep 17 00:00:00 2001 From: Vladimir Motylenko Date: Tue, 5 Oct 2021 13:53:04 +0300 Subject: [PATCH] fix(evm): Fix creating of empty block on reset. --- evm-utils/evm-state/src/executor.rs | 11 +++++++++-- .../programs/evm_loader/src/precompiles/builtins.rs | 2 +- evm-utils/programs/evm_loader/src/processor.rs | 5 ++++- sdk/src/feature_set.rs | 5 +++++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/evm-utils/evm-state/src/executor.rs b/evm-utils/evm-state/src/executor.rs index 90a030bff7..f9e5ed7e42 100644 --- a/evm-utils/evm-state/src/executor.rs +++ b/evm-utils/evm-state/src/executor.rs @@ -443,8 +443,15 @@ impl Executor { } /// After "swap from evm" transaction EVM_MINT_ADDRESS will cleanup. Using this method. - pub fn reset_balance(&mut self, balance: H160) { - self.with_executor(|_, _, _, _| None, |e| e.state_mut().reset_balance(balance)); + pub fn reset_balance(&mut self, swap_addr: H160, ignore_reset_on_cleared: bool) { + self.with_executor( + |_, _, _, _| None, + |e| { + if !ignore_reset_on_cleared || e.state().basic(swap_addr).balance != U256::zero() { + e.state_mut().reset_balance(swap_addr) + } + }, + ); } // /// Burn some tokens on address: diff --git a/evm-utils/programs/evm_loader/src/precompiles/builtins.rs b/evm-utils/programs/evm_loader/src/precompiles/builtins.rs index 0a167d8e25..3e0dfa2978 100644 --- a/evm-utils/programs/evm_loader/src/precompiles/builtins.rs +++ b/evm-utils/programs/evm_loader/src/precompiles/builtins.rs @@ -95,7 +95,7 @@ where // // NativeContracts declaration below // - +// 0x56454c41532d434841494e000000000053574150 for better search // TODO: Implement some procedural macro to render this in more pub static ETH_TO_VLX_ADDR: Lazy = Lazy::new(|| { H160::from_str(concat!( diff --git a/evm-utils/programs/evm_loader/src/processor.rs b/evm-utils/programs/evm_loader/src/processor.rs index 1903303a6c..25acbaaf91 100644 --- a/evm-utils/programs/evm_loader/src/processor.rs +++ b/evm-utils/programs/evm_loader/src/processor.rs @@ -48,6 +48,9 @@ impl EvmProcessor { .is_feature_active(&solana_sdk::feature_set::velas::evm_new_error_handling::id()); let unsigned_tx_fix = invoke_context .is_feature_active(&solana_sdk::feature_set::velas::unsigned_tx_fix::id()); + let ignore_reset_on_cleared = invoke_context + .is_feature_active(&solana_sdk::feature_set::velas::ignore_reset_on_cleared::id()); + if cross_execution && !cross_execution_enabled { ic_msg!(invoke_context, "Cross-Program evm execution not enabled."); return Err(EvmError::CrossExecutionNotEnabled.into()); @@ -114,7 +117,7 @@ impl EvmProcessor { }; if register_swap_tx_in_evm { - executor.reset_balance(*precompiles::ETH_TO_VLX_ADDR) + executor.reset_balance(*precompiles::ETH_TO_VLX_ADDR, ignore_reset_on_cleared) } // When old error handling, manually convert EvmError to InstructionError diff --git a/sdk/src/feature_set.rs b/sdk/src/feature_set.rs index f6ff1a4c10..a37db9b4f4 100644 --- a/sdk/src/feature_set.rs +++ b/sdk/src/feature_set.rs @@ -169,6 +169,10 @@ pub mod velas { pub mod unsigned_tx_fix { solana_sdk::declare_id!("HfCMpyxjAmu7sPtRdnqdrTf3zDpkErKugzYPnKs4vhat"); } + + pub mod ignore_reset_on_cleared { + solana_sdk::declare_id!("HC6ZH7Dx92Q5dwVLYAaK3SPNCDc1L7Wq41Zuc7FU1mR1"); + } } lazy_static! { /// Map of feature identifiers to user-visible description @@ -218,6 +222,7 @@ lazy_static! { (velas::native_swap_in_evm_history::id(), "Native swap in evm history."), (velas::evm_new_error_handling::id(), "EVM new error handling."), (velas::unsigned_tx_fix::id(), "Authorized transaction hash fixed."), + (velas::ignore_reset_on_cleared::id(), "Don't reset evm_swap address balance, when it already swapped, to avoid empty blocks."), /*************** ADD NEW FEATURES HERE ***************/ ] ).collect();