Skip to content

Commit

Permalink
Improved precision converter (#74)
Browse files Browse the repository at this point in the history
* Improved precision converter

* Update trait doc
  • Loading branch information
vovac12 authored Feb 5, 2024
1 parent 2f56528 commit 82260be
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 21 deletions.
13 changes: 7 additions & 6 deletions pallets/parachain-app/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -281,8 +281,9 @@ pub mod pallet {

let precision = SidechainPrecision::<T>::get(network_id, &asset_id)
.ok_or(Error::<T>::UnknownPrecision)?;
let amount = T::BalancePrecisionConverter::from_sidechain(&asset_id, precision, amount)
.ok_or(Error::<T>::WrongAmount)?;
let (amount, _) =
T::BalancePrecisionConverter::from_sidechain(&asset_id, precision, amount)
.ok_or(Error::<T>::WrongAmount)?;
ensure!(amount > Zero::zero(), Error::<T>::WrongAmount);

T::BridgeAssetLocker::unlock_asset(
Expand Down Expand Up @@ -366,7 +367,7 @@ pub mod pallet {

let sidechain_precision = T::AssetRegistry::get_raw_info(asset_id.clone()).precision;

let minimal_xcm_amount = T::BalancePrecisionConverter::to_sidechain(
let (_, minimal_xcm_amount) = T::BalancePrecisionConverter::to_sidechain(
&asset_id,
sidechain_precision,
minimal_xcm_amount,
Expand Down Expand Up @@ -403,7 +404,7 @@ pub mod pallet {
ensure_root(origin)?;

let asset_id = T::AssetRegistry::register_asset(network_id.into(), name, symbol)?;
let minimal_xcm_amount =
let (_, minimal_xcm_amount) =
T::BalancePrecisionConverter::to_sidechain(&asset_id, decimals, minimal_xcm_amount)
.ok_or(Error::<T>::WrongAmount)?;

Expand Down Expand Up @@ -500,7 +501,7 @@ pub mod pallet {
fail!(Error::<T>::UnknownPrecision);
};

let minimal_xcm_amount = T::BalancePrecisionConverter::to_sidechain(
let (_, minimal_xcm_amount) = T::BalancePrecisionConverter::to_sidechain(
&asset_id,
sidechain_precision,
minimal_xcm_amount,
Expand Down Expand Up @@ -588,7 +589,7 @@ pub mod pallet {
let precision = SidechainPrecision::<T>::get(network_id, &asset_id)
.ok_or(Error::<T>::UnknownPrecision)?;

let sidechain_amount =
let (amount, sidechain_amount) =
T::BalancePrecisionConverter::to_sidechain(&asset_id, precision, amount.clone())
.ok_or(Error::<T>::WrongAmount)?;

Expand Down
12 changes: 6 additions & 6 deletions pallets/parachain-app/src/mock.rs
Original file line number Diff line number Diff line change
Expand Up @@ -298,23 +298,23 @@ impl BalancePrecisionConverter<AssetId, Balance, Balance> for BalancePrecisionCo
asset_id: &AssetId,
_sidechain_precision: u8,
amount: Balance,
) -> Option<Balance> {
) -> Option<(Balance, Balance)> {
if matches!(asset_id, AssetId::Custom(_)) {
Some(amount)
Some((amount, amount))
} else {
Some(amount * 10)
Some((amount, amount * 10))
}
}

fn from_sidechain(
asset_id: &AssetId,
_sidechain_precision: u8,
amount: Balance,
) -> Option<Balance> {
) -> Option<(Balance, Balance)> {
if matches!(asset_id, AssetId::Custom(_)) {
Some(amount)
Some((amount, amount))
} else {
Some(amount / 10)
Some((amount / 10, amount))
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion pallets/parachain-app/src/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ fn it_works_mint() {
recipient.clone(),
amount
));
let sidechain_amount =
let (_, sidechain_amount) =
BalancePrecisionConverterImpl::from_sidechain(&AssetId::Custom(1), 0, amount).unwrap();
assert_eq!(
Currencies::total_balance(asset_id, &recipient),
Expand Down
33 changes: 25 additions & 8 deletions pallets/types/src/traits.rs
Original file line number Diff line number Diff line change
Expand Up @@ -358,35 +358,52 @@ impl AuxiliaryDigestHandler for () {
fn add_item(_item: AuxiliaryDigestItem) {}
}

/// Converter trait for Balance precision in different networks.
pub trait BalancePrecisionConverter<AssetId, Balance, SidechainBalance> {
/// Convert thischain balance to sidechain balance.
///
/// **Returns**
/// * `Balance` - rounded thischain balance
/// * `SidechainBalance` - converted sidechain balance
///
/// Or
/// * `None` - if thischain balance can't be converted to sidechain balance
fn to_sidechain(
asset_id: &AssetId,
sidechain_precision: u8,
amount: Balance,
) -> Option<SidechainBalance>;

) -> Option<(Balance, SidechainBalance)>;

/// Convert sidechain balance to thischain balance.
///
/// **Returns**
/// * `Balance` - rounded thischain balance
/// * `SidechainBalance` - converted sidechain balance
///
/// Or
/// * `None` - if sidechain balance can't be converted to thischain balance
fn from_sidechain(
asset_id: &AssetId,
sidechain_precision: u8,
amount: SidechainBalance,
) -> Option<Balance>;
) -> Option<(Balance, SidechainBalance)>;
}

impl<AssetId, Balance> BalancePrecisionConverter<AssetId, Balance, Balance> for () {
impl<AssetId, Balance: Clone> BalancePrecisionConverter<AssetId, Balance, Balance> for () {
fn to_sidechain(
_asset_id: &AssetId,
_sidechain_precision: u8,
amount: Balance,
) -> Option<Balance> {
Some(amount)
) -> Option<(Balance, Balance)> {
Some((amount.clone(), amount))
}

fn from_sidechain(
_asset_id: &AssetId,
_sidechain_precision: u8,
amount: Balance,
) -> Option<Balance> {
Some(amount)
) -> Option<(Balance, Balance)> {
Some((amount.clone(), amount))
}
}

Expand Down

0 comments on commit 82260be

Please sign in to comment.