cfx_executor/observer/
internal_transfer_tracer.rs1use cfx_parity_trace_types::AddressPocket;
2use cfx_types::{address_util::AddressUtil, Address, AddressSpaceUtil, U256};
3
4use self::AddressPocket::*;
5
6use impl_tools::autoimpl;
7use impl_trait_for_tuples::impl_for_tuples;
8
9#[impl_for_tuples(3)]
10#[autoimpl(for<T: trait + ?Sized> &mut T)]
11#[allow(unused_variables)]
12pub trait InternalTransferTracer {
14 fn trace_internal_transfer(
16 &mut self, from: AddressPocket, to: AddressPocket, value: U256,
17 ) {
18 }
19
20 fn trace_convert_storage_points(
21 &mut self, addr: Address, from_balance: U256, from_collateral: U256,
22 ) {
23 if !from_balance.is_zero() {
24 self.trace_internal_transfer(
25 SponsorBalanceForStorage(addr),
26 MintBurn,
27 from_balance,
28 );
29 }
30 if !from_collateral.is_zero() {
31 self.trace_internal_transfer(
32 StorageCollateral(addr),
33 MintBurn,
34 from_collateral,
35 );
36 }
37 }
38
39 fn trace_refund_collateral(&mut self, addr: Address, by: U256) {
40 if !by.is_zero() {
41 self.trace_internal_transfer(
42 StorageCollateral(addr),
43 if addr.is_contract_address() {
44 SponsorBalanceForStorage(addr)
45 } else {
46 Balance(addr.with_native_space())
47 },
48 by,
49 );
50 }
51 }
52
53 fn trace_occupy_collateral(&mut self, addr: Address, by: U256) {
54 if !by.is_zero() {
55 self.trace_internal_transfer(
56 if addr.is_contract_address() {
57 SponsorBalanceForStorage(addr)
58 } else {
59 Balance(addr.with_native_space())
60 },
61 StorageCollateral(addr),
62 by,
63 );
64 }
65 }
66}