Skip to content

Commit

Permalink
fixed merge and warnings
Browse files Browse the repository at this point in the history
Signed-off-by: Dzmitry Lahoda <dzmitry@lahoda.pro>
  • Loading branch information
dzmitry-lahoda committed Jan 5, 2022
1 parent e4a058c commit 87fa7ce
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 21 deletions.
44 changes: 23 additions & 21 deletions frame/composable-traits/src/lending/math.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ pub fn calc_utilization_ratio(
let utilization_ratio = borrows
.checked_div(&total)
.expect("above checks prove it cannot error")
.checked_mul_int(100u16)
.unwrap()
.checked_mul_int(100_u16)
.ok_or(ArithmeticError::Overflow)?
.try_into()
.unwrap();
.map_err(|_| ArithmeticError::Overflow)?;
Ok(Percent::from_percent(utilization_ratio))
}

Expand All @@ -74,7 +74,7 @@ impl Default for InterestRateModel {
Rate::saturating_from_rational(32, 100),
Percent::from_percent(80),
)
.unwrap()
.expect("default model is valid")
}
}

Expand Down Expand Up @@ -279,8 +279,8 @@ impl DynamicPIDControllerModel {
utilization_ratio: FixedU128,
) -> Result<Rate, ArithmeticError> {
// compute error term `et = uo - ut`
let et: i128 = self.target_utilization.into_inner().try_into().unwrap_or(0i128) -
utilization_ratio.into_inner().try_into().unwrap_or(0i128);
let et: i128 = self.target_utilization.into_inner().try_into().unwrap_or(0_i128) -
utilization_ratio.into_inner().try_into().unwrap_or(0_i128);
let et: FixedI128 = FixedI128::from_inner(et);
// compute proportional term `pt = kp * et`
let pt = self.proportional_parameter.checked_mul(&et).ok_or(ArithmeticError::Overflow)?;
Expand All @@ -304,13 +304,13 @@ impl DynamicPIDControllerModel {
// update interest_rate `ir = ir_t_1 + ut`
if ut.is_negative() {
let ut = ut.neg();
self.previous_interest_rate = self
.previous_interest_rate
.saturating_sub(FixedU128::from_inner(ut.into_inner().try_into().unwrap_or(0u128)));
self.previous_interest_rate = self.previous_interest_rate.saturating_sub(
FixedU128::from_inner(ut.into_inner().try_into().unwrap_or(0_u128)),
);
} else {
self.previous_interest_rate = self
.previous_interest_rate
.saturating_add(FixedU128::from_inner(ut.into_inner().try_into().unwrap_or(0u128)));
self.previous_interest_rate = self.previous_interest_rate.saturating_add(
FixedU128::from_inner(ut.into_inner().try_into().unwrap_or(0_u128)),
);
}

Ok(self.previous_interest_rate)
Expand Down Expand Up @@ -350,7 +350,7 @@ const EXPECTED_COEFFICIENTS_SUM: u16 = 100;

/// The double exponent interest rate model
/// Interest based on a polynomial of the utilization of the market.
/// Interest = C_0 + C_1 * U^(2^0) + C_2 * U^(2^1) + C_3 * U^(2^2) ...
/// Interest = C_0 + C_1 * U^(2^2) + C_2 * U^(2^4) + C_3 * U^(2^8) ...
/// For reference check https://github.com/dydxprotocol/solo/blob/master/contracts/external/interestsetters/DoubleExponentInterestSetter.sol
/// https://web.archive.org/web/20210518033618/https://help.dydx.exchange/en/articles/2924246-how-do-interest-rates-work
#[cfg_attr(feature = "std", derive(serde::Deserialize, serde::Serialize))]
Expand All @@ -362,7 +362,7 @@ pub struct DoubleExponentModel {
impl DoubleExponentModel {
/// Create a double exponent model
pub fn new(coefficients: [u8; 16]) -> Option<Self> {
let sum_of_coefficients = coefficients.iter().fold(0u16, |acc, &c| acc + c as u16);
let sum_of_coefficients = coefficients.iter().fold(0_u16, |acc, &c| acc + c as u16);
if sum_of_coefficients == EXPECTED_COEFFICIENTS_SUM {
return Some(DoubleExponentModel { coefficients })
}
Expand All @@ -372,13 +372,15 @@ impl DoubleExponentModel {

impl InterestRate for DoubleExponentModel {
fn get_borrow_rate(&mut self, utilization: Percent) -> Option<Rate> {
// as per model
let mut polynomial: FixedU128 = utilization.into();
let mut result = FixedU128::saturating_from_integer(self.coefficients[0]);
for i in 1..self.coefficients.len() {
result = result + FixedU128::saturating_from_integer(self.coefficients[i]) * polynomial;
polynomial = polynomial * polynomial;
}
let polynomial: FixedU128 = utilization.into();
let (result, _) = self.coefficients.iter().skip(1).fold(
(FixedU128::saturating_from_integer(self.coefficients[0]), polynomial),
|(rate, polynomial), element| {
let polynomial = polynomial * polynomial;
let rate = rate + FixedU128::saturating_from_integer(*element) * polynomial;
(rate, polynomial)
},
);
let maximal = FixedU128::saturating_from_integer(EXPECTED_COEFFICIENTS_SUM);
Some(result / maximal)
}
Expand Down
1 change: 1 addition & 0 deletions frame/composable-traits/src/lending/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -276,6 +276,7 @@ fn curve_model_plotter() {
#[test]
fn dynamic_pid_model_plotter() {
use plotters::prelude::*;
use sp_runtime::FixedI128;
let proportional_parameter = FixedI128::saturating_from_rational(40, 100);
let integral_parameter = FixedI128::saturating_from_rational(50, 100);
let derivative_parameter = FixedI128::saturating_from_rational(30, 100);
Expand Down

0 comments on commit 87fa7ce

Please sign in to comment.