--- a/js-packages/playgrounds/unique.xcm.ts +++ b/js-packages/playgrounds/unique.xcm.ts @@ -108,7 +108,7 @@ await this.helper.executeExtrinsic( signer, 'api.tx.foreignAssets.forceRegisterForeignAsset', - [assetId, this.helper.util.str2vec(name), tokenPrefix, mode], + [{V3: assetId}, this.helper.util.str2vec(name), tokenPrefix, mode], true, ); } --- a/pallets/foreign-assets/src/lib.rs +++ b/pallets/foreign-assets/src/lib.rs @@ -35,6 +35,7 @@ use staging_xcm::{ opaque::latest::{prelude::XcmError, Weight}, v3::{prelude::*, MultiAsset, XcmContext}, + VersionedAssetId, }; use staging_xcm_executor::{ traits::{ConvertLocation, Error as XcmExecutorError, TransactAsset, WeightTrader}, @@ -90,6 +91,9 @@ pub enum Error { /// The foreign asset is already registered. ForeignAssetAlreadyRegistered, + + /// The given asset ID could not be converted into the current XCM version. + BadForeignAssetId, } #[pallet::event] @@ -98,7 +102,7 @@ /// The foreign asset registered. ForeignAssetRegistered { collection_id: CollectionId, - asset_id: Box, + asset_id: Box, }, } @@ -147,15 +151,21 @@ #[pallet::weight(::WeightInfo::register_foreign_asset())] pub fn force_register_foreign_asset( origin: OriginFor, - asset_id: Box, + versioned_asset_id: Box, name: CollectionName, token_prefix: CollectionTokenPrefix, mode: ForeignCollectionMode, ) -> DispatchResult { T::ForceRegisterOrigin::ensure_origin(origin.clone())?; + let asset_id: AssetId = versioned_asset_id + .as_ref() + .clone() + .try_into() + .map_err(|()| Error::::BadForeignAssetId)?; + ensure!( - !>::contains_key(*asset_id), + !>::contains_key(asset_id), >::ForeignAssetAlreadyRegistered, ); @@ -179,12 +189,12 @@ }, )?; - >::insert(*asset_id, collection_id); - >::insert(collection_id, *asset_id); + >::insert(asset_id, collection_id); + >::insert(collection_id, asset_id); Self::deposit_event(Event::::ForeignAssetRegistered { collection_id, - asset_id, + asset_id: versioned_asset_id, }); Ok(())