cfx_executor/observer/
internal_transfer_tracer.rs

1use 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)]
12/// This trait is used by executive to build traces.
13pub trait InternalTransferTracer {
14    /// Prepares internal transfer action
15    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}