1
1
use super :: * ;
2
2
use frame_support:: traits:: Get ;
3
+ use safe_math:: * ;
3
4
use substrate_fixed:: { transcendental:: log2, types:: I96F32 } ;
4
5
5
6
impl < T : Config > Pallet < T > {
@@ -30,15 +31,15 @@ impl<T: Config> Pallet<T> {
30
31
alpha_block_emission : u64 ,
31
32
) -> ( u64 , u64 , u64 ) {
32
33
// Init terms.
33
- let mut tao_in_emission: I96F32 = I96F32 :: from_num ( tao_emission) ;
34
- let float_alpha_block_emission: I96F32 = I96F32 :: from_num ( alpha_block_emission) ;
34
+ let mut tao_in_emission: I96F32 = I96F32 :: saturating_from_num ( tao_emission) ;
35
+ let float_alpha_block_emission: I96F32 = I96F32 :: saturating_from_num ( alpha_block_emission) ;
35
36
36
37
// Get alpha price for subnet.
37
38
let alpha_price: I96F32 = Self :: get_alpha_price ( netuid) ;
38
39
log:: debug!( "{:?} - alpha_price: {:?}" , netuid, alpha_price) ;
39
40
40
41
// Get initial alpha_in
41
- let mut alpha_in_emission: I96F32 = I96F32 :: from_num ( tao_emission)
42
+ let mut alpha_in_emission: I96F32 = I96F32 :: saturating_from_num ( tao_emission)
42
43
. checked_div ( alpha_price)
43
44
. unwrap_or ( float_alpha_block_emission) ;
44
45
@@ -59,9 +60,11 @@ impl<T: Config> Pallet<T> {
59
60
}
60
61
61
62
// Avoid rounding errors.
62
- if tao_in_emission < I96F32 :: from_num ( 1 ) || alpha_in_emission < I96F32 :: from_num ( 1 ) {
63
- alpha_in_emission = I96F32 :: from_num ( 0 ) ;
64
- tao_in_emission = I96F32 :: from_num ( 0 ) ;
63
+ if tao_in_emission < I96F32 :: saturating_from_num ( 1 )
64
+ || alpha_in_emission < I96F32 :: saturating_from_num ( 1 )
65
+ {
66
+ alpha_in_emission = I96F32 :: saturating_from_num ( 0 ) ;
67
+ tao_in_emission = I96F32 :: saturating_from_num ( 0 ) ;
65
68
}
66
69
67
70
// Set Alpha in emission.
@@ -78,9 +81,9 @@ impl<T: Config> Pallet<T> {
78
81
79
82
// Return result.
80
83
(
81
- tao_in_emission. to_num :: < u64 > ( ) ,
82
- alpha_in_emission. to_num :: < u64 > ( ) ,
83
- alpha_out_emission. to_num :: < u64 > ( ) ,
84
+ tao_in_emission. saturating_to_num :: < u64 > ( ) ,
85
+ alpha_in_emission. saturating_to_num :: < u64 > ( ) ,
86
+ alpha_out_emission. saturating_to_num :: < u64 > ( ) ,
84
87
)
85
88
}
86
89
@@ -103,23 +106,22 @@ impl<T: Config> Pallet<T> {
103
106
/// Returns the block emission for an issuance value.
104
107
pub fn get_block_emission_for_issuance ( issuance : u64 ) -> Result < u64 , & ' static str > {
105
108
// Convert issuance to a float for calculations below.
106
- let total_issuance: I96F32 = I96F32 :: from_num ( issuance) ;
109
+ let total_issuance: I96F32 = I96F32 :: saturating_from_num ( issuance) ;
107
110
// Check to prevent division by zero when the total supply is reached
108
111
// and creating an issuance greater than the total supply.
109
- if total_issuance >= I96F32 :: from_num ( TotalSupply :: < T > :: get ( ) ) {
112
+ if total_issuance >= I96F32 :: saturating_from_num ( TotalSupply :: < T > :: get ( ) ) {
110
113
return Ok ( 0 ) ;
111
114
}
112
115
// Calculate the logarithmic residual of the issuance against half the total supply.
113
116
let residual: I96F32 = log2 (
114
- I96F32 :: from_num ( 1.0 )
117
+ I96F32 :: saturating_from_num ( 1.0 )
115
118
. checked_div (
116
- I96F32 :: from_num ( 1.0 )
119
+ I96F32 :: saturating_from_num ( 1.0 )
117
120
. checked_sub (
118
121
total_issuance
119
- . checked_div (
120
- I96F32 :: from_num ( 2.0 )
121
- . saturating_mul ( I96F32 :: from_num ( 10_500_000_000_000_000.0 ) ) ,
122
- )
122
+ . checked_div ( I96F32 :: saturating_from_num ( 2.0 ) . saturating_mul (
123
+ I96F32 :: saturating_from_num ( 10_500_000_000_000_000.0 ) ,
124
+ ) )
123
125
. ok_or ( "Logarithm calculation failed" ) ?,
124
126
)
125
127
. ok_or ( "Logarithm calculation failed" ) ?,
@@ -131,18 +133,19 @@ impl<T: Config> Pallet<T> {
131
133
let floored_residual: I96F32 = residual. floor ( ) ;
132
134
// Calculate the final emission rate using the floored residual.
133
135
// Convert floored_residual to an integer
134
- let floored_residual_int: u64 = floored_residual. to_num :: < u64 > ( ) ;
136
+ let floored_residual_int: u64 = floored_residual. saturating_to_num :: < u64 > ( ) ;
135
137
// Multiply 2.0 by itself floored_residual times to calculate the power of 2.
136
- let mut multiplier: I96F32 = I96F32 :: from_num ( 1.0 ) ;
138
+ let mut multiplier: I96F32 = I96F32 :: saturating_from_num ( 1.0 ) ;
137
139
for _ in 0 ..floored_residual_int {
138
- multiplier = multiplier. saturating_mul ( I96F32 :: from_num ( 2.0 ) ) ;
140
+ multiplier = multiplier. saturating_mul ( I96F32 :: saturating_from_num ( 2.0 ) ) ;
139
141
}
140
- let block_emission_percentage: I96F32 = I96F32 :: from_num ( 1.0 ) . saturating_div ( multiplier) ;
142
+ let block_emission_percentage: I96F32 =
143
+ I96F32 :: saturating_from_num ( 1.0 ) . safe_div ( multiplier) ;
141
144
// Calculate the actual emission based on the emission rate
142
145
let block_emission: I96F32 = block_emission_percentage
143
- . saturating_mul ( I96F32 :: from_num ( DefaultBlockEmission :: < T > :: get ( ) ) ) ;
146
+ . saturating_mul ( I96F32 :: saturating_from_num ( DefaultBlockEmission :: < T > :: get ( ) ) ) ;
144
147
// Convert to u64
145
- let block_emission_u64: u64 = block_emission. to_num :: < u64 > ( ) ;
148
+ let block_emission_u64: u64 = block_emission. saturating_to_num :: < u64 > ( ) ;
146
149
if BlockEmission :: < T > :: get ( ) != block_emission_u64 {
147
150
BlockEmission :: < T > :: put ( block_emission_u64) ;
148
151
}
0 commit comments