11use super :: Control ;
22use crate :: {
33 ExitException , ExitFatal , ExitSucceed , Log , Machine , RuntimeBackend , RuntimeEnvironment ,
4- RuntimeState ,
4+ RuntimeState , Transfer ,
55} ;
66use alloc:: vec:: Vec ;
77use primitive_types:: { H256 , U256 } ;
@@ -47,7 +47,7 @@ pub fn balance<S: AsRef<RuntimeState>, H: RuntimeEnvironment + RuntimeBackend, T
4747 handler : & mut H ,
4848) -> Control < Tr > {
4949 pop ! ( machine, address) ;
50- try_or_fail ! ( handler. mark_hot( address. into( ) , None ) ) ;
50+ handler. mark_hot ( address. into ( ) , None ) ;
5151 push_u256 ! ( machine, handler. balance( address. into( ) ) ) ;
5252
5353 Control :: Continue
@@ -127,7 +127,7 @@ pub fn extcodesize<S: AsRef<RuntimeState>, H: RuntimeEnvironment + RuntimeBacken
127127 handler : & mut H ,
128128) -> Control < Tr > {
129129 pop ! ( machine, address) ;
130- try_or_fail ! ( handler. mark_hot( address. into( ) , None ) ) ;
130+ handler. mark_hot ( address. into ( ) , None ) ;
131131 let code_size = handler. code_size ( address. into ( ) ) ;
132132 push_u256 ! ( machine, code_size) ;
133133
@@ -139,7 +139,7 @@ pub fn extcodehash<S: AsRef<RuntimeState>, H: RuntimeEnvironment + RuntimeBacken
139139 handler : & mut H ,
140140) -> Control < Tr > {
141141 pop ! ( machine, address) ;
142- try_or_fail ! ( handler. mark_hot( address. into( ) , None ) ) ;
142+ handler. mark_hot ( address. into ( ) , None ) ;
143143 let code_hash = handler. code_hash ( address. into ( ) ) ;
144144 push ! ( machine, code_hash) ;
145145
@@ -153,7 +153,7 @@ pub fn extcodecopy<S: AsRef<RuntimeState>, H: RuntimeEnvironment + RuntimeBacken
153153 pop ! ( machine, address) ;
154154 pop_u256 ! ( machine, memory_offset, code_offset, len) ;
155155
156- try_or_fail ! ( handler. mark_hot( address. into( ) , None ) ) ;
156+ handler. mark_hot ( address. into ( ) , None ) ;
157157 try_or_fail ! ( machine. memory. resize_offset( memory_offset, len) ) ;
158158
159159 let code = handler. code ( address. into ( ) ) ;
@@ -265,7 +265,7 @@ pub fn sload<S: AsRef<RuntimeState>, H: RuntimeEnvironment + RuntimeBackend, Tr>
265265 handler : & mut H ,
266266) -> Control < Tr > {
267267 pop ! ( machine, index) ;
268- try_or_fail ! ( handler. mark_hot( machine. state. as_ref( ) . context. address, Some ( index) ) ) ;
268+ handler. mark_hot ( machine. state . as_ref ( ) . context . address , Some ( index) ) ;
269269 let value = handler. storage ( machine. state . as_ref ( ) . context . address , index) ;
270270 push ! ( machine, value) ;
271271
@@ -277,7 +277,7 @@ pub fn sstore<S: AsRef<RuntimeState>, H: RuntimeEnvironment + RuntimeBackend, Tr
277277 handler : & mut H ,
278278) -> Control < Tr > {
279279 pop ! ( machine, index, value) ;
280- try_or_fail ! ( handler. mark_hot( machine. state. as_ref( ) . context. address, Some ( index) ) ) ;
280+ handler. mark_hot ( machine. state . as_ref ( ) . context . address , Some ( index) ) ;
281281
282282 match handler. set_storage ( machine. state . as_ref ( ) . context . address , index, value) {
283283 Ok ( ( ) ) => Control :: Continue ,
@@ -335,12 +335,23 @@ pub fn suicide<S: AsRef<RuntimeState>, H: RuntimeEnvironment + RuntimeBackend, T
335335 machine : & mut Machine < S > ,
336336 handler : & mut H ,
337337) -> Control < Tr > {
338- pop ! ( machine , target ) ;
338+ let address = machine . state . as_ref ( ) . context . address ;
339339
340- match handler. mark_delete ( machine. state . as_ref ( ) . context . address , target. into ( ) ) {
341- Ok ( ( ) ) => ( ) ,
342- Err ( e) => return Control :: Exit ( e. into ( ) ) ,
343- }
340+ match machine. stack . perform_pop1_push0 ( |target| {
341+ let balance = handler. balance ( address) ;
342+
343+ handler. transfer ( Transfer {
344+ source : address,
345+ target : ( * target) . into ( ) ,
346+ value : balance,
347+ } ) ?;
344348
345- Control :: Exit ( ExitSucceed :: Suicided . into ( ) )
349+ handler. mark_delete ( address) ;
350+ handler. reset_balance ( address) ;
351+
352+ Ok ( ( ( ) , ( ) ) )
353+ } ) {
354+ Ok ( ( ) ) => Control :: Exit ( ExitSucceed :: Suicided . into ( ) ) ,
355+ Err ( e) => Control :: Exit ( Err ( e) ) ,
356+ }
346357}
0 commit comments