This repository has been archived by the owner on Nov 15, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add integration tests to xcm-builder (#3537)
* add integration tests to xcm-builder * add an integration test for reserve_transfer_assets * add query holding and teleport tests * formatting * add to barrier doc comments and fix doc tests warnings * use more realistic barrier for integration tests * improve imports * adjust base xcm weight and existential deposit to be in line with Kusama * remove AnyNetwork Co-authored-by: Amar Singh <asinghchrony@protonmail.com> * add more comments and remove unnecessary code * move mock into separate file * reduce imports * update cargo.lock * remove reserve transfer test from xcm builder integration tests * reword barrier doc comment * elaborate on QueryHolding test scenario * add an integration test for reserve based transfers from parachain to parachain * add teleport tests * fix failing teleport filter tests * Update xcm/xcm-builder/src/integration_tests.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * Update xcm/xcm-builder/src/integration_tests.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * Update xcm/xcm-builder/src/integration_tests.rs Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * Move integration tests to tests/ directory * Fix merge * Replace All wildcard with a concrete seed amount * Rename SEED_AMOUNT to REGISTER_AMOUNT * Fix compilation error * Check for teleport destination first before checking out assets * Fix unit test * Do not run tests in integration mock * Add a permissive assets filter for teleportation * Remove check for teleport location in InitiateTeleport XCM * Remove defunct test * Apply suggestions from code review Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> * Reword comment Co-authored-by: Amar Singh <asinghchrony@protonmail.com> Co-authored-by: Kian Paimani <5588131+kianenigma@users.noreply.github.com> Co-authored-by: Keith Yeung <kungfukeith11@gmail.com>
- Loading branch information
Showing
9 changed files
with
548 additions
and
8 deletions.
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,211 @@ | ||
// Copyright 2021 Parity Technologies (UK) Ltd. | ||
// This file is part of Polkadot. | ||
|
||
// Polkadot is free software: you can redistribute it and/or modify | ||
// it under the terms of the GNU General Public License as published by | ||
// the Free Software Foundation, either version 3 of the License, or | ||
// (at your option) any later version. | ||
|
||
// Polkadot is distributed in the hope that it will be useful, | ||
// but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
// GNU General Public License for more details. | ||
|
||
// You should have received a copy of the GNU General Public License | ||
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>. | ||
|
||
use frame_support::{construct_runtime, parameter_types, traits::Everything, weights::Weight}; | ||
use sp_core::H256; | ||
use sp_runtime::{testing::Header, traits::IdentityLookup, AccountId32}; | ||
use sp_std::cell::RefCell; | ||
|
||
use polkadot_parachain::primitives::Id as ParaId; | ||
use polkadot_runtime_parachains::{configuration, origin, shared}; | ||
use xcm::latest::{opaque, prelude::*}; | ||
use xcm_executor::XcmExecutor; | ||
|
||
use xcm_builder::{ | ||
AccountId32Aliases, AllowTopLevelPaidExecutionFrom, AllowUnpaidExecutionFrom, | ||
ChildParachainAsNative, ChildParachainConvertsVia, ChildSystemParachainAsSuperuser, | ||
CurrencyAdapter as XcmCurrencyAdapter, FixedRateOfFungible, FixedWeightBounds, | ||
IsChildSystemParachain, IsConcrete, LocationInverter, SignedAccountId32AsNative, | ||
SignedToAccountId32, SovereignSignedViaLocation, TakeWeightCredit, | ||
}; | ||
|
||
pub type AccountId = AccountId32; | ||
pub type Balance = u128; | ||
|
||
thread_local! { | ||
pub static SENT_XCM: RefCell<Vec<(MultiLocation, opaque::Xcm)>> = RefCell::new(Vec::new()); | ||
} | ||
pub fn sent_xcm() -> Vec<(MultiLocation, opaque::Xcm)> { | ||
SENT_XCM.with(|q| (*q.borrow()).clone()) | ||
} | ||
pub struct TestSendXcm; | ||
impl SendXcm for TestSendXcm { | ||
fn send_xcm(dest: MultiLocation, msg: opaque::Xcm) -> XcmResult { | ||
SENT_XCM.with(|q| q.borrow_mut().push((dest, msg))); | ||
Ok(()) | ||
} | ||
} | ||
|
||
// copied from kusama constants | ||
pub const UNITS: Balance = 1_000_000_000_000; | ||
pub const CENTS: Balance = UNITS / 30_000; | ||
|
||
parameter_types! { | ||
pub const BlockHashCount: u64 = 250; | ||
} | ||
|
||
impl frame_system::Config for Runtime { | ||
type Origin = Origin; | ||
type Call = Call; | ||
type Index = u64; | ||
type BlockNumber = u64; | ||
type Hash = H256; | ||
type Hashing = ::sp_runtime::traits::BlakeTwo256; | ||
type AccountId = AccountId; | ||
type Lookup = IdentityLookup<Self::AccountId>; | ||
type Header = Header; | ||
type Event = Event; | ||
type BlockHashCount = BlockHashCount; | ||
type BlockWeights = (); | ||
type BlockLength = (); | ||
type Version = (); | ||
type PalletInfo = PalletInfo; | ||
type AccountData = pallet_balances::AccountData<Balance>; | ||
type OnNewAccount = (); | ||
type OnKilledAccount = (); | ||
type DbWeight = (); | ||
type BaseCallFilter = Everything; | ||
type SystemWeightInfo = (); | ||
type SS58Prefix = (); | ||
type OnSetCode = (); | ||
} | ||
|
||
parameter_types! { | ||
pub ExistentialDeposit: Balance = 1 * CENTS; | ||
pub const MaxLocks: u32 = 50; | ||
pub const MaxReserves: u32 = 50; | ||
} | ||
|
||
impl pallet_balances::Config for Runtime { | ||
type MaxLocks = MaxLocks; | ||
type Balance = Balance; | ||
type Event = Event; | ||
type DustRemoval = (); | ||
type ExistentialDeposit = ExistentialDeposit; | ||
type AccountStore = System; | ||
type WeightInfo = (); | ||
type MaxReserves = MaxReserves; | ||
type ReserveIdentifier = [u8; 8]; | ||
} | ||
|
||
impl shared::Config for Runtime {} | ||
|
||
impl configuration::Config for Runtime {} | ||
|
||
// aims to closely emulate the Kusama XcmConfig | ||
parameter_types! { | ||
pub const KsmLocation: MultiLocation = MultiLocation::here(); | ||
pub const KusamaNetwork: NetworkId = NetworkId::Kusama; | ||
pub Ancestry: MultiLocation = Here.into(); | ||
pub CheckAccount: AccountId = XcmPallet::check_account(); | ||
} | ||
|
||
pub type SovereignAccountOf = | ||
(ChildParachainConvertsVia<ParaId, AccountId>, AccountId32Aliases<KusamaNetwork, AccountId>); | ||
|
||
pub type LocalAssetTransactor = XcmCurrencyAdapter< | ||
Balances, | ||
IsConcrete<KsmLocation>, | ||
SovereignAccountOf, | ||
AccountId, | ||
CheckAccount, | ||
>; | ||
|
||
type LocalOriginConverter = ( | ||
SovereignSignedViaLocation<SovereignAccountOf, Origin>, | ||
ChildParachainAsNative<origin::Origin, Origin>, | ||
SignedAccountId32AsNative<KusamaNetwork, Origin>, | ||
ChildSystemParachainAsSuperuser<ParaId, Origin>, | ||
); | ||
|
||
parameter_types! { | ||
pub const BaseXcmWeight: Weight = 1_000_000_000; | ||
pub KsmPerSecond: (AssetId, u128) = (KsmLocation::get().into(), 1); | ||
} | ||
|
||
pub type Barrier = ( | ||
TakeWeightCredit, | ||
AllowTopLevelPaidExecutionFrom<Everything>, | ||
// Unused/Untested | ||
AllowUnpaidExecutionFrom<IsChildSystemParachain<ParaId>>, | ||
); | ||
|
||
parameter_types! { | ||
pub const KusamaForStatemint: (MultiAssetFilter, MultiLocation) = | ||
(MultiAssetFilter::Wild(WildMultiAsset::AllOf { id: Concrete(MultiLocation::here()), fun: WildFungible }), X1(Parachain(1000)).into()); | ||
} | ||
pub type TrustedTeleporters = (xcm_builder::Case<KusamaForStatemint>,); | ||
|
||
pub struct XcmConfig; | ||
impl xcm_executor::Config for XcmConfig { | ||
type Call = Call; | ||
type XcmSender = TestSendXcm; | ||
type AssetTransactor = LocalAssetTransactor; | ||
type OriginConverter = LocalOriginConverter; | ||
type IsReserve = (); | ||
type IsTeleporter = TrustedTeleporters; | ||
type LocationInverter = LocationInverter<Ancestry>; | ||
type Barrier = Barrier; | ||
type Weigher = FixedWeightBounds<BaseXcmWeight, Call>; | ||
type Trader = FixedRateOfFungible<KsmPerSecond, ()>; | ||
type ResponseHandler = (); | ||
} | ||
|
||
pub type LocalOriginToLocation = SignedToAccountId32<Origin, AccountId, KusamaNetwork>; | ||
|
||
impl pallet_xcm::Config for Runtime { | ||
type Event = Event; | ||
type LocationInverter = LocationInverter<Ancestry>; | ||
type SendXcmOrigin = xcm_builder::EnsureXcmOrigin<Origin, LocalOriginToLocation>; | ||
type XcmRouter = TestSendXcm; | ||
// Anyone can execute XCM messages locally... | ||
type ExecuteXcmOrigin = xcm_builder::EnsureXcmOrigin<Origin, LocalOriginToLocation>; | ||
type XcmExecuteFilter = (); | ||
type XcmExecutor = XcmExecutor<XcmConfig>; | ||
type XcmTeleportFilter = Everything; | ||
type XcmReserveTransferFilter = Everything; | ||
type Weigher = FixedWeightBounds<BaseXcmWeight, Call>; | ||
} | ||
|
||
impl origin::Config for Runtime {} | ||
|
||
type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic<Runtime>; | ||
type Block = frame_system::mocking::MockBlock<Runtime>; | ||
|
||
construct_runtime!( | ||
pub enum Runtime where | ||
Block = Block, | ||
NodeBlock = Block, | ||
UncheckedExtrinsic = UncheckedExtrinsic, | ||
{ | ||
System: frame_system::{Pallet, Call, Storage, Config, Event<T>}, | ||
Balances: pallet_balances::{Pallet, Call, Storage, Config<T>, Event<T>}, | ||
ParasOrigin: origin::{Pallet, Origin}, | ||
XcmPallet: pallet_xcm::{Pallet, Call, Storage, Event<T>}, | ||
} | ||
); | ||
|
||
pub fn kusama_like_with_balances(balances: Vec<(AccountId, Balance)>) -> sp_io::TestExternalities { | ||
let mut t = frame_system::GenesisConfig::default().build_storage::<Runtime>().unwrap(); | ||
|
||
pallet_balances::GenesisConfig::<Runtime> { balances } | ||
.assimilate_storage(&mut t) | ||
.unwrap(); | ||
|
||
let mut ext = sp_io::TestExternalities::new(t); | ||
ext.execute_with(|| System::set_block_number(1)); | ||
ext | ||
} |
Oops, something went wrong.