Skip to content

Commit

Permalink
fix: 🐛 fix conversion calculation problem (#529)
Browse files Browse the repository at this point in the history
* fix: 🐛 fix conversion calculation problem

* fix: 🐛 fix
  • Loading branch information
yooml committed Apr 1, 2022
1 parent 919007b commit 4c34ddf
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 9 deletions.
17 changes: 15 additions & 2 deletions pallets/vstoken-conversion/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ use node_primitives::{CurrencyId, TokenSymbol};
use orml_traits::MultiCurrency;
pub use pallet::*;
pub use primitives::{VstokenConversionExchangeFee, VstokenConversionExchangeRate};
use sp_arithmetic::per_things::Percent;
pub use weights::WeightInfo;

#[allow(type_alias_bounds)]
Expand Down Expand Up @@ -265,11 +266,17 @@ pub mod pallet {
remaining_due_lease = 0i32
}
let exchange_rate = ExchangeRate::<T>::get(remaining_due_lease);
ensure!(
exchange_rate.vsksm_convert_to_vsbond != Percent::from_percent(0),
Error::<T>::CalculationOverflow
);

let exchange_fee = ExchangeFee::<T>::get();
let vsksm_balance = vsksm_amount
.checked_sub(&exchange_fee.vsksm_exchange_fee)
.ok_or(Error::<T>::CalculationOverflow)?;
let vsbond_balance = exchange_rate.vsksm_convert_to_vsbond * vsksm_balance;
let vsbond_balance =
exchange_rate.vsksm_convert_to_vsbond.saturating_reciprocal_mul(vsksm_balance);
ensure!(vsbond_balance >= minimum_vsbond, Error::<T>::NotEnoughBalance);

T::MultiCurrency::transfer(
Expand Down Expand Up @@ -409,11 +416,17 @@ pub mod pallet {
remaining_due_lease = 0i32
}
let exchange_rate = ExchangeRate::<T>::get(remaining_due_lease);
ensure!(
exchange_rate.vsdot_convert_to_vsbond != Percent::from_percent(0),
Error::<T>::CalculationOverflow
);

let exchange_fee = ExchangeFee::<T>::get();
let vsdot_balance = vsdot_amount
.checked_sub(&exchange_fee.vsdot_exchange_fee)
.ok_or(Error::<T>::CalculationOverflow)?;
let vsbond_balance = exchange_rate.vsdot_convert_to_vsbond * vsdot_balance;
let vsbond_balance =
exchange_rate.vsdot_convert_to_vsbond.saturating_reciprocal_mul(vsdot_balance);
ensure!(vsbond_balance >= minimum_vsbond, Error::<T>::NotEnoughBalance);

T::MultiCurrency::transfer(
Expand Down
18 changes: 11 additions & 7 deletions pallets/vstoken-conversion/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,16 @@ fn vsksm_convert_to_vsbond() {
vsdot_convert_to_vsbond: EXCHANGE_RATE_PERCENTAGE,
};
assert_ok!(VstokenConversion::set_kusama_lease(Origin::signed(ALICE), 1));
assert_ok!(VstokenConversion::set_exchange_rate(Origin::signed(ALICE), 8, EXCHANGE_RATE));
assert_eq!(VstokenConversion::exchange_rate(8), EXCHANGE_RATE);
assert_noop!(
VstokenConversion::vsksm_convert_to_vsbond(Some(BOB).into(), vsBond, 1000, 1),
Error::<Runtime>::NotEnoughBalance
);
assert_noop!(
VstokenConversion::vsksm_convert_to_vsbond(Some(BOB).into(), vsBond, 100, 1),
Error::<Runtime>::CalculationOverflow
);
assert_ok!(VstokenConversion::set_exchange_rate(Origin::signed(ALICE), 8, EXCHANGE_RATE));
assert_eq!(VstokenConversion::exchange_rate(8), EXCHANGE_RATE);
assert_noop!(
VstokenConversion::vsksm_convert_to_vsbond(Some(BOB).into(), vsBond, 100, 1),
orml_tokens::Error::<Runtime>::BalanceTooLow
Expand All @@ -60,11 +64,11 @@ fn vsksm_convert_to_vsbond() {
Error::<Runtime>::NotSupportTokenType
);
let vsbond_account: AccountId = <Runtime as Config>::VsbondAccount::get().into_account();
assert_ok!(<Tokens as MultiCurrency<AccountId>>::deposit(vsBond, &vsbond_account, 100));
assert_ok!(<Tokens as MultiCurrency<AccountId>>::deposit(vsBond, &vsbond_account, 10000));
assert_ok!(VstokenConversion::vsksm_convert_to_vsbond(Some(BOB).into(), vsBond, 100, 1));
assert_eq!(Tokens::free_balance(vsKSM, &BOB), 0);
assert_eq!(Tokens::free_balance(vsBond, &vsbond_account), 96);
assert_eq!(Tokens::free_balance(vsBond, &BOB), 104);
assert_eq!(Tokens::free_balance(vsBond, &vsbond_account), 8200);
assert_eq!(Tokens::free_balance(vsBond, &BOB), 1900);

assert_ok!(<Tokens as MultiCurrency<AccountId>>::deposit(vsKSM, &BOB, 1000));
pub const EXCHANGE_RATE_PERCENTAGE_0: Percent = Percent::from_percent(100);
Expand All @@ -78,8 +82,8 @@ fn vsksm_convert_to_vsbond() {
assert_ok!(VstokenConversion::set_exchange_rate(Origin::signed(ALICE), 0, EXCHANGE_RATE_0));
assert_ok!(VstokenConversion::vsksm_convert_to_vsbond(Some(BOB).into(), vsBond, 100, 1));
assert_eq!(Tokens::free_balance(vsKSM, &BOB), 900);
assert_eq!(Tokens::free_balance(vsBond, &vsbond_account), 6);
assert_eq!(Tokens::free_balance(vsBond, &BOB), 194);
assert_eq!(Tokens::free_balance(vsBond, &vsbond_account), 8110);
assert_eq!(Tokens::free_balance(vsBond, &BOB), 1990);
});
}

Expand Down

0 comments on commit 4c34ddf

Please sign in to comment.