revive_strategy/backend/
mod.rs1use 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
14pub trait ReviveBackendStrategyBuilder {
16 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#[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#[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}