@@ -3,6 +3,7 @@ use revm::{
3
3
context:: { BlockEnv , CfgEnv , Evm , TxEnv } ,
4
4
Database ,
5
5
} ;
6
+ use std:: sync:: Arc ;
6
7
7
8
/// Types that can fill the EVM transaction environment [`TxEnv`].
8
9
pub trait Tx : Send + Sync {
@@ -18,11 +19,26 @@ pub trait Tx: Send + Sync {
18
19
fn fill_tx_env ( & self , tx_env : & mut TxEnv ) ;
19
20
20
21
/// Fill the transaction environment on the EVM.
21
- fn fill_tx < Db : Database , Insp , Inst , Prec > ( & self , evm : & mut Evm < Ctx < Db > , Insp , Inst , Prec > ) {
22
+ fn fill_tx < Db : Database , Insp , Inst , Prec > ( & self , evm : & mut Evm < Ctx < Db > , Insp , Inst , Prec > )
23
+ where
24
+ Self : Sized ,
25
+ {
22
26
evm. data . ctx . modify_tx ( |tx_env| self . fill_tx_env ( tx_env) ) ;
23
27
}
24
28
}
25
29
30
+ impl Tx for Arc < dyn Tx > {
31
+ fn fill_tx_env ( & self , tx_env : & mut TxEnv ) {
32
+ self . as_ref ( ) . fill_tx_env ( tx_env) ;
33
+ }
34
+ }
35
+
36
+ impl Tx for Box < dyn Tx > {
37
+ fn fill_tx_env ( & self , tx_env : & mut TxEnv ) {
38
+ self . as_ref ( ) . fill_tx_env ( tx_env) ;
39
+ }
40
+ }
41
+
26
42
impl < T > Tx for T
27
43
where
28
44
T : Fn ( & mut TxEnv ) + Send + Sync ,
@@ -45,7 +61,10 @@ pub trait Block: Send + Sync {
45
61
fn fill_block_env ( & self , block_env : & mut BlockEnv ) ;
46
62
47
63
/// Fill the block environment on the EVM.
48
- fn fill_block < Db : Database , Insp , Inst , Prec > ( & self , evm : & mut Evm < Ctx < Db > , Insp , Inst , Prec > ) {
64
+ fn fill_block < Db : Database , Insp , Inst , Prec > ( & self , evm : & mut Evm < Ctx < Db > , Insp , Inst , Prec > )
65
+ where
66
+ Self : Sized ,
67
+ {
49
68
evm. data . ctx . modify_block ( |block_env| self . fill_block_env ( block_env) ) ;
50
69
}
51
70
65
84
}
66
85
}
67
86
87
+ impl Block for Arc < dyn Block > {
88
+ fn fill_block_env ( & self , block_env : & mut BlockEnv ) {
89
+ self . as_ref ( ) . fill_block_env ( block_env) ;
90
+ }
91
+ }
92
+
93
+ impl Block for Box < dyn Block > {
94
+ fn fill_block_env ( & self , block_env : & mut BlockEnv ) {
95
+ self . as_ref ( ) . fill_block_env ( block_env) ;
96
+ }
97
+ }
98
+
68
99
/// Types that can fill the EVM configuration environment [`CfgEnv`].
69
100
///
70
101
/// Because the CFG env has quite a few conditionally compiled properties, it
@@ -87,11 +118,26 @@ pub trait Cfg: Send + Sync {
87
118
fn fill_cfg_env ( & self , cfg_env : & mut CfgEnv ) ;
88
119
89
120
/// Fill the configuration environment on the EVM.
90
- fn fill_cfg < Db : Database , Insp , Inst , Prec > ( & self , evm : & mut Evm < Ctx < Db > , Insp , Inst , Prec > ) {
121
+ fn fill_cfg < Db : Database , Insp , Inst , Prec > ( & self , evm : & mut Evm < Ctx < Db > , Insp , Inst , Prec > )
122
+ where
123
+ Self : Sized ,
124
+ {
91
125
evm. data . ctx . modify_cfg ( |cfg_env| self . fill_cfg_env ( cfg_env) ) ;
92
126
}
93
127
}
94
128
129
+ impl Cfg for Arc < dyn Cfg > {
130
+ fn fill_cfg_env ( & self , cfg_env : & mut CfgEnv ) {
131
+ self . as_ref ( ) . fill_cfg_env ( cfg_env) ;
132
+ }
133
+ }
134
+
135
+ impl Cfg for Box < dyn Cfg > {
136
+ fn fill_cfg_env ( & self , cfg_env : & mut CfgEnv ) {
137
+ self . as_ref ( ) . fill_cfg_env ( cfg_env) ;
138
+ }
139
+ }
140
+
95
141
impl < T > Cfg for T
96
142
where
97
143
T : Fn ( & mut CfgEnv ) + Send + Sync ,
@@ -114,6 +160,13 @@ mod test {
114
160
115
161
use super :: * ;
116
162
163
+ #[ allow( dead_code) ]
164
+ fn object_safety ( cfg : Box < dyn Cfg > , block : Box < dyn Block > , tx : Box < dyn Tx > ) {
165
+ crate :: test_utils:: test_trevm ( ) . fill_cfg ( & cfg) . fill_block ( & block) . fill_tx ( & tx) ;
166
+
167
+ unimplemented ! ( "compilation check only" )
168
+ }
169
+
117
170
impl Block for ( ) {
118
171
fn fill_block_env ( & self , block_env : & mut BlockEnv ) {
119
172
let BlockEnv {
0 commit comments