@@ -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