Skip to content

Commit 86191d8

Browse files
committed
feat: xtokens non-fungible multiassets support PoC
1 parent b45942e commit 86191d8

File tree

1 file changed

+28
-14
lines changed

1 file changed

+28
-14
lines changed

xtokens/src/lib.rs

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -526,25 +526,39 @@ pub mod module {
526526
let asset_len = assets.len();
527527
for i in 0..asset_len {
528528
let asset = assets.get(i).ok_or(Error::<T>::AssetIndexNonExistent)?;
529-
ensure!(
530-
matches!(asset.fun, Fungibility::Fungible(x) if !x.is_zero()),
531-
Error::<T>::InvalidAsset
532-
);
533-
// `assets` includes fee, the reserve location is decided by non fee asset
534-
if (fee != *asset && non_fee_reserve.is_none()) || asset_len == 1 {
535-
non_fee_reserve = T::ReserveProvider::reserve(asset);
536-
}
537-
// make sure all non fee assets share the same reserve
538-
if non_fee_reserve.is_some() {
529+
530+
if fee == *asset {
531+
// Fee payment can only be made by using fungibles
539532
ensure!(
540-
non_fee_reserve == T::ReserveProvider::reserve(asset),
541-
Error::<T>::DistinctReserveForAssetAndFee
533+
matches!(asset.fun, Fungibility::Fungible(x) if !x.is_zero()),
534+
Error::<T>::InvalidAsset
542535
);
536+
} else {
537+
match asset.fun {
538+
Fungibility::Fungible(x) => ensure!(!x.is_zero(), Error::<T>::InvalidAsset),
539+
Fungibility::NonFungible(AssetInstance::Undefined) => {
540+
return Err(Error::<T>::InvalidAsset.into())
541+
}
542+
_ => {}
543+
}
544+
545+
// `assets` includes fee, the reserve location is decided by non fee asset
546+
if non_fee_reserve.is_none() {
547+
non_fee_reserve = T::ReserveProvider::reserve(asset);
548+
}
549+
550+
// make sure all non fee assets share the same reserve
551+
if non_fee_reserve.is_some() {
552+
ensure!(
553+
non_fee_reserve == T::ReserveProvider::reserve(asset),
554+
Error::<T>::DistinctReserveForAssetAndFee
555+
);
556+
}
543557
}
544558
}
545559

546560
let fee_reserve = T::ReserveProvider::reserve(&fee);
547-
if fee_reserve != non_fee_reserve {
561+
if asset_len > 1 && fee_reserve != non_fee_reserve {
548562
// Current only support `ToReserve` with relay-chain asset as fee. other case
549563
// like `NonReserve` or `SelfReserve` with relay-chain fee is not support.
550564
ensure!(non_fee_reserve == dest.chain_part(), Error::<T>::InvalidAsset);
@@ -610,7 +624,7 @@ pub mod module {
610624
origin_location,
611625
assets.clone(),
612626
fee.clone(),
613-
non_fee_reserve,
627+
fee_reserve,
614628
&dest,
615629
None,
616630
dest_weight_limit,

0 commit comments

Comments
 (0)