1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
use cfx_parameters::consensus::ONE_CFX_IN_DRIP;
use cfx_types::{Address, U256};
use primitives::SponsorInfo;

use super::OverlayAccount;

impl OverlayAccount {
    pub fn sponsor_info(&self) -> &SponsorInfo { &self.sponsor_info }

    pub fn set_sponsor_for_gas(
        &mut self, sponsor: &Address, sponsor_balance: &U256,
        upper_bound: &U256,
    ) {
        self.address.assert_native();
        self.sponsor_info.sponsor_for_gas = *sponsor;
        self.sponsor_info.sponsor_balance_for_gas = *sponsor_balance;
        self.sponsor_info.sponsor_gas_bound = *upper_bound;
    }

    pub fn set_sponsor_for_collateral(
        &mut self, sponsor: &Address, sponsor_balance: &U256, prop: U256,
    ) -> U256 {
        self.address.assert_native();
        self.sponsor_info.sponsor_for_collateral = *sponsor;
        let inc = sponsor_balance
            .saturating_sub(self.sponsor_info.sponsor_balance_for_collateral);
        self.sponsor_info.sponsor_balance_for_collateral = *sponsor_balance;

        if self.sponsor_info.storage_points.is_some() && !inc.is_zero() {
            let converted_storage_point =
                inc * prop / (U256::from(ONE_CFX_IN_DRIP) + prop);
            self.sponsor_info.sponsor_balance_for_collateral -=
                converted_storage_point;
            self.sponsor_info.storage_points.as_mut().unwrap().unused +=
                converted_storage_point;
            converted_storage_point
        } else {
            U256::zero()
        }
    }

    pub fn add_sponsor_balance_for_gas(&mut self, by: &U256) {
        self.address.assert_native();
        self.sponsor_info.sponsor_balance_for_gas += *by;
    }

    pub fn sub_sponsor_balance_for_gas(&mut self, by: &U256) {
        self.address.assert_native();
        assert!(self.sponsor_info.sponsor_balance_for_gas >= *by);
        self.sponsor_info.sponsor_balance_for_gas -= *by;
    }

    pub fn add_sponsor_balance_for_collateral(&mut self, by: &U256) {
        self.address.assert_native();
        self.sponsor_info.sponsor_balance_for_collateral += *by;
    }

    pub fn sub_sponsor_balance_for_collateral(&mut self, by: &U256) {
        self.address.assert_native();
        assert!(self.sponsor_info.sponsor_balance_for_collateral >= *by);
        self.sponsor_info.sponsor_balance_for_collateral -= *by;
    }
}