Skip to main content

ethrex_levm/hooks/
backup_hook.rs

1use 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    /// We need to store this because we clear the backup after `prepare_execution` hook is executed
11    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        // Here we need to backup the callframe for undoing transaction changes if we want to.
17        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        // We want to restore to the initial state, this includes saving the changes made by the prepare execution
27        // and the changes made by the execution itself.
28        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}