xcm_primitives/
asset_id_conversions.rs1use sp_runtime::traits::MaybeEquivalence;
18use sp_std::marker::PhantomData;
19use xcm::{v3::Location, IntoVersion};
20use xcm_executor::traits::ConvertLocation;
21
22pub struct AsAssetType<AssetId, AssetType, AssetIdInfoGetter>(
28 PhantomData<(AssetId, AssetType, AssetIdInfoGetter)>,
29);
30impl<AssetId, AssetType, AssetIdInfoGetter> MaybeEquivalence<Location, AssetId>
31 for AsAssetType<AssetId, AssetType, AssetIdInfoGetter>
32where
33 AssetId: Clone,
34 AssetType: From<Location> + Into<Option<Location>> + Clone,
35 AssetIdInfoGetter: AssetTypeGetter<AssetId, AssetType>,
36{
37 fn convert(id: &Location) -> Option<AssetId> {
38 AssetIdInfoGetter::get_asset_id(id.clone().into())
39 }
40 fn convert_back(what: &AssetId) -> Option<Location> {
41 AssetIdInfoGetter::get_asset_type(what.clone()).and_then(Into::into)
42 }
43}
44impl<AssetId, AssetType, AssetIdInfoGetter> MaybeEquivalence<xcm::v5::Location, AssetId>
45 for AsAssetType<AssetId, AssetType, AssetIdInfoGetter>
46where
47 AssetId: Clone,
48 AssetType: From<Location> + Into<Option<Location>> + Clone,
49 AssetIdInfoGetter: AssetTypeGetter<AssetId, AssetType>,
50{
51 fn convert(id: &xcm::v5::Location) -> Option<AssetId> {
52 match xcm::VersionedLocation::V5(id.clone()).into_version(xcm::v3::VERSION) {
53 Ok(xcm::VersionedLocation::V3(loc)) => AssetIdInfoGetter::get_asset_id(loc.into()),
54 _ => None,
56 }
57 }
58
59 fn convert_back(what: &AssetId) -> Option<xcm::v5::Location> {
60 let v3_location: Location =
61 AssetIdInfoGetter::get_asset_type(what.clone()).and_then(Into::into)?;
62
63 let versioned = xcm::VersionedLocation::V3(v3_location);
65 match versioned.into_version(xcm::latest::VERSION) {
66 Ok(xcm::VersionedLocation::V5(loc)) => Some(loc),
67 _ => None,
68 }
69 }
70}
71impl<AssetId, AssetType, AssetIdInfoGetter> ConvertLocation<AssetId>
72 for AsAssetType<AssetId, AssetType, AssetIdInfoGetter>
73where
74 AssetId: Clone,
75 AssetType: From<Location> + Into<Option<Location>> + Clone,
76 AssetIdInfoGetter: AssetTypeGetter<AssetId, AssetType>,
77{
78 fn convert_location(id: &xcm::v5::Location) -> Option<AssetId> {
79 Self::convert(id)
81 }
82}
83
84pub trait AssetTypeGetter<AssetId, AssetType> {
86 fn get_asset_type(asset_id: AssetId) -> Option<AssetType>;
88
89 fn get_asset_id(asset_type: AssetType) -> Option<AssetId>;
91}
92
93pub trait AccountIdToCurrencyId<Account, CurrencyId> {
96 fn account_to_currency_id(account: Account) -> Option<CurrencyId>;
98}