mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 09:21:04 +00:00
Add Foreign Assets to Statemint (#2540)
* add foreign assets to statemint * make review changes * two dots --------- Co-authored-by: parity-processbot <>
This commit is contained in:
@@ -112,9 +112,9 @@ pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConverte
|
|||||||
(
|
(
|
||||||
// Ignore `TrustBackedAssets` explicitly
|
// Ignore `TrustBackedAssets` explicitly
|
||||||
StartsWith<TrustBackedAssetsPalletLocation>,
|
StartsWith<TrustBackedAssetsPalletLocation>,
|
||||||
// Ignore asset which starts explicitly with our `GlobalConsensus(NetworkId)`, means:
|
// Ignore assets that start explicitly with our `GlobalConsensus(NetworkId)`, means:
|
||||||
// - foreign assets from our consensus should be: `MultiLocation {parent: 1, X*(Parachain(xyz))}
|
// - foreign assets from our consensus should be: `MultiLocation {parents: 1, X*(Parachain(xyz), ..)}`
|
||||||
// - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` wont be accepted here
|
// - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` won't be accepted here
|
||||||
StartsWithExplicitGlobalConsensus<UniversalLocationNetworkId>,
|
StartsWithExplicitGlobalConsensus<UniversalLocationNetworkId>,
|
||||||
),
|
),
|
||||||
Balance,
|
Balance,
|
||||||
@@ -491,9 +491,7 @@ pub type ForeignCreatorsSovereignAccountOf = (
|
|||||||
/// Simple conversion of `u32` into an `AssetId` for use in benchmarking.
|
/// Simple conversion of `u32` into an `AssetId` for use in benchmarking.
|
||||||
pub struct XcmBenchmarkHelper;
|
pub struct XcmBenchmarkHelper;
|
||||||
#[cfg(feature = "runtime-benchmarks")]
|
#[cfg(feature = "runtime-benchmarks")]
|
||||||
use pallet_assets::BenchmarkHelper;
|
impl pallet_assets::BenchmarkHelper<MultiLocation> for XcmBenchmarkHelper {
|
||||||
#[cfg(feature = "runtime-benchmarks")]
|
|
||||||
impl BenchmarkHelper<MultiLocation> for XcmBenchmarkHelper {
|
|
||||||
fn create_asset_id_parameter(id: u32) -> MultiLocation {
|
fn create_asset_id_parameter(id: u32) -> MultiLocation {
|
||||||
MultiLocation { parents: 1, interior: X1(Parachain(id)) }
|
MultiLocation { parents: 1, interior: X1(Parachain(id)) }
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -57,6 +57,9 @@ pub mod constants;
|
|||||||
mod weights;
|
mod weights;
|
||||||
pub mod xcm_config;
|
pub mod xcm_config;
|
||||||
|
|
||||||
|
use assets_common::{
|
||||||
|
foreign_creators::ForeignCreators, matching::FromSiblingParachain, MultiLocationForAssetId,
|
||||||
|
};
|
||||||
use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases;
|
use cumulus_pallet_parachain_system::RelayNumberStrictlyIncreases;
|
||||||
use sp_api::impl_runtime_apis;
|
use sp_api::impl_runtime_apis;
|
||||||
use sp_core::{crypto::KeyTypeId, OpaqueMetadata};
|
use sp_core::{crypto::KeyTypeId, OpaqueMetadata};
|
||||||
@@ -95,8 +98,8 @@ use parachains_common::{
|
|||||||
MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION,
|
MAXIMUM_BLOCK_WEIGHT, NORMAL_DISPATCH_RATIO, SLOT_DURATION,
|
||||||
};
|
};
|
||||||
use xcm_config::{
|
use xcm_config::{
|
||||||
DotLocation, FellowshipLocation, GovernanceLocation, TrustBackedAssetsConvertedConcreteId,
|
DotLocation, FellowshipLocation, ForeignAssetsConvertedConcreteId, GovernanceLocation,
|
||||||
XcmConfig, XcmOriginToTransactDispatchOrigin,
|
TrustBackedAssetsConvertedConcreteId, XcmConfig, XcmOriginToTransactDispatchOrigin,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(any(feature = "std", test))]
|
#[cfg(any(feature = "std", test))]
|
||||||
@@ -108,6 +111,7 @@ use polkadot_runtime_common::{BlockHashCount, SlowAdjustingFeeUpdate};
|
|||||||
use xcm::latest::BodyId;
|
use xcm::latest::BodyId;
|
||||||
use xcm_executor::XcmExecutor;
|
use xcm_executor::XcmExecutor;
|
||||||
|
|
||||||
|
use crate::xcm_config::ForeignCreatorsSovereignAccountOf;
|
||||||
use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight};
|
use weights::{BlockExecutionWeight, ExtrinsicBaseWeight, RocksDbWeight};
|
||||||
|
|
||||||
impl_opaque_keys! {
|
impl_opaque_keys! {
|
||||||
@@ -279,6 +283,48 @@ impl pallet_assets::Config<TrustBackedAssetsInstance> for Runtime {
|
|||||||
type BenchmarkHelper = ();
|
type BenchmarkHelper = ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
parameter_types! {
|
||||||
|
// we just reuse the same deposits
|
||||||
|
pub const ForeignAssetsAssetDeposit: Balance = AssetDeposit::get();
|
||||||
|
pub const ForeignAssetsAssetAccountDeposit: Balance = AssetAccountDeposit::get();
|
||||||
|
pub const ForeignAssetsApprovalDeposit: Balance = ApprovalDeposit::get();
|
||||||
|
pub const ForeignAssetsAssetsStringLimit: u32 = AssetsStringLimit::get();
|
||||||
|
pub const ForeignAssetsMetadataDepositBase: Balance = MetadataDepositBase::get();
|
||||||
|
pub const ForeignAssetsMetadataDepositPerByte: Balance = MetadataDepositPerByte::get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Assets managed by some foreign location. Note: we do not declare a `ForeignAssetsCall` type, as
|
||||||
|
/// this type is used in proxy definitions. We assume that a foreign location would not want to set
|
||||||
|
/// an individual, local account as a proxy for the issuance of their assets. This issuance should
|
||||||
|
/// be managed by the foreign location's governance.
|
||||||
|
pub type ForeignAssetsInstance = pallet_assets::Instance2;
|
||||||
|
impl pallet_assets::Config<ForeignAssetsInstance> for Runtime {
|
||||||
|
type RuntimeEvent = RuntimeEvent;
|
||||||
|
type Balance = Balance;
|
||||||
|
type AssetId = MultiLocationForAssetId;
|
||||||
|
type AssetIdParameter = MultiLocationForAssetId;
|
||||||
|
type Currency = Balances;
|
||||||
|
type CreateOrigin = ForeignCreators<
|
||||||
|
(FromSiblingParachain<parachain_info::Pallet<Runtime>>,),
|
||||||
|
ForeignCreatorsSovereignAccountOf,
|
||||||
|
AccountId,
|
||||||
|
>;
|
||||||
|
type ForceOrigin = AssetsForceOrigin;
|
||||||
|
type AssetDeposit = ForeignAssetsAssetDeposit;
|
||||||
|
type MetadataDepositBase = ForeignAssetsMetadataDepositBase;
|
||||||
|
type MetadataDepositPerByte = ForeignAssetsMetadataDepositPerByte;
|
||||||
|
type ApprovalDeposit = ForeignAssetsApprovalDeposit;
|
||||||
|
type StringLimit = ForeignAssetsAssetsStringLimit;
|
||||||
|
type Freezer = ();
|
||||||
|
type Extra = ();
|
||||||
|
type WeightInfo = weights::pallet_assets::WeightInfo<Runtime>;
|
||||||
|
type CallbackHandle = ();
|
||||||
|
type AssetAccountDeposit = ForeignAssetsAssetAccountDeposit;
|
||||||
|
type RemoveItemsLimit = frame_support::traits::ConstU32<1000>;
|
||||||
|
#[cfg(feature = "runtime-benchmarks")]
|
||||||
|
type BenchmarkHelper = xcm_config::XcmBenchmarkHelper;
|
||||||
|
}
|
||||||
|
|
||||||
parameter_types! {
|
parameter_types! {
|
||||||
// One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes.
|
// One storage item; key size is 32; value is size 4+4+16+32 bytes = 56 bytes.
|
||||||
pub const DepositBase: Balance = deposit(1, 88);
|
pub const DepositBase: Balance = deposit(1, 88);
|
||||||
@@ -704,6 +750,7 @@ construct_runtime!(
|
|||||||
Assets: pallet_assets::<Instance1>::{Pallet, Call, Storage, Event<T>} = 50,
|
Assets: pallet_assets::<Instance1>::{Pallet, Call, Storage, Event<T>} = 50,
|
||||||
Uniques: pallet_uniques::{Pallet, Call, Storage, Event<T>} = 51,
|
Uniques: pallet_uniques::{Pallet, Call, Storage, Event<T>} = 51,
|
||||||
Nfts: pallet_nfts::{Pallet, Call, Storage, Event<T>} = 52,
|
Nfts: pallet_nfts::{Pallet, Call, Storage, Event<T>} = 52,
|
||||||
|
ForeignAssets: pallet_assets::<Instance2>::{Pallet, Call, Storage, Event<T>} = 53,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -753,6 +800,7 @@ mod benches {
|
|||||||
define_benchmarks!(
|
define_benchmarks!(
|
||||||
[frame_system, SystemBench::<Runtime>]
|
[frame_system, SystemBench::<Runtime>]
|
||||||
[pallet_assets, Assets]
|
[pallet_assets, Assets]
|
||||||
|
[pallet_assets, ForeignAssets]
|
||||||
[pallet_balances, Balances]
|
[pallet_balances, Balances]
|
||||||
[pallet_multisig, Multisig]
|
[pallet_multisig, Multisig]
|
||||||
[pallet_nfts, Nfts]
|
[pallet_nfts, Nfts]
|
||||||
@@ -928,11 +976,17 @@ impl_runtime_apis! {
|
|||||||
},
|
},
|
||||||
// collect pallet_assets (TrustBackedAssets)
|
// collect pallet_assets (TrustBackedAssets)
|
||||||
convert::<_, _, _, _, TrustBackedAssetsConvertedConcreteId>(
|
convert::<_, _, _, _, TrustBackedAssetsConvertedConcreteId>(
|
||||||
Assets::account_balances(account)
|
Assets::account_balances(account.clone())
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|(_, balance)| balance > &0)
|
.filter(|(_, balance)| balance > &0)
|
||||||
)?,
|
)?,
|
||||||
// collect ... e.g. pallet_assets ForeignAssets
|
// collect pallet_assets (ForeignAssets)
|
||||||
|
convert::<_, _, _, _, ForeignAssetsConvertedConcreteId>(
|
||||||
|
ForeignAssets::account_balances(account)
|
||||||
|
.iter()
|
||||||
|
.filter(|(_, balance)| balance > &0)
|
||||||
|
)?,
|
||||||
|
// collect ... e.g. other tokens
|
||||||
].concat().into())
|
].concat().into())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,10 +14,13 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
use super::{
|
use super::{
|
||||||
AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ParachainInfo,
|
AccountId, AllPalletsWithSystem, Assets, Authorship, Balance, Balances, ForeignAssets,
|
||||||
ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin,
|
ParachainInfo, ParachainSystem, PolkadotXcm, Runtime, RuntimeCall, RuntimeEvent, RuntimeOrigin,
|
||||||
TrustBackedAssetsInstance, WeightToFee, XcmpQueue,
|
TrustBackedAssetsInstance, WeightToFee, XcmpQueue,
|
||||||
};
|
};
|
||||||
|
use assets_common::matching::{
|
||||||
|
FromSiblingParachain, IsForeignConcreteAsset, StartsWith, StartsWithExplicitGlobalConsensus,
|
||||||
|
};
|
||||||
use frame_support::{
|
use frame_support::{
|
||||||
match_types, parameter_types,
|
match_types, parameter_types,
|
||||||
traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess},
|
traits::{ConstU32, Contains, Everything, Nothing, PalletInfoAccess},
|
||||||
@@ -36,8 +39,8 @@ use xcm::latest::prelude::*;
|
|||||||
use xcm_builder::{
|
use xcm_builder::{
|
||||||
AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses,
|
AccountId32Aliases, AllowExplicitUnpaidExecutionFrom, AllowKnownQueryResponses,
|
||||||
AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin,
|
AllowSubscriptionsFrom, AllowTopLevelPaidExecutionFrom, CurrencyAdapter, EnsureXcmOrigin,
|
||||||
FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, ParentAsSuperuser, ParentIsPreset,
|
FungiblesAdapter, IsConcrete, LocalMint, NativeAsset, NoChecking, ParentAsSuperuser,
|
||||||
RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,
|
ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative, SiblingParachainConvertsVia,
|
||||||
SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,
|
SignedAccountId32AsNative, SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit,
|
||||||
UsingComponents, WeightInfoBounds, WithComputedOrigin,
|
UsingComponents, WeightInfoBounds, WithComputedOrigin,
|
||||||
};
|
};
|
||||||
@@ -49,6 +52,7 @@ parameter_types! {
|
|||||||
pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into();
|
pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into();
|
||||||
pub UniversalLocation: InteriorMultiLocation =
|
pub UniversalLocation: InteriorMultiLocation =
|
||||||
X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into()));
|
X2(GlobalConsensus(RelayNetwork::get().unwrap()), Parachain(ParachainInfo::parachain_id().into()));
|
||||||
|
pub UniversalLocationNetworkId: NetworkId = UniversalLocation::get().global_consensus().unwrap();
|
||||||
pub TrustBackedAssetsPalletLocation: MultiLocation =
|
pub TrustBackedAssetsPalletLocation: MultiLocation =
|
||||||
PalletInstance(<Assets as PalletInfoAccess>::index() as u8).into();
|
PalletInstance(<Assets as PalletInfoAccess>::index() as u8).into();
|
||||||
pub CheckingAccount: AccountId = PolkadotXcm::check_account();
|
pub CheckingAccount: AccountId = PolkadotXcm::check_account();
|
||||||
@@ -102,8 +106,38 @@ pub type FungiblesTransactor = FungiblesAdapter<
|
|||||||
// The account to use for tracking teleports.
|
// The account to use for tracking teleports.
|
||||||
CheckingAccount,
|
CheckingAccount,
|
||||||
>;
|
>;
|
||||||
|
|
||||||
|
/// `AssetId/Balance` converter for `TrustBackedAssets`
|
||||||
|
pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConvertedConcreteId<
|
||||||
|
(
|
||||||
|
// Ignore `TrustBackedAssets` explicitly
|
||||||
|
StartsWith<TrustBackedAssetsPalletLocation>,
|
||||||
|
// Ignore assets that start explicitly with our `GlobalConsensus(NetworkId)`, means:
|
||||||
|
// - foreign assets from our consensus should be: `MultiLocation {parents: 1, X*(Parachain(xyz), ..)}`
|
||||||
|
// - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` won't be accepted here
|
||||||
|
StartsWithExplicitGlobalConsensus<UniversalLocationNetworkId>,
|
||||||
|
),
|
||||||
|
Balance,
|
||||||
|
>;
|
||||||
|
|
||||||
|
/// Means for transacting foreign assets from different global consensus.
|
||||||
|
pub type ForeignFungiblesTransactor = FungiblesAdapter<
|
||||||
|
// Use this fungibles implementation:
|
||||||
|
ForeignAssets,
|
||||||
|
// Use this currency when it is a fungible asset matching the given location or name:
|
||||||
|
ForeignAssetsConvertedConcreteId,
|
||||||
|
// Convert an XCM MultiLocation into a local account id:
|
||||||
|
LocationToAccountId,
|
||||||
|
// Our chain's account ID type (we can't get away without mentioning it explicitly):
|
||||||
|
AccountId,
|
||||||
|
// We dont need to check teleports here.
|
||||||
|
NoChecking,
|
||||||
|
// The account to use for tracking teleports.
|
||||||
|
CheckingAccount,
|
||||||
|
>;
|
||||||
|
|
||||||
/// Means for transacting assets on this chain.
|
/// Means for transacting assets on this chain.
|
||||||
pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor);
|
pub type AssetTransactors = (CurrencyTransactor, FungiblesTransactor, ForeignFungiblesTransactor);
|
||||||
|
|
||||||
/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance,
|
/// This is the type we use to convert an (incoming) XCM origin into a local `Origin` instance,
|
||||||
/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can
|
/// ready for dispatching a transaction with Xcm's `Transact`. There is an `OriginKind` which can
|
||||||
@@ -205,6 +239,7 @@ impl Contains<RuntimeCall> for SafeCallFilter {
|
|||||||
pallet_assets::Call::thaw_asset { .. } |
|
pallet_assets::Call::thaw_asset { .. } |
|
||||||
pallet_assets::Call::transfer_ownership { .. } |
|
pallet_assets::Call::transfer_ownership { .. } |
|
||||||
pallet_assets::Call::set_team { .. } |
|
pallet_assets::Call::set_team { .. } |
|
||||||
|
pallet_assets::Call::set_metadata { .. } |
|
||||||
pallet_assets::Call::clear_metadata { .. } |
|
pallet_assets::Call::clear_metadata { .. } |
|
||||||
pallet_assets::Call::force_clear_metadata { .. } |
|
pallet_assets::Call::force_clear_metadata { .. } |
|
||||||
pallet_assets::Call::force_asset_status { .. } |
|
pallet_assets::Call::force_asset_status { .. } |
|
||||||
@@ -214,7 +249,35 @@ impl Contains<RuntimeCall> for SafeCallFilter {
|
|||||||
pallet_assets::Call::transfer_approved { .. } |
|
pallet_assets::Call::transfer_approved { .. } |
|
||||||
pallet_assets::Call::touch { .. } |
|
pallet_assets::Call::touch { .. } |
|
||||||
pallet_assets::Call::refund { .. },
|
pallet_assets::Call::refund { .. },
|
||||||
) | RuntimeCall::Nfts(
|
) | RuntimeCall::ForeignAssets(
|
||||||
|
pallet_assets::Call::create { .. } |
|
||||||
|
pallet_assets::Call::force_create { .. } |
|
||||||
|
pallet_assets::Call::start_destroy { .. } |
|
||||||
|
pallet_assets::Call::destroy_accounts { .. } |
|
||||||
|
pallet_assets::Call::destroy_approvals { .. } |
|
||||||
|
pallet_assets::Call::finish_destroy { .. } |
|
||||||
|
pallet_assets::Call::mint { .. } |
|
||||||
|
pallet_assets::Call::burn { .. } |
|
||||||
|
pallet_assets::Call::transfer { .. } |
|
||||||
|
pallet_assets::Call::transfer_keep_alive { .. } |
|
||||||
|
pallet_assets::Call::force_transfer { .. } |
|
||||||
|
pallet_assets::Call::freeze { .. } |
|
||||||
|
pallet_assets::Call::thaw { .. } |
|
||||||
|
pallet_assets::Call::freeze_asset { .. } |
|
||||||
|
pallet_assets::Call::thaw_asset { .. } |
|
||||||
|
pallet_assets::Call::transfer_ownership { .. } |
|
||||||
|
pallet_assets::Call::set_team { .. } |
|
||||||
|
pallet_assets::Call::set_metadata { .. } |
|
||||||
|
pallet_assets::Call::clear_metadata { .. } |
|
||||||
|
pallet_assets::Call::force_clear_metadata { .. } |
|
||||||
|
pallet_assets::Call::force_asset_status { .. } |
|
||||||
|
pallet_assets::Call::approve_transfer { .. } |
|
||||||
|
pallet_assets::Call::cancel_approval { .. } |
|
||||||
|
pallet_assets::Call::force_cancel_approval { .. } |
|
||||||
|
pallet_assets::Call::transfer_approved { .. } |
|
||||||
|
pallet_assets::Call::touch { .. } |
|
||||||
|
pallet_assets::Call::refund { .. },
|
||||||
|
) | RuntimeCall::Nfts(
|
||||||
pallet_nfts::Call::create { .. } |
|
pallet_nfts::Call::create { .. } |
|
||||||
pallet_nfts::Call::force_create { .. } |
|
pallet_nfts::Call::force_create { .. } |
|
||||||
pallet_nfts::Call::destroy { .. } |
|
pallet_nfts::Call::destroy { .. } |
|
||||||
@@ -321,7 +384,13 @@ impl xcm_executor::Config for XcmConfig {
|
|||||||
// Statemint acting _as_ a reserve location for DOT and assets created under `pallet-assets`.
|
// Statemint acting _as_ a reserve location for DOT and assets created under `pallet-assets`.
|
||||||
// For DOT, users must use teleport where allowed (e.g. with the Relay Chain).
|
// For DOT, users must use teleport where allowed (e.g. with the Relay Chain).
|
||||||
type IsReserve = ();
|
type IsReserve = ();
|
||||||
type IsTeleporter = NativeAsset; // <- should be enough to allow teleportation of DOT
|
// We allow:
|
||||||
|
// - teleportation of DOT
|
||||||
|
// - teleportation of sibling parachain's assets (as ForeignCreators)
|
||||||
|
type IsTeleporter = (
|
||||||
|
NativeAsset,
|
||||||
|
IsForeignConcreteAsset<FromSiblingParachain<parachain_info::Pallet<Runtime>>>,
|
||||||
|
);
|
||||||
type UniversalLocation = UniversalLocation;
|
type UniversalLocation = UniversalLocation;
|
||||||
type Barrier = Barrier;
|
type Barrier = Barrier;
|
||||||
type Weigher = WeightInfoBounds<
|
type Weigher = WeightInfoBounds<
|
||||||
@@ -415,3 +484,18 @@ impl cumulus_pallet_xcm::Config for Runtime {
|
|||||||
type RuntimeEvent = RuntimeEvent;
|
type RuntimeEvent = RuntimeEvent;
|
||||||
type XcmExecutor = XcmExecutor<XcmConfig>;
|
type XcmExecutor = XcmExecutor<XcmConfig>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub type ForeignCreatorsSovereignAccountOf = (
|
||||||
|
SiblingParachainConvertsVia<Sibling, AccountId>,
|
||||||
|
AccountId32Aliases<RelayNetwork, AccountId>,
|
||||||
|
ParentIsPreset<AccountId>,
|
||||||
|
);
|
||||||
|
|
||||||
|
/// Simple conversion of `u32` into an `AssetId` for use in benchmarking.
|
||||||
|
pub struct XcmBenchmarkHelper;
|
||||||
|
#[cfg(feature = "runtime-benchmarks")]
|
||||||
|
impl pallet_assets::BenchmarkHelper<MultiLocation> for XcmBenchmarkHelper {
|
||||||
|
fn create_asset_id_parameter(id: u32) -> MultiLocation {
|
||||||
|
MultiLocation { parents: 1, interior: X1(Parachain(id)) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
use asset_test_utils::{CollatorSessionKeys, ExtBuilder, RuntimeHelper};
|
use asset_test_utils::{CollatorSessionKeys, ExtBuilder, RuntimeHelper};
|
||||||
use codec::Decode;
|
use codec::{Decode, Encode};
|
||||||
use cumulus_primitives_utility::ChargeWeightInFungibles;
|
use cumulus_primitives_utility::ChargeWeightInFungibles;
|
||||||
use frame_support::{
|
use frame_support::{
|
||||||
assert_noop, assert_ok,
|
assert_noop, assert_ok,
|
||||||
@@ -11,17 +11,18 @@ use parachains_common::{
|
|||||||
};
|
};
|
||||||
use statemint_runtime::xcm_config::{
|
use statemint_runtime::xcm_config::{
|
||||||
AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, DotLocation,
|
AssetFeeAsExistentialDepositMultiplierFeeCharger, CheckingAccount, DotLocation,
|
||||||
TrustBackedAssetsPalletLocation,
|
ForeignCreatorsSovereignAccountOf, TrustBackedAssetsPalletLocation, XcmConfig,
|
||||||
};
|
};
|
||||||
pub use statemint_runtime::{
|
pub use statemint_runtime::{
|
||||||
constants::fee::WeightToFee, xcm_config::XcmConfig, AssetDeposit, Assets, Balances,
|
constants::fee::WeightToFee, AssetDeposit, Assets, Balances, ExistentialDeposit, ForeignAssets,
|
||||||
ExistentialDeposit, ParachainSystem, Runtime, RuntimeEvent, SessionKeys, System,
|
ForeignAssetsInstance, MetadataDepositBase, MetadataDepositPerByte, ParachainSystem, Runtime,
|
||||||
TrustBackedAssetsInstance,
|
RuntimeCall, RuntimeEvent, SessionKeys, System, TrustBackedAssetsInstance,
|
||||||
};
|
};
|
||||||
use xcm::latest::prelude::*;
|
use xcm::latest::prelude::*;
|
||||||
use xcm_executor::traits::{Convert, WeightTrader};
|
use xcm_executor::traits::{Convert, Identity, JustTry, WeightTrader};
|
||||||
|
|
||||||
const ALICE: [u8; 32] = [1u8; 32];
|
const ALICE: [u8; 32] = [1u8; 32];
|
||||||
|
const SOME_ASSET_ADMIN: [u8; 32] = [5u8; 32];
|
||||||
|
|
||||||
type AssetIdForTrustBackedAssetsConvert =
|
type AssetIdForTrustBackedAssetsConvert =
|
||||||
assets_common::AssetIdForTrustBackedAssetsConvert<TrustBackedAssetsPalletLocation>;
|
assets_common::AssetIdForTrustBackedAssetsConvert<TrustBackedAssetsPalletLocation>;
|
||||||
@@ -390,9 +391,15 @@ fn test_assets_balances_api_works() {
|
|||||||
.build()
|
.build()
|
||||||
.execute_with(|| {
|
.execute_with(|| {
|
||||||
let local_asset_id = 1;
|
let local_asset_id = 1;
|
||||||
|
let foreign_asset_id_multilocation =
|
||||||
|
MultiLocation { parents: 1, interior: X2(Parachain(1234), GeneralIndex(12345)) };
|
||||||
|
|
||||||
// check before
|
// check before
|
||||||
assert_eq!(Assets::balance(local_asset_id, AccountId::from(ALICE)), 0);
|
assert_eq!(Assets::balance(local_asset_id, AccountId::from(ALICE)), 0);
|
||||||
|
assert_eq!(
|
||||||
|
ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)),
|
||||||
|
0
|
||||||
|
);
|
||||||
assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0);
|
assert_eq!(Balances::free_balance(AccountId::from(ALICE)), 0);
|
||||||
assert!(Runtime::query_account_balances(AccountId::from(ALICE))
|
assert!(Runtime::query_account_balances(AccountId::from(ALICE))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
@@ -423,18 +430,40 @@ fn test_assets_balances_api_works() {
|
|||||||
minimum_asset_balance
|
minimum_asset_balance
|
||||||
));
|
));
|
||||||
|
|
||||||
|
// create foreign asset
|
||||||
|
let foreign_asset_minimum_asset_balance = 3333333_u128;
|
||||||
|
assert_ok!(ForeignAssets::force_create(
|
||||||
|
RuntimeHelper::<Runtime>::root_origin(),
|
||||||
|
foreign_asset_id_multilocation,
|
||||||
|
AccountId::from(SOME_ASSET_ADMIN).into(),
|
||||||
|
false,
|
||||||
|
foreign_asset_minimum_asset_balance
|
||||||
|
));
|
||||||
|
|
||||||
|
// We first mint enough asset for the account to exist for assets
|
||||||
|
assert_ok!(ForeignAssets::mint(
|
||||||
|
RuntimeHelper::<Runtime>::origin_of(AccountId::from(SOME_ASSET_ADMIN)),
|
||||||
|
foreign_asset_id_multilocation,
|
||||||
|
AccountId::from(ALICE).into(),
|
||||||
|
6 * foreign_asset_minimum_asset_balance
|
||||||
|
));
|
||||||
|
|
||||||
// check after
|
// check after
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
Assets::balance(local_asset_id, AccountId::from(ALICE)),
|
Assets::balance(local_asset_id, AccountId::from(ALICE)),
|
||||||
minimum_asset_balance
|
minimum_asset_balance
|
||||||
);
|
);
|
||||||
|
assert_eq!(
|
||||||
|
ForeignAssets::balance(foreign_asset_id_multilocation, AccountId::from(ALICE)),
|
||||||
|
6 * minimum_asset_balance
|
||||||
|
);
|
||||||
assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency);
|
assert_eq!(Balances::free_balance(AccountId::from(ALICE)), some_currency);
|
||||||
|
|
||||||
let result: MultiAssets = Runtime::query_account_balances(AccountId::from(ALICE))
|
let result: MultiAssets = Runtime::query_account_balances(AccountId::from(ALICE))
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.try_into()
|
.try_into()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
assert_eq!(result.len(), 2);
|
assert_eq!(result.len(), 3);
|
||||||
|
|
||||||
// check currency
|
// check currency
|
||||||
assert!(result.inner().iter().any(|asset| asset.eq(
|
assert!(result.inner().iter().any(|asset| asset.eq(
|
||||||
@@ -449,6 +478,12 @@ fn test_assets_balances_api_works() {
|
|||||||
minimum_asset_balance
|
minimum_asset_balance
|
||||||
)
|
)
|
||||||
.into())));
|
.into())));
|
||||||
|
// check foreign asset
|
||||||
|
assert!(result.inner().iter().any(|asset| asset.eq(&(
|
||||||
|
Identity::reverse_ref(foreign_asset_id_multilocation).unwrap(),
|
||||||
|
6 * foreign_asset_minimum_asset_balance
|
||||||
|
)
|
||||||
|
.into())));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -475,6 +510,34 @@ asset_test_utils::include_teleports_for_native_asset_works!(
|
|||||||
1000
|
1000
|
||||||
);
|
);
|
||||||
|
|
||||||
|
asset_test_utils::include_teleports_for_foreign_assets_works!(
|
||||||
|
Runtime,
|
||||||
|
XcmConfig,
|
||||||
|
CheckingAccount,
|
||||||
|
WeightToFee,
|
||||||
|
ParachainSystem,
|
||||||
|
ForeignCreatorsSovereignAccountOf,
|
||||||
|
ForeignAssetsInstance,
|
||||||
|
asset_test_utils::CollatorSessionKeys::new(
|
||||||
|
AccountId::from(ALICE),
|
||||||
|
AccountId::from(ALICE),
|
||||||
|
SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) }
|
||||||
|
),
|
||||||
|
ExistentialDeposit::get(),
|
||||||
|
Box::new(|runtime_event_encoded: Vec<u8>| {
|
||||||
|
match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) {
|
||||||
|
Ok(RuntimeEvent::PolkadotXcm(event)) => Some(event),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
Box::new(|runtime_event_encoded: Vec<u8>| {
|
||||||
|
match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) {
|
||||||
|
Ok(RuntimeEvent::XcmpQueue(event)) => Some(event),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currency_works!(
|
asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currency_works!(
|
||||||
Runtime,
|
Runtime,
|
||||||
XcmConfig,
|
XcmConfig,
|
||||||
@@ -482,14 +545,16 @@ asset_test_utils::include_asset_transactor_transfer_with_local_consensus_currenc
|
|||||||
ExistentialDeposit::get(),
|
ExistentialDeposit::get(),
|
||||||
Box::new(|| {
|
Box::new(|| {
|
||||||
assert!(Assets::asset_ids().collect::<Vec<_>>().is_empty());
|
assert!(Assets::asset_ids().collect::<Vec<_>>().is_empty());
|
||||||
|
assert!(ForeignAssets::asset_ids().collect::<Vec<_>>().is_empty());
|
||||||
}),
|
}),
|
||||||
Box::new(|| {
|
Box::new(|| {
|
||||||
assert!(Assets::asset_ids().collect::<Vec<_>>().is_empty());
|
assert!(Assets::asset_ids().collect::<Vec<_>>().is_empty());
|
||||||
|
assert!(ForeignAssets::asset_ids().collect::<Vec<_>>().is_empty());
|
||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!(
|
asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!(
|
||||||
asset_transactor_transfer_with_pallet_assets_instance_works,
|
asset_transactor_transfer_with_trust_backed_assets_works,
|
||||||
Runtime,
|
Runtime,
|
||||||
XcmConfig,
|
XcmConfig,
|
||||||
TrustBackedAssetsInstance,
|
TrustBackedAssetsInstance,
|
||||||
@@ -498,6 +563,66 @@ asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_
|
|||||||
collator_session_keys(),
|
collator_session_keys(),
|
||||||
ExistentialDeposit::get(),
|
ExistentialDeposit::get(),
|
||||||
12345,
|
12345,
|
||||||
Box::new(|| {}),
|
Box::new(|| {
|
||||||
Box::new(|| {})
|
assert!(ForeignAssets::asset_ids().collect::<Vec<_>>().is_empty());
|
||||||
|
}),
|
||||||
|
Box::new(|| {
|
||||||
|
assert!(ForeignAssets::asset_ids().collect::<Vec<_>>().is_empty());
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
asset_test_utils::include_asset_transactor_transfer_with_pallet_assets_instance_works!(
|
||||||
|
asset_transactor_transfer_with_foreign_assets_works,
|
||||||
|
Runtime,
|
||||||
|
XcmConfig,
|
||||||
|
ForeignAssetsInstance,
|
||||||
|
MultiLocation,
|
||||||
|
JustTry,
|
||||||
|
asset_test_utils::CollatorSessionKeys::new(
|
||||||
|
AccountId::from(ALICE),
|
||||||
|
AccountId::from(ALICE),
|
||||||
|
SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) }
|
||||||
|
),
|
||||||
|
ExistentialDeposit::get(),
|
||||||
|
MultiLocation { parents: 1, interior: X2(Parachain(1313), GeneralIndex(12345)) },
|
||||||
|
Box::new(|| {
|
||||||
|
assert!(Assets::asset_ids().collect::<Vec<_>>().is_empty());
|
||||||
|
}),
|
||||||
|
Box::new(|| {
|
||||||
|
assert!(Assets::asset_ids().collect::<Vec<_>>().is_empty());
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
asset_test_utils::include_create_and_manage_foreign_assets_for_local_consensus_parachain_assets_works!(
|
||||||
|
Runtime,
|
||||||
|
XcmConfig,
|
||||||
|
WeightToFee,
|
||||||
|
ForeignCreatorsSovereignAccountOf,
|
||||||
|
ForeignAssetsInstance,
|
||||||
|
MultiLocation,
|
||||||
|
JustTry,
|
||||||
|
asset_test_utils::CollatorSessionKeys::new(
|
||||||
|
AccountId::from(ALICE),
|
||||||
|
AccountId::from(ALICE),
|
||||||
|
SessionKeys { aura: AuraId::from(sp_core::ed25519::Public::from_raw(ALICE)) }
|
||||||
|
),
|
||||||
|
ExistentialDeposit::get(),
|
||||||
|
AssetDeposit::get(),
|
||||||
|
MetadataDepositBase::get(),
|
||||||
|
MetadataDepositPerByte::get(),
|
||||||
|
Box::new(|pallet_asset_call| RuntimeCall::ForeignAssets(pallet_asset_call).encode()),
|
||||||
|
Box::new(|runtime_event_encoded: Vec<u8>| {
|
||||||
|
match RuntimeEvent::decode(&mut &runtime_event_encoded[..]) {
|
||||||
|
Ok(RuntimeEvent::ForeignAssets(pallet_asset_event)) => Some(pallet_asset_event),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
Box::new(|| {
|
||||||
|
assert!(Assets::asset_ids().collect::<Vec<_>>().is_empty());
|
||||||
|
assert!(ForeignAssets::asset_ids().collect::<Vec<_>>().is_empty());
|
||||||
|
}),
|
||||||
|
Box::new(|| {
|
||||||
|
assert!(Assets::asset_ids().collect::<Vec<_>>().is_empty());
|
||||||
|
assert_eq!(ForeignAssets::asset_ids().collect::<Vec<_>>().len(), 1);
|
||||||
|
})
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -112,7 +112,7 @@ pub type ForeignAssetsConvertedConcreteId = assets_common::ForeignAssetsConverte
|
|||||||
// Ignore `TrustBackedAssets` explicitly
|
// Ignore `TrustBackedAssets` explicitly
|
||||||
StartsWith<TrustBackedAssetsPalletLocation>,
|
StartsWith<TrustBackedAssetsPalletLocation>,
|
||||||
// Ignore asset which starts explicitly with our `GlobalConsensus(NetworkId)`, means:
|
// Ignore asset which starts explicitly with our `GlobalConsensus(NetworkId)`, means:
|
||||||
// - foreign assets from our consensus should be: `MultiLocation {parent: 1, X*(Parachain(xyz))}
|
// - foreign assets from our consensus should be: `MultiLocation {parents: 1, X*(Parachain(xyz), ..)}
|
||||||
// - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` wont be accepted here
|
// - foreign assets outside our consensus with the same `GlobalConsensus(NetworkId)` wont be accepted here
|
||||||
StartsWithExplicitGlobalConsensus<UniversalLocationNetworkId>,
|
StartsWithExplicitGlobalConsensus<UniversalLocationNetworkId>,
|
||||||
),
|
),
|
||||||
@@ -487,9 +487,7 @@ pub type ForeignCreatorsSovereignAccountOf = (
|
|||||||
/// Simple conversion of `u32` into an `AssetId` for use in benchmarking.
|
/// Simple conversion of `u32` into an `AssetId` for use in benchmarking.
|
||||||
pub struct XcmBenchmarkHelper;
|
pub struct XcmBenchmarkHelper;
|
||||||
#[cfg(feature = "runtime-benchmarks")]
|
#[cfg(feature = "runtime-benchmarks")]
|
||||||
use pallet_assets::BenchmarkHelper;
|
impl pallet_assets::BenchmarkHelper<MultiLocation> for XcmBenchmarkHelper {
|
||||||
#[cfg(feature = "runtime-benchmarks")]
|
|
||||||
impl BenchmarkHelper<MultiLocation> for XcmBenchmarkHelper {
|
|
||||||
fn create_asset_id_parameter(id: u32) -> MultiLocation {
|
fn create_asset_id_parameter(id: u32) -> MultiLocation {
|
||||||
MultiLocation { parents: 1, interior: X1(Parachain(id)) }
|
MultiLocation { parents: 1, interior: X1(Parachain(id)) }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user