frequency_runtime/xcm/
reserve.rs

1use crate::xcm::parameters::{AssetHubLocation, NativeToken, RelayLocation};
2
3use frame_support::{
4	pallet_prelude::{Get, PhantomData},
5	parameter_types,
6	traits::ContainsPair,
7};
8use parachains_common::xcm_config::ConcreteAssetFromSystem;
9use staging_xcm::latest::prelude::*;
10use staging_xcm_builder::NativeAsset;
11
12parameter_types! {
13	pub ExceptAsset: (Location, AssetId) = (AssetHubLocation::get(), NativeToken::get());
14}
15/// Checks whether the asset originates from a given prefix location
16pub struct AssetFromExcept<T>(core::marker::PhantomData<T>);
17
18impl<T: frame_support::pallet_prelude::Get<(Location, AssetId)>> ContainsPair<Asset, Location>
19	for AssetFromExcept<T>
20{
21	fn contains(asset: &Asset, location: &Location) -> bool {
22		let (prefix, exclude_asset) = T::get();
23		location == &prefix && asset.id != exclude_asset
24	}
25}
26
27pub struct AssetPrefixFrom<Prefix, Origin>(PhantomData<(Prefix, Origin)>);
28impl<Prefix, Origin> ContainsPair<Asset, Location> for AssetPrefixFrom<Prefix, Origin>
29where
30	Prefix: Get<Location>,
31	Origin: Get<Location>,
32{
33	fn contains(asset: &Asset, origin: &Location) -> bool {
34		let loc = Origin::get();
35		&loc == origin &&
36			matches!(asset, Asset { id: AssetId(asset_loc), fun: Fungible(_a) }
37			if asset_loc.starts_with(&Prefix::get()))
38	}
39}
40
41type AssetsFrom<T> = AssetPrefixFrom<T, T>;
42
43/// Assets considered as reserve-based (e.g. DOT, native, system-registered)
44pub type TrustedReserves = (
45	NativeAsset,
46	ConcreteAssetFromSystem<RelayLocation>,
47	AssetsFrom<AssetHubLocation>,
48	AssetFromExcept<ExceptAsset>,
49);