@@ -3,6 +3,7 @@ use revm::{
33 context:: { BlockEnv , CfgEnv , Evm , TxEnv } ,
44 Database ,
55} ;
6+ use std:: sync:: Arc ;
67
78/// Types that can fill the EVM transaction environment [`TxEnv`].
89pub trait Tx : Send + Sync {
@@ -18,11 +19,26 @@ pub trait Tx: Send + Sync {
1819 fn fill_tx_env ( & self , tx_env : & mut TxEnv ) ;
1920
2021 /// 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+ {
2226 evm. data . ctx . modify_tx ( |tx_env| self . fill_tx_env ( tx_env) ) ;
2327 }
2428}
2529
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+
2642impl < T > Tx for T
2743where
2844 T : Fn ( & mut TxEnv ) + Send + Sync ,
@@ -45,7 +61,10 @@ pub trait Block: Send + Sync {
4561 fn fill_block_env ( & self , block_env : & mut BlockEnv ) ;
4662
4763 /// 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+ {
4968 evm. data . ctx . modify_block ( |block_env| self . fill_block_env ( block_env) ) ;
5069 }
5170
6584 }
6685}
6786
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+
6899/// Types that can fill the EVM configuration environment [`CfgEnv`].
69100///
70101/// Because the CFG env has quite a few conditionally compiled properties, it
@@ -87,11 +118,26 @@ pub trait Cfg: Send + Sync {
87118 fn fill_cfg_env ( & self , cfg_env : & mut CfgEnv ) ;
88119
89120 /// 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+ {
91125 evm. data . ctx . modify_cfg ( |cfg_env| self . fill_cfg_env ( cfg_env) ) ;
92126 }
93127}
94128
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+
95141impl < T > Cfg for T
96142where
97143 T : Fn ( & mut CfgEnv ) + Send + Sync ,
@@ -114,6 +160,13 @@ mod test {
114160
115161 use super :: * ;
116162
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+
117170 impl Block for ( ) {
118171 fn fill_block_env ( & self , block_env : & mut BlockEnv ) {
119172 let BlockEnv {
0 commit comments