@@ -11,7 +11,7 @@ use evm_interpreter::{
11
11
} ;
12
12
use primitive_types:: { H160 , H256 , U256 } ;
13
13
14
- use crate :: { backend:: TransactionalBackend , MergeStrategy } ;
14
+ use crate :: { backend:: TransactionalBackend , standard :: Config , MergeStrategy } ;
15
15
16
16
#[ derive( Clone , Debug ) ]
17
17
pub struct OverlayedChangeSet {
@@ -25,18 +25,24 @@ pub struct OverlayedChangeSet {
25
25
pub deletes : BTreeSet < H160 > ,
26
26
}
27
27
28
- pub struct OverlayedBackend < B > {
28
+ pub struct OverlayedBackend < ' config , B > {
29
29
backend : B ,
30
30
substate : Box < Substate > ,
31
31
accessed : BTreeSet < ( H160 , Option < H256 > ) > ,
32
+ config : & ' config Config ,
32
33
}
33
34
34
- impl < B > OverlayedBackend < B > {
35
- pub fn new ( backend : B , accessed : BTreeSet < ( H160 , Option < H256 > ) > ) -> Self {
35
+ impl < ' config , B > OverlayedBackend < ' config , B > {
36
+ pub fn new (
37
+ backend : B ,
38
+ accessed : BTreeSet < ( H160 , Option < H256 > ) > ,
39
+ config : & ' config Config ,
40
+ ) -> Self {
36
41
Self {
37
42
backend,
38
43
substate : Box :: new ( Substate :: new ( ) ) ,
39
44
accessed,
45
+ config,
40
46
}
41
47
}
42
48
@@ -57,7 +63,7 @@ impl<B> OverlayedBackend<B> {
57
63
}
58
64
}
59
65
60
- impl < B : RuntimeEnvironment > RuntimeEnvironment for OverlayedBackend < B > {
66
+ impl < B : RuntimeEnvironment > RuntimeEnvironment for OverlayedBackend < ' _ , B > {
61
67
fn block_hash ( & self , number : U256 ) -> H256 {
62
68
self . backend . block_hash ( number)
63
69
}
@@ -95,7 +101,7 @@ impl<B: RuntimeEnvironment> RuntimeEnvironment for OverlayedBackend<B> {
95
101
}
96
102
}
97
103
98
- impl < B : RuntimeBaseBackend > RuntimeBaseBackend for OverlayedBackend < B > {
104
+ impl < B : RuntimeBaseBackend > RuntimeBaseBackend for OverlayedBackend < ' _ , B > {
99
105
fn balance ( & self , address : H160 ) -> U256 {
100
106
if let Some ( balance) = self . substate . known_balance ( address) {
101
107
balance
@@ -145,7 +151,7 @@ impl<B: RuntimeBaseBackend> RuntimeBaseBackend for OverlayedBackend<B> {
145
151
}
146
152
}
147
153
148
- impl < B : RuntimeBaseBackend > RuntimeBackend for OverlayedBackend < B > {
154
+ impl < B : RuntimeBaseBackend > RuntimeBackend for OverlayedBackend < ' _ , B > {
149
155
fn original_storage ( & self , address : H160 , index : H256 ) -> H256 {
150
156
self . backend . storage ( address, index)
151
157
}
@@ -188,8 +194,16 @@ impl<B: RuntimeBaseBackend> RuntimeBackend for OverlayedBackend<B> {
188
194
Ok ( ( ) )
189
195
}
190
196
191
- fn mark_delete ( & mut self , address : H160 ) {
192
- self . substate . deletes . insert ( address) ;
197
+ fn mark_delete_reset ( & mut self , address : H160 ) {
198
+ if self . config . suicide_only_in_same_tx {
199
+ if self . created ( address) {
200
+ self . substate . deletes . insert ( address) ;
201
+ self . substate . storage_resets . insert ( address) ;
202
+ }
203
+ } else {
204
+ self . substate . deletes . insert ( address) ;
205
+ self . substate . storage_resets . insert ( address) ;
206
+ }
193
207
}
194
208
195
209
fn mark_create ( & mut self , address : H160 ) {
@@ -241,7 +255,7 @@ impl<B: RuntimeBaseBackend> RuntimeBackend for OverlayedBackend<B> {
241
255
}
242
256
}
243
257
244
- impl < B : RuntimeBaseBackend > TransactionalBackend for OverlayedBackend < B > {
258
+ impl < ' config , B : RuntimeBaseBackend > TransactionalBackend for OverlayedBackend < ' config , B > {
245
259
fn push_substate ( & mut self ) {
246
260
let mut parent = Box :: new ( Substate :: new ( ) ) ;
247
261
mem:: swap ( & mut parent, & mut self . substate ) ;
0 commit comments