Skip to main content

revive_strategy/backend/
mod.rs

1use std::any::Any;
2
3use alloy_rpc_types::TransactionRequest;
4use foundry_evm::{
5    Env, InspectorExt,
6    backend::{
7        Backend, BackendStrategy, BackendStrategyContext, BackendStrategyRunner,
8        EvmBackendStrategyRunner, ForkDB, JournaledState,
9    },
10};
11use revm::context::result::ResultAndState;
12use serde::{Deserialize, Serialize};
13
14/// Create revive strategy for [BackendStrategy].
15pub trait ReviveBackendStrategyBuilder {
16    /// Create new revive strategy.
17    fn new_revive() -> Self;
18}
19
20impl ReviveBackendStrategyBuilder for BackendStrategy {
21    fn new_revive() -> Self {
22        Self {
23            runner: &ReviveBackendStrategyRunner,
24            context: Box::new(ReviveBackendStrategyContext::new()),
25        }
26    }
27}
28
29/// revive implementation for [BackendStrategyRunner].
30#[derive(Debug, Default, Clone, Serialize, Deserialize)]
31pub struct ReviveBackendStrategyRunner;
32
33impl BackendStrategyRunner for ReviveBackendStrategyRunner {
34    fn inspect(
35        &self,
36        backend: &mut foundry_evm::backend::Backend,
37        env: &mut Env,
38        inspector: &mut dyn foundry_evm::InspectorExt,
39        inspect_ctx: Box<dyn std::any::Any>,
40    ) -> eyre::Result<ResultAndState> {
41        if !is_revive_inspect_context(inspect_ctx.as_ref()) {
42            return EvmBackendStrategyRunner.inspect(backend, env, inspector, inspect_ctx);
43        }
44
45        todo!();
46    }
47
48    fn update_fork_db(
49        &self,
50        _ctx: &mut dyn foundry_evm::backend::BackendStrategyContext,
51        _active_fork: Option<&foundry_evm::backend::Fork>,
52        _mem_db: &foundry_evm::backend::FoundryEvmInMemoryDB,
53        _backend_inner: &foundry_evm::backend::BackendInner,
54        _active_journaled_state: &mut JournaledState,
55        _target_fork: &mut foundry_evm::backend::Fork,
56    ) {
57        todo!()
58    }
59
60    fn merge_journaled_state_data(
61        &self,
62        _ctx: &mut dyn foundry_evm::backend::BackendStrategyContext,
63        _addr: alloy_primitives::Address,
64        _active_journaled_state: &JournaledState,
65        _fork_journaled_state: &mut JournaledState,
66    ) {
67        todo!()
68    }
69
70    fn merge_db_account_data(
71        &self,
72        _ctx: &mut dyn foundry_evm::backend::BackendStrategyContext,
73        _addr: alloy_primitives::Address,
74        _active: &ForkDB,
75        _fork_db: &mut ForkDB,
76    ) {
77        todo!()
78    }
79
80    fn transact_from_tx(
81        &self,
82        _backend: &mut Backend,
83        _tx: &TransactionRequest,
84        _env: Env,
85        _journaled_state: &mut JournaledState,
86        _inspector: &mut dyn InspectorExt,
87        _inspect_ctx: Box<dyn Any>,
88    ) -> eyre::Result<()> {
89        todo!()
90    }
91}
92
93/// Context for [ReviveBackendStrategyRunner].
94#[derive(Debug, Clone)]
95pub struct ReviveBackendStrategyContext;
96
97impl ReviveBackendStrategyContext {
98    fn new() -> Self {
99        Self
100    }
101}
102
103impl BackendStrategyContext for ReviveBackendStrategyContext {
104    fn new_cloned(&self) -> Box<dyn BackendStrategyContext> {
105        Box::new(self.clone())
106    }
107
108    fn as_any_ref(&self) -> &dyn Any {
109        self
110    }
111
112    fn as_any_mut(&mut self) -> &mut dyn Any {
113        self
114    }
115}
116
117#[derive(Clone, Debug, Default)]
118pub(crate) struct ReviveInspectContext;
119
120fn is_revive_inspect_context(ctx: &dyn Any) -> bool {
121    ctx.downcast_ref::<ReviveInspectContext>().is_some()
122}