ethrex_levm/hooks/
backup_hook.rs1use crate::{
2 call_frame::CallFrameBackup,
3 errors::{ContextResult, VMError},
4 hooks::hook::Hook,
5 vm::VM,
6};
7
8#[derive(Default)]
9pub struct BackupHook {
10 pub pre_execution_backup: CallFrameBackup,
12}
13
14impl Hook for BackupHook {
15 fn prepare_execution(&mut self, vm: &mut crate::vm::VM<'_>) -> Result<(), VMError> {
16 self.pre_execution_backup = vm.current_call_frame.call_frame_backup.clone();
18 Ok(())
19 }
20
21 fn finalize_execution(
22 &mut self,
23 vm: &mut VM<'_>,
24 _ctx_result: &mut ContextResult,
25 ) -> Result<(), VMError> {
26 let mut execution_backup = vm.current_call_frame.call_frame_backup.clone();
29 let pre_execution_backup = std::mem::take(&mut self.pre_execution_backup);
30 execution_backup.extend(pre_execution_backup);
31 vm.db.tx_backup = Some(execution_backup);
32
33 Ok(())
34 }
35
36 fn reads_top_level_backup(&self) -> bool {
37 true
38 }
39}