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
use chain_impl_mockchain::rewards::{CompoundingType, Limit, Parameters};
use jormungandr_lib::interfaces::{BlockchainConfiguration, RewardParams};

pub trait BlockchainConfigurationExtension {
    fn reward_parameters(&self) -> Option<Parameters>;
}

impl BlockchainConfigurationExtension for BlockchainConfiguration {
    fn reward_parameters(&self) -> Option<Parameters> {
        let reward_param = match self.reward_parameters {
            None => return None,
            Some(r) => r,
        };

        let reward_drawing = match self.reward_constraints.reward_drawing_limit_max {
            None => Limit::None,
            Some(r) => Limit::ByStakeAbsolute(r.into()),
        };

        let pool_participation = self
            .reward_constraints
            .pool_participation_capping
            .map(|p| (p.min, p.max));

        match reward_param {
            RewardParams::Linear {
                constant,
                ratio,
                epoch_start,
                epoch_rate,
            } => Some(Parameters {
                initial_value: constant,
                compounding_ratio: ratio.into(),
                compounding_type: CompoundingType::Linear,
                epoch_rate,
                epoch_start,
                reward_drawing_limit_max: reward_drawing,
                pool_participation_capping: pool_participation,
            }),
            RewardParams::Halving {
                constant,
                ratio,
                epoch_start,
                epoch_rate,
            } => Some(Parameters {
                initial_value: constant,
                compounding_ratio: ratio.into(),
                compounding_type: CompoundingType::Halvening,
                epoch_rate,
                epoch_start,
                reward_drawing_limit_max: reward_drawing,
                pool_participation_capping: pool_participation,
            }),
        }
    }
}