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,15 +60,15 @@ 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.
68
- let alpha_out_emission = I96F32 :: from_num ( 2 )
69
- . saturating_mul ( float_alpha_block_emission)
70
- . saturating_sub ( alpha_in_emission) ;
71
+ let alpha_out_emission = float_alpha_block_emission;
71
72
72
73
// Log results.
73
74
log:: debug!( "{:?} - tao_in_emission: {:?}" , netuid, tao_in_emission) ;
@@ -80,9 +81,9 @@ impl<T: Config> Pallet<T> {
80
81
81
82
// Return result.
82
83
(
83
- tao_in_emission. to_num :: < u64 > ( ) ,
84
- alpha_in_emission. to_num :: < u64 > ( ) ,
85
- 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 > ( ) ,
86
87
)
87
88
}
88
89
@@ -105,23 +106,22 @@ impl<T: Config> Pallet<T> {
105
106
/// Returns the block emission for an issuance value.
106
107
pub fn get_block_emission_for_issuance ( issuance : u64 ) -> Result < u64 , & ' static str > {
107
108
// Convert issuance to a float for calculations below.
108
- let total_issuance: I96F32 = I96F32 :: from_num ( issuance) ;
109
+ let total_issuance: I96F32 = I96F32 :: saturating_from_num ( issuance) ;
109
110
// Check to prevent division by zero when the total supply is reached
110
111
// and creating an issuance greater than the total supply.
111
- if total_issuance >= I96F32 :: from_num ( TotalSupply :: < T > :: get ( ) ) {
112
+ if total_issuance >= I96F32 :: saturating_from_num ( TotalSupply :: < T > :: get ( ) ) {
112
113
return Ok ( 0 ) ;
113
114
}
114
115
// Calculate the logarithmic residual of the issuance against half the total supply.
115
116
let residual: I96F32 = log2 (
116
- I96F32 :: from_num ( 1.0 )
117
+ I96F32 :: saturating_from_num ( 1.0 )
117
118
. checked_div (
118
- I96F32 :: from_num ( 1.0 )
119
+ I96F32 :: saturating_from_num ( 1.0 )
119
120
. checked_sub (
120
121
total_issuance
121
- . checked_div (
122
- I96F32 :: from_num ( 2.0 )
123
- . saturating_mul ( I96F32 :: from_num ( 10_500_000_000_000_000.0 ) ) ,
124
- )
122
+ . checked_div ( I96F32 :: saturating_from_num ( 2.0 ) . saturating_mul (
123
+ I96F32 :: saturating_from_num ( 10_500_000_000_000_000.0 ) ,
124
+ ) )
125
125
. ok_or ( "Logarithm calculation failed" ) ?,
126
126
)
127
127
. ok_or ( "Logarithm calculation failed" ) ?,
@@ -133,18 +133,19 @@ impl<T: Config> Pallet<T> {
133
133
let floored_residual: I96F32 = residual. floor ( ) ;
134
134
// Calculate the final emission rate using the floored residual.
135
135
// Convert floored_residual to an integer
136
- let floored_residual_int: u64 = floored_residual. to_num :: < u64 > ( ) ;
136
+ let floored_residual_int: u64 = floored_residual. saturating_to_num :: < u64 > ( ) ;
137
137
// Multiply 2.0 by itself floored_residual times to calculate the power of 2.
138
- let mut multiplier: I96F32 = I96F32 :: from_num ( 1.0 ) ;
138
+ let mut multiplier: I96F32 = I96F32 :: saturating_from_num ( 1.0 ) ;
139
139
for _ in 0 ..floored_residual_int {
140
- multiplier = multiplier. saturating_mul ( I96F32 :: from_num ( 2.0 ) ) ;
140
+ multiplier = multiplier. saturating_mul ( I96F32 :: saturating_from_num ( 2.0 ) ) ;
141
141
}
142
- 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) ;
143
144
// Calculate the actual emission based on the emission rate
144
145
let block_emission: I96F32 = block_emission_percentage
145
- . saturating_mul ( I96F32 :: from_num ( DefaultBlockEmission :: < T > :: get ( ) ) ) ;
146
+ . saturating_mul ( I96F32 :: saturating_from_num ( DefaultBlockEmission :: < T > :: get ( ) ) ) ;
146
147
// Convert to u64
147
- let block_emission_u64: u64 = block_emission. to_num :: < u64 > ( ) ;
148
+ let block_emission_u64: u64 = block_emission. saturating_to_num :: < u64 > ( ) ;
148
149
if BlockEmission :: < T > :: get ( ) != block_emission_u64 {
149
150
BlockEmission :: < T > :: put ( block_emission_u64) ;
150
151
}
0 commit comments