mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-27 10:27:59 +00:00
[xcm-emulator] Chains generic over Network & Integration tests restructure (#2092)
Closes: - #1383 - Declared chains can be now be imported and reused in a different crate. - Chain declaration are now generic over a generic type `N` (the Network) - #1389 - Solved #1383, chains and networks declarations can be restructure to avoid having to compile all chains when running integrations tests where are not needed. - Chains are now declared on its own crate (removed from `integration-tests-common`) - Networks are now declared on its own crate (removed from `integration-tests-common`) - Integration tests will import only the relevant Network crate - `integration-tests-common` is renamed to `emulated-integration-tests-common` All this is necessary to be able to implement what is described here: https://github.com/paritytech/roadmap/issues/56#issuecomment-1777010553 --------- Co-authored-by: command-bot <>
This commit is contained in:
@@ -17,7 +17,6 @@
|
||||
**/._*
|
||||
**/.criterion/
|
||||
**/*.rs.bk
|
||||
**/chains/
|
||||
**/hfuzz_target/
|
||||
**/hfuzz_workspace/
|
||||
**/node_modules
|
||||
|
||||
Generated
+250
-82
@@ -874,6 +874,21 @@ dependencies = [
|
||||
"substrate-wasm-builder",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "asset-hub-rococo-emulated-chain"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"asset-hub-rococo-runtime",
|
||||
"cumulus-primitives-core",
|
||||
"emulated-integration-tests-common",
|
||||
"frame-support",
|
||||
"parachains-common",
|
||||
"rococo-emulated-chain",
|
||||
"serde_json",
|
||||
"sp-core",
|
||||
"sp-runtime",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "asset-hub-rococo-integration-tests"
|
||||
version = "1.0.0"
|
||||
@@ -881,23 +896,19 @@ dependencies = [
|
||||
"assert_matches",
|
||||
"asset-hub-rococo-runtime",
|
||||
"asset-test-utils",
|
||||
"emulated-integration-tests-common",
|
||||
"frame-support",
|
||||
"frame-system",
|
||||
"integration-tests-common",
|
||||
"pallet-asset-conversion",
|
||||
"pallet-assets",
|
||||
"pallet-balances",
|
||||
"pallet-xcm",
|
||||
"parachains-common",
|
||||
"parity-scale-codec",
|
||||
"polkadot-core-primitives",
|
||||
"polkadot-parachain-primitives",
|
||||
"polkadot-runtime-parachains",
|
||||
"rococo-runtime",
|
||||
"rococo-system-emulated-network",
|
||||
"sp-runtime",
|
||||
"staging-xcm",
|
||||
"staging-xcm-executor",
|
||||
"xcm-emulator",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -982,6 +993,21 @@ dependencies = [
|
||||
"substrate-wasm-builder",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "asset-hub-westend-emulated-chain"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"asset-hub-westend-runtime",
|
||||
"cumulus-primitives-core",
|
||||
"emulated-integration-tests-common",
|
||||
"frame-support",
|
||||
"parachains-common",
|
||||
"serde_json",
|
||||
"sp-core",
|
||||
"sp-runtime",
|
||||
"westend-emulated-chain",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "asset-hub-westend-integration-tests"
|
||||
version = "1.0.0"
|
||||
@@ -991,9 +1017,9 @@ dependencies = [
|
||||
"asset-test-utils",
|
||||
"cumulus-pallet-dmp-queue",
|
||||
"cumulus-pallet-parachain-system",
|
||||
"emulated-integration-tests-common",
|
||||
"frame-support",
|
||||
"frame-system",
|
||||
"integration-tests-common",
|
||||
"pallet-asset-conversion",
|
||||
"pallet-asset-rate",
|
||||
"pallet-assets",
|
||||
@@ -1003,17 +1029,14 @@ dependencies = [
|
||||
"pallet-xcm",
|
||||
"parachains-common",
|
||||
"parity-scale-codec",
|
||||
"polkadot-core-primitives",
|
||||
"polkadot-parachain-primitives",
|
||||
"polkadot-runtime-common",
|
||||
"polkadot-runtime-parachains",
|
||||
"sp-runtime",
|
||||
"staging-xcm",
|
||||
"staging-xcm-builder",
|
||||
"staging-xcm-executor",
|
||||
"westend-runtime",
|
||||
"westend-runtime-constants",
|
||||
"xcm-emulator",
|
||||
"westend-system-emulated-network",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -1094,6 +1117,22 @@ dependencies = [
|
||||
"westend-runtime-constants",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "asset-hub-wococo-emulated-chain"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"asset-hub-rococo-emulated-chain",
|
||||
"asset-hub-rococo-runtime",
|
||||
"cumulus-primitives-core",
|
||||
"emulated-integration-tests-common",
|
||||
"frame-support",
|
||||
"parachains-common",
|
||||
"serde_json",
|
||||
"sp-core",
|
||||
"sp-runtime",
|
||||
"wococo-emulated-chain",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "asset-test-utils"
|
||||
version = "1.0.0"
|
||||
@@ -2136,6 +2175,20 @@ dependencies = [
|
||||
"substrate-wasm-builder",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bridge-hub-rococo-emulated-chain"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"bridge-hub-rococo-runtime",
|
||||
"cumulus-primitives-core",
|
||||
"emulated-integration-tests-common",
|
||||
"frame-support",
|
||||
"parachains-common",
|
||||
"serde_json",
|
||||
"sp-core",
|
||||
"sp-runtime",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bridge-hub-rococo-integration-tests"
|
||||
version = "1.0.0"
|
||||
@@ -2145,24 +2198,16 @@ dependencies = [
|
||||
"bridge-hub-rococo-runtime",
|
||||
"cumulus-pallet-dmp-queue",
|
||||
"cumulus-pallet-xcmp-queue",
|
||||
"emulated-integration-tests-common",
|
||||
"frame-support",
|
||||
"frame-system",
|
||||
"integration-tests-common",
|
||||
"pallet-assets",
|
||||
"pallet-balances",
|
||||
"pallet-bridge-messages",
|
||||
"pallet-message-queue",
|
||||
"pallet-xcm",
|
||||
"parachains-common",
|
||||
"parity-scale-codec",
|
||||
"polkadot-core-primitives",
|
||||
"polkadot-parachain-primitives",
|
||||
"polkadot-runtime-parachains",
|
||||
"sp-core",
|
||||
"sp-weights",
|
||||
"rococo-wococo-system-emulated-network",
|
||||
"staging-xcm",
|
||||
"staging-xcm-executor",
|
||||
"xcm-emulator",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2298,6 +2343,20 @@ dependencies = [
|
||||
"staging-xcm-executor",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bridge-hub-westend-emulated-chain"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"bridge-hub-westend-runtime",
|
||||
"cumulus-primitives-core",
|
||||
"emulated-integration-tests-common",
|
||||
"frame-support",
|
||||
"parachains-common",
|
||||
"serde_json",
|
||||
"sp-core",
|
||||
"sp-runtime",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bridge-hub-westend-integration-tests"
|
||||
version = "1.0.0"
|
||||
@@ -2307,24 +2366,16 @@ dependencies = [
|
||||
"bridge-hub-westend-runtime",
|
||||
"cumulus-pallet-dmp-queue",
|
||||
"cumulus-pallet-xcmp-queue",
|
||||
"emulated-integration-tests-common",
|
||||
"frame-support",
|
||||
"frame-system",
|
||||
"integration-tests-common",
|
||||
"pallet-assets",
|
||||
"pallet-balances",
|
||||
"pallet-bridge-messages",
|
||||
"pallet-message-queue",
|
||||
"pallet-xcm",
|
||||
"parachains-common",
|
||||
"parity-scale-codec",
|
||||
"polkadot-core-primitives",
|
||||
"polkadot-parachain-primitives",
|
||||
"polkadot-runtime-parachains",
|
||||
"sp-core",
|
||||
"sp-weights",
|
||||
"staging-xcm",
|
||||
"staging-xcm-executor",
|
||||
"xcm-emulator",
|
||||
"westend-system-emulated-network",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2410,6 +2461,21 @@ dependencies = [
|
||||
"westend-runtime-constants",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bridge-hub-wococo-emulated-chain"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"bridge-hub-rococo-emulated-chain",
|
||||
"bridge-hub-rococo-runtime",
|
||||
"cumulus-primitives-core",
|
||||
"emulated-integration-tests-common",
|
||||
"frame-support",
|
||||
"parachains-common",
|
||||
"serde_json",
|
||||
"sp-core",
|
||||
"sp-runtime",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bridge-runtime-common"
|
||||
version = "0.1.0"
|
||||
@@ -4988,6 +5054,40 @@ dependencies = [
|
||||
"zeroize",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "emulated-integration-tests-common"
|
||||
version = "1.0.0"
|
||||
dependencies = [
|
||||
"asset-test-utils",
|
||||
"bp-messages",
|
||||
"bridge-runtime-common",
|
||||
"cumulus-pallet-parachain-system",
|
||||
"cumulus-pallet-xcmp-queue",
|
||||
"cumulus-primitives-core",
|
||||
"frame-support",
|
||||
"pallet-assets",
|
||||
"pallet-balances",
|
||||
"pallet-bridge-messages",
|
||||
"pallet-im-online",
|
||||
"pallet-message-queue",
|
||||
"pallet-xcm",
|
||||
"parachains-common",
|
||||
"parity-scale-codec",
|
||||
"paste",
|
||||
"polkadot-primitives",
|
||||
"polkadot-runtime-parachains",
|
||||
"polkadot-service",
|
||||
"sc-consensus-grandpa",
|
||||
"serde_json",
|
||||
"sp-authority-discovery",
|
||||
"sp-consensus-babe",
|
||||
"sp-consensus-beefy",
|
||||
"sp-core",
|
||||
"sp-runtime",
|
||||
"staging-xcm",
|
||||
"xcm-emulator",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "encode_unicode"
|
||||
version = "0.3.6"
|
||||
@@ -6735,57 +6835,6 @@ dependencies = [
|
||||
"num-traits",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "integration-tests-common"
|
||||
version = "1.0.0"
|
||||
dependencies = [
|
||||
"asset-hub-kusama-runtime",
|
||||
"asset-hub-polkadot-runtime",
|
||||
"asset-hub-rococo-runtime",
|
||||
"asset-hub-westend-runtime",
|
||||
"bp-messages",
|
||||
"bridge-hub-kusama-runtime",
|
||||
"bridge-hub-polkadot-runtime",
|
||||
"bridge-hub-rococo-runtime",
|
||||
"bridge-hub-westend-runtime",
|
||||
"bridge-runtime-common",
|
||||
"collectives-polkadot-runtime",
|
||||
"cumulus-pallet-parachain-system",
|
||||
"cumulus-pallet-xcmp-queue",
|
||||
"cumulus-primitives-core",
|
||||
"frame-support",
|
||||
"pallet-assets",
|
||||
"pallet-balances",
|
||||
"pallet-bridge-messages",
|
||||
"pallet-im-online",
|
||||
"pallet-message-queue",
|
||||
"pallet-staking",
|
||||
"pallet-xcm",
|
||||
"parachains-common",
|
||||
"parity-scale-codec",
|
||||
"paste",
|
||||
"penpal-runtime",
|
||||
"polkadot-core-primitives",
|
||||
"polkadot-parachain-primitives",
|
||||
"polkadot-primitives",
|
||||
"polkadot-runtime-parachains",
|
||||
"polkadot-service",
|
||||
"rococo-runtime",
|
||||
"rococo-runtime-constants",
|
||||
"sc-chain-spec",
|
||||
"sc-consensus-grandpa",
|
||||
"serde_json",
|
||||
"sp-authority-discovery",
|
||||
"sp-consensus-babe",
|
||||
"sp-consensus-beefy",
|
||||
"sp-core",
|
||||
"sp-runtime",
|
||||
"staging-xcm",
|
||||
"westend-runtime",
|
||||
"westend-runtime-constants",
|
||||
"xcm-emulator",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "interceptor"
|
||||
version = "0.8.2"
|
||||
@@ -11547,6 +11596,20 @@ dependencies = [
|
||||
"base64ct",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "penpal-emulated-chain"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"cumulus-primitives-core",
|
||||
"emulated-integration-tests-common",
|
||||
"frame-support",
|
||||
"parachains-common",
|
||||
"penpal-runtime",
|
||||
"serde_json",
|
||||
"sp-core",
|
||||
"sp-runtime",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "penpal-runtime"
|
||||
version = "0.9.27"
|
||||
@@ -14288,6 +14351,25 @@ dependencies = [
|
||||
"librocksdb-sys",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rococo-emulated-chain"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"emulated-integration-tests-common",
|
||||
"pallet-im-online",
|
||||
"parachains-common",
|
||||
"polkadot-primitives",
|
||||
"rococo-runtime",
|
||||
"rococo-runtime-constants",
|
||||
"sc-consensus-grandpa",
|
||||
"serde_json",
|
||||
"sp-authority-discovery",
|
||||
"sp-consensus-babe",
|
||||
"sp-consensus-beefy",
|
||||
"sp-core",
|
||||
"sp-runtime",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rococo-parachain-runtime"
|
||||
version = "0.1.0"
|
||||
@@ -14455,6 +14537,30 @@ dependencies = [
|
||||
"staging-xcm",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rococo-system-emulated-network"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"asset-hub-rococo-emulated-chain",
|
||||
"bridge-hub-rococo-emulated-chain",
|
||||
"emulated-integration-tests-common",
|
||||
"penpal-emulated-chain",
|
||||
"rococo-emulated-chain",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rococo-wococo-system-emulated-network"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"asset-hub-rococo-emulated-chain",
|
||||
"asset-hub-wococo-emulated-chain",
|
||||
"bridge-hub-rococo-emulated-chain",
|
||||
"bridge-hub-wococo-emulated-chain",
|
||||
"emulated-integration-tests-common",
|
||||
"rococo-emulated-chain",
|
||||
"wococo-emulated-chain",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rpassword"
|
||||
version = "7.2.0"
|
||||
@@ -20682,6 +20788,26 @@ dependencies = [
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "westend-emulated-chain"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"emulated-integration-tests-common",
|
||||
"pallet-im-online",
|
||||
"pallet-staking",
|
||||
"parachains-common",
|
||||
"polkadot-primitives",
|
||||
"sc-consensus-grandpa",
|
||||
"serde_json",
|
||||
"sp-authority-discovery",
|
||||
"sp-consensus-babe",
|
||||
"sp-consensus-beefy",
|
||||
"sp-core",
|
||||
"sp-runtime",
|
||||
"westend-runtime",
|
||||
"westend-runtime-constants",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "westend-runtime"
|
||||
version = "1.0.0"
|
||||
@@ -20807,6 +20933,17 @@ dependencies = [
|
||||
"staging-xcm",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "westend-system-emulated-network"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"asset-hub-westend-emulated-chain",
|
||||
"bridge-hub-westend-emulated-chain",
|
||||
"emulated-integration-tests-common",
|
||||
"penpal-emulated-chain",
|
||||
"westend-emulated-chain",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "which"
|
||||
version = "4.4.0"
|
||||
@@ -21068,6 +21205,37 @@ dependencies = [
|
||||
"windows-sys 0.48.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wococo-emulated-chain"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"emulated-integration-tests-common",
|
||||
"pallet-im-online",
|
||||
"parachains-common",
|
||||
"polkadot-primitives",
|
||||
"rococo-emulated-chain",
|
||||
"rococo-runtime",
|
||||
"rococo-runtime-constants",
|
||||
"sc-consensus-grandpa",
|
||||
"serde_json",
|
||||
"sp-authority-discovery",
|
||||
"sp-consensus-babe",
|
||||
"sp-consensus-beefy",
|
||||
"sp-core",
|
||||
"sp-runtime",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wococo-system-emulated-network"
|
||||
version = "0.0.0"
|
||||
dependencies = [
|
||||
"asset-hub-wococo-emulated-chain",
|
||||
"bridge-hub-wococo-emulated-chain",
|
||||
"emulated-integration-tests-common",
|
||||
"penpal-emulated-chain",
|
||||
"wococo-emulated-chain",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wyz"
|
||||
version = "0.5.1"
|
||||
|
||||
+16
-4
@@ -65,11 +65,23 @@ members = [
|
||||
"cumulus/parachain-template/pallets/template",
|
||||
"cumulus/parachain-template/runtime",
|
||||
"cumulus/parachains/common",
|
||||
"cumulus/parachains/integration-tests/emulated/assets/asset-hub-rococo",
|
||||
"cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend",
|
||||
"cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-rococo",
|
||||
"cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-westend",
|
||||
"cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo",
|
||||
"cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend",
|
||||
"cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo",
|
||||
"cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend",
|
||||
"cumulus/parachains/integration-tests/emulated/common",
|
||||
"cumulus/parachains/integration-tests/emulated/chains/relays/rococo",
|
||||
"cumulus/parachains/integration-tests/emulated/chains/relays/wococo",
|
||||
"cumulus/parachains/integration-tests/emulated/chains/relays/westend",
|
||||
"cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-rococo",
|
||||
"cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-wococo",
|
||||
"cumulus/parachains/integration-tests/emulated/chains/parachains/assets/asset-hub-westend",
|
||||
"cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-rococo",
|
||||
"cumulus/parachains/integration-tests/emulated/chains/parachains/bridges/bridge-hub-westend",
|
||||
"cumulus/parachains/integration-tests/emulated/networks/rococo-system",
|
||||
"cumulus/parachains/integration-tests/emulated/networks/wococo-system",
|
||||
"cumulus/parachains/integration-tests/emulated/networks/rococo-wococo-system",
|
||||
"cumulus/parachains/integration-tests/emulated/networks/westend-system",
|
||||
"cumulus/parachains/pallets/collective-content",
|
||||
"cumulus/parachains/pallets/parachain-info",
|
||||
"cumulus/parachains/pallets/ping",
|
||||
|
||||
-412
@@ -1,412 +0,0 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
use crate::*;
|
||||
|
||||
fn relay_origin_assertions(t: RelayToSystemParaTest) {
|
||||
type RuntimeEvent = <Polkadot as Chain>::RuntimeEvent;
|
||||
|
||||
Polkadot::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(629_384_000, 6_196)));
|
||||
|
||||
assert_expected_events!(
|
||||
Polkadot,
|
||||
vec![
|
||||
// Amount to reserve transfer is transferred to System Parachain's Sovereign account
|
||||
RuntimeEvent::Balances(pallet_balances::Event::Transfer { from, to, amount }) => {
|
||||
from: *from == t.sender.account_id,
|
||||
to: *to == Polkadot::sovereign_account_id_of(
|
||||
t.args.dest
|
||||
),
|
||||
amount: *amount == t.args.amount,
|
||||
},
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
fn system_para_dest_assertions_incomplete(_t: RelayToSystemParaTest) {
|
||||
// Errors with `UntrustedReserveLocation`, but the MQ pallet does not report back errors.
|
||||
AssetHubPolkadot::assert_dmp_queue_incomplete(Some(Weight::from_parts(1_000_000_000, 0)));
|
||||
}
|
||||
|
||||
fn system_para_to_relay_assertions(_t: SystemParaToRelayTest) {
|
||||
AssetHubPolkadot::assert_xcm_pallet_attempted_error(Some(XcmError::Barrier))
|
||||
}
|
||||
|
||||
fn system_para_to_para_assertions(t: SystemParaToParaTest) {
|
||||
type RuntimeEvent = <AssetHubPolkadot as Chain>::RuntimeEvent;
|
||||
|
||||
AssetHubPolkadot::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(
|
||||
676_119_000,
|
||||
6196,
|
||||
)));
|
||||
|
||||
assert_expected_events!(
|
||||
AssetHubPolkadot,
|
||||
vec![
|
||||
// Amount to reserve transfer is transferred to Parachain's Sovereing account
|
||||
RuntimeEvent::Balances(
|
||||
pallet_balances::Event::Transfer { from, to, amount }
|
||||
) => {
|
||||
from: *from == t.sender.account_id,
|
||||
to: *to == AssetHubPolkadot::sovereign_account_id_of(
|
||||
t.args.dest
|
||||
),
|
||||
amount: *amount == t.args.amount,
|
||||
},
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
fn system_para_to_para_assets_assertions(t: SystemParaToParaTest) {
|
||||
type RuntimeEvent = <AssetHubPolkadot as Chain>::RuntimeEvent;
|
||||
|
||||
AssetHubPolkadot::assert_xcm_pallet_attempted_complete(Some(Weight::from_parts(
|
||||
676_119_000,
|
||||
6196,
|
||||
)));
|
||||
|
||||
assert_expected_events!(
|
||||
AssetHubPolkadot,
|
||||
vec![
|
||||
// Amount to reserve transfer is transferred to Parachain's Sovereing account
|
||||
RuntimeEvent::Assets(
|
||||
pallet_assets::Event::Transferred { asset_id, from, to, amount }
|
||||
) => {
|
||||
asset_id: *asset_id == ASSET_ID,
|
||||
from: *from == t.sender.account_id,
|
||||
to: *to == AssetHubPolkadot::sovereign_account_id_of(
|
||||
t.args.dest
|
||||
),
|
||||
amount: *amount == t.args.amount,
|
||||
},
|
||||
]
|
||||
);
|
||||
}
|
||||
|
||||
fn relay_limited_reserve_transfer_assets(t: RelayToSystemParaTest) -> DispatchResult {
|
||||
<Polkadot as PolkadotPallet>::XcmPallet::limited_reserve_transfer_assets(
|
||||
t.signed_origin,
|
||||
bx!(t.args.dest.into()),
|
||||
bx!(t.args.beneficiary.into()),
|
||||
bx!(t.args.assets.into()),
|
||||
t.args.fee_asset_item,
|
||||
t.args.weight_limit,
|
||||
)
|
||||
}
|
||||
|
||||
fn relay_reserve_transfer_assets(t: RelayToSystemParaTest) -> DispatchResult {
|
||||
<Polkadot as PolkadotPallet>::XcmPallet::reserve_transfer_assets(
|
||||
t.signed_origin,
|
||||
bx!(t.args.dest.into()),
|
||||
bx!(t.args.beneficiary.into()),
|
||||
bx!(t.args.assets.into()),
|
||||
t.args.fee_asset_item,
|
||||
)
|
||||
}
|
||||
|
||||
fn system_para_limited_reserve_transfer_assets(t: SystemParaToRelayTest) -> DispatchResult {
|
||||
<AssetHubPolkadot as AssetHubPolkadotPallet>::PolkadotXcm::limited_reserve_transfer_assets(
|
||||
t.signed_origin,
|
||||
bx!(t.args.dest.into()),
|
||||
bx!(t.args.beneficiary.into()),
|
||||
bx!(t.args.assets.into()),
|
||||
t.args.fee_asset_item,
|
||||
t.args.weight_limit,
|
||||
)
|
||||
}
|
||||
|
||||
fn system_para_reserve_transfer_assets(t: SystemParaToRelayTest) -> DispatchResult {
|
||||
<AssetHubPolkadot as AssetHubPolkadotPallet>::PolkadotXcm::reserve_transfer_assets(
|
||||
t.signed_origin,
|
||||
bx!(t.args.dest.into()),
|
||||
bx!(t.args.beneficiary.into()),
|
||||
bx!(t.args.assets.into()),
|
||||
t.args.fee_asset_item,
|
||||
)
|
||||
}
|
||||
|
||||
fn system_para_to_para_limited_reserve_transfer_assets(t: SystemParaToParaTest) -> DispatchResult {
|
||||
<AssetHubPolkadot as AssetHubPolkadotPallet>::PolkadotXcm::limited_reserve_transfer_assets(
|
||||
t.signed_origin,
|
||||
bx!(t.args.dest.into()),
|
||||
bx!(t.args.beneficiary.into()),
|
||||
bx!(t.args.assets.into()),
|
||||
t.args.fee_asset_item,
|
||||
t.args.weight_limit,
|
||||
)
|
||||
}
|
||||
|
||||
fn system_para_to_para_reserve_transfer_assets(t: SystemParaToParaTest) -> DispatchResult {
|
||||
<AssetHubPolkadot as AssetHubPolkadotPallet>::PolkadotXcm::reserve_transfer_assets(
|
||||
t.signed_origin,
|
||||
bx!(t.args.dest.into()),
|
||||
bx!(t.args.beneficiary.into()),
|
||||
bx!(t.args.assets.into()),
|
||||
t.args.fee_asset_item,
|
||||
)
|
||||
}
|
||||
|
||||
/// Limited Reserve Transfers of native asset from Relay Chain to the System Parachain shouldn't
|
||||
/// work
|
||||
#[test]
|
||||
fn limited_reserve_transfer_native_asset_from_relay_to_system_para_fails() {
|
||||
// Init values for Relay Chain
|
||||
let amount_to_send: Balance = POLKADOT_ED * 1000;
|
||||
let test_args = TestContext {
|
||||
sender: PolkadotSender::get(),
|
||||
receiver: AssetHubPolkadotReceiver::get(),
|
||||
args: relay_test_args(amount_to_send),
|
||||
};
|
||||
|
||||
let mut test = RelayToSystemParaTest::new(test_args);
|
||||
|
||||
let sender_balance_before = test.sender.balance;
|
||||
let receiver_balance_before = test.receiver.balance;
|
||||
|
||||
test.set_assertion::<Polkadot>(relay_origin_assertions);
|
||||
test.set_assertion::<AssetHubPolkadot>(system_para_dest_assertions_incomplete);
|
||||
test.set_dispatchable::<Polkadot>(relay_limited_reserve_transfer_assets);
|
||||
test.assert();
|
||||
|
||||
let sender_balance_after = test.sender.balance;
|
||||
let receiver_balance_after = test.receiver.balance;
|
||||
|
||||
assert_eq!(sender_balance_before - amount_to_send, sender_balance_after);
|
||||
assert_eq!(receiver_balance_before, receiver_balance_after);
|
||||
}
|
||||
|
||||
/// Limited Reserve Transfers of native asset from System Parachain to Relay Chain shoudln't work
|
||||
#[test]
|
||||
fn limited_reserve_transfer_native_asset_from_system_para_to_relay_fails() {
|
||||
// Init values for System Parachain
|
||||
let destination = AssetHubPolkadot::parent_location();
|
||||
let beneficiary_id = PolkadotReceiver::get();
|
||||
let amount_to_send: Balance = ASSET_HUB_POLKADOT_ED * 1000;
|
||||
let assets = (Parent, amount_to_send).into();
|
||||
|
||||
let test_args = TestContext {
|
||||
sender: AssetHubPolkadotSender::get(),
|
||||
receiver: PolkadotReceiver::get(),
|
||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
||||
};
|
||||
|
||||
let mut test = SystemParaToRelayTest::new(test_args);
|
||||
|
||||
let sender_balance_before = test.sender.balance;
|
||||
let receiver_balance_before = test.receiver.balance;
|
||||
|
||||
test.set_assertion::<AssetHubPolkadot>(system_para_to_relay_assertions);
|
||||
test.set_dispatchable::<AssetHubPolkadot>(system_para_limited_reserve_transfer_assets);
|
||||
test.assert();
|
||||
|
||||
let sender_balance_after = test.sender.balance;
|
||||
let receiver_balance_after = test.receiver.balance;
|
||||
|
||||
assert_eq!(sender_balance_before, sender_balance_after);
|
||||
assert_eq!(receiver_balance_before, receiver_balance_after);
|
||||
}
|
||||
|
||||
/// Reserve Transfers of native asset from Relay Chain to the System Parachain shouldn't work
|
||||
#[test]
|
||||
fn reserve_transfer_native_asset_from_relay_to_system_para_fails() {
|
||||
// Init values for Relay Chain
|
||||
let amount_to_send: Balance = POLKADOT_ED * 1000;
|
||||
let test_args = TestContext {
|
||||
sender: PolkadotSender::get(),
|
||||
receiver: AssetHubPolkadotReceiver::get(),
|
||||
args: relay_test_args(amount_to_send),
|
||||
};
|
||||
|
||||
let mut test = RelayToSystemParaTest::new(test_args);
|
||||
|
||||
let sender_balance_before = test.sender.balance;
|
||||
let receiver_balance_before = test.receiver.balance;
|
||||
|
||||
test.set_assertion::<Polkadot>(relay_origin_assertions);
|
||||
test.set_assertion::<AssetHubPolkadot>(system_para_dest_assertions_incomplete);
|
||||
test.set_dispatchable::<Polkadot>(relay_reserve_transfer_assets);
|
||||
test.assert();
|
||||
|
||||
let sender_balance_after = test.sender.balance;
|
||||
let receiver_balance_after = test.receiver.balance;
|
||||
|
||||
assert_eq!(sender_balance_before - amount_to_send, sender_balance_after);
|
||||
assert_eq!(receiver_balance_before, receiver_balance_after);
|
||||
}
|
||||
|
||||
/// Reserve Transfers of native asset from System Parachain to Relay Chain shouldn't work
|
||||
#[test]
|
||||
fn reserve_transfer_native_asset_from_system_para_to_relay_fails() {
|
||||
// Init values for System Parachain
|
||||
let destination = AssetHubPolkadot::parent_location();
|
||||
let beneficiary_id = PolkadotReceiver::get();
|
||||
let amount_to_send: Balance = ASSET_HUB_POLKADOT_ED * 1000;
|
||||
let assets = (Parent, amount_to_send).into();
|
||||
|
||||
let test_args = TestContext {
|
||||
sender: AssetHubPolkadotSender::get(),
|
||||
receiver: PolkadotReceiver::get(),
|
||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
||||
};
|
||||
|
||||
let mut test = SystemParaToRelayTest::new(test_args);
|
||||
|
||||
let sender_balance_before = test.sender.balance;
|
||||
let receiver_balance_before = test.receiver.balance;
|
||||
|
||||
test.set_assertion::<AssetHubPolkadot>(system_para_to_relay_assertions);
|
||||
test.set_dispatchable::<AssetHubPolkadot>(system_para_reserve_transfer_assets);
|
||||
test.assert();
|
||||
|
||||
let sender_balance_after = test.sender.balance;
|
||||
let receiver_balance_after = test.receiver.balance;
|
||||
|
||||
assert_eq!(sender_balance_before, sender_balance_after);
|
||||
assert_eq!(receiver_balance_before, receiver_balance_after);
|
||||
}
|
||||
|
||||
/// Limited Reserve Transfers of native asset from System Parachain to Parachain should work
|
||||
#[test]
|
||||
fn limited_reserve_transfer_native_asset_from_system_para_to_para() {
|
||||
// Init values for System Parachain
|
||||
let destination = AssetHubPolkadot::sibling_location_of(PenpalPolkadotA::para_id());
|
||||
let beneficiary_id = PenpalPolkadotAReceiver::get();
|
||||
let amount_to_send: Balance = ASSET_HUB_POLKADOT_ED * 1000;
|
||||
let assets = (Parent, amount_to_send).into();
|
||||
|
||||
let test_args = TestContext {
|
||||
sender: AssetHubPolkadotSender::get(),
|
||||
receiver: PenpalPolkadotAReceiver::get(),
|
||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
||||
};
|
||||
|
||||
let mut test = SystemParaToParaTest::new(test_args);
|
||||
|
||||
let sender_balance_before = test.sender.balance;
|
||||
|
||||
test.set_assertion::<AssetHubPolkadot>(system_para_to_para_assertions);
|
||||
// TODO: Add assertion for Penpal runtime. Right now message is failing with
|
||||
// `UntrustedReserveLocation`
|
||||
test.set_dispatchable::<AssetHubPolkadot>(system_para_to_para_limited_reserve_transfer_assets);
|
||||
test.assert();
|
||||
|
||||
let sender_balance_after = test.sender.balance;
|
||||
|
||||
assert_eq!(sender_balance_before - amount_to_send, sender_balance_after);
|
||||
// TODO: Check receiver balance when Penpal runtime is improved to propery handle reserve
|
||||
// transfers
|
||||
}
|
||||
|
||||
/// Reserve Transfers of native asset from System Parachain to Parachain should work
|
||||
#[test]
|
||||
fn reserve_transfer_native_asset_from_system_para_to_para() {
|
||||
// Init values for System Parachain
|
||||
let destination = AssetHubPolkadot::sibling_location_of(PenpalPolkadotA::para_id());
|
||||
let beneficiary_id = PenpalPolkadotAReceiver::get();
|
||||
let amount_to_send: Balance = ASSET_HUB_POLKADOT_ED * 1000;
|
||||
let assets = (Parent, amount_to_send).into();
|
||||
|
||||
let test_args = TestContext {
|
||||
sender: AssetHubPolkadotSender::get(),
|
||||
receiver: PenpalPolkadotAReceiver::get(),
|
||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
||||
};
|
||||
|
||||
let mut test = SystemParaToParaTest::new(test_args);
|
||||
|
||||
let sender_balance_before = test.sender.balance;
|
||||
|
||||
test.set_assertion::<AssetHubPolkadot>(system_para_to_para_assertions);
|
||||
// TODO: Add assertion for Penpal runtime. Right now message is failing with
|
||||
// `UntrustedReserveLocation`
|
||||
test.set_dispatchable::<AssetHubPolkadot>(system_para_to_para_reserve_transfer_assets);
|
||||
test.assert();
|
||||
|
||||
let sender_balance_after = test.sender.balance;
|
||||
|
||||
assert_eq!(sender_balance_before - amount_to_send, sender_balance_after);
|
||||
// TODO: Check receiver balance when Penpal runtime is improved to propery handle reserve
|
||||
// transfers
|
||||
}
|
||||
|
||||
/// Limited Reserve Transfers of a local asset from System Parachain to Parachain should work
|
||||
#[test]
|
||||
fn limited_reserve_transfer_asset_from_system_para_to_para() {
|
||||
// Force create asset from Relay Chain and mint assets for System Parachain's sender account
|
||||
AssetHubPolkadot::force_create_and_mint_asset(
|
||||
ASSET_ID,
|
||||
ASSET_MIN_BALANCE,
|
||||
true,
|
||||
AssetHubPolkadotSender::get(),
|
||||
ASSET_MIN_BALANCE * 1000000,
|
||||
);
|
||||
|
||||
// Init values for System Parachain
|
||||
let destination = AssetHubPolkadot::sibling_location_of(PenpalPolkadotA::para_id());
|
||||
let beneficiary_id = PenpalPolkadotAReceiver::get();
|
||||
let amount_to_send = ASSET_MIN_BALANCE * 1000;
|
||||
let assets =
|
||||
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send)
|
||||
.into();
|
||||
|
||||
let system_para_test_args = TestContext {
|
||||
sender: AssetHubPolkadotSender::get(),
|
||||
receiver: PenpalPolkadotAReceiver::get(),
|
||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
||||
};
|
||||
|
||||
let mut system_para_test = SystemParaToParaTest::new(system_para_test_args);
|
||||
|
||||
system_para_test.set_assertion::<AssetHubPolkadot>(system_para_to_para_assets_assertions);
|
||||
// TODO: Add assertions when Penpal is able to manage assets
|
||||
system_para_test
|
||||
.set_dispatchable::<AssetHubPolkadot>(system_para_to_para_limited_reserve_transfer_assets);
|
||||
system_para_test.assert();
|
||||
}
|
||||
|
||||
/// Reserve Transfers of a local asset from System Parachain to Parachain should work
|
||||
#[test]
|
||||
fn reserve_transfer_asset_from_system_para_to_para() {
|
||||
// Force create asset from Relay Chain and mint assets for System Parachain's sender account
|
||||
AssetHubPolkadot::force_create_and_mint_asset(
|
||||
ASSET_ID,
|
||||
ASSET_MIN_BALANCE,
|
||||
true,
|
||||
AssetHubPolkadotSender::get(),
|
||||
ASSET_MIN_BALANCE * 1000000,
|
||||
);
|
||||
|
||||
// Init values for System Parachain
|
||||
let destination = AssetHubPolkadot::sibling_location_of(PenpalPolkadotA::para_id());
|
||||
let beneficiary_id = PenpalPolkadotAReceiver::get();
|
||||
let amount_to_send = ASSET_MIN_BALANCE * 1000;
|
||||
let assets =
|
||||
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send)
|
||||
.into();
|
||||
|
||||
let system_para_test_args = TestContext {
|
||||
sender: AssetHubPolkadotSender::get(),
|
||||
receiver: PenpalPolkadotAReceiver::get(),
|
||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
||||
};
|
||||
|
||||
let mut system_para_test = SystemParaToParaTest::new(system_para_test_args);
|
||||
|
||||
system_para_test.set_assertion::<AssetHubPolkadot>(system_para_to_para_assets_assertions);
|
||||
// TODO: Add assertions when Penpal is able to manage assets
|
||||
system_para_test
|
||||
.set_dispatchable::<AssetHubPolkadot>(system_para_to_para_reserve_transfer_assets);
|
||||
system_para_test.assert();
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
[package]
|
||||
name = "asset-hub-rococo-integration-tests"
|
||||
version = "1.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Asset Hub Rococo runtime integration tests with xcm-emulator"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false }
|
||||
assert_matches = "1.5.0"
|
||||
|
||||
# Substrate
|
||||
sp-runtime = { path = "../../../../../../substrate/primitives/runtime", default-features = false}
|
||||
frame-support = { path = "../../../../../../substrate/frame/support", default-features = false}
|
||||
frame-system = { path = "../../../../../../substrate/frame/system", default-features = false}
|
||||
pallet-balances = { path = "../../../../../../substrate/frame/balances", default-features = false}
|
||||
pallet-assets = { path = "../../../../../../substrate/frame/assets", default-features = false}
|
||||
pallet-asset-conversion = { path = "../../../../../../substrate/frame/asset-conversion", default-features = false}
|
||||
|
||||
# Polkadot
|
||||
polkadot-core-primitives = { path = "../../../../../../polkadot/core-primitives", default-features = false}
|
||||
polkadot-parachain-primitives = { path = "../../../../../../polkadot/parachain", default-features = false}
|
||||
polkadot-runtime-parachains = { path = "../../../../../../polkadot/runtime/parachains" }
|
||||
xcm = { package = "staging-xcm", path = "../../../../../../polkadot/xcm", default-features = false}
|
||||
pallet-xcm = { path = "../../../../../../polkadot/xcm/pallet-xcm", default-features = false}
|
||||
xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../polkadot/xcm/xcm-executor", default-features = false}
|
||||
rococo-runtime = { path = "../../../../../../polkadot/runtime/rococo", default-features = false }
|
||||
|
||||
# Cumulus
|
||||
asset-test-utils = { path = "../../../../runtimes/assets/test-utils", default-features = false }
|
||||
parachains-common = { path = "../../../../common" }
|
||||
asset-hub-rococo-runtime = { path = "../../../../runtimes/assets/asset-hub-rococo" }
|
||||
|
||||
# Local
|
||||
xcm-emulator = { path = "../../../../../xcm/xcm-emulator", default-features = false}
|
||||
integration-tests-common = { path = "../../common", default-features = false}
|
||||
|
||||
[features]
|
||||
runtime-benchmarks = [
|
||||
"asset-hub-rococo-runtime/runtime-benchmarks",
|
||||
"frame-support/runtime-benchmarks",
|
||||
"frame-system/runtime-benchmarks",
|
||||
"integration-tests-common/runtime-benchmarks",
|
||||
"pallet-asset-conversion/runtime-benchmarks",
|
||||
"pallet-assets/runtime-benchmarks",
|
||||
"pallet-balances/runtime-benchmarks",
|
||||
"pallet-xcm/runtime-benchmarks",
|
||||
"parachains-common/runtime-benchmarks",
|
||||
"polkadot-parachain-primitives/runtime-benchmarks",
|
||||
"polkadot-runtime-parachains/runtime-benchmarks",
|
||||
"rococo-runtime/runtime-benchmarks",
|
||||
"sp-runtime/runtime-benchmarks",
|
||||
"xcm-executor/runtime-benchmarks",
|
||||
]
|
||||
@@ -1,71 +0,0 @@
|
||||
[package]
|
||||
name = "asset-hub-westend-integration-tests"
|
||||
version = "1.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Asset Hub Westend runtime integration tests with xcm-emulator"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false }
|
||||
assert_matches = "1.5.0"
|
||||
|
||||
# Substrate
|
||||
sp-runtime = { path = "../../../../../../substrate/primitives/runtime", default-features = false}
|
||||
frame-support = { path = "../../../../../../substrate/frame/support", default-features = false}
|
||||
frame-system = { path = "../../../../../../substrate/frame/system", default-features = false}
|
||||
pallet-balances = { path = "../../../../../../substrate/frame/balances", default-features = false}
|
||||
pallet-assets = { path = "../../../../../../substrate/frame/assets", default-features = false}
|
||||
pallet-asset-conversion = { path = "../../../../../../substrate/frame/asset-conversion", default-features = false}
|
||||
pallet-message-queue = { path = "../../../../../../substrate/frame/message-queue", default-features = false }
|
||||
pallet-treasury = { path = "../../../../../../substrate/frame/treasury", default-features = false}
|
||||
pallet-asset-rate = { path = "../../../../../../substrate/frame/asset-rate", default-features = false}
|
||||
|
||||
# Polkadot
|
||||
polkadot-core-primitives = { path = "../../../../../../polkadot/core-primitives", default-features = false}
|
||||
polkadot-parachain-primitives = { path = "../../../../../../polkadot/parachain", default-features = false}
|
||||
polkadot-runtime-common = { path = "../../../../../../polkadot/runtime/common" }
|
||||
polkadot-runtime-parachains = { path = "../../../../../../polkadot/runtime/parachains" }
|
||||
xcm = { package = "staging-xcm", path = "../../../../../../polkadot/xcm", default-features = false}
|
||||
xcm-builder = { package = "staging-xcm-builder", path = "../../../../../../polkadot/xcm/xcm-builder", default-features = false}
|
||||
xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../polkadot/xcm/xcm-executor", default-features = false}
|
||||
pallet-xcm = { path = "../../../../../../polkadot/xcm/pallet-xcm", default-features = false}
|
||||
westend-runtime = { path = "../../../../../../polkadot/runtime/westend", default-features = false }
|
||||
westend-runtime-constants = { path = "../../../../../../polkadot/runtime/westend/constants", default-features = false }
|
||||
|
||||
# Cumulus
|
||||
parachains-common = { path = "../../../../common" }
|
||||
asset-hub-westend-runtime = { path = "../../../../runtimes/assets/asset-hub-westend" }
|
||||
asset-test-utils = { path = "../../../../runtimes/assets/test-utils", default-features = false }
|
||||
cumulus-pallet-dmp-queue = { default-features = false, path = "../../../../../pallets/dmp-queue" }
|
||||
cumulus-pallet-parachain-system = { default-features = false, path = "../../../../../pallets/parachain-system" }
|
||||
|
||||
# Local
|
||||
xcm-emulator = { path = "../../../../../xcm/xcm-emulator", default-features = false}
|
||||
integration-tests-common = { path = "../../common", default-features = false}
|
||||
|
||||
[features]
|
||||
runtime-benchmarks = [
|
||||
"asset-hub-westend-runtime/runtime-benchmarks",
|
||||
"cumulus-pallet-dmp-queue/runtime-benchmarks",
|
||||
"cumulus-pallet-parachain-system/runtime-benchmarks",
|
||||
"frame-support/runtime-benchmarks",
|
||||
"frame-system/runtime-benchmarks",
|
||||
"integration-tests-common/runtime-benchmarks",
|
||||
"pallet-asset-conversion/runtime-benchmarks",
|
||||
"pallet-asset-rate/runtime-benchmarks",
|
||||
"pallet-assets/runtime-benchmarks",
|
||||
"pallet-balances/runtime-benchmarks",
|
||||
"pallet-message-queue/runtime-benchmarks",
|
||||
"pallet-treasury/runtime-benchmarks",
|
||||
"pallet-xcm/runtime-benchmarks",
|
||||
"parachains-common/runtime-benchmarks",
|
||||
"polkadot-parachain-primitives/runtime-benchmarks",
|
||||
"polkadot-runtime-common/runtime-benchmarks",
|
||||
"polkadot-runtime-parachains/runtime-benchmarks",
|
||||
"sp-runtime/runtime-benchmarks",
|
||||
"westend-runtime/runtime-benchmarks",
|
||||
"xcm-builder/runtime-benchmarks",
|
||||
"xcm-executor/runtime-benchmarks",
|
||||
]
|
||||
@@ -1,41 +0,0 @@
|
||||
[package]
|
||||
name = "bridge-hub-rococo-integration-tests"
|
||||
version = "1.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Bridge Hub Rococo runtime integration tests with xcm-emulator"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false }
|
||||
|
||||
# Substrate
|
||||
frame-support = { path = "../../../../../../substrate/frame/support", default-features = false}
|
||||
frame-system = { path = "../../../../../../substrate/frame/system", default-features = false}
|
||||
sp-core = { path = "../../../../../../substrate/primitives/core", default-features = false}
|
||||
sp-weights = { path = "../../../../../../substrate/primitives/weights", default-features = false}
|
||||
pallet-balances = { path = "../../../../../../substrate/frame/balances", default-features = false}
|
||||
pallet-assets = { path = "../../../../../../substrate/frame/assets", default-features = false}
|
||||
pallet-message-queue = { path = "../../../../../../substrate/frame/message-queue", default-features = false }
|
||||
|
||||
# Polkadot
|
||||
polkadot-core-primitives = { path = "../../../../../../polkadot/core-primitives", default-features = false}
|
||||
polkadot-parachain-primitives = { path = "../../../../../../polkadot/parachain", default-features = false}
|
||||
polkadot-runtime-parachains = { path = "../../../../../../polkadot/runtime/parachains" }
|
||||
xcm = { package = "staging-xcm", path = "../../../../../../polkadot/xcm", default-features = false}
|
||||
pallet-xcm = { path = "../../../../../../polkadot/xcm/pallet-xcm", default-features = false}
|
||||
xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../polkadot/xcm/xcm-executor", default-features = false}
|
||||
|
||||
# Cumulus
|
||||
asset-test-utils = { path = "../../../../../parachains/runtimes/assets/test-utils", default-features = false }
|
||||
parachains-common = { path = "../../../../common" }
|
||||
cumulus-pallet-xcmp-queue = { path = "../../../../../pallets/xcmp-queue", default-features = false}
|
||||
cumulus-pallet-dmp-queue = { path = "../../../../../pallets/dmp-queue", default-features = false}
|
||||
pallet-bridge-messages = { path = "../../../../../../bridges/modules/messages", default-features = false}
|
||||
bp-messages = { path = "../../../../../../bridges/primitives/messages", default-features = false}
|
||||
bridge-hub-rococo-runtime = { path = "../../../../../parachains/runtimes/bridge-hubs/bridge-hub-rococo", default-features = false }
|
||||
|
||||
# Local
|
||||
xcm-emulator = { path = "../../../../../xcm/xcm-emulator", default-features = false}
|
||||
integration-tests-common = { path = "../../common", default-features = false}
|
||||
@@ -1,67 +0,0 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub use bp_messages::LaneId;
|
||||
pub use frame_support::assert_ok;
|
||||
pub use integration_tests_common::{
|
||||
constants::{
|
||||
bridge_hub_rococo::ED as BRIDGE_HUB_ROCOCO_ED, rococo::ED as ROCOCO_ED,
|
||||
PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3,
|
||||
},
|
||||
test_parachain_is_trusted_teleporter,
|
||||
xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution},
|
||||
AssetHubRococo, AssetHubRococoReceiver, AssetHubWococo, BridgeHubRococo, BridgeHubRococoPallet,
|
||||
BridgeHubRococoSender, BridgeHubWococo, PenpalRococoA, Rococo, RococoPallet,
|
||||
};
|
||||
pub use parachains_common::{AccountId, Balance};
|
||||
pub use xcm::{
|
||||
prelude::{AccountId32 as AccountId32Junction, *},
|
||||
v3::{
|
||||
Error,
|
||||
NetworkId::{Rococo as RococoId, Wococo as WococoId},
|
||||
},
|
||||
};
|
||||
pub use xcm_emulator::{
|
||||
assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para,
|
||||
RelayChain as Relay, Test, TestArgs, TestContext, TestExt,
|
||||
};
|
||||
|
||||
pub const ASSET_ID: u32 = 1;
|
||||
pub const ASSET_MIN_BALANCE: u128 = 1000;
|
||||
pub const ASSETS_PALLET_ID: u8 = 50;
|
||||
|
||||
pub type RelayToSystemParaTest = Test<Rococo, AssetHubRococo>;
|
||||
pub type SystemParaToRelayTest = Test<AssetHubRococo, Rococo>;
|
||||
pub type SystemParaToParaTest = Test<AssetHubRococo, PenpalRococoA>;
|
||||
|
||||
/// Returns a `TestArgs` instance to de used for the Relay Chain accross integraton tests
|
||||
pub fn relay_test_args(amount: Balance) -> TestArgs {
|
||||
TestArgs {
|
||||
dest: Rococo::child_location_of(AssetHubRococo::para_id()),
|
||||
beneficiary: AccountId32Junction {
|
||||
network: None,
|
||||
id: AssetHubRococoReceiver::get().into(),
|
||||
}
|
||||
.into(),
|
||||
amount,
|
||||
assets: (Here, amount).into(),
|
||||
asset_id: None,
|
||||
fee_asset_item: 0,
|
||||
weight_limit: WeightLimit::Unlimited,
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
@@ -1,41 +0,0 @@
|
||||
[package]
|
||||
name = "bridge-hub-westend-integration-tests"
|
||||
version = "1.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Bridge Hub Westend runtime integration tests with xcm-emulator"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false }
|
||||
|
||||
# Substrate
|
||||
frame-support = { path = "../../../../../../substrate/frame/support", default-features = false}
|
||||
frame-system = { path = "../../../../../../substrate/frame/system", default-features = false}
|
||||
sp-core = { path = "../../../../../../substrate/primitives/core", default-features = false}
|
||||
sp-weights = { path = "../../../../../../substrate/primitives/weights", default-features = false}
|
||||
pallet-balances = { path = "../../../../../../substrate/frame/balances", default-features = false}
|
||||
pallet-assets = { path = "../../../../../../substrate/frame/assets", default-features = false}
|
||||
pallet-message-queue = { path = "../../../../../../substrate/frame/message-queue", default-features = false }
|
||||
|
||||
# Polkadot
|
||||
polkadot-core-primitives = { path = "../../../../../../polkadot/core-primitives", default-features = false}
|
||||
polkadot-parachain-primitives = { path = "../../../../../../polkadot/parachain", default-features = false}
|
||||
polkadot-runtime-parachains = { path = "../../../../../../polkadot/runtime/parachains" }
|
||||
xcm = { package = "staging-xcm", path = "../../../../../../polkadot/xcm", default-features = false}
|
||||
pallet-xcm = { path = "../../../../../../polkadot/xcm/pallet-xcm", default-features = false}
|
||||
xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../polkadot/xcm/xcm-executor", default-features = false}
|
||||
|
||||
# Cumulus
|
||||
asset-test-utils = { path = "../../../../../parachains/runtimes/assets/test-utils", default-features = false }
|
||||
parachains-common = { path = "../../../../common" }
|
||||
cumulus-pallet-xcmp-queue = { path = "../../../../../pallets/xcmp-queue", default-features = false}
|
||||
cumulus-pallet-dmp-queue = { path = "../../../../../pallets/dmp-queue", default-features = false}
|
||||
pallet-bridge-messages = { path = "../../../../../../bridges/modules/messages", default-features = false}
|
||||
bp-messages = { path = "../../../../../../bridges/primitives/messages", default-features = false}
|
||||
bridge-hub-westend-runtime = { path = "../../../../../parachains/runtimes/bridge-hubs/bridge-hub-westend", default-features = false }
|
||||
|
||||
# Local
|
||||
xcm-emulator = { path = "../../../../../xcm/xcm-emulator", default-features = false}
|
||||
integration-tests-common = { path = "../../common", default-features = false}
|
||||
@@ -1,67 +0,0 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub use bp_messages::LaneId;
|
||||
pub use frame_support::assert_ok;
|
||||
pub use integration_tests_common::{
|
||||
constants::{
|
||||
bridge_hub_westend::ED as BRIDGE_HUB_WESTEND_ED, westend::ED as WESTEND_ED,
|
||||
PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3,
|
||||
},
|
||||
test_parachain_is_trusted_teleporter,
|
||||
xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution},
|
||||
AssetHubRococo, AssetHubWestend, AssetHubWestendReceiver, BridgeHubRococo, BridgeHubWestend,
|
||||
BridgeHubWestendPallet, BridgeHubWestendSender, PenpalWestendA, Westend, WestendPallet,
|
||||
};
|
||||
pub use parachains_common::{AccountId, Balance};
|
||||
pub use xcm::{
|
||||
prelude::{AccountId32 as AccountId32Junction, *},
|
||||
v3::{
|
||||
Error,
|
||||
NetworkId::{Rococo as RococoId, Westend as WestendId},
|
||||
},
|
||||
};
|
||||
pub use xcm_emulator::{
|
||||
assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para,
|
||||
RelayChain as Relay, Test, TestArgs, TestContext, TestExt,
|
||||
};
|
||||
|
||||
pub const ASSET_ID: u32 = 1;
|
||||
pub const ASSET_MIN_BALANCE: u128 = 1000;
|
||||
pub const ASSETS_PALLET_ID: u8 = 50;
|
||||
|
||||
pub type RelayToSystemParaTest = Test<Westend, AssetHubWestend>;
|
||||
pub type SystemParaToRelayTest = Test<AssetHubWestend, Westend>;
|
||||
pub type SystemParaToParaTest = Test<AssetHubWestend, PenpalWestendA>;
|
||||
|
||||
/// Returns a `TestArgs` instance to de used for the Relay Chain accross integraton tests
|
||||
pub fn relay_test_args(amount: Balance) -> TestArgs {
|
||||
TestArgs {
|
||||
dest: Westend::child_location_of(AssetHubWestend::para_id()),
|
||||
beneficiary: AccountId32Junction {
|
||||
network: None,
|
||||
id: AssetHubWestendReceiver::get().into(),
|
||||
}
|
||||
.into(),
|
||||
amount,
|
||||
assets: (Here, amount).into(),
|
||||
asset_id: None,
|
||||
fee_asset_item: 0,
|
||||
weight_limit: WeightLimit::Unlimited,
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
[package]
|
||||
name = "asset-hub-rococo-emulated-chain"
|
||||
version = "0.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Asset Hub Rococo emulated chain"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1.0.104"
|
||||
|
||||
# Substrate
|
||||
sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false }
|
||||
sp-runtime = { path = "../../../../../../../../substrate/primitives/runtime", default-features = false }
|
||||
frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false }
|
||||
|
||||
# Polakadot
|
||||
parachains-common = { path = "../../../../../../../parachains/common" }
|
||||
|
||||
# Cumulus
|
||||
cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false }
|
||||
emulated-integration-tests-common = { path = "../../../../common", default-features = false }
|
||||
asset-hub-rococo-runtime = { path = "../../../../../../runtimes/assets/asset-hub-rococo" }
|
||||
rococo-emulated-chain = { path = "../../../relays/rococo" }
|
||||
+70
@@ -0,0 +1,70 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Substrate
|
||||
use sp_core::storage::Storage;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
accounts, build_genesis_storage_legacy, collators, SAFE_XCM_VERSION,
|
||||
};
|
||||
use parachains_common::Balance;
|
||||
|
||||
pub const PARA_ID: u32 = 1000;
|
||||
pub const ED: Balance = parachains_common::rococo::currency::EXISTENTIAL_DEPOSIT;
|
||||
|
||||
pub fn genesis() -> Storage {
|
||||
let genesis_config = asset_hub_rococo_runtime::RuntimeGenesisConfig {
|
||||
system: asset_hub_rococo_runtime::SystemConfig::default(),
|
||||
balances: asset_hub_rococo_runtime::BalancesConfig {
|
||||
balances: accounts::init_balances()
|
||||
.iter()
|
||||
.cloned()
|
||||
.map(|k| (k, ED * 4096 * 4096))
|
||||
.collect(),
|
||||
},
|
||||
parachain_info: asset_hub_rococo_runtime::ParachainInfoConfig {
|
||||
parachain_id: PARA_ID.into(),
|
||||
..Default::default()
|
||||
},
|
||||
collator_selection: asset_hub_rococo_runtime::CollatorSelectionConfig {
|
||||
invulnerables: collators::invulnerables().iter().cloned().map(|(acc, _)| acc).collect(),
|
||||
candidacy_bond: ED * 16,
|
||||
..Default::default()
|
||||
},
|
||||
session: asset_hub_rococo_runtime::SessionConfig {
|
||||
keys: collators::invulnerables()
|
||||
.into_iter()
|
||||
.map(|(acc, aura)| {
|
||||
(
|
||||
acc.clone(), // account id
|
||||
acc, // validator id
|
||||
asset_hub_rococo_runtime::SessionKeys { aura }, // session keys
|
||||
)
|
||||
})
|
||||
.collect(),
|
||||
},
|
||||
polkadot_xcm: asset_hub_rococo_runtime::PolkadotXcmConfig {
|
||||
safe_xcm_version: Some(SAFE_XCM_VERSION),
|
||||
..Default::default()
|
||||
},
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
build_genesis_storage_legacy(
|
||||
&genesis_config,
|
||||
asset_hub_rococo_runtime::WASM_BINARY.expect("WASM binary was not built, please build it!"),
|
||||
)
|
||||
}
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub mod genesis;
|
||||
|
||||
// Substrate
|
||||
use frame_support::traits::OnInitialize;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain,
|
||||
impl_assets_helpers_for_system_parachain, xcm_emulator::decl_test_parachains,
|
||||
};
|
||||
use rococo_emulated_chain::Rococo;
|
||||
|
||||
// AssetHubRococo Parachain declaration
|
||||
decl_test_parachains! {
|
||||
pub struct AssetHubRococo {
|
||||
genesis = genesis::genesis(),
|
||||
on_init = {
|
||||
asset_hub_rococo_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = asset_hub_rococo_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: asset_hub_rococo_runtime::XcmpQueue,
|
||||
LocationToAccountId: asset_hub_rococo_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: asset_hub_rococo_runtime::ParachainInfo,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: asset_hub_rococo_runtime::PolkadotXcm,
|
||||
Assets: asset_hub_rococo_runtime::Assets,
|
||||
ForeignAssets: asset_hub_rococo_runtime::ForeignAssets,
|
||||
PoolAssets: asset_hub_rococo_runtime::PoolAssets,
|
||||
AssetConversion: asset_hub_rococo_runtime::AssetConversion,
|
||||
Balances: asset_hub_rococo_runtime::Balances,
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// AssetHubRococo implementation
|
||||
impl_accounts_helpers_for_parachain!(AssetHubRococo);
|
||||
impl_assert_events_helpers_for_parachain!(AssetHubRococo);
|
||||
impl_assets_helpers_for_system_parachain!(AssetHubRococo, Rococo);
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
[package]
|
||||
name = "asset-hub-westend-emulated-chain"
|
||||
version = "0.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Asset Hub Westend emulated chain"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1.0.104"
|
||||
|
||||
# Substrate
|
||||
sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false }
|
||||
sp-runtime = { path = "../../../../../../../../substrate/primitives/runtime", default-features = false }
|
||||
frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false }
|
||||
|
||||
# Polakadot
|
||||
parachains-common = { path = "../../../../../../../parachains/common" }
|
||||
|
||||
# Cumulus
|
||||
cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false }
|
||||
emulated-integration-tests-common = { path = "../../../../common", default-features = false }
|
||||
asset-hub-westend-runtime = { path = "../../../../../../runtimes/assets/asset-hub-westend" }
|
||||
westend-emulated-chain = { path = "../../../relays/westend" }
|
||||
+67
@@ -0,0 +1,67 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Substrate
|
||||
use sp_core::storage::Storage;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
accounts, build_genesis_storage_legacy, collators, SAFE_XCM_VERSION,
|
||||
};
|
||||
use parachains_common::Balance;
|
||||
|
||||
pub const PARA_ID: u32 = 1000;
|
||||
pub const ED: Balance = parachains_common::westend::currency::EXISTENTIAL_DEPOSIT;
|
||||
|
||||
pub fn genesis() -> Storage {
|
||||
let genesis_config = asset_hub_westend_runtime::RuntimeGenesisConfig {
|
||||
system: asset_hub_westend_runtime::SystemConfig::default(),
|
||||
balances: asset_hub_westend_runtime::BalancesConfig {
|
||||
balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
|
||||
},
|
||||
parachain_info: asset_hub_westend_runtime::ParachainInfoConfig {
|
||||
parachain_id: PARA_ID.into(),
|
||||
..Default::default()
|
||||
},
|
||||
collator_selection: asset_hub_westend_runtime::CollatorSelectionConfig {
|
||||
invulnerables: collators::invulnerables().iter().cloned().map(|(acc, _)| acc).collect(),
|
||||
candidacy_bond: ED * 16,
|
||||
..Default::default()
|
||||
},
|
||||
session: asset_hub_westend_runtime::SessionConfig {
|
||||
keys: collators::invulnerables()
|
||||
.into_iter()
|
||||
.map(|(acc, aura)| {
|
||||
(
|
||||
acc.clone(), // account id
|
||||
acc, // validator id
|
||||
asset_hub_westend_runtime::SessionKeys { aura }, // session keys
|
||||
)
|
||||
})
|
||||
.collect(),
|
||||
},
|
||||
polkadot_xcm: asset_hub_westend_runtime::PolkadotXcmConfig {
|
||||
safe_xcm_version: Some(SAFE_XCM_VERSION),
|
||||
..Default::default()
|
||||
},
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
build_genesis_storage_legacy(
|
||||
&genesis_config,
|
||||
asset_hub_westend_runtime::WASM_BINARY
|
||||
.expect("WASM binary was not built, please build it!"),
|
||||
)
|
||||
}
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub mod genesis;
|
||||
|
||||
// Substrate
|
||||
use frame_support::traits::OnInitialize;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain,
|
||||
impl_assets_helpers_for_system_parachain, xcm_emulator::decl_test_parachains,
|
||||
};
|
||||
use westend_emulated_chain::Westend;
|
||||
|
||||
// AssetHubWestend Parachain declaration
|
||||
decl_test_parachains! {
|
||||
pub struct AssetHubWestend {
|
||||
genesis = genesis::genesis(),
|
||||
on_init = {
|
||||
asset_hub_westend_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = asset_hub_westend_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: asset_hub_westend_runtime::XcmpQueue,
|
||||
LocationToAccountId: asset_hub_westend_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: asset_hub_westend_runtime::ParachainInfo,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: asset_hub_westend_runtime::PolkadotXcm,
|
||||
Balances: asset_hub_westend_runtime::Balances,
|
||||
Assets: asset_hub_westend_runtime::Assets,
|
||||
ForeignAssets: asset_hub_westend_runtime::ForeignAssets,
|
||||
PoolAssets: asset_hub_westend_runtime::PoolAssets,
|
||||
AssetConversion: asset_hub_westend_runtime::AssetConversion,
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// AssetHubWestend implementation
|
||||
impl_accounts_helpers_for_parachain!(AssetHubWestend);
|
||||
impl_assert_events_helpers_for_parachain!(AssetHubWestend);
|
||||
impl_assets_helpers_for_system_parachain!(AssetHubWestend, Westend);
|
||||
+26
@@ -0,0 +1,26 @@
|
||||
[package]
|
||||
name = "asset-hub-wococo-emulated-chain"
|
||||
version = "0.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Asset Hub Wococo emulated chain"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1.0.104"
|
||||
|
||||
# Substrate
|
||||
sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false }
|
||||
sp-runtime = { path = "../../../../../../../../substrate/primitives/runtime", default-features = false }
|
||||
frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false }
|
||||
|
||||
# Polakadot
|
||||
parachains-common = { path = "../../../../../../../parachains/common" }
|
||||
|
||||
# Cumulus
|
||||
cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false }
|
||||
emulated-integration-tests-common = { path = "../../../../common", default-features = false }
|
||||
asset-hub-rococo-runtime = { path = "../../../../../../runtimes/assets/asset-hub-rococo" }
|
||||
wococo-emulated-chain = { path = "../../../relays/wococo" }
|
||||
asset-hub-rococo-emulated-chain = { path = "../asset-hub-rococo" }
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Substrate
|
||||
use frame_support::traits::OnInitialize;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain,
|
||||
impl_assets_helpers_for_system_parachain, xcm_emulator::decl_test_parachains,
|
||||
};
|
||||
use wococo_emulated_chain::Wococo;
|
||||
|
||||
// AssetHubWococo Parachain declaration
|
||||
decl_test_parachains! {
|
||||
pub struct AssetHubWococo {
|
||||
genesis = asset_hub_rococo_emulated_chain::genesis::genesis(),
|
||||
on_init = {
|
||||
asset_hub_rococo_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = asset_hub_rococo_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: asset_hub_rococo_runtime::XcmpQueue,
|
||||
LocationToAccountId: asset_hub_rococo_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: asset_hub_rococo_runtime::ParachainInfo,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: asset_hub_rococo_runtime::PolkadotXcm,
|
||||
Assets: asset_hub_rococo_runtime::Assets,
|
||||
ForeignAssets: asset_hub_rococo_runtime::ForeignAssets,
|
||||
PoolAssets: asset_hub_rococo_runtime::PoolAssets,
|
||||
AssetConversion: asset_hub_rococo_runtime::AssetConversion,
|
||||
Balances: asset_hub_rococo_runtime::Balances,
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// AssetHubWococo implementation
|
||||
impl_accounts_helpers_for_parachain!(AssetHubWococo);
|
||||
impl_assert_events_helpers_for_parachain!(AssetHubWococo);
|
||||
impl_assets_helpers_for_system_parachain!(AssetHubWococo, Wococo);
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
[package]
|
||||
name = "bridge-hub-rococo-emulated-chain"
|
||||
version = "0.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Bridge Hub Rococo emulated chain"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1.0.104"
|
||||
|
||||
# Substrate
|
||||
sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false }
|
||||
sp-runtime = { path = "../../../../../../../../substrate/primitives/runtime", default-features = false }
|
||||
frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false }
|
||||
|
||||
# Polakadot
|
||||
parachains-common = { path = "../../../../../../../parachains/common" }
|
||||
|
||||
# Cumulus
|
||||
cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false }
|
||||
emulated-integration-tests-common = { path = "../../../../common", default-features = false }
|
||||
bridge-hub-rococo-runtime = { path = "../../../../../../runtimes/bridge-hubs/bridge-hub-rococo" }
|
||||
+83
@@ -0,0 +1,83 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Substrate
|
||||
use sp_core::{sr25519, storage::Storage};
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
accounts, build_genesis_storage_legacy, collators, get_account_id_from_seed, SAFE_XCM_VERSION,
|
||||
};
|
||||
use parachains_common::Balance;
|
||||
|
||||
pub const PARA_ID: u32 = 1013;
|
||||
pub const ED: Balance = parachains_common::rococo::currency::EXISTENTIAL_DEPOSIT;
|
||||
|
||||
pub fn genesis() -> Storage {
|
||||
let genesis_config = bridge_hub_rococo_runtime::RuntimeGenesisConfig {
|
||||
system: bridge_hub_rococo_runtime::SystemConfig::default(),
|
||||
balances: bridge_hub_rococo_runtime::BalancesConfig {
|
||||
balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
|
||||
},
|
||||
parachain_info: bridge_hub_rococo_runtime::ParachainInfoConfig {
|
||||
parachain_id: PARA_ID.into(),
|
||||
..Default::default()
|
||||
},
|
||||
collator_selection: bridge_hub_rococo_runtime::CollatorSelectionConfig {
|
||||
invulnerables: collators::invulnerables().iter().cloned().map(|(acc, _)| acc).collect(),
|
||||
candidacy_bond: ED * 16,
|
||||
..Default::default()
|
||||
},
|
||||
session: bridge_hub_rococo_runtime::SessionConfig {
|
||||
keys: collators::invulnerables()
|
||||
.into_iter()
|
||||
.map(|(acc, aura)| {
|
||||
(
|
||||
acc.clone(), // account id
|
||||
acc, // validator id
|
||||
bridge_hub_rococo_runtime::SessionKeys { aura }, // session keys
|
||||
)
|
||||
})
|
||||
.collect(),
|
||||
},
|
||||
polkadot_xcm: bridge_hub_rococo_runtime::PolkadotXcmConfig {
|
||||
safe_xcm_version: Some(SAFE_XCM_VERSION),
|
||||
..Default::default()
|
||||
},
|
||||
bridge_wococo_grandpa: bridge_hub_rococo_runtime::BridgeWococoGrandpaConfig {
|
||||
owner: Some(get_account_id_from_seed::<sr25519::Public>(accounts::BOB)),
|
||||
..Default::default()
|
||||
},
|
||||
bridge_rococo_grandpa: bridge_hub_rococo_runtime::BridgeRococoGrandpaConfig {
|
||||
owner: Some(get_account_id_from_seed::<sr25519::Public>(accounts::BOB)),
|
||||
..Default::default()
|
||||
},
|
||||
bridge_rococo_messages: bridge_hub_rococo_runtime::BridgeRococoMessagesConfig {
|
||||
owner: Some(get_account_id_from_seed::<sr25519::Public>(accounts::BOB)),
|
||||
..Default::default()
|
||||
},
|
||||
bridge_wococo_messages: bridge_hub_rococo_runtime::BridgeWococoMessagesConfig {
|
||||
owner: Some(get_account_id_from_seed::<sr25519::Public>(accounts::BOB)),
|
||||
..Default::default()
|
||||
},
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
build_genesis_storage_legacy(
|
||||
&genesis_config,
|
||||
bridge_hub_rococo_runtime::WASM_BINARY
|
||||
.expect("WASM binary was not built, please build it!"),
|
||||
)
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub mod genesis;
|
||||
|
||||
// Substrate
|
||||
use frame_support::traits::OnInitialize;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain,
|
||||
xcm_emulator::decl_test_parachains,
|
||||
};
|
||||
|
||||
// BridgeHubRococo Parachain declaration
|
||||
decl_test_parachains! {
|
||||
pub struct BridgeHubRococo {
|
||||
genesis = genesis::genesis(),
|
||||
on_init = {
|
||||
bridge_hub_rococo_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = bridge_hub_rococo_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: bridge_hub_rococo_runtime::XcmpQueue,
|
||||
LocationToAccountId: bridge_hub_rococo_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: bridge_hub_rococo_runtime::ParachainInfo,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: bridge_hub_rococo_runtime::PolkadotXcm,
|
||||
Balances: bridge_hub_rococo_runtime::Balances,
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// BridgeHubRococo implementation
|
||||
impl_accounts_helpers_for_parachain!(BridgeHubRococo);
|
||||
impl_assert_events_helpers_for_parachain!(BridgeHubRococo);
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
[package]
|
||||
name = "bridge-hub-westend-emulated-chain"
|
||||
version = "0.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Bridge Hub Westend emulated chain"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1.0.104"
|
||||
|
||||
# Substrate
|
||||
sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false }
|
||||
sp-runtime = { path = "../../../../../../../../substrate/primitives/runtime", default-features = false }
|
||||
frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false }
|
||||
|
||||
# Polakadot
|
||||
parachains-common = { path = "../../../../../../../parachains/common" }
|
||||
|
||||
# Cumulus
|
||||
cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false }
|
||||
emulated-integration-tests-common = { path = "../../../../common", default-features = false }
|
||||
bridge-hub-westend-runtime = { path = "../../../../../../runtimes/bridge-hubs/bridge-hub-westend" }
|
||||
+75
@@ -0,0 +1,75 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Substrate
|
||||
use sp_core::{sr25519, storage::Storage};
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
accounts, build_genesis_storage_legacy, collators, get_account_id_from_seed, SAFE_XCM_VERSION,
|
||||
};
|
||||
use parachains_common::Balance;
|
||||
|
||||
pub const PARA_ID: u32 = 1013;
|
||||
pub const ED: Balance = parachains_common::westend::currency::EXISTENTIAL_DEPOSIT;
|
||||
|
||||
pub fn genesis() -> Storage {
|
||||
let genesis_config = bridge_hub_westend_runtime::RuntimeGenesisConfig {
|
||||
system: bridge_hub_westend_runtime::SystemConfig::default(),
|
||||
balances: bridge_hub_westend_runtime::BalancesConfig {
|
||||
balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
|
||||
},
|
||||
parachain_info: bridge_hub_westend_runtime::ParachainInfoConfig {
|
||||
parachain_id: PARA_ID.into(),
|
||||
..Default::default()
|
||||
},
|
||||
collator_selection: bridge_hub_westend_runtime::CollatorSelectionConfig {
|
||||
invulnerables: collators::invulnerables().iter().cloned().map(|(acc, _)| acc).collect(),
|
||||
candidacy_bond: ED * 16,
|
||||
..Default::default()
|
||||
},
|
||||
session: bridge_hub_westend_runtime::SessionConfig {
|
||||
keys: collators::invulnerables()
|
||||
.into_iter()
|
||||
.map(|(acc, aura)| {
|
||||
(
|
||||
acc.clone(), // account id
|
||||
acc, // validator id
|
||||
bridge_hub_westend_runtime::SessionKeys { aura }, // session keys
|
||||
)
|
||||
})
|
||||
.collect(),
|
||||
},
|
||||
polkadot_xcm: bridge_hub_westend_runtime::PolkadotXcmConfig {
|
||||
safe_xcm_version: Some(SAFE_XCM_VERSION),
|
||||
..Default::default()
|
||||
},
|
||||
bridge_rococo_grandpa: bridge_hub_westend_runtime::BridgeRococoGrandpaConfig {
|
||||
owner: Some(get_account_id_from_seed::<sr25519::Public>(accounts::BOB)),
|
||||
..Default::default()
|
||||
},
|
||||
bridge_rococo_messages: bridge_hub_westend_runtime::BridgeRococoMessagesConfig {
|
||||
owner: Some(get_account_id_from_seed::<sr25519::Public>(accounts::BOB)),
|
||||
..Default::default()
|
||||
},
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
build_genesis_storage_legacy(
|
||||
&genesis_config,
|
||||
bridge_hub_westend_runtime::WASM_BINARY
|
||||
.expect("WASM binary was not built, please build it!"),
|
||||
)
|
||||
}
|
||||
+49
@@ -0,0 +1,49 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub mod genesis;
|
||||
|
||||
// Substrate
|
||||
use frame_support::traits::OnInitialize;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain,
|
||||
xcm_emulator::decl_test_parachains,
|
||||
};
|
||||
|
||||
// BridgeHubWestend Parachain declaration
|
||||
decl_test_parachains! {
|
||||
pub struct BridgeHubWestend {
|
||||
genesis = genesis::genesis(),
|
||||
on_init = {
|
||||
bridge_hub_westend_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = bridge_hub_westend_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: bridge_hub_westend_runtime::XcmpQueue,
|
||||
LocationToAccountId: bridge_hub_westend_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: bridge_hub_westend_runtime::ParachainInfo,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: bridge_hub_westend_runtime::PolkadotXcm,
|
||||
Balances: bridge_hub_westend_runtime::Balances,
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// BridgeHubWestend implementation
|
||||
impl_accounts_helpers_for_parachain!(BridgeHubWestend);
|
||||
impl_assert_events_helpers_for_parachain!(BridgeHubWestend);
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
[package]
|
||||
name = "bridge-hub-wococo-emulated-chain"
|
||||
version = "0.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Bridge Hub Wococo emulated chain"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1.0.104"
|
||||
|
||||
# Substrate
|
||||
sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false }
|
||||
sp-runtime = { path = "../../../../../../../../substrate/primitives/runtime", default-features = false }
|
||||
frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false }
|
||||
|
||||
# Polakadot
|
||||
parachains-common = { path = "../../../../../../../parachains/common" }
|
||||
|
||||
# Cumulus
|
||||
cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false }
|
||||
emulated-integration-tests-common = { path = "../../../../common", default-features = false }
|
||||
bridge-hub-rococo-runtime = { path = "../../../../../../runtimes/bridge-hubs/bridge-hub-rococo" }
|
||||
bridge-hub-rococo-emulated-chain = { path = "../bridge-hub-rococo" }
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Substrate
|
||||
use frame_support::traits::OnInitialize;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
impl_accounts_helpers_for_parachain, impl_assert_events_helpers_for_parachain,
|
||||
xcm_emulator::decl_test_parachains,
|
||||
};
|
||||
|
||||
// BridgeHubWococo Parachain declaration
|
||||
decl_test_parachains! {
|
||||
pub struct BridgeHubWococo {
|
||||
genesis = bridge_hub_rococo_emulated_chain::genesis::genesis(),
|
||||
on_init = {
|
||||
bridge_hub_rococo_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = bridge_hub_rococo_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: bridge_hub_rococo_runtime::XcmpQueue,
|
||||
LocationToAccountId: bridge_hub_rococo_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: bridge_hub_rococo_runtime::ParachainInfo,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: bridge_hub_rococo_runtime::PolkadotXcm,
|
||||
Balances: bridge_hub_rococo_runtime::Balances,
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// BridgeHubWococo implementation
|
||||
impl_accounts_helpers_for_parachain!(BridgeHubWococo);
|
||||
impl_assert_events_helpers_for_parachain!(BridgeHubWococo);
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
[package]
|
||||
name = "penpal-emulated-chain"
|
||||
version = "0.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Penpal emulated chain"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1.0.104"
|
||||
|
||||
# Substrate
|
||||
sp-core = { path = "../../../../../../../../substrate/primitives/core", default-features = false }
|
||||
sp-runtime = { path = "../../../../../../../../substrate/primitives/runtime", default-features = false }
|
||||
frame-support = { path = "../../../../../../../../substrate/frame/support", default-features = false }
|
||||
|
||||
# Polakadot
|
||||
parachains-common = { path = "../../../../../../../parachains/common" }
|
||||
|
||||
# Cumulus
|
||||
cumulus-primitives-core = { path = "../../../../../../../primitives/core", default-features = false }
|
||||
emulated-integration-tests-common = { path = "../../../../common", default-features = false }
|
||||
penpal-runtime = { path = "../../../../../../runtimes/testing/penpal" }
|
||||
+71
@@ -0,0 +1,71 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Substrate
|
||||
use sp_core::{sr25519, storage::Storage};
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
accounts, build_genesis_storage_legacy, collators, get_account_id_from_seed, SAFE_XCM_VERSION,
|
||||
};
|
||||
use parachains_common::Balance;
|
||||
|
||||
// Penpal
|
||||
pub const PARA_ID_A: u32 = 2000;
|
||||
pub const PARA_ID_B: u32 = 2001;
|
||||
pub const ED: Balance = penpal_runtime::EXISTENTIAL_DEPOSIT;
|
||||
|
||||
pub fn genesis(para_id: u32) -> Storage {
|
||||
let genesis_config = penpal_runtime::RuntimeGenesisConfig {
|
||||
system: penpal_runtime::SystemConfig::default(),
|
||||
balances: penpal_runtime::BalancesConfig {
|
||||
balances: accounts::init_balances().iter().cloned().map(|k| (k, ED * 4096)).collect(),
|
||||
},
|
||||
parachain_info: penpal_runtime::ParachainInfoConfig {
|
||||
parachain_id: para_id.into(),
|
||||
..Default::default()
|
||||
},
|
||||
collator_selection: penpal_runtime::CollatorSelectionConfig {
|
||||
invulnerables: collators::invulnerables().iter().cloned().map(|(acc, _)| acc).collect(),
|
||||
candidacy_bond: ED * 16,
|
||||
..Default::default()
|
||||
},
|
||||
session: penpal_runtime::SessionConfig {
|
||||
keys: collators::invulnerables()
|
||||
.into_iter()
|
||||
.map(|(acc, aura)| {
|
||||
(
|
||||
acc.clone(), // account id
|
||||
acc, // validator id
|
||||
penpal_runtime::SessionKeys { aura }, // session keys
|
||||
)
|
||||
})
|
||||
.collect(),
|
||||
},
|
||||
polkadot_xcm: penpal_runtime::PolkadotXcmConfig {
|
||||
safe_xcm_version: Some(SAFE_XCM_VERSION),
|
||||
..Default::default()
|
||||
},
|
||||
sudo: penpal_runtime::SudoConfig {
|
||||
key: Some(get_account_id_from_seed::<sr25519::Public>("Alice")),
|
||||
},
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
build_genesis_storage_legacy(
|
||||
&genesis_config,
|
||||
penpal_runtime::WASM_BINARY.expect("WASM binary was not built, please build it!"),
|
||||
)
|
||||
}
|
||||
+65
@@ -0,0 +1,65 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
mod genesis;
|
||||
pub use genesis::{genesis, ED, PARA_ID_A, PARA_ID_B};
|
||||
|
||||
// Substrate
|
||||
use frame_support::traits::OnInitialize;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
impl_assert_events_helpers_for_parachain, xcm_emulator::decl_test_parachains,
|
||||
};
|
||||
|
||||
// Penpal Parachain declaration
|
||||
decl_test_parachains! {
|
||||
pub struct PenpalA {
|
||||
genesis = genesis(PARA_ID_A),
|
||||
on_init = {
|
||||
penpal_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = penpal_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: penpal_runtime::XcmpQueue,
|
||||
LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: penpal_runtime::ParachainInfo,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: penpal_runtime::PolkadotXcm,
|
||||
Assets: penpal_runtime::Assets,
|
||||
}
|
||||
},
|
||||
pub struct PenpalB {
|
||||
genesis = genesis(PARA_ID_B),
|
||||
on_init = {
|
||||
penpal_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = penpal_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: penpal_runtime::XcmpQueue,
|
||||
LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: penpal_runtime::ParachainInfo,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: penpal_runtime::PolkadotXcm,
|
||||
Assets: penpal_runtime::Assets,
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// Penpal implementation
|
||||
impl_assert_events_helpers_for_parachain!(PenpalA);
|
||||
impl_assert_events_helpers_for_parachain!(PenpalB);
|
||||
@@ -0,0 +1,29 @@
|
||||
[package]
|
||||
name = "rococo-emulated-chain"
|
||||
version = "0.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Rococo emulated chain"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1.0.104"
|
||||
|
||||
# Substrate
|
||||
sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false }
|
||||
sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false }
|
||||
sp-authority-discovery = { path = "../../../../../../../substrate/primitives/authority-discovery", default-features = false }
|
||||
sp-consensus-babe = { path = "../../../../../../../substrate/primitives/consensus/babe", default-features = false }
|
||||
beefy-primitives = { package = "sp-consensus-beefy", path = "../../../../../../../substrate/primitives/consensus/beefy" }
|
||||
grandpa = { package = "sc-consensus-grandpa", path = "../../../../../../../substrate/client/consensus/grandpa", default-features = false }
|
||||
pallet-im-online = { path = "../../../../../../../substrate/frame/im-online", default-features = false }
|
||||
|
||||
# Polkadot
|
||||
polkadot-primitives = { path = "../../../../../../../polkadot/primitives", default-features = false }
|
||||
rococo-runtime-constants = { path = "../../../../../../../polkadot/runtime/rococo/constants", default-features = false }
|
||||
rococo-runtime = { path = "../../../../../../../polkadot/runtime/rococo" }
|
||||
|
||||
# Cumulus
|
||||
parachains-common = { path = "../../../../../../parachains/common" }
|
||||
emulated-integration-tests-common = { path = "../../../common", default-features = false }
|
||||
@@ -0,0 +1,101 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Substrate
|
||||
use beefy_primitives::ecdsa_crypto::AuthorityId as BeefyId;
|
||||
use grandpa::AuthorityId as GrandpaId;
|
||||
use pallet_im_online::sr25519::AuthorityId as ImOnlineId;
|
||||
use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId;
|
||||
use sp_consensus_babe::AuthorityId as BabeId;
|
||||
use sp_core::{sr25519, storage::Storage};
|
||||
|
||||
// Polkadot
|
||||
use polkadot_primitives::{AssignmentId, ValidatorId};
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
accounts, build_genesis_storage_legacy, get_account_id_from_seed, get_from_seed,
|
||||
get_host_config, validators,
|
||||
};
|
||||
use parachains_common::Balance;
|
||||
use rococo_runtime_constants::currency::UNITS as ROC;
|
||||
|
||||
pub const ED: Balance = rococo_runtime_constants::currency::EXISTENTIAL_DEPOSIT;
|
||||
const ENDOWMENT: u128 = 1_000_000 * ROC;
|
||||
|
||||
fn session_keys(
|
||||
babe: BabeId,
|
||||
grandpa: GrandpaId,
|
||||
im_online: ImOnlineId,
|
||||
para_validator: ValidatorId,
|
||||
para_assignment: AssignmentId,
|
||||
authority_discovery: AuthorityDiscoveryId,
|
||||
beefy: BeefyId,
|
||||
) -> rococo_runtime::SessionKeys {
|
||||
rococo_runtime::SessionKeys {
|
||||
babe,
|
||||
grandpa,
|
||||
im_online,
|
||||
para_validator,
|
||||
para_assignment,
|
||||
authority_discovery,
|
||||
beefy,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn genesis() -> Storage {
|
||||
let genesis_config = rococo_runtime::RuntimeGenesisConfig {
|
||||
system: rococo_runtime::SystemConfig::default(),
|
||||
balances: rococo_runtime::BalancesConfig {
|
||||
balances: accounts::init_balances().iter().map(|k| (k.clone(), ENDOWMENT)).collect(),
|
||||
},
|
||||
session: rococo_runtime::SessionConfig {
|
||||
keys: validators::initial_authorities()
|
||||
.iter()
|
||||
.map(|x| {
|
||||
(
|
||||
x.0.clone(),
|
||||
x.0.clone(),
|
||||
session_keys(
|
||||
x.2.clone(),
|
||||
x.3.clone(),
|
||||
x.4.clone(),
|
||||
x.5.clone(),
|
||||
x.6.clone(),
|
||||
x.7.clone(),
|
||||
get_from_seed::<BeefyId>("Alice"),
|
||||
),
|
||||
)
|
||||
})
|
||||
.collect::<Vec<_>>(),
|
||||
},
|
||||
babe: rococo_runtime::BabeConfig {
|
||||
authorities: Default::default(),
|
||||
epoch_config: Some(rococo_runtime::BABE_GENESIS_EPOCH_CONFIG),
|
||||
..Default::default()
|
||||
},
|
||||
sudo: rococo_runtime::SudoConfig {
|
||||
key: Some(get_account_id_from_seed::<sr25519::Public>("Alice")),
|
||||
},
|
||||
configuration: rococo_runtime::ConfigurationConfig { config: get_host_config() },
|
||||
registrar: rococo_runtime::RegistrarConfig {
|
||||
next_free_para_id: polkadot_primitives::LOWEST_PUBLIC_ID,
|
||||
..Default::default()
|
||||
},
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
build_genesis_storage_legacy(&genesis_config, rococo_runtime::WASM_BINARY.unwrap())
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub mod genesis;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
impl_accounts_helpers_for_relay_chain, impl_assert_events_helpers_for_relay_chain,
|
||||
impl_hrmp_channels_helpers_for_relay_chain, impl_send_transact_helpers_for_relay_chain,
|
||||
xcm_emulator::decl_test_relay_chains,
|
||||
};
|
||||
|
||||
// Rococo declaration
|
||||
decl_test_relay_chains! {
|
||||
#[api_version(8)]
|
||||
pub struct Rococo {
|
||||
genesis = genesis::genesis(),
|
||||
on_init = (),
|
||||
runtime = rococo_runtime,
|
||||
core = {
|
||||
SovereignAccountOf: rococo_runtime::xcm_config::LocationConverter,
|
||||
},
|
||||
pallets = {
|
||||
XcmPallet: rococo_runtime::XcmPallet,
|
||||
Sudo: rococo_runtime::Sudo,
|
||||
Balances: rococo_runtime::Balances,
|
||||
Hrmp: rococo_runtime::Hrmp,
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// Rococo implementation
|
||||
impl_accounts_helpers_for_relay_chain!(Rococo);
|
||||
impl_assert_events_helpers_for_relay_chain!(Rococo);
|
||||
impl_hrmp_channels_helpers_for_relay_chain!(Rococo);
|
||||
impl_send_transact_helpers_for_relay_chain!(Rococo);
|
||||
@@ -0,0 +1,30 @@
|
||||
[package]
|
||||
name = "westend-emulated-chain"
|
||||
version = "0.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Westend emulated chain"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1.0.104"
|
||||
|
||||
# Substrate
|
||||
sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false }
|
||||
sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false }
|
||||
sp-authority-discovery = { path = "../../../../../../../substrate/primitives/authority-discovery", default-features = false }
|
||||
sp-consensus-babe = { path = "../../../../../../../substrate/primitives/consensus/babe", default-features = false }
|
||||
beefy-primitives = { package = "sp-consensus-beefy", path = "../../../../../../../substrate/primitives/consensus/beefy" }
|
||||
grandpa = { package = "sc-consensus-grandpa", path = "../../../../../../../substrate/client/consensus/grandpa", default-features = false }
|
||||
pallet-im-online = { path = "../../../../../../../substrate/frame/im-online", default-features = false }
|
||||
pallet-staking = { path = "../../../../../../../substrate/frame/staking", default-features = false }
|
||||
|
||||
# Polkadot
|
||||
polkadot-primitives = { path = "../../../../../../../polkadot/primitives", default-features = false }
|
||||
westend-runtime-constants = { path = "../../../../../../../polkadot/runtime/westend/constants", default-features = false }
|
||||
westend-runtime = { path = "../../../../../../../polkadot/runtime/westend" }
|
||||
|
||||
# Cumulus
|
||||
parachains-common = { path = "../../../../../../parachains/common" }
|
||||
emulated-integration-tests-common = { path = "../../../common", default-features = false }
|
||||
@@ -0,0 +1,109 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Substrate
|
||||
use beefy_primitives::ecdsa_crypto::AuthorityId as BeefyId;
|
||||
use grandpa::AuthorityId as GrandpaId;
|
||||
use pallet_im_online::sr25519::AuthorityId as ImOnlineId;
|
||||
use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId;
|
||||
use sp_consensus_babe::AuthorityId as BabeId;
|
||||
use sp_core::storage::Storage;
|
||||
use sp_runtime::Perbill;
|
||||
|
||||
// Polkadot
|
||||
use polkadot_primitives::{AssignmentId, ValidatorId};
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
accounts, build_genesis_storage_legacy, get_from_seed, get_host_config, validators,
|
||||
};
|
||||
use parachains_common::Balance;
|
||||
use westend_runtime_constants::currency::UNITS as WND;
|
||||
|
||||
pub const ED: Balance = westend_runtime_constants::currency::EXISTENTIAL_DEPOSIT;
|
||||
const ENDOWMENT: u128 = 1_000_000 * WND;
|
||||
const STASH: u128 = 100 * WND;
|
||||
|
||||
fn session_keys(
|
||||
babe: BabeId,
|
||||
grandpa: GrandpaId,
|
||||
im_online: ImOnlineId,
|
||||
para_validator: ValidatorId,
|
||||
para_assignment: AssignmentId,
|
||||
authority_discovery: AuthorityDiscoveryId,
|
||||
beefy: BeefyId,
|
||||
) -> westend_runtime::SessionKeys {
|
||||
westend_runtime::SessionKeys {
|
||||
babe,
|
||||
grandpa,
|
||||
im_online,
|
||||
para_validator,
|
||||
para_assignment,
|
||||
authority_discovery,
|
||||
beefy,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn genesis() -> Storage {
|
||||
let genesis_config = westend_runtime::RuntimeGenesisConfig {
|
||||
system: westend_runtime::SystemConfig::default(),
|
||||
balances: westend_runtime::BalancesConfig {
|
||||
balances: accounts::init_balances().iter().cloned().map(|k| (k, ENDOWMENT)).collect(),
|
||||
},
|
||||
session: westend_runtime::SessionConfig {
|
||||
keys: validators::initial_authorities()
|
||||
.iter()
|
||||
.map(|x| {
|
||||
(
|
||||
x.0.clone(),
|
||||
x.0.clone(),
|
||||
session_keys(
|
||||
x.2.clone(),
|
||||
x.3.clone(),
|
||||
x.4.clone(),
|
||||
x.5.clone(),
|
||||
x.6.clone(),
|
||||
x.7.clone(),
|
||||
get_from_seed::<BeefyId>("Alice"),
|
||||
),
|
||||
)
|
||||
})
|
||||
.collect::<Vec<_>>(),
|
||||
},
|
||||
staking: westend_runtime::StakingConfig {
|
||||
validator_count: validators::initial_authorities().len() as u32,
|
||||
minimum_validator_count: 1,
|
||||
stakers: validators::initial_authorities()
|
||||
.iter()
|
||||
.map(|x| {
|
||||
(x.0.clone(), x.1.clone(), STASH, westend_runtime::StakerStatus::Validator)
|
||||
})
|
||||
.collect(),
|
||||
invulnerables: validators::initial_authorities().iter().map(|x| x.0.clone()).collect(),
|
||||
force_era: pallet_staking::Forcing::ForceNone,
|
||||
slash_reward_fraction: Perbill::from_percent(10),
|
||||
..Default::default()
|
||||
},
|
||||
babe: westend_runtime::BabeConfig {
|
||||
authorities: Default::default(),
|
||||
epoch_config: Some(westend_runtime::BABE_GENESIS_EPOCH_CONFIG),
|
||||
..Default::default()
|
||||
},
|
||||
configuration: westend_runtime::ConfigurationConfig { config: get_host_config() },
|
||||
..Default::default()
|
||||
};
|
||||
|
||||
build_genesis_storage_legacy(&genesis_config, westend_runtime::WASM_BINARY.unwrap())
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub mod genesis;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
impl_accounts_helpers_for_relay_chain, impl_assert_events_helpers_for_relay_chain,
|
||||
impl_hrmp_channels_helpers_for_relay_chain, impl_send_transact_helpers_for_relay_chain,
|
||||
xcm_emulator::decl_test_relay_chains,
|
||||
};
|
||||
|
||||
// Westend declaration
|
||||
decl_test_relay_chains! {
|
||||
#[api_version(8)]
|
||||
pub struct Westend {
|
||||
genesis = genesis::genesis(),
|
||||
on_init = (),
|
||||
runtime = westend_runtime,
|
||||
core = {
|
||||
SovereignAccountOf: westend_runtime::xcm_config::LocationConverter, //TODO: rename to SovereignAccountOf,
|
||||
},
|
||||
pallets = {
|
||||
XcmPallet: westend_runtime::XcmPallet,
|
||||
Sudo: westend_runtime::Sudo,
|
||||
Balances: westend_runtime::Balances,
|
||||
Treasury: westend_runtime::Treasury,
|
||||
AssetRate: westend_runtime::AssetRate,
|
||||
Hrmp: westend_runtime::Hrmp,
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// Westend implementation
|
||||
impl_accounts_helpers_for_relay_chain!(Westend);
|
||||
impl_assert_events_helpers_for_relay_chain!(Westend);
|
||||
impl_hrmp_channels_helpers_for_relay_chain!(Westend);
|
||||
impl_send_transact_helpers_for_relay_chain!(Westend);
|
||||
@@ -0,0 +1,30 @@
|
||||
[package]
|
||||
name = "wococo-emulated-chain"
|
||||
version = "0.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Wococo emulated chain"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
serde_json = "1.0.104"
|
||||
|
||||
# Substrate
|
||||
sp-core = { path = "../../../../../../../substrate/primitives/core", default-features = false }
|
||||
sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false }
|
||||
sp-authority-discovery = { path = "../../../../../../../substrate/primitives/authority-discovery", default-features = false }
|
||||
sp-consensus-babe = { path = "../../../../../../../substrate/primitives/consensus/babe", default-features = false }
|
||||
beefy-primitives = { package = "sp-consensus-beefy", path = "../../../../../../../substrate/primitives/consensus/beefy" }
|
||||
grandpa = { package = "sc-consensus-grandpa", path = "../../../../../../../substrate/client/consensus/grandpa", default-features = false }
|
||||
pallet-im-online = { path = "../../../../../../../substrate/frame/im-online", default-features = false }
|
||||
|
||||
# Polkadot
|
||||
polkadot-primitives = { path = "../../../../../../../polkadot/primitives", default-features = false }
|
||||
rococo-runtime-constants = { path = "../../../../../../../polkadot/runtime/rococo/constants", default-features = false }
|
||||
rococo-runtime = { path = "../../../../../../../polkadot/runtime/rococo" }
|
||||
|
||||
# Cumulus
|
||||
parachains-common = { path = "../../../../../../parachains/common" }
|
||||
emulated-integration-tests-common = { path = "../../../common", default-features = false }
|
||||
rococo-emulated-chain = { path = "../rococo" }
|
||||
@@ -0,0 +1,46 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
impl_accounts_helpers_for_relay_chain, impl_assert_events_helpers_for_relay_chain,
|
||||
impl_hrmp_channels_helpers_for_relay_chain, impl_send_transact_helpers_for_relay_chain,
|
||||
xcm_emulator::decl_test_relay_chains,
|
||||
};
|
||||
|
||||
// Wococo declaration
|
||||
decl_test_relay_chains! {
|
||||
#[api_version(8)]
|
||||
pub struct Wococo {
|
||||
genesis = rococo_emulated_chain::genesis::genesis(),
|
||||
on_init = (),
|
||||
runtime = rococo_runtime,
|
||||
core = {
|
||||
SovereignAccountOf: rococo_runtime::xcm_config::LocationConverter,
|
||||
},
|
||||
pallets = {
|
||||
XcmPallet: rococo_runtime::XcmPallet,
|
||||
Sudo: rococo_runtime::Sudo,
|
||||
Balances: rococo_runtime::Balances,
|
||||
Hrmp: rococo_runtime::Hrmp,
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
// Wococo implementation
|
||||
impl_accounts_helpers_for_relay_chain!(Wococo);
|
||||
impl_assert_events_helpers_for_relay_chain!(Wococo);
|
||||
impl_hrmp_channels_helpers_for_relay_chain!(Wococo);
|
||||
impl_send_transact_helpers_for_relay_chain!(Wococo);
|
||||
@@ -1,11 +1,10 @@
|
||||
[package]
|
||||
name = "integration-tests-common"
|
||||
name = "emulated-integration-tests-common"
|
||||
version = "1.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Common resources for integration testing with xcm-emulator"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false }
|
||||
@@ -21,75 +20,26 @@ sp-core = { path = "../../../../../substrate/primitives/core", default-features
|
||||
sp-consensus-babe = { path = "../../../../../substrate/primitives/consensus/babe", default-features = false}
|
||||
pallet-assets = { path = "../../../../../substrate/frame/assets", default-features = false}
|
||||
pallet-balances = { path = "../../../../../substrate/frame/balances", default-features = false}
|
||||
pallet-staking = { path = "../../../../../substrate/frame/staking", default-features = false}
|
||||
pallet-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false}
|
||||
pallet-im-online = { path = "../../../../../substrate/frame/im-online", default-features = false}
|
||||
beefy-primitives = { package = "sp-consensus-beefy", path = "../../../../../substrate/primitives/consensus/beefy" }
|
||||
sc-chain-spec = { path = "../../../../../substrate/client/chain-spec", default-features = false }
|
||||
|
||||
# Polkadot
|
||||
polkadot-core-primitives = { path = "../../../../../polkadot/core-primitives", default-features = false}
|
||||
polkadot-parachain-primitives = { path = "../../../../../polkadot/parachain", default-features = false}
|
||||
polkadot-service = { path = "../../../../../polkadot/node/service", default-features = false, features = ["full-node"] }
|
||||
polkadot-primitives = { path = "../../../../../polkadot/primitives", default-features = false}
|
||||
polkadot-runtime-parachains = { path = "../../../../../polkadot/runtime/parachains" }
|
||||
rococo-runtime = { path = "../../../../../polkadot/runtime/rococo" }
|
||||
rococo-runtime-constants = { path = "../../../../../polkadot/runtime/rococo/constants" }
|
||||
westend-runtime = { path = "../../../../../polkadot/runtime/westend" }
|
||||
westend-runtime-constants = { path = "../../../../../polkadot/runtime/westend/constants" }
|
||||
xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false}
|
||||
pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false}
|
||||
|
||||
# Cumulus
|
||||
parachains-common = { path = "../../../common" }
|
||||
cumulus-primitives-core = { path = "../../../../primitives/core" }
|
||||
penpal-runtime = { path = "../../../runtimes/testing/penpal" }
|
||||
asset-hub-polkadot-runtime = { path = "../../../runtimes/assets/asset-hub-polkadot" }
|
||||
asset-hub-kusama-runtime = { path = "../../../runtimes/assets/asset-hub-kusama" }
|
||||
asset-hub-rococo-runtime = { path = "../../../runtimes/assets/asset-hub-rococo" }
|
||||
asset-hub-westend-runtime = { path = "../../../runtimes/assets/asset-hub-westend" }
|
||||
collectives-polkadot-runtime = { path = "../../../runtimes/collectives/collectives-polkadot" }
|
||||
bridge-hub-kusama-runtime = { path = "../../../runtimes/bridge-hubs/bridge-hub-kusama" }
|
||||
bridge-hub-polkadot-runtime = { path = "../../../runtimes/bridge-hubs/bridge-hub-polkadot" }
|
||||
bridge-hub-rococo-runtime = { path = "../../../runtimes/bridge-hubs/bridge-hub-rococo" }
|
||||
bridge-hub-westend-runtime = { path = "../../../runtimes/bridge-hubs/bridge-hub-westend" }
|
||||
xcm-emulator = { default-features = false, path = "../../../../xcm/xcm-emulator" }
|
||||
cumulus-pallet-xcmp-queue = { default-features = false, path = "../../../../pallets/xcmp-queue" }
|
||||
xcm-emulator = { path = "../../../../xcm/xcm-emulator", default-features = false}
|
||||
cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false}
|
||||
cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system" }
|
||||
asset-test-utils = { path = "../../../runtimes/assets/test-utils" }
|
||||
|
||||
# Bridges
|
||||
bp-messages = { path = "../../../../../bridges/primitives/messages" }
|
||||
pallet-bridge-messages = { path = "../../../../../bridges/modules/messages" }
|
||||
bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common" }
|
||||
|
||||
[features]
|
||||
runtime-benchmarks = [
|
||||
"asset-hub-kusama-runtime/runtime-benchmarks",
|
||||
"asset-hub-polkadot-runtime/runtime-benchmarks",
|
||||
"asset-hub-rococo-runtime/runtime-benchmarks",
|
||||
"asset-hub-westend-runtime/runtime-benchmarks",
|
||||
"bridge-hub-kusama-runtime/runtime-benchmarks",
|
||||
"bridge-hub-polkadot-runtime/runtime-benchmarks",
|
||||
"bridge-hub-rococo-runtime/runtime-benchmarks",
|
||||
"bridge-hub-westend-runtime/runtime-benchmarks",
|
||||
"bridge-runtime-common/runtime-benchmarks",
|
||||
"collectives-polkadot-runtime/runtime-benchmarks",
|
||||
"cumulus-pallet-parachain-system/runtime-benchmarks",
|
||||
"cumulus-pallet-xcmp-queue/runtime-benchmarks",
|
||||
"cumulus-primitives-core/runtime-benchmarks",
|
||||
"frame-support/runtime-benchmarks",
|
||||
"pallet-assets/runtime-benchmarks",
|
||||
"pallet-balances/runtime-benchmarks",
|
||||
"pallet-bridge-messages/runtime-benchmarks",
|
||||
"pallet-im-online/runtime-benchmarks",
|
||||
"pallet-message-queue/runtime-benchmarks",
|
||||
"pallet-staking/runtime-benchmarks",
|
||||
"pallet-xcm/runtime-benchmarks",
|
||||
"parachains-common/runtime-benchmarks",
|
||||
"penpal-runtime/runtime-benchmarks",
|
||||
"polkadot-parachain-primitives/runtime-benchmarks",
|
||||
"polkadot-primitives/runtime-benchmarks",
|
||||
"polkadot-runtime-parachains/runtime-benchmarks",
|
||||
"polkadot-service/runtime-benchmarks",
|
||||
"rococo-runtime/runtime-benchmarks",
|
||||
"sp-runtime/runtime-benchmarks",
|
||||
"westend-runtime/runtime-benchmarks",
|
||||
]
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -17,41 +17,22 @@ pub use codec::{Decode, Encode};
|
||||
pub use paste;
|
||||
|
||||
pub use crate::{
|
||||
constants::{PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD},
|
||||
xcm_helpers::xcm_transact_unpaid_execution,
|
||||
BridgeHubRococo, BridgeHubWococo,
|
||||
xcm_helpers::xcm_transact_unpaid_execution, PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD,
|
||||
};
|
||||
|
||||
// Substrate
|
||||
pub use frame_support::{
|
||||
assert_ok,
|
||||
sp_runtime::AccountId32,
|
||||
traits::fungibles::Inspect,
|
||||
weights::{Weight, WeightMeter},
|
||||
};
|
||||
pub use pallet_assets;
|
||||
pub use pallet_message_queue;
|
||||
pub use pallet_xcm;
|
||||
use sp_core::Get;
|
||||
|
||||
// Cumulus
|
||||
use bp_messages::{
|
||||
target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch},
|
||||
LaneId, MessageKey, OutboundLaneData,
|
||||
};
|
||||
use bridge_runtime_common::messages_xcm_extension::XcmBlobMessageDispatchResult;
|
||||
pub use cumulus_pallet_parachain_system;
|
||||
pub use cumulus_pallet_xcmp_queue;
|
||||
pub use cumulus_primitives_core::{
|
||||
relay_chain::HrmpChannelId, DmpMessageHandler, ParaId, XcmpMessageHandler,
|
||||
};
|
||||
use pallet_bridge_messages::{Config, Instance1, Instance2, OutboundLanes, Pallet};
|
||||
pub use parachains_common::{AccountId, Balance};
|
||||
pub use xcm_emulator::{
|
||||
assert_expected_events, bx, helpers::weight_within_threshold, BridgeMessage,
|
||||
BridgeMessageDispatchError, BridgeMessageHandler, Chain, Parachain, RelayChain, TestExt,
|
||||
};
|
||||
|
||||
// Polkadot
|
||||
pub use pallet_xcm;
|
||||
pub use polkadot_runtime_parachains::{
|
||||
dmp, hrmp,
|
||||
inclusion::{AggregateMessageOrigin, UmpQueueId},
|
||||
@@ -62,6 +43,28 @@ pub use xcm::{
|
||||
DoubleEncoded,
|
||||
};
|
||||
|
||||
// Cumulus
|
||||
pub use cumulus_pallet_parachain_system;
|
||||
pub use cumulus_pallet_xcmp_queue;
|
||||
pub use cumulus_primitives_core::{
|
||||
relay_chain::HrmpChannelId, DmpMessageHandler, ParaId, XcmpMessageHandler,
|
||||
};
|
||||
pub use parachains_common::{AccountId, Balance};
|
||||
pub use xcm_emulator::{
|
||||
assert_expected_events, bx, helpers::weight_within_threshold, BridgeMessage,
|
||||
BridgeMessageDispatchError, BridgeMessageHandler, Chain, Network, Parachain, RelayChain,
|
||||
TestExt,
|
||||
};
|
||||
|
||||
// Bridges
|
||||
use bp_messages::{
|
||||
target_chain::{DispatchMessage, DispatchMessageData, MessageDispatch},
|
||||
LaneId, MessageKey, OutboundLaneData,
|
||||
};
|
||||
use bridge_runtime_common::messages_xcm_extension::XcmBlobMessageDispatchResult;
|
||||
pub use pallet_bridge_messages::Instance2 as BridgeMessagesInstance2;
|
||||
use pallet_bridge_messages::{Config, Instance1, OutboundLanes, Pallet};
|
||||
|
||||
pub struct BridgeHubMessageHandler<S, T, I> {
|
||||
_marker: std::marker::PhantomData<(S, T, I)>,
|
||||
}
|
||||
@@ -80,14 +83,6 @@ impl From<u32> for LaneIdWrapper {
|
||||
}
|
||||
}
|
||||
|
||||
type BridgeHubRococoRuntime = <BridgeHubRococo as Chain>::Runtime;
|
||||
type BridgeHubWococoRuntime = <BridgeHubWococo as Chain>::Runtime;
|
||||
|
||||
pub type RococoWococoMessageHandler =
|
||||
BridgeHubMessageHandler<BridgeHubRococoRuntime, BridgeHubWococoRuntime, Instance2>;
|
||||
pub type WococoRococoMessageHandler =
|
||||
BridgeHubMessageHandler<BridgeHubWococoRuntime, BridgeHubRococoRuntime, Instance2>;
|
||||
|
||||
impl<S, T, I> BridgeMessageHandler for BridgeHubMessageHandler<S, T, I>
|
||||
where
|
||||
S: Config<Instance1>,
|
||||
@@ -171,12 +166,12 @@ where
|
||||
macro_rules! impl_accounts_helpers_for_relay_chain {
|
||||
( $chain:ident ) => {
|
||||
$crate::impls::paste::paste! {
|
||||
impl $chain {
|
||||
impl<N: $crate::impls::Network> $chain<N> {
|
||||
/// Fund a set of accounts with a balance
|
||||
pub fn fund_accounts(accounts: Vec<($crate::impls::AccountId, $crate::impls::Balance)>) {
|
||||
<Self as $crate::impls::TestExt>::execute_with(|| {
|
||||
for account in accounts {
|
||||
$crate::impls::assert_ok!(<Self as [<$chain Pallet>]>::Balances::force_set_balance(
|
||||
$crate::impls::assert_ok!(<Self as [<$chain RelayPallet>]>::Balances::force_set_balance(
|
||||
<Self as $crate::impls::Chain>::RuntimeOrigin::root(),
|
||||
account.0.into(),
|
||||
account.1,
|
||||
@@ -185,7 +180,7 @@ macro_rules! impl_accounts_helpers_for_relay_chain {
|
||||
});
|
||||
}
|
||||
/// Fund a sovereign account based on its Parachain Id
|
||||
pub fn fund_para_sovereign(amount: $crate::impls::Balance, para_id: $crate::impls::ParaId) -> sp_runtime::AccountId32 {
|
||||
pub fn fund_para_sovereign(amount: $crate::impls::Balance, para_id: $crate::impls::ParaId) -> $crate::impls::AccountId32 {
|
||||
let sovereign_account = <Self as $crate::impls::RelayChain>::sovereign_account_id_of_child_para(para_id);
|
||||
Self::fund_accounts(vec![(sovereign_account.clone(), amount)]);
|
||||
sovereign_account
|
||||
@@ -199,15 +194,15 @@ macro_rules! impl_accounts_helpers_for_relay_chain {
|
||||
macro_rules! impl_assert_events_helpers_for_relay_chain {
|
||||
( $chain:ident ) => {
|
||||
$crate::impls::paste::paste! {
|
||||
type [<$chain RuntimeEvent>] = <$chain as $crate::impls::Chain>::RuntimeEvent;
|
||||
type [<$chain RuntimeEvent>]<N> = <$chain<N> as $crate::impls::Chain>::RuntimeEvent;
|
||||
|
||||
impl $chain {
|
||||
impl<N: $crate::impls::Network> $chain<N> {
|
||||
/// Asserts a dispatchable is completely executed and XCM sent
|
||||
pub fn assert_xcm_pallet_attempted_complete(expected_weight: Option<$crate::impls::Weight>) {
|
||||
$crate::impls::assert_expected_events!(
|
||||
Self,
|
||||
vec![
|
||||
[<$chain RuntimeEvent>]::XcmPallet(
|
||||
[<$chain RuntimeEvent>]::<N>::XcmPallet(
|
||||
$crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Complete(weight) }
|
||||
) => {
|
||||
weight: $crate::impls::weight_within_threshold(
|
||||
@@ -229,7 +224,7 @@ macro_rules! impl_assert_events_helpers_for_relay_chain {
|
||||
Self,
|
||||
vec![
|
||||
// Dispatchable is properly executed and XCM message sent
|
||||
[<$chain RuntimeEvent>]::XcmPallet(
|
||||
[<$chain RuntimeEvent>]::<N>::XcmPallet(
|
||||
$crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Incomplete(weight, error) }
|
||||
) => {
|
||||
weight: $crate::impls::weight_within_threshold(
|
||||
@@ -248,7 +243,7 @@ macro_rules! impl_assert_events_helpers_for_relay_chain {
|
||||
$crate::impls::assert_expected_events!(
|
||||
Self,
|
||||
vec![
|
||||
[<$chain RuntimeEvent>]::XcmPallet($crate::impls::pallet_xcm::Event::Sent { .. }) => {},
|
||||
[<$chain RuntimeEvent>]::<N>::XcmPallet($crate::impls::pallet_xcm::Event::Sent { .. }) => {},
|
||||
]
|
||||
);
|
||||
}
|
||||
@@ -263,7 +258,7 @@ macro_rules! impl_assert_events_helpers_for_relay_chain {
|
||||
Self,
|
||||
vec![
|
||||
// XCM is succesfully received and proccessed
|
||||
[<$chain RuntimeEvent>]::MessageQueue($crate::impls::pallet_message_queue::Event::Processed {
|
||||
[<$chain RuntimeEvent>]::<N>::MessageQueue($crate::impls::pallet_message_queue::Event::Processed {
|
||||
origin: $crate::impls::AggregateMessageOrigin::Ump($crate::impls::UmpQueueId::Para(id)),
|
||||
weight_used,
|
||||
success,
|
||||
@@ -289,7 +284,7 @@ macro_rules! impl_assert_events_helpers_for_relay_chain {
|
||||
macro_rules! impl_hrmp_channels_helpers_for_relay_chain {
|
||||
( $chain:ident ) => {
|
||||
$crate::impls::paste::paste! {
|
||||
impl $chain {
|
||||
impl<N: $crate::impls::Network> $chain<N> {
|
||||
/// Init open channel request with another Parachain
|
||||
pub fn init_open_channel_call(
|
||||
recipient_para_id: $crate::impls::ParaId,
|
||||
@@ -329,7 +324,7 @@ macro_rules! impl_hrmp_channels_helpers_for_relay_chain {
|
||||
let relay_root_origin = <Self as Chain>::RuntimeOrigin::root();
|
||||
|
||||
// Force process HRMP open channel requests without waiting for the next session
|
||||
$crate::impls::assert_ok!(<Self as [<$chain Pallet>]>::Hrmp::force_process_hrmp_open(
|
||||
$crate::impls::assert_ok!(<Self as [<$chain RelayPallet>]>::Hrmp::force_process_hrmp_open(
|
||||
relay_root_origin,
|
||||
0
|
||||
));
|
||||
@@ -353,7 +348,7 @@ macro_rules! impl_hrmp_channels_helpers_for_relay_chain {
|
||||
macro_rules! impl_send_transact_helpers_for_relay_chain {
|
||||
( $chain:ident ) => {
|
||||
$crate::impls::paste::paste! {
|
||||
impl $chain {
|
||||
impl<N: $crate::impls::Network> $chain<N> {
|
||||
/// A root origin (as governance) sends `xcm::Transact` with `UnpaidExecution` and encoded `call` to child parachain.
|
||||
pub fn send_unpaid_transact_to_parachain_as_root(
|
||||
recipient: $crate::impls::ParaId,
|
||||
@@ -367,7 +362,7 @@ macro_rules! impl_send_transact_helpers_for_relay_chain {
|
||||
let xcm = $crate::impls::xcm_transact_unpaid_execution(call, $crate::impls::OriginKind::Superuser);
|
||||
|
||||
// Send XCM `Transact`
|
||||
$crate::impls::assert_ok!(<Self as [<$chain Pallet>]>::XcmPallet::send(
|
||||
$crate::impls::assert_ok!(<Self as [<$chain RelayPallet>]>::XcmPallet::send(
|
||||
root_origin,
|
||||
bx!(destination.into()),
|
||||
bx!(xcm),
|
||||
@@ -384,12 +379,12 @@ macro_rules! impl_send_transact_helpers_for_relay_chain {
|
||||
macro_rules! impl_accounts_helpers_for_parachain {
|
||||
( $chain:ident ) => {
|
||||
$crate::impls::paste::paste! {
|
||||
impl $chain {
|
||||
impl<N: $crate::impls::Network> $chain<N> {
|
||||
/// Fund a set of accounts with a balance
|
||||
pub fn fund_accounts(accounts: Vec<($crate::impls::AccountId, $crate::impls::Balance)>) {
|
||||
<Self as $crate::impls::TestExt>::execute_with(|| {
|
||||
for account in accounts {
|
||||
$crate::impls::assert_ok!(<Self as [<$chain Pallet>]>::Balances::force_set_balance(
|
||||
$crate::impls::assert_ok!(<Self as [<$chain ParaPallet>]>::Balances::force_set_balance(
|
||||
<Self as $crate::impls::Chain>::RuntimeOrigin::root(),
|
||||
account.0.into(),
|
||||
account.1,
|
||||
@@ -406,15 +401,15 @@ macro_rules! impl_accounts_helpers_for_parachain {
|
||||
macro_rules! impl_assert_events_helpers_for_parachain {
|
||||
( $chain:ident ) => {
|
||||
$crate::impls::paste::paste! {
|
||||
type [<$chain RuntimeEvent>] = <$chain as $crate::impls::Chain>::RuntimeEvent;
|
||||
type [<$chain RuntimeEvent>]<N> = <$chain<N> as $crate::impls::Chain>::RuntimeEvent;
|
||||
|
||||
impl $chain {
|
||||
impl<N: $crate::impls::Network> $chain<N> {
|
||||
/// Asserts a dispatchable is completely executed and XCM sent
|
||||
pub fn assert_xcm_pallet_attempted_complete(expected_weight: Option<$crate::impls::Weight>) {
|
||||
$crate::impls::assert_expected_events!(
|
||||
Self,
|
||||
vec![
|
||||
[<$chain RuntimeEvent>]::PolkadotXcm(
|
||||
[<$chain RuntimeEvent>]::<N>::PolkadotXcm(
|
||||
$crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Complete(weight) }
|
||||
) => {
|
||||
weight: $crate::impls::weight_within_threshold(
|
||||
@@ -436,7 +431,7 @@ macro_rules! impl_assert_events_helpers_for_parachain {
|
||||
Self,
|
||||
vec![
|
||||
// Dispatchable is properly executed and XCM message sent
|
||||
[<$chain RuntimeEvent>]::PolkadotXcm(
|
||||
[<$chain RuntimeEvent>]::<N>::PolkadotXcm(
|
||||
$crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Incomplete(weight, error) }
|
||||
) => {
|
||||
weight: $crate::impls::weight_within_threshold(
|
||||
@@ -456,7 +451,7 @@ macro_rules! impl_assert_events_helpers_for_parachain {
|
||||
Self,
|
||||
vec![
|
||||
// Execution fails in the origin with `Barrier`
|
||||
[<$chain RuntimeEvent>]::PolkadotXcm(
|
||||
[<$chain RuntimeEvent>]::<N>::PolkadotXcm(
|
||||
$crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Error(error) }
|
||||
) => {
|
||||
error: *error == expected_error.unwrap_or(*error),
|
||||
@@ -470,7 +465,7 @@ macro_rules! impl_assert_events_helpers_for_parachain {
|
||||
$crate::impls::assert_expected_events!(
|
||||
Self,
|
||||
vec![
|
||||
[<$chain RuntimeEvent>]::PolkadotXcm($crate::impls::pallet_xcm::Event::Sent { .. }) => {},
|
||||
[<$chain RuntimeEvent>]::<N>::PolkadotXcm($crate::impls::pallet_xcm::Event::Sent { .. }) => {},
|
||||
]
|
||||
);
|
||||
}
|
||||
@@ -480,7 +475,7 @@ macro_rules! impl_assert_events_helpers_for_parachain {
|
||||
$crate::impls::assert_expected_events!(
|
||||
Self,
|
||||
vec![
|
||||
[<$chain RuntimeEvent>]::ParachainSystem(
|
||||
[<$chain RuntimeEvent>]::<N>::ParachainSystem(
|
||||
$crate::impls::cumulus_pallet_parachain_system::Event::UpwardMessageSent { .. }
|
||||
) => {},
|
||||
]
|
||||
@@ -492,7 +487,7 @@ macro_rules! impl_assert_events_helpers_for_parachain {
|
||||
$crate::impls::assert_expected_events!(
|
||||
Self,
|
||||
vec![
|
||||
[<$chain RuntimeEvent>]::MessageQueue(pallet_message_queue::Event::Processed {
|
||||
[<$chain RuntimeEvent>]::<N>::MessageQueue($crate::impls::pallet_message_queue::Event::Processed {
|
||||
success: true, weight_used: weight, ..
|
||||
}) => {
|
||||
weight: $crate::impls::weight_within_threshold(
|
||||
@@ -512,7 +507,7 @@ macro_rules! impl_assert_events_helpers_for_parachain {
|
||||
$crate::impls::assert_expected_events!(
|
||||
Self,
|
||||
vec![
|
||||
[<$chain RuntimeEvent>]::MessageQueue(pallet_message_queue::Event::Processed {
|
||||
[<$chain RuntimeEvent>]::<N>::MessageQueue($crate::impls::pallet_message_queue::Event::Processed {
|
||||
success: false, weight_used: weight, ..
|
||||
}) => {
|
||||
weight: $crate::impls::weight_within_threshold(
|
||||
@@ -530,7 +525,7 @@ macro_rules! impl_assert_events_helpers_for_parachain {
|
||||
$crate::impls::assert_expected_events!(
|
||||
Self,
|
||||
vec![
|
||||
[<$chain RuntimeEvent>]::MessageQueue($crate::impls::pallet_message_queue::Event::ProcessingFailed {
|
||||
[<$chain RuntimeEvent>]::<N>::MessageQueue($crate::impls::pallet_message_queue::Event::ProcessingFailed {
|
||||
..
|
||||
}) => {
|
||||
|
||||
@@ -544,7 +539,7 @@ macro_rules! impl_assert_events_helpers_for_parachain {
|
||||
$crate::impls::assert_expected_events!(
|
||||
Self,
|
||||
vec![
|
||||
[<$chain RuntimeEvent>]::MessageQueue(pallet_message_queue::Event::Processed { success: true, weight_used: weight, .. }
|
||||
[<$chain RuntimeEvent>]::<N>::MessageQueue($crate::impls::pallet_message_queue::Event::Processed { success: true, weight_used: weight, .. }
|
||||
) => {
|
||||
weight: $crate::impls::weight_within_threshold(
|
||||
($crate::impls::REF_TIME_THRESHOLD, $crate::impls::PROOF_SIZE_THRESHOLD),
|
||||
@@ -561,10 +556,10 @@ macro_rules! impl_assert_events_helpers_for_parachain {
|
||||
}
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! impl_assets_helpers_for_parachain {
|
||||
macro_rules! impl_assets_helpers_for_system_parachain {
|
||||
( $chain:ident, $relay_chain:ident ) => {
|
||||
$crate::impls::paste::paste! {
|
||||
impl $chain {
|
||||
impl<N: $crate::impls::Network> $chain<N> {
|
||||
/// Returns the encoded call for `force_create` from the assets pallet
|
||||
pub fn force_create_asset_call(
|
||||
asset_id: u32,
|
||||
@@ -607,19 +602,19 @@ macro_rules! impl_assets_helpers_for_parachain {
|
||||
amount_to_mint: u128,
|
||||
) {
|
||||
<Self as $crate::impls::TestExt>::execute_with(|| {
|
||||
$crate::impls::assert_ok!(<Self as [<$chain Pallet>]>::Assets::mint(
|
||||
$crate::impls::assert_ok!(<Self as [<$chain ParaPallet>]>::Assets::mint(
|
||||
signed_origin,
|
||||
id.into(),
|
||||
beneficiary.clone().into(),
|
||||
amount_to_mint
|
||||
));
|
||||
|
||||
type RuntimeEvent = <$chain as $crate::impls::Chain>::RuntimeEvent;
|
||||
type RuntimeEvent<N> = <$chain<N> as $crate::impls::Chain>::RuntimeEvent;
|
||||
|
||||
$crate::impls::assert_expected_events!(
|
||||
Self,
|
||||
vec![
|
||||
RuntimeEvent::Assets($crate::impls::pallet_assets::Event::Issued { asset_id, owner, amount }) => {
|
||||
RuntimeEvent::<N>::Assets($crate::impls::pallet_assets::Event::Issued { asset_id, owner, amount }) => {
|
||||
asset_id: *asset_id == id,
|
||||
owner: *owner == beneficiary.clone().into(),
|
||||
amount: *amount == amount_to_mint,
|
||||
@@ -664,28 +659,28 @@ macro_rules! impl_assets_helpers_for_parachain {
|
||||
) {
|
||||
use $crate::impls::{Parachain, Inspect, TestExt};
|
||||
|
||||
<$relay_chain>::send_unpaid_transact_to_parachain_as_root(
|
||||
<$relay_chain<N>>::send_unpaid_transact_to_parachain_as_root(
|
||||
Self::para_id(),
|
||||
Self::force_create_asset_call(id, asset_owner.clone(), is_sufficient, min_balance),
|
||||
);
|
||||
|
||||
// Receive XCM message in Assets Parachain
|
||||
Self::execute_with(|| {
|
||||
type RuntimeEvent = <$chain as $crate::impls::Chain>::RuntimeEvent;
|
||||
type RuntimeEvent<N> = <$chain<N> as $crate::impls::Chain>::RuntimeEvent;
|
||||
|
||||
Self::assert_dmp_queue_complete(dmp_weight_threshold);
|
||||
|
||||
$crate::impls::assert_expected_events!(
|
||||
Self,
|
||||
vec![
|
||||
RuntimeEvent::Assets($crate::impls::pallet_assets::Event::ForceCreated { asset_id, owner }) => {
|
||||
RuntimeEvent::<N>::Assets($crate::impls::pallet_assets::Event::ForceCreated { asset_id, owner }) => {
|
||||
asset_id: *asset_id == id,
|
||||
owner: *owner == asset_owner,
|
||||
},
|
||||
]
|
||||
);
|
||||
|
||||
assert!(<Self as [<$chain Pallet>]>::Assets::asset_exists(id.into()));
|
||||
assert!(<Self as [<$chain ParaPallet>]>::Assets::asset_exists(id.into()));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -13,361 +13,161 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub mod constants;
|
||||
pub mod impls;
|
||||
pub mod macros;
|
||||
pub mod xcm_helpers;
|
||||
|
||||
use constants::{
|
||||
accounts::{ALICE, BOB},
|
||||
asset_hub_rococo, asset_hub_westend, asset_hub_wococo, bridge_hub_rococo, bridge_hub_westend,
|
||||
penpal, rococo, westend,
|
||||
};
|
||||
use impls::{RococoWococoMessageHandler, WococoRococoMessageHandler};
|
||||
pub use paste;
|
||||
pub use xcm_emulator;
|
||||
|
||||
// Substrate
|
||||
use frame_support::traits::OnInitialize;
|
||||
pub use pallet_balances;
|
||||
pub use pallet_message_queue;
|
||||
|
||||
// Cumulus
|
||||
pub use cumulus_pallet_xcmp_queue;
|
||||
pub use xcm_emulator::Chain;
|
||||
use xcm_emulator::{
|
||||
decl_test_bridges, decl_test_networks, decl_test_parachains, decl_test_relay_chains,
|
||||
decl_test_sender_receiver_accounts_parameter_types, DefaultParaMessageProcessor,
|
||||
DefaultRelayMessageProcessor, Parachain, TestExt,
|
||||
use grandpa::AuthorityId as GrandpaId;
|
||||
use pallet_im_online::sr25519::AuthorityId as ImOnlineId;
|
||||
use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId;
|
||||
use sp_consensus_babe::AuthorityId as BabeId;
|
||||
use sp_core::{sr25519, storage::Storage, Pair, Public};
|
||||
use sp_runtime::{
|
||||
traits::{IdentifyAccount, Verify},
|
||||
BuildStorage, MultiSignature,
|
||||
};
|
||||
|
||||
// Polkadot
|
||||
pub use pallet_xcm;
|
||||
pub use xcm::prelude::{AccountId32, WeightLimit};
|
||||
// Polakdot
|
||||
use parachains_common::BlockNumber;
|
||||
use polkadot_runtime_parachains::configuration::HostConfiguration;
|
||||
use xcm;
|
||||
|
||||
decl_test_relay_chains! {
|
||||
#[api_version(8)]
|
||||
pub struct Westend {
|
||||
genesis = westend::genesis(),
|
||||
on_init = (),
|
||||
runtime = westend_runtime,
|
||||
core = {
|
||||
MessageProcessor: DefaultRelayMessageProcessor<Westend>,
|
||||
SovereignAccountOf: westend_runtime::xcm_config::LocationConverter, //TODO: rename to SovereignAccountOf,
|
||||
},
|
||||
pallets = {
|
||||
XcmPallet: westend_runtime::XcmPallet,
|
||||
Sudo: westend_runtime::Sudo,
|
||||
Balances: westend_runtime::Balances,
|
||||
Treasury: westend_runtime::Treasury,
|
||||
AssetRate: westend_runtime::AssetRate,
|
||||
}
|
||||
},
|
||||
#[api_version(8)]
|
||||
pub struct Rococo {
|
||||
genesis = rococo::genesis(),
|
||||
on_init = (),
|
||||
runtime = rococo_runtime,
|
||||
core = {
|
||||
MessageProcessor: DefaultRelayMessageProcessor<Rococo>,
|
||||
SovereignAccountOf: rococo_runtime::xcm_config::LocationConverter, //TODO: rename to SovereignAccountOf,
|
||||
},
|
||||
pallets = {
|
||||
XcmPallet: rococo_runtime::XcmPallet,
|
||||
Sudo: rococo_runtime::Sudo,
|
||||
Balances: rococo_runtime::Balances,
|
||||
Hrmp: rococo_runtime::Hrmp,
|
||||
}
|
||||
},
|
||||
#[api_version(8)]
|
||||
pub struct Wococo {
|
||||
genesis = rococo::genesis(),
|
||||
on_init = (),
|
||||
runtime = rococo_runtime,
|
||||
core = {
|
||||
MessageProcessor: DefaultRelayMessageProcessor<Wococo>,
|
||||
SovereignAccountOf: rococo_runtime::xcm_config::LocationConverter, //TODO: rename to SovereignAccountOf,
|
||||
},
|
||||
pallets = {
|
||||
XcmPallet: rococo_runtime::XcmPallet,
|
||||
Sudo: rococo_runtime::Sudo,
|
||||
Balances: rococo_runtime::Balances,
|
||||
}
|
||||
// Cumulus
|
||||
use parachains_common::{AccountId, AssetHubPolkadotAuraId, AuraId};
|
||||
use polkadot_primitives::{AssignmentId, ValidatorId};
|
||||
use polkadot_service::chain_spec::get_authority_keys_from_seed_no_beefy;
|
||||
|
||||
pub const XCM_V2: u32 = 2;
|
||||
pub const XCM_V3: u32 = 3;
|
||||
pub const REF_TIME_THRESHOLD: u64 = 33;
|
||||
pub const PROOF_SIZE_THRESHOLD: u64 = 33;
|
||||
|
||||
/// The default XCM version to set in genesis config.
|
||||
pub const SAFE_XCM_VERSION: u32 = xcm::prelude::XCM_VERSION;
|
||||
|
||||
type AccountPublic = <MultiSignature as Verify>::Signer;
|
||||
|
||||
/// Helper function to generate a crypto pair from seed
|
||||
pub fn get_from_seed<TPublic: Public>(seed: &str) -> <TPublic::Pair as Pair>::Public {
|
||||
TPublic::Pair::from_string(&format!("//{}", seed), None)
|
||||
.expect("static values are valid; qed")
|
||||
.public()
|
||||
}
|
||||
|
||||
/// Helper function to generate an account ID from seed.
|
||||
pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId
|
||||
where
|
||||
AccountPublic: From<<TPublic::Pair as Pair>::Public>,
|
||||
{
|
||||
AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()
|
||||
}
|
||||
|
||||
pub fn get_host_config() -> HostConfiguration<BlockNumber> {
|
||||
HostConfiguration {
|
||||
max_upward_queue_count: 10,
|
||||
max_upward_queue_size: 51200,
|
||||
max_upward_message_size: 51200,
|
||||
max_upward_message_num_per_candidate: 10,
|
||||
max_downward_message_size: 51200,
|
||||
hrmp_sender_deposit: 0,
|
||||
hrmp_recipient_deposit: 0,
|
||||
hrmp_channel_max_capacity: 1000,
|
||||
hrmp_channel_max_message_size: 102400,
|
||||
hrmp_channel_max_total_size: 102400,
|
||||
hrmp_max_parachain_outbound_channels: 30,
|
||||
hrmp_max_parachain_inbound_channels: 30,
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
decl_test_parachains! {
|
||||
// Westend Parachains
|
||||
pub struct AssetHubWestend {
|
||||
genesis = asset_hub_westend::genesis(),
|
||||
on_init = {
|
||||
asset_hub_westend_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = asset_hub_westend_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: asset_hub_westend_runtime::XcmpQueue,
|
||||
LocationToAccountId: asset_hub_westend_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: asset_hub_westend_runtime::ParachainInfo,
|
||||
MessageProcessor: DefaultParaMessageProcessor<AssetHubWestend>,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: asset_hub_westend_runtime::PolkadotXcm,
|
||||
Balances: asset_hub_westend_runtime::Balances,
|
||||
Assets: asset_hub_westend_runtime::Assets,
|
||||
ForeignAssets: asset_hub_westend_runtime::ForeignAssets,
|
||||
PoolAssets: asset_hub_westend_runtime::PoolAssets,
|
||||
AssetConversion: asset_hub_westend_runtime::AssetConversion,
|
||||
}
|
||||
},
|
||||
pub struct BridgeHubWestend {
|
||||
genesis = bridge_hub_westend::genesis(),
|
||||
on_init = {
|
||||
bridge_hub_westend_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = bridge_hub_westend_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: bridge_hub_westend_runtime::XcmpQueue,
|
||||
LocationToAccountId: bridge_hub_westend_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: bridge_hub_westend_runtime::ParachainInfo,
|
||||
MessageProcessor: DefaultParaMessageProcessor<BridgeHubWestend>,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: bridge_hub_westend_runtime::PolkadotXcm,
|
||||
Balances: bridge_hub_westend_runtime::Balances,
|
||||
}
|
||||
},
|
||||
pub struct PenpalWestendA {
|
||||
genesis = penpal::genesis(penpal::PARA_ID_A),
|
||||
on_init = {
|
||||
penpal_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = penpal_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: penpal_runtime::XcmpQueue,
|
||||
LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: penpal_runtime::ParachainInfo,
|
||||
MessageProcessor: DefaultParaMessageProcessor<PenpalWestendA>,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: penpal_runtime::PolkadotXcm,
|
||||
Assets: penpal_runtime::Assets,
|
||||
Balances: penpal_runtime::Balances,
|
||||
}
|
||||
},
|
||||
// Rococo Parachains
|
||||
pub struct BridgeHubRococo {
|
||||
genesis = bridge_hub_rococo::genesis(),
|
||||
on_init = {
|
||||
bridge_hub_rococo_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = bridge_hub_rococo_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: bridge_hub_rococo_runtime::XcmpQueue,
|
||||
LocationToAccountId: bridge_hub_rococo_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: bridge_hub_rococo_runtime::ParachainInfo,
|
||||
MessageProcessor: DefaultParaMessageProcessor<BridgeHubRococo>,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: bridge_hub_rococo_runtime::PolkadotXcm,
|
||||
Balances: bridge_hub_rococo_runtime::Balances,
|
||||
}
|
||||
},
|
||||
// AssetHubRococo
|
||||
pub struct AssetHubRococo {
|
||||
genesis = asset_hub_rococo::genesis(),
|
||||
on_init = {
|
||||
asset_hub_rococo_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = asset_hub_rococo_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: asset_hub_rococo_runtime::XcmpQueue,
|
||||
LocationToAccountId: asset_hub_rococo_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: asset_hub_rococo_runtime::ParachainInfo,
|
||||
MessageProcessor: DefaultParaMessageProcessor<AssetHubRococo>,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: asset_hub_rococo_runtime::PolkadotXcm,
|
||||
Assets: asset_hub_rococo_runtime::Assets,
|
||||
ForeignAssets: asset_hub_rococo_runtime::ForeignAssets,
|
||||
PoolAssets: asset_hub_rococo_runtime::PoolAssets,
|
||||
AssetConversion: asset_hub_rococo_runtime::AssetConversion,
|
||||
Balances: asset_hub_rococo_runtime::Balances,
|
||||
}
|
||||
},
|
||||
pub struct PenpalRococoA {
|
||||
genesis = penpal::genesis(penpal::PARA_ID_A),
|
||||
on_init = {
|
||||
penpal_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = penpal_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: penpal_runtime::XcmpQueue,
|
||||
LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: penpal_runtime::ParachainInfo,
|
||||
MessageProcessor: DefaultParaMessageProcessor<PenpalRococoA>,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: penpal_runtime::PolkadotXcm,
|
||||
Assets: penpal_runtime::Assets,
|
||||
}
|
||||
},
|
||||
pub struct PenpalRococoB {
|
||||
genesis = penpal::genesis(penpal::PARA_ID_B),
|
||||
on_init = {
|
||||
penpal_runtime::AuraExt::on_initialize(1);
|
||||
},
|
||||
runtime = penpal_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: penpal_runtime::XcmpQueue,
|
||||
LocationToAccountId: penpal_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: penpal_runtime::ParachainInfo,
|
||||
MessageProcessor: DefaultParaMessageProcessor<PenpalRococoB>,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: penpal_runtime::PolkadotXcm,
|
||||
Assets: penpal_runtime::Assets,
|
||||
}
|
||||
},
|
||||
// Wococo Parachains
|
||||
pub struct BridgeHubWococo {
|
||||
genesis = bridge_hub_rococo::genesis(),
|
||||
on_init = {
|
||||
bridge_hub_rococo_runtime::AuraExt::on_initialize(1);
|
||||
// TODO: manage to set_wococo_flavor with `set_storage`
|
||||
},
|
||||
runtime = bridge_hub_rococo_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: bridge_hub_rococo_runtime::XcmpQueue,
|
||||
LocationToAccountId: bridge_hub_rococo_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: bridge_hub_rococo_runtime::ParachainInfo,
|
||||
MessageProcessor: DefaultParaMessageProcessor<BridgeHubWococo>,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: bridge_hub_rococo_runtime::PolkadotXcm,
|
||||
}
|
||||
},
|
||||
pub struct AssetHubWococo {
|
||||
genesis = asset_hub_wococo::genesis(),
|
||||
on_init = {
|
||||
asset_hub_rococo_runtime::AuraExt::on_initialize(1);
|
||||
// TODO: manage to set_wococo_flavor with `set_storage`
|
||||
},
|
||||
runtime = asset_hub_rococo_runtime,
|
||||
core = {
|
||||
XcmpMessageHandler: asset_hub_rococo_runtime::XcmpQueue,
|
||||
LocationToAccountId: asset_hub_rococo_runtime::xcm_config::LocationToAccountId,
|
||||
ParachainInfo: asset_hub_rococo_runtime::ParachainInfo,
|
||||
MessageProcessor: DefaultParaMessageProcessor<AssetHubWococo>,
|
||||
},
|
||||
pallets = {
|
||||
PolkadotXcm: asset_hub_rococo_runtime::PolkadotXcm,
|
||||
Assets: asset_hub_rococo_runtime::Assets,
|
||||
ForeignAssets: asset_hub_rococo_runtime::ForeignAssets,
|
||||
PoolAssets: asset_hub_rococo_runtime::PoolAssets,
|
||||
AssetConversion: asset_hub_rococo_runtime::AssetConversion,
|
||||
Balances: asset_hub_rococo_runtime::Balances,
|
||||
}
|
||||
/// Helper function used in tests to build the genesis storage using given RuntimeGenesisConfig and
|
||||
/// code Used in `legacy_vs_json_check` submods to verify storage building with JSON patch against
|
||||
/// building with RuntimeGenesisConfig struct.
|
||||
pub fn build_genesis_storage_legacy(builder: &dyn BuildStorage, code: &[u8]) -> Storage {
|
||||
let mut storage = builder.build_storage().unwrap();
|
||||
storage
|
||||
.top
|
||||
.insert(sp_core::storage::well_known_keys::CODE.to_vec(), code.into());
|
||||
storage
|
||||
}
|
||||
|
||||
pub mod accounts {
|
||||
use super::*;
|
||||
pub const ALICE: &str = "Alice";
|
||||
pub const BOB: &str = "Bob";
|
||||
pub const CHARLIE: &str = "Charlie";
|
||||
pub const DAVE: &str = "Dave";
|
||||
pub const EVE: &str = "Eve";
|
||||
pub const FERDIE: &str = "Ferdei";
|
||||
pub const ALICE_STASH: &str = "Alice//stash";
|
||||
pub const BOB_STASH: &str = "Bob//stash";
|
||||
pub const CHARLIE_STASH: &str = "Charlie//stash";
|
||||
pub const DAVE_STASH: &str = "Dave//stash";
|
||||
pub const EVE_STASH: &str = "Eve//stash";
|
||||
pub const FERDIE_STASH: &str = "Ferdie//stash";
|
||||
pub const FERDIE_BEEFY: &str = "Ferdie//stash";
|
||||
|
||||
pub fn init_balances() -> Vec<AccountId> {
|
||||
vec![
|
||||
get_account_id_from_seed::<sr25519::Public>(ALICE),
|
||||
get_account_id_from_seed::<sr25519::Public>(BOB),
|
||||
get_account_id_from_seed::<sr25519::Public>(CHARLIE),
|
||||
get_account_id_from_seed::<sr25519::Public>(DAVE),
|
||||
get_account_id_from_seed::<sr25519::Public>(EVE),
|
||||
get_account_id_from_seed::<sr25519::Public>(FERDIE),
|
||||
get_account_id_from_seed::<sr25519::Public>(ALICE_STASH),
|
||||
get_account_id_from_seed::<sr25519::Public>(BOB_STASH),
|
||||
get_account_id_from_seed::<sr25519::Public>(CHARLIE_STASH),
|
||||
get_account_id_from_seed::<sr25519::Public>(DAVE_STASH),
|
||||
get_account_id_from_seed::<sr25519::Public>(EVE_STASH),
|
||||
get_account_id_from_seed::<sr25519::Public>(FERDIE_STASH),
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
decl_test_networks! {
|
||||
pub struct WestendMockNet {
|
||||
relay_chain = Westend,
|
||||
parachains = vec![
|
||||
AssetHubWestend,
|
||||
BridgeHubWestend,
|
||||
PenpalWestendA,
|
||||
],
|
||||
bridge = ()
|
||||
},
|
||||
pub struct RococoMockNet {
|
||||
relay_chain = Rococo,
|
||||
parachains = vec![
|
||||
AssetHubRococo,
|
||||
BridgeHubRococo,
|
||||
PenpalRococoA,
|
||||
PenpalRococoB,
|
||||
],
|
||||
bridge = RococoWococoMockBridge
|
||||
},
|
||||
pub struct WococoMockNet {
|
||||
relay_chain = Wococo,
|
||||
parachains = vec![
|
||||
AssetHubWococo,
|
||||
BridgeHubWococo,
|
||||
],
|
||||
bridge = WococoRococoMockBridge
|
||||
pub mod collators {
|
||||
use super::*;
|
||||
|
||||
pub fn invulnerables_asset_hub_polkadot() -> Vec<(AccountId, AssetHubPolkadotAuraId)> {
|
||||
vec![
|
||||
(
|
||||
get_account_id_from_seed::<sr25519::Public>("Alice"),
|
||||
get_from_seed::<AssetHubPolkadotAuraId>("Alice"),
|
||||
),
|
||||
(
|
||||
get_account_id_from_seed::<sr25519::Public>("Bob"),
|
||||
get_from_seed::<AssetHubPolkadotAuraId>("Bob"),
|
||||
),
|
||||
]
|
||||
}
|
||||
|
||||
pub fn invulnerables() -> Vec<(AccountId, AuraId)> {
|
||||
vec![
|
||||
(
|
||||
get_account_id_from_seed::<sr25519::Public>("Alice"),
|
||||
get_from_seed::<AuraId>("Alice"),
|
||||
),
|
||||
(get_account_id_from_seed::<sr25519::Public>("Bob"), get_from_seed::<AuraId>("Bob")),
|
||||
]
|
||||
}
|
||||
}
|
||||
|
||||
decl_test_bridges! {
|
||||
pub struct RococoWococoMockBridge {
|
||||
source = BridgeHubRococo,
|
||||
target = BridgeHubWococo,
|
||||
handler = RococoWococoMessageHandler
|
||||
},
|
||||
pub struct WococoRococoMockBridge {
|
||||
source = BridgeHubWococo,
|
||||
target = BridgeHubRococo,
|
||||
handler = WococoRococoMessageHandler
|
||||
pub mod validators {
|
||||
use super::*;
|
||||
|
||||
pub fn initial_authorities() -> Vec<(
|
||||
AccountId,
|
||||
AccountId,
|
||||
BabeId,
|
||||
GrandpaId,
|
||||
ImOnlineId,
|
||||
ValidatorId,
|
||||
AssignmentId,
|
||||
AuthorityDiscoveryId,
|
||||
)> {
|
||||
vec![get_authority_keys_from_seed_no_beefy("Alice")]
|
||||
}
|
||||
}
|
||||
|
||||
// Westend implementation
|
||||
impl_accounts_helpers_for_relay_chain!(Westend);
|
||||
impl_assert_events_helpers_for_relay_chain!(Westend);
|
||||
impl_send_transact_helpers_for_relay_chain!(Westend);
|
||||
|
||||
// Rococo implementation
|
||||
impl_accounts_helpers_for_relay_chain!(Rococo);
|
||||
impl_assert_events_helpers_for_relay_chain!(Rococo);
|
||||
impl_hrmp_channels_helpers_for_relay_chain!(Rococo);
|
||||
impl_send_transact_helpers_for_relay_chain!(Rococo);
|
||||
|
||||
// Wococo implementation
|
||||
impl_accounts_helpers_for_relay_chain!(Wococo);
|
||||
impl_assert_events_helpers_for_relay_chain!(Wococo);
|
||||
impl_send_transact_helpers_for_relay_chain!(Wococo);
|
||||
|
||||
// AssetHubWestend implementation
|
||||
impl_accounts_helpers_for_parachain!(AssetHubWestend);
|
||||
impl_assets_helpers_for_parachain!(AssetHubWestend, Westend);
|
||||
impl_assert_events_helpers_for_parachain!(AssetHubWestend);
|
||||
|
||||
// AssetHubRococo implementation
|
||||
impl_accounts_helpers_for_parachain!(AssetHubRococo);
|
||||
impl_assets_helpers_for_parachain!(AssetHubRococo, Rococo);
|
||||
impl_assert_events_helpers_for_parachain!(AssetHubRococo);
|
||||
|
||||
// PenpalWestendA implementation
|
||||
impl_assert_events_helpers_for_parachain!(PenpalWestendA);
|
||||
|
||||
// BridgeHubWestend implementation
|
||||
impl_accounts_helpers_for_parachain!(BridgeHubWestend);
|
||||
impl_assert_events_helpers_for_parachain!(BridgeHubWestend);
|
||||
|
||||
// BridgeHubRococo implementation
|
||||
impl_accounts_helpers_for_parachain!(BridgeHubRococo);
|
||||
impl_assert_events_helpers_for_parachain!(BridgeHubRococo);
|
||||
|
||||
// PenpalRococo implementations
|
||||
impl_assert_events_helpers_for_parachain!(PenpalRococoA);
|
||||
impl_assert_events_helpers_for_parachain!(PenpalRococoB);
|
||||
|
||||
decl_test_sender_receiver_accounts_parameter_types! {
|
||||
// Relays
|
||||
Westend { sender: ALICE, receiver: BOB },
|
||||
Rococo { sender: ALICE, receiver: BOB },
|
||||
Wococo { sender: ALICE, receiver: BOB },
|
||||
// Asset Hubs
|
||||
AssetHubWestend { sender: ALICE, receiver: BOB },
|
||||
AssetHubRococo { sender: ALICE, receiver: BOB },
|
||||
AssetHubWococo { sender: ALICE, receiver: BOB },
|
||||
// Bridged Hubs
|
||||
BridgeHubRococo { sender: ALICE, receiver: BOB },
|
||||
BridgeHubWococo { sender: ALICE, receiver: BOB },
|
||||
BridgeHubWestend { sender: ALICE, receiver: BOB },
|
||||
// Penpals
|
||||
PenpalWestendA { sender: ALICE, receiver: BOB },
|
||||
PenpalRococoA { sender: ALICE, receiver: BOB },
|
||||
PenpalRococoB { sender: ALICE, receiver: BOB }
|
||||
}
|
||||
|
||||
@@ -13,28 +13,43 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub use paste;
|
||||
|
||||
// Substrate
|
||||
pub use pallet_balances;
|
||||
pub use pallet_message_queue;
|
||||
pub use pallet_xcm;
|
||||
|
||||
// Polkadot
|
||||
pub use xcm::prelude::{AccountId32, WeightLimit};
|
||||
|
||||
// Cumulus
|
||||
pub use asset_test_utils;
|
||||
pub use cumulus_pallet_xcmp_queue;
|
||||
pub use xcm_emulator::Chain;
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! test_parachain_is_trusted_teleporter {
|
||||
( $sender_para:ty, $sender_xcm_config:ty, vec![$( $receiver_para:ty ),+], ($assets:expr, $amount:expr) ) => {
|
||||
$crate::paste::paste! {
|
||||
$crate::macros::paste::paste! {
|
||||
// init Origin variables
|
||||
let sender = [<$sender_para Sender>]::get();
|
||||
let mut para_sender_balance_before =
|
||||
<$sender_para as $crate::Chain>::account_data_of(sender.clone()).free;
|
||||
let origin = <$sender_para as $crate::Chain>::RuntimeOrigin::signed(sender.clone());
|
||||
<$sender_para as $crate::macros::Chain>::account_data_of(sender.clone()).free;
|
||||
let origin = <$sender_para as $crate::macros::Chain>::RuntimeOrigin::signed(sender.clone());
|
||||
let fee_asset_item = 0;
|
||||
let weight_limit = $crate::WeightLimit::Unlimited;
|
||||
let weight_limit = $crate::macros::WeightLimit::Unlimited;
|
||||
|
||||
$(
|
||||
{
|
||||
// init Destination variables
|
||||
let receiver = [<$receiver_para Receiver>]::get();
|
||||
let para_receiver_balance_before =
|
||||
<$receiver_para as $crate::Chain>::account_data_of(receiver.clone()).free;
|
||||
<$receiver_para as $crate::macros::Chain>::account_data_of(receiver.clone()).free;
|
||||
let para_destination =
|
||||
<$sender_para>::sibling_location_of(<$receiver_para>::para_id());
|
||||
let beneficiary: MultiLocation =
|
||||
$crate::AccountId32 { network: None, id: receiver.clone().into() }.into();
|
||||
$crate::macros::AccountId32 { network: None, id: receiver.clone().into() }.into();
|
||||
|
||||
// Send XCM message from Origin Parachain
|
||||
// We are only testing the limited teleport version, which should be ok since success will
|
||||
@@ -49,19 +64,19 @@ macro_rules! test_parachain_is_trusted_teleporter {
|
||||
weight_limit.clone(),
|
||||
));
|
||||
|
||||
type RuntimeEvent = <$sender_para as $crate::Chain>::RuntimeEvent;
|
||||
type RuntimeEvent = <$sender_para as $crate::macros::Chain>::RuntimeEvent;
|
||||
|
||||
assert_expected_events!(
|
||||
$sender_para,
|
||||
vec![
|
||||
RuntimeEvent::PolkadotXcm(
|
||||
$crate::pallet_xcm::Event::Attempted { outcome: Outcome::Complete { .. } }
|
||||
$crate::macros::pallet_xcm::Event::Attempted { outcome: Outcome::Complete { .. } }
|
||||
) => {},
|
||||
RuntimeEvent::XcmpQueue(
|
||||
$crate::cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }
|
||||
$crate::macros::cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }
|
||||
) => {},
|
||||
RuntimeEvent::Balances(
|
||||
$crate::pallet_balances::Event::Withdraw { who: sender, amount }
|
||||
$crate::macros::pallet_balances::Event::Withdraw { who: sender, amount }
|
||||
) => {},
|
||||
]
|
||||
);
|
||||
@@ -69,16 +84,16 @@ macro_rules! test_parachain_is_trusted_teleporter {
|
||||
|
||||
// Receive XCM message in Destination Parachain
|
||||
<$receiver_para>::execute_with(|| {
|
||||
type RuntimeEvent = <$receiver_para as $crate::Chain>::RuntimeEvent;
|
||||
type RuntimeEvent = <$receiver_para as $crate::macros::Chain>::RuntimeEvent;
|
||||
|
||||
assert_expected_events!(
|
||||
$receiver_para,
|
||||
vec![
|
||||
RuntimeEvent::Balances(
|
||||
$crate::pallet_balances::Event::Deposit { who: receiver, .. }
|
||||
$crate::macros::pallet_balances::Event::Deposit { who: receiver, .. }
|
||||
) => {},
|
||||
RuntimeEvent::MessageQueue(
|
||||
$crate::pallet_message_queue::Event::Processed { success: true, .. }
|
||||
$crate::macros::pallet_message_queue::Event::Processed { success: true, .. }
|
||||
) => {},
|
||||
]
|
||||
);
|
||||
@@ -86,11 +101,11 @@ macro_rules! test_parachain_is_trusted_teleporter {
|
||||
|
||||
// Check if balances are updated accordingly in Origin and Destination Parachains
|
||||
let para_sender_balance_after =
|
||||
<$sender_para as $crate::Chain>::account_data_of(sender.clone()).free;
|
||||
<$sender_para as $crate::macros::Chain>::account_data_of(sender.clone()).free;
|
||||
let para_receiver_balance_after =
|
||||
<$receiver_para as $crate::Chain>::account_data_of(receiver.clone()).free;
|
||||
<$receiver_para as $crate::macros::Chain>::account_data_of(receiver.clone()).free;
|
||||
let delivery_fees = <$sender_para>::execute_with(|| {
|
||||
asset_test_utils::xcm_helpers::transfer_assets_delivery_fees::<
|
||||
$crate::macros::asset_test_utils::xcm_helpers::transfer_assets_delivery_fees::<
|
||||
<$sender_xcm_config as xcm_executor::Config>::XcmSender,
|
||||
>($assets.clone(), fee_asset_item, weight_limit.clone(), beneficiary, para_destination)
|
||||
});
|
||||
@@ -99,7 +114,7 @@ macro_rules! test_parachain_is_trusted_teleporter {
|
||||
assert!(para_receiver_balance_after > para_receiver_balance_before);
|
||||
|
||||
// Update sender balance
|
||||
para_sender_balance_before = <$sender_para as $crate::Chain>::account_data_of(sender.clone()).free;
|
||||
para_sender_balance_before = <$sender_para as $crate::macros::Chain>::account_data_of(sender.clone()).free;
|
||||
}
|
||||
)+
|
||||
}
|
||||
|
||||
@@ -13,7 +13,10 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Cumulus
|
||||
use parachains_common::AccountId;
|
||||
|
||||
// Polkadot
|
||||
use xcm::{prelude::*, DoubleEncoded};
|
||||
|
||||
/// Helper method to build a XCM with a `Transact` instruction and paying for its execution
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
[package]
|
||||
name = "rococo-system-emulated-network"
|
||||
version = "0.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Rococo System emulated network"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
# Cumulus
|
||||
emulated-integration-tests-common = { path = "../../common", default-features = false }
|
||||
rococo-emulated-chain = { path = "../../chains/relays/rococo" }
|
||||
asset-hub-rococo-emulated-chain = { path = "../../chains/parachains/assets/asset-hub-rococo" }
|
||||
bridge-hub-rococo-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-rococo" }
|
||||
penpal-emulated-chain = { path = "../../chains/parachains/testing/penpal" }
|
||||
@@ -0,0 +1,51 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub use asset_hub_rococo_emulated_chain;
|
||||
pub use bridge_hub_rococo_emulated_chain;
|
||||
pub use penpal_emulated_chain;
|
||||
pub use rococo_emulated_chain;
|
||||
|
||||
use asset_hub_rococo_emulated_chain::AssetHubRococo;
|
||||
use bridge_hub_rococo_emulated_chain::BridgeHubRococo;
|
||||
use penpal_emulated_chain::{PenpalA, PenpalB};
|
||||
use rococo_emulated_chain::Rococo;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
accounts::{ALICE, BOB},
|
||||
xcm_emulator::{decl_test_networks, decl_test_sender_receiver_accounts_parameter_types},
|
||||
};
|
||||
|
||||
decl_test_networks! {
|
||||
pub struct RococoMockNet {
|
||||
relay_chain = Rococo,
|
||||
parachains = vec![
|
||||
AssetHubRococo,
|
||||
BridgeHubRococo,
|
||||
PenpalA,
|
||||
PenpalB,
|
||||
],
|
||||
bridge = ()
|
||||
},
|
||||
}
|
||||
|
||||
decl_test_sender_receiver_accounts_parameter_types! {
|
||||
RococoRelay { sender: ALICE, receiver: BOB },
|
||||
AssetHubRococoPara { sender: ALICE, receiver: BOB },
|
||||
BridgeHubRococoPara { sender: ALICE, receiver: BOB },
|
||||
PenpalAPara { sender: ALICE, receiver: BOB },
|
||||
PenpalBPara { sender: ALICE, receiver: BOB }
|
||||
}
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
[package]
|
||||
name = "rococo-wococo-system-emulated-network"
|
||||
version = "0.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Rococo<>Wococo emulated bridged network"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
# Cumulus
|
||||
emulated-integration-tests-common = { path = "../../common", default-features = false }
|
||||
rococo-emulated-chain = { path = "../../chains/relays/rococo" }
|
||||
wococo-emulated-chain = { path = "../../chains/relays/wococo" }
|
||||
asset-hub-rococo-emulated-chain = { path = "../../chains/parachains/assets/asset-hub-rococo" }
|
||||
asset-hub-wococo-emulated-chain = { path = "../../chains/parachains/assets/asset-hub-wococo" }
|
||||
bridge-hub-rococo-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-rococo" }
|
||||
bridge-hub-wococo-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-wococo" }
|
||||
+94
@@ -0,0 +1,94 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub use asset_hub_rococo_emulated_chain;
|
||||
pub use asset_hub_wococo_emulated_chain;
|
||||
pub use bridge_hub_rococo_emulated_chain;
|
||||
pub use bridge_hub_wococo_emulated_chain;
|
||||
pub use rococo_emulated_chain;
|
||||
pub use wococo_emulated_chain;
|
||||
|
||||
use asset_hub_rococo_emulated_chain::AssetHubRococo;
|
||||
use asset_hub_wococo_emulated_chain::AssetHubWococo;
|
||||
use bridge_hub_rococo_emulated_chain::BridgeHubRococo;
|
||||
use bridge_hub_wococo_emulated_chain::BridgeHubWococo;
|
||||
use rococo_emulated_chain::Rococo;
|
||||
use wococo_emulated_chain::Wococo;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
accounts::{ALICE, BOB},
|
||||
impls::{BridgeHubMessageHandler, BridgeMessagesInstance2},
|
||||
xcm_emulator::{
|
||||
decl_test_bridges, decl_test_networks, decl_test_sender_receiver_accounts_parameter_types,
|
||||
Chain,
|
||||
},
|
||||
};
|
||||
|
||||
decl_test_networks! {
|
||||
pub struct RococoMockNet {
|
||||
relay_chain = Rococo,
|
||||
parachains = vec![
|
||||
AssetHubRococo,
|
||||
BridgeHubRococo,
|
||||
],
|
||||
bridge = RococoWococoMockBridge
|
||||
|
||||
},
|
||||
pub struct WococoMockNet {
|
||||
relay_chain = Wococo,
|
||||
parachains = vec![
|
||||
AssetHubWococo,
|
||||
BridgeHubWococo,
|
||||
],
|
||||
bridge = WococoRococoMockBridge
|
||||
},
|
||||
}
|
||||
|
||||
decl_test_bridges! {
|
||||
pub struct RococoWococoMockBridge {
|
||||
source = BridgeHubRococoPara,
|
||||
target = BridgeHubWococoPara,
|
||||
handler = RococoWococoMessageHandler
|
||||
},
|
||||
pub struct WococoRococoMockBridge {
|
||||
source = BridgeHubWococoPara,
|
||||
target = BridgeHubRococoPara,
|
||||
handler = WococoRococoMessageHandler
|
||||
}
|
||||
}
|
||||
|
||||
type BridgeHubRococoRuntime = <BridgeHubRococoPara as Chain>::Runtime;
|
||||
type BridgeHubWococoRuntime = <BridgeHubWococoPara as Chain>::Runtime;
|
||||
|
||||
pub type RococoWococoMessageHandler = BridgeHubMessageHandler<
|
||||
BridgeHubRococoRuntime,
|
||||
BridgeHubWococoRuntime,
|
||||
BridgeMessagesInstance2,
|
||||
>;
|
||||
pub type WococoRococoMessageHandler = BridgeHubMessageHandler<
|
||||
BridgeHubWococoRuntime,
|
||||
BridgeHubRococoRuntime,
|
||||
BridgeMessagesInstance2,
|
||||
>;
|
||||
|
||||
decl_test_sender_receiver_accounts_parameter_types! {
|
||||
RococoRelay { sender: ALICE, receiver: BOB },
|
||||
AssetHubRococoPara { sender: ALICE, receiver: BOB },
|
||||
BridgeHubRococoPara { sender: ALICE, receiver: BOB },
|
||||
WococoRelay { sender: ALICE, receiver: BOB },
|
||||
AssetHubWococoPara { sender: ALICE, receiver: BOB },
|
||||
BridgeHubWococoPara { sender: ALICE, receiver: BOB }
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
[package]
|
||||
name = "westend-system-emulated-network"
|
||||
version = "0.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Westend System emulated network"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
# Cumulus
|
||||
emulated-integration-tests-common = { path = "../../common", default-features = false }
|
||||
westend-emulated-chain = { path = "../../chains/relays/westend", default-features = false }
|
||||
asset-hub-westend-emulated-chain = { path = "../../chains/parachains/assets/asset-hub-westend" }
|
||||
bridge-hub-westend-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-westend" }
|
||||
penpal-emulated-chain = { path = "../../chains/parachains/testing/penpal" }
|
||||
@@ -0,0 +1,51 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub use asset_hub_westend_emulated_chain;
|
||||
pub use bridge_hub_westend_emulated_chain;
|
||||
pub use penpal_emulated_chain;
|
||||
pub use westend_emulated_chain;
|
||||
|
||||
use asset_hub_westend_emulated_chain::AssetHubWestend;
|
||||
use bridge_hub_westend_emulated_chain::BridgeHubWestend;
|
||||
use penpal_emulated_chain::{PenpalA, PenpalB};
|
||||
use westend_emulated_chain::Westend;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
accounts::{ALICE, BOB},
|
||||
xcm_emulator::{decl_test_networks, decl_test_sender_receiver_accounts_parameter_types},
|
||||
};
|
||||
|
||||
decl_test_networks! {
|
||||
pub struct WestendMockNet {
|
||||
relay_chain = Westend,
|
||||
parachains = vec![
|
||||
AssetHubWestend,
|
||||
BridgeHubWestend,
|
||||
PenpalA,
|
||||
PenpalB,
|
||||
],
|
||||
bridge = ()
|
||||
},
|
||||
}
|
||||
|
||||
decl_test_sender_receiver_accounts_parameter_types! {
|
||||
WestendRelay { sender: ALICE, receiver: BOB },
|
||||
AssetHubWestendPara { sender: ALICE, receiver: BOB },
|
||||
BridgeHubWestendPara { sender: ALICE, receiver: BOB },
|
||||
PenpalAPara { sender: ALICE, receiver: BOB },
|
||||
PenpalBPara { sender: ALICE, receiver: BOB }
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
[package]
|
||||
name = "wococo-system-emulated-network"
|
||||
version = "0.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Wococo System emulated network"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
# Cumulus
|
||||
emulated-integration-tests-common = { path = "../../common", default-features = false }
|
||||
wococo-emulated-chain = { path = "../../chains/relays/wococo" }
|
||||
asset-hub-wococo-emulated-chain = { path = "../../chains/parachains/assets/asset-hub-wococo" }
|
||||
bridge-hub-wococo-emulated-chain = { path = "../../chains/parachains/bridges/bridge-hub-wococo" }
|
||||
penpal-emulated-chain = { path = "../../chains/parachains/testing/penpal" }
|
||||
@@ -0,0 +1,50 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub use asset_hub_wococo_emulated_chain;
|
||||
pub use bridge_hub_wococo_emulated_chain;
|
||||
pub use wococo_emulated_chain;
|
||||
|
||||
use asset_hub_wococo_emulated_chain::AssetHubWococo;
|
||||
use bridge_hub_wococo_emulated_chain::BridgeHubWococo;
|
||||
use penpal_emulated_chain::{PenpalA, PenpalB};
|
||||
use wococo_emulated_chain::Wococo;
|
||||
|
||||
// Cumulus
|
||||
use emulated_integration_tests_common::{
|
||||
accounts::{ALICE, BOB},
|
||||
xcm_emulator::{decl_test_networks, decl_test_sender_receiver_accounts_parameter_types},
|
||||
};
|
||||
|
||||
decl_test_networks! {
|
||||
pub struct WococoMockNet {
|
||||
relay_chain = Wococo,
|
||||
parachains = vec![
|
||||
AssetHubWococo,
|
||||
BridgeHubWococo,
|
||||
PenpalA,
|
||||
PenpalB,
|
||||
],
|
||||
bridge = ()
|
||||
},
|
||||
}
|
||||
|
||||
decl_test_sender_receiver_accounts_parameter_types! {
|
||||
WococoRelay { sender: ALICE, receiver: BOB },
|
||||
AssetHubWococoPara { sender: ALICE, receiver: BOB },
|
||||
BridgeHubWococoPara { sender: ALICE, receiver: BOB },
|
||||
PenpalAPara { sender: ALICE, receiver: BOB },
|
||||
PenpalBPara { sender: ALICE, receiver: BOB }
|
||||
}
|
||||
+32
@@ -0,0 +1,32 @@
|
||||
[package]
|
||||
name = "asset-hub-rococo-integration-tests"
|
||||
version = "1.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Asset Hub Rococo runtime integration tests with xcm-emulator"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false }
|
||||
assert_matches = "1.5.0"
|
||||
|
||||
# Substrate
|
||||
sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false}
|
||||
frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false}
|
||||
pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false}
|
||||
pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false}
|
||||
pallet-asset-conversion = { path = "../../../../../../../substrate/frame/asset-conversion", default-features = false}
|
||||
|
||||
# Polkadot
|
||||
xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false}
|
||||
pallet-xcm = { path = "../../../../../../../polkadot/xcm/pallet-xcm", default-features = false}
|
||||
xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../polkadot/xcm/xcm-executor", default-features = false}
|
||||
rococo-runtime = { path = "../../../../../../../polkadot/runtime/rococo" }
|
||||
|
||||
# Cumulus
|
||||
asset-test-utils = { path = "../../../../../runtimes/assets/test-utils" }
|
||||
parachains-common = { path = "../../../../../../parachains/common" }
|
||||
asset-hub-rococo-runtime = { path = "../../../../../runtimes/assets/asset-hub-rococo" }
|
||||
emulated-integration-tests-common = { path = "../../../common", default-features = false}
|
||||
rococo-system-emulated-network ={ path = "../../../networks/rococo-system" }
|
||||
+30
-18
@@ -13,34 +13,46 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub use asset_test_utils::xcm_helpers;
|
||||
pub use codec::Encode;
|
||||
|
||||
// Substrate
|
||||
pub use frame_support::{
|
||||
assert_err, assert_ok,
|
||||
pallet_prelude::Weight,
|
||||
sp_runtime::{AccountId32, DispatchError, DispatchResult},
|
||||
traits::fungibles::Inspect,
|
||||
};
|
||||
pub use integration_tests_common::{
|
||||
constants::{
|
||||
asset_hub_rococo::ED as ASSET_HUB_ROCOCO_ED, rococo::ED as ROCOCO_ED, PROOF_SIZE_THRESHOLD,
|
||||
REF_TIME_THRESHOLD, XCM_V3,
|
||||
},
|
||||
test_parachain_is_trusted_teleporter,
|
||||
xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution},
|
||||
AssetHubRococo, AssetHubRococoPallet, AssetHubRococoReceiver, AssetHubRococoSender,
|
||||
BridgeHubRococo, BridgeHubRococoReceiver, PenpalRococoA, PenpalRococoAPallet,
|
||||
PenpalRococoAReceiver, PenpalRococoASender, PenpalRococoB, PenpalRococoBPallet, Rococo,
|
||||
RococoPallet, RococoReceiver, RococoSender,
|
||||
};
|
||||
pub use parachains_common::{AccountId, Balance};
|
||||
|
||||
// Polkadot
|
||||
pub use xcm::{
|
||||
prelude::{AccountId32 as AccountId32Junction, *},
|
||||
v3::{Error, NetworkId::Rococo as RococoId},
|
||||
};
|
||||
pub use xcm_emulator::{
|
||||
assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para,
|
||||
RelayChain as Relay, Test, TestArgs, TestContext, TestExt,
|
||||
|
||||
// Cumulus
|
||||
pub use asset_test_utils::xcm_helpers;
|
||||
pub use emulated_integration_tests_common::{
|
||||
test_parachain_is_trusted_teleporter,
|
||||
xcm_emulator::{
|
||||
assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para,
|
||||
RelayChain as Relay, Test, TestArgs, TestContext, TestExt,
|
||||
},
|
||||
xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution},
|
||||
PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3,
|
||||
};
|
||||
pub use parachains_common::{AccountId, Balance};
|
||||
pub use rococo_system_emulated_network::{
|
||||
asset_hub_rococo_emulated_chain::{
|
||||
genesis::ED as ASSET_HUB_ROCOCO_ED, AssetHubRococoParaPallet as AssetHubRococoPallet,
|
||||
},
|
||||
penpal_emulated_chain::PenpalAParaPallet as PenpalAPallet,
|
||||
rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet},
|
||||
AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver,
|
||||
AssetHubRococoParaSender as AssetHubRococoSender, BridgeHubRococoPara as BridgeHubRococo,
|
||||
BridgeHubRococoParaReceiver as BridgeHubRococoReceiver, PenpalAPara as PenpalA,
|
||||
PenpalAParaReceiver as PenpalAReceiver, PenpalAParaSender as PenpalASender,
|
||||
RococoRelay as Rococo, RococoRelayReceiver as RococoReceiver,
|
||||
RococoRelaySender as RococoSender,
|
||||
};
|
||||
|
||||
pub const ASSET_ID: u32 = 1;
|
||||
@@ -50,7 +62,7 @@ pub const ASSETS_PALLET_ID: u8 = 50;
|
||||
|
||||
pub type RelayToSystemParaTest = Test<Rococo, AssetHubRococo>;
|
||||
pub type SystemParaToRelayTest = Test<AssetHubRococo, Rococo>;
|
||||
pub type SystemParaToParaTest = Test<AssetHubRococo, PenpalRococoA>;
|
||||
pub type SystemParaToParaTest = Test<AssetHubRococo, PenpalA>;
|
||||
|
||||
/// Returns a `TestArgs` instance to de used for the Relay Chain accross integraton tests
|
||||
pub fn relay_test_args(amount: Balance) -> TestArgs {
|
||||
+12
-12
@@ -294,14 +294,14 @@ fn reserve_transfer_native_asset_from_system_para_to_relay_fails() {
|
||||
#[test]
|
||||
fn limited_reserve_transfer_native_asset_from_system_para_to_para() {
|
||||
// Init values for System Parachain
|
||||
let destination = AssetHubRococo::sibling_location_of(PenpalRococoA::para_id());
|
||||
let beneficiary_id = PenpalRococoAReceiver::get();
|
||||
let destination = AssetHubRococo::sibling_location_of(PenpalA::para_id());
|
||||
let beneficiary_id = PenpalAReceiver::get();
|
||||
let amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 1000;
|
||||
let assets = (Parent, amount_to_send).into();
|
||||
|
||||
let test_args = TestContext {
|
||||
sender: AssetHubRococoSender::get(),
|
||||
receiver: PenpalRococoAReceiver::get(),
|
||||
receiver: PenpalAReceiver::get(),
|
||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
||||
};
|
||||
|
||||
@@ -332,14 +332,14 @@ fn limited_reserve_transfer_native_asset_from_system_para_to_para() {
|
||||
#[test]
|
||||
fn reserve_transfer_native_asset_from_system_para_to_para() {
|
||||
// Init values for System Parachain
|
||||
let destination = AssetHubRococo::sibling_location_of(PenpalRococoA::para_id());
|
||||
let beneficiary_id = PenpalRococoAReceiver::get();
|
||||
let destination = AssetHubRococo::sibling_location_of(PenpalA::para_id());
|
||||
let beneficiary_id = PenpalAReceiver::get();
|
||||
let amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 1000;
|
||||
let assets = (Parent, amount_to_send).into();
|
||||
|
||||
let test_args = TestContext {
|
||||
sender: AssetHubRococoSender::get(),
|
||||
receiver: PenpalRococoAReceiver::get(),
|
||||
receiver: PenpalAReceiver::get(),
|
||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
||||
};
|
||||
|
||||
@@ -380,8 +380,8 @@ fn limited_reserve_transfer_asset_from_system_para_to_para() {
|
||||
);
|
||||
|
||||
// Init values for System Parachain
|
||||
let destination = AssetHubRococo::sibling_location_of(PenpalRococoA::para_id());
|
||||
let beneficiary_id = PenpalRococoAReceiver::get();
|
||||
let destination = AssetHubRococo::sibling_location_of(PenpalA::para_id());
|
||||
let beneficiary_id = PenpalAReceiver::get();
|
||||
let amount_to_send = ASSET_MIN_BALANCE * 1000;
|
||||
let assets =
|
||||
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send)
|
||||
@@ -389,7 +389,7 @@ fn limited_reserve_transfer_asset_from_system_para_to_para() {
|
||||
|
||||
let system_para_test_args = TestContext {
|
||||
sender: AssetHubRococoSender::get(),
|
||||
receiver: PenpalRococoAReceiver::get(),
|
||||
receiver: PenpalAReceiver::get(),
|
||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
||||
};
|
||||
|
||||
@@ -416,8 +416,8 @@ fn reserve_transfer_asset_from_system_para_to_para() {
|
||||
);
|
||||
|
||||
// Init values for System Parachain
|
||||
let destination = AssetHubRococo::sibling_location_of(PenpalRococoA::para_id());
|
||||
let beneficiary_id = PenpalRococoAReceiver::get();
|
||||
let destination = AssetHubRococo::sibling_location_of(PenpalA::para_id());
|
||||
let beneficiary_id = PenpalAReceiver::get();
|
||||
let amount_to_send = ASSET_MIN_BALANCE * 1000;
|
||||
let assets =
|
||||
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send)
|
||||
@@ -425,7 +425,7 @@ fn reserve_transfer_asset_from_system_para_to_para() {
|
||||
|
||||
let system_para_test_args = TestContext {
|
||||
sender: AssetHubRococoSender::get(),
|
||||
receiver: PenpalRococoAReceiver::get(),
|
||||
receiver: PenpalAReceiver::get(),
|
||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
||||
};
|
||||
|
||||
+6
-7
@@ -33,7 +33,7 @@ fn send_transact_as_superuser_from_relay_to_system_para_works() {
|
||||
#[test]
|
||||
fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() {
|
||||
let para_sovereign_account = AssetHubRococo::sovereign_account_id_of(
|
||||
AssetHubRococo::sibling_location_of(PenpalRococoA::para_id()),
|
||||
AssetHubRococo::sibling_location_of(PenpalA::para_id()),
|
||||
);
|
||||
|
||||
// Force create and mint assets for Parachain's sovereign account
|
||||
@@ -60,9 +60,8 @@ fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() {
|
||||
let native_asset =
|
||||
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount).into();
|
||||
|
||||
let root_origin = <PenpalRococoA as Chain>::RuntimeOrigin::root();
|
||||
let system_para_destination =
|
||||
PenpalRococoA::sibling_location_of(AssetHubRococo::para_id()).into();
|
||||
let root_origin = <PenpalA as Chain>::RuntimeOrigin::root();
|
||||
let system_para_destination = PenpalA::sibling_location_of(AssetHubRococo::para_id()).into();
|
||||
let xcm = xcm_transact_paid_execution(
|
||||
call,
|
||||
origin_kind,
|
||||
@@ -70,14 +69,14 @@ fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() {
|
||||
para_sovereign_account.clone(),
|
||||
);
|
||||
|
||||
PenpalRococoA::execute_with(|| {
|
||||
assert_ok!(<PenpalRococoA as PenpalRococoAPallet>::PolkadotXcm::send(
|
||||
PenpalA::execute_with(|| {
|
||||
assert_ok!(<PenpalA as PenpalAPallet>::PolkadotXcm::send(
|
||||
root_origin,
|
||||
bx!(system_para_destination),
|
||||
bx!(xcm),
|
||||
));
|
||||
|
||||
PenpalRococoA::assert_xcm_pallet_sent();
|
||||
PenpalA::assert_xcm_pallet_sent();
|
||||
});
|
||||
|
||||
AssetHubRococo::execute_with(|| {
|
||||
+12
-12
@@ -125,7 +125,7 @@ fn swap_locally_on_chain_using_foreign_assets() {
|
||||
let foreign_asset1_at_asset_hub_rococo = Box::new(MultiLocation {
|
||||
parents: 1,
|
||||
interior: X3(
|
||||
Parachain(PenpalRococoA::para_id().into()),
|
||||
Parachain(PenpalA::para_id().into()),
|
||||
PalletInstance(ASSETS_PALLET_ID),
|
||||
GeneralIndex(ASSET_ID.into()),
|
||||
),
|
||||
@@ -136,18 +136,18 @@ fn swap_locally_on_chain_using_foreign_assets() {
|
||||
.into();
|
||||
|
||||
let penpal_location =
|
||||
MultiLocation { parents: 1, interior: X1(Parachain(PenpalRococoA::para_id().into())) };
|
||||
MultiLocation { parents: 1, interior: X1(Parachain(PenpalA::para_id().into())) };
|
||||
|
||||
// 1. Create asset on penpal:
|
||||
PenpalRococoA::execute_with(|| {
|
||||
assert_ok!(<PenpalRococoA as PenpalRococoAPallet>::Assets::create(
|
||||
<PenpalRococoA as Chain>::RuntimeOrigin::signed(PenpalRococoASender::get()),
|
||||
PenpalA::execute_with(|| {
|
||||
assert_ok!(<PenpalA as PenpalAPallet>::Assets::create(
|
||||
<PenpalA as Chain>::RuntimeOrigin::signed(PenpalASender::get()),
|
||||
ASSET_ID.into(),
|
||||
PenpalRococoASender::get().into(),
|
||||
PenpalASender::get().into(),
|
||||
1000,
|
||||
));
|
||||
|
||||
assert!(<PenpalRococoA as PenpalRococoAPallet>::Assets::asset_exists(ASSET_ID));
|
||||
assert!(<PenpalA as PenpalAPallet>::Assets::asset_exists(ASSET_ID));
|
||||
});
|
||||
|
||||
// 2. Create foreign asset on asset_hub_rococo:
|
||||
@@ -202,18 +202,18 @@ fn swap_locally_on_chain_using_foreign_assets() {
|
||||
]));
|
||||
|
||||
// Send XCM message from penpal => asset_hub_rococo
|
||||
let sudo_penpal_origin = <PenpalRococoA as Chain>::RuntimeOrigin::root();
|
||||
PenpalRococoA::execute_with(|| {
|
||||
assert_ok!(<PenpalRococoA as PenpalRococoAPallet>::PolkadotXcm::send(
|
||||
let sudo_penpal_origin = <PenpalA as Chain>::RuntimeOrigin::root();
|
||||
PenpalA::execute_with(|| {
|
||||
assert_ok!(<PenpalA as PenpalAPallet>::PolkadotXcm::send(
|
||||
sudo_penpal_origin.clone(),
|
||||
bx!(assets_para_destination.clone()),
|
||||
bx!(xcm),
|
||||
));
|
||||
|
||||
type RuntimeEvent = <PenpalRococoA as Chain>::RuntimeEvent;
|
||||
type RuntimeEvent = <PenpalA as Chain>::RuntimeEvent;
|
||||
|
||||
assert_expected_events!(
|
||||
PenpalRococoA,
|
||||
PenpalA,
|
||||
vec![
|
||||
RuntimeEvent::PolkadotXcm(pallet_xcm::Event::Sent { .. }) => {},
|
||||
]
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
[package]
|
||||
name = "asset-hub-westend-integration-tests"
|
||||
version = "1.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Asset Hub Westend runtime integration tests with xcm-emulator"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false }
|
||||
assert_matches = "1.5.0"
|
||||
|
||||
# Substrate
|
||||
sp-runtime = { path = "../../../../../../../substrate/primitives/runtime", default-features = false}
|
||||
frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false}
|
||||
frame-system = { path = "../../../../../../../substrate/frame/system", default-features = false}
|
||||
pallet-balances = { path = "../../../../../../../substrate/frame/balances", default-features = false}
|
||||
pallet-assets = { path = "../../../../../../../substrate/frame/assets", default-features = false}
|
||||
pallet-asset-conversion = { path = "../../../../../../../substrate/frame/asset-conversion", default-features = false}
|
||||
pallet-treasury = { path = "../../../../../../../substrate/frame/treasury", default-features = false}
|
||||
pallet-asset-rate = { path = "../../../../../../../substrate/frame/asset-rate", default-features = false}
|
||||
pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue", default-features = false }
|
||||
|
||||
# Polkadot
|
||||
polkadot-runtime-common = { path = "../../../../../../../polkadot/runtime/common" }
|
||||
xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false}
|
||||
xcm-builder = { package = "staging-xcm-builder", path = "../../../../../../../polkadot/xcm/xcm-builder", default-features = false}
|
||||
xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../polkadot/xcm/xcm-executor", default-features = false}
|
||||
pallet-xcm = { path = "../../../../../../../polkadot/xcm/pallet-xcm", default-features = false}
|
||||
westend-runtime = { path = "../../../../../../../polkadot/runtime/westend" }
|
||||
westend-runtime-constants = { path = "../../../../../../../polkadot/runtime/westend/constants", default-features = false }
|
||||
|
||||
# Cumulus
|
||||
parachains-common = { path = "../../../../../../parachains/common" }
|
||||
asset-hub-westend-runtime = { path = "../../../../../runtimes/assets/asset-hub-westend" }
|
||||
asset-test-utils = { path = "../../../../../runtimes/assets/test-utils" }
|
||||
cumulus-pallet-dmp-queue = { default-features = false, path = "../../../../../../pallets/dmp-queue" }
|
||||
cumulus-pallet-parachain-system = { default-features = false, path = "../../../../../../pallets/parachain-system" }
|
||||
emulated-integration-tests-common = { path = "../../../common", default-features = false}
|
||||
westend-system-emulated-network ={ path = "../../../networks/westend-system" }
|
||||
+29
-17
@@ -13,8 +13,9 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
pub use asset_test_utils::xcm_helpers;
|
||||
pub use codec::Encode;
|
||||
|
||||
// Substrate
|
||||
pub use frame_support::{
|
||||
assert_err, assert_ok,
|
||||
instances::Instance2,
|
||||
@@ -23,25 +24,36 @@ pub use frame_support::{
|
||||
traits::fungibles::Inspect,
|
||||
BoundedVec,
|
||||
};
|
||||
pub use integration_tests_common::{
|
||||
constants::{
|
||||
asset_hub_westend::ED as ASSET_HUB_WESTEND_ED, westend::ED as WESTEND_ED,
|
||||
PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3,
|
||||
},
|
||||
test_parachain_is_trusted_teleporter,
|
||||
xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution},
|
||||
AssetHubWestend, AssetHubWestendPallet, AssetHubWestendReceiver, AssetHubWestendSender,
|
||||
PenpalWestendA, PenpalWestendAPallet, PenpalWestendAReceiver, PenpalWestendASender, Westend,
|
||||
WestendPallet, WestendReceiver, WestendSender,
|
||||
};
|
||||
pub use parachains_common::{AccountId, Balance};
|
||||
|
||||
// Polkadot
|
||||
pub use xcm::{
|
||||
prelude::{AccountId32 as AccountId32Junction, *},
|
||||
v3::{Error, NetworkId::Westend as WestendId},
|
||||
};
|
||||
pub use xcm_emulator::{
|
||||
assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para,
|
||||
RelayChain as Relay, Test, TestArgs, TestContext, TestExt,
|
||||
|
||||
// Cumulus
|
||||
pub use asset_test_utils::xcm_helpers;
|
||||
pub use emulated_integration_tests_common::{
|
||||
test_parachain_is_trusted_teleporter,
|
||||
xcm_emulator::{
|
||||
assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para,
|
||||
RelayChain as Relay, Test, TestArgs, TestContext, TestExt,
|
||||
},
|
||||
xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution},
|
||||
PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3,
|
||||
};
|
||||
pub use parachains_common::{AccountId, Balance};
|
||||
pub use westend_system_emulated_network::{
|
||||
asset_hub_westend_emulated_chain::{
|
||||
genesis::ED as ASSET_HUB_WESTEND_ED, AssetHubWestendParaPallet as AssetHubWestendPallet,
|
||||
},
|
||||
penpal_emulated_chain::PenpalAParaPallet as PenpalAPallet,
|
||||
westend_emulated_chain::{genesis::ED as WESTEND_ED, WestendRelayPallet as WestendPallet},
|
||||
AssetHubWestendPara as AssetHubWestend, AssetHubWestendParaReceiver as AssetHubWestendReceiver,
|
||||
AssetHubWestendParaSender as AssetHubWestendSender, PenpalAPara as PenpalA,
|
||||
PenpalAParaReceiver as PenpalAReceiver, PenpalAParaSender as PenpalASender,
|
||||
WestendRelay as Westend, WestendRelayReceiver as WestendReceiver,
|
||||
WestendRelaySender as WestendSender,
|
||||
};
|
||||
|
||||
pub const ASSET_ID: u32 = 1;
|
||||
@@ -51,7 +63,7 @@ pub const ASSETS_PALLET_ID: u8 = 50;
|
||||
|
||||
pub type RelayToSystemParaTest = Test<Westend, AssetHubWestend>;
|
||||
pub type SystemParaToRelayTest = Test<AssetHubWestend, Westend>;
|
||||
pub type SystemParaToParaTest = Test<AssetHubWestend, PenpalWestendA>;
|
||||
pub type SystemParaToParaTest = Test<AssetHubWestend, PenpalA>;
|
||||
|
||||
/// Returns a `TestArgs` instance to de used for the Relay Chain accross integraton tests
|
||||
pub fn relay_test_args(amount: Balance) -> TestArgs {
|
||||
+12
-12
@@ -294,14 +294,14 @@ fn reserve_transfer_native_asset_from_system_para_to_relay_fails() {
|
||||
#[test]
|
||||
fn limited_reserve_transfer_native_asset_from_system_para_to_para() {
|
||||
// Init values for System Parachain
|
||||
let destination = AssetHubWestend::sibling_location_of(PenpalWestendA::para_id());
|
||||
let beneficiary_id = PenpalWestendAReceiver::get();
|
||||
let destination = AssetHubWestend::sibling_location_of(PenpalA::para_id());
|
||||
let beneficiary_id = PenpalAReceiver::get();
|
||||
let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000;
|
||||
let assets = (Parent, amount_to_send).into();
|
||||
|
||||
let test_args = TestContext {
|
||||
sender: AssetHubWestendSender::get(),
|
||||
receiver: PenpalWestendAReceiver::get(),
|
||||
receiver: PenpalAReceiver::get(),
|
||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
||||
};
|
||||
|
||||
@@ -336,14 +336,14 @@ fn limited_reserve_transfer_native_asset_from_system_para_to_para() {
|
||||
#[test]
|
||||
fn reserve_transfer_native_asset_from_system_para_to_para() {
|
||||
// Init values for System Parachain
|
||||
let destination = AssetHubWestend::sibling_location_of(PenpalWestendA::para_id());
|
||||
let beneficiary_id = PenpalWestendAReceiver::get();
|
||||
let destination = AssetHubWestend::sibling_location_of(PenpalA::para_id());
|
||||
let beneficiary_id = PenpalAReceiver::get();
|
||||
let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000;
|
||||
let assets = (Parent, amount_to_send).into();
|
||||
|
||||
let test_args = TestContext {
|
||||
sender: AssetHubWestendSender::get(),
|
||||
receiver: PenpalWestendAReceiver::get(),
|
||||
receiver: PenpalAReceiver::get(),
|
||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
||||
};
|
||||
|
||||
@@ -388,8 +388,8 @@ fn limited_reserve_transfer_asset_from_system_para_to_para() {
|
||||
);
|
||||
|
||||
// Init values for System Parachain
|
||||
let destination = AssetHubWestend::sibling_location_of(PenpalWestendA::para_id());
|
||||
let beneficiary_id = PenpalWestendAReceiver::get();
|
||||
let destination = AssetHubWestend::sibling_location_of(PenpalA::para_id());
|
||||
let beneficiary_id = PenpalAReceiver::get();
|
||||
let amount_to_send = ASSET_MIN_BALANCE * 1000;
|
||||
let assets =
|
||||
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send)
|
||||
@@ -397,7 +397,7 @@ fn limited_reserve_transfer_asset_from_system_para_to_para() {
|
||||
|
||||
let system_para_test_args = TestContext {
|
||||
sender: AssetHubWestendSender::get(),
|
||||
receiver: PenpalWestendAReceiver::get(),
|
||||
receiver: PenpalAReceiver::get(),
|
||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
||||
};
|
||||
|
||||
@@ -424,8 +424,8 @@ fn reserve_transfer_asset_from_system_para_to_para() {
|
||||
);
|
||||
|
||||
// Init values for System Parachain
|
||||
let destination = AssetHubWestend::sibling_location_of(PenpalWestendA::para_id());
|
||||
let beneficiary_id = PenpalWestendAReceiver::get();
|
||||
let destination = AssetHubWestend::sibling_location_of(PenpalA::para_id());
|
||||
let beneficiary_id = PenpalAReceiver::get();
|
||||
let amount_to_send = ASSET_MIN_BALANCE * 1000;
|
||||
let assets =
|
||||
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send)
|
||||
@@ -433,7 +433,7 @@ fn reserve_transfer_asset_from_system_para_to_para() {
|
||||
|
||||
let system_para_test_args = TestContext {
|
||||
sender: AssetHubWestendSender::get(),
|
||||
receiver: PenpalWestendAReceiver::get(),
|
||||
receiver: PenpalAReceiver::get(),
|
||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
||||
};
|
||||
|
||||
+6
-7
@@ -33,7 +33,7 @@ fn send_transact_as_superuser_from_relay_to_system_para_works() {
|
||||
#[test]
|
||||
fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() {
|
||||
let para_sovereign_account = AssetHubWestend::sovereign_account_id_of(
|
||||
AssetHubWestend::sibling_location_of(PenpalWestendA::para_id()),
|
||||
AssetHubWestend::sibling_location_of(PenpalA::para_id()),
|
||||
);
|
||||
|
||||
// Force create and mint assets for Parachain's sovereign account
|
||||
@@ -60,9 +60,8 @@ fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() {
|
||||
let native_asset =
|
||||
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount).into();
|
||||
|
||||
let root_origin = <PenpalWestendA as Chain>::RuntimeOrigin::root();
|
||||
let system_para_destination =
|
||||
PenpalWestendA::sibling_location_of(AssetHubWestend::para_id()).into();
|
||||
let root_origin = <PenpalA as Chain>::RuntimeOrigin::root();
|
||||
let system_para_destination = PenpalA::sibling_location_of(AssetHubWestend::para_id()).into();
|
||||
let xcm = xcm_transact_paid_execution(
|
||||
call,
|
||||
origin_kind,
|
||||
@@ -70,14 +69,14 @@ fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() {
|
||||
para_sovereign_account.clone(),
|
||||
);
|
||||
|
||||
PenpalWestendA::execute_with(|| {
|
||||
assert_ok!(<PenpalWestendA as PenpalWestendAPallet>::PolkadotXcm::send(
|
||||
PenpalA::execute_with(|| {
|
||||
assert_ok!(<PenpalA as PenpalAPallet>::PolkadotXcm::send(
|
||||
root_origin,
|
||||
bx!(system_para_destination),
|
||||
bx!(xcm),
|
||||
));
|
||||
|
||||
PenpalWestendA::assert_xcm_pallet_sent();
|
||||
PenpalA::assert_xcm_pallet_sent();
|
||||
});
|
||||
|
||||
AssetHubWestend::execute_with(|| {
|
||||
+12
-14
@@ -114,7 +114,7 @@ fn swap_locally_on_chain_using_foreign_assets() {
|
||||
let foreign_asset1_at_asset_hub_westend = Box::new(MultiLocation {
|
||||
parents: 1,
|
||||
interior: X3(
|
||||
Parachain(PenpalWestendA::para_id().into()),
|
||||
Parachain(PenpalA::para_id().into()),
|
||||
PalletInstance(ASSETS_PALLET_ID),
|
||||
GeneralIndex(ASSET_ID.into()),
|
||||
),
|
||||
@@ -125,18 +125,18 @@ fn swap_locally_on_chain_using_foreign_assets() {
|
||||
.into();
|
||||
|
||||
let penpal_location =
|
||||
MultiLocation { parents: 1, interior: X1(Parachain(PenpalWestendA::para_id().into())) };
|
||||
MultiLocation { parents: 1, interior: X1(Parachain(PenpalA::para_id().into())) };
|
||||
|
||||
// 1. Create asset on penpal:
|
||||
PenpalWestendA::execute_with(|| {
|
||||
assert_ok!(<PenpalWestendA as PenpalWestendAPallet>::Assets::create(
|
||||
<PenpalWestendA as Chain>::RuntimeOrigin::signed(PenpalWestendASender::get()),
|
||||
PenpalA::execute_with(|| {
|
||||
assert_ok!(<PenpalA as PenpalAPallet>::Assets::create(
|
||||
<PenpalA as Chain>::RuntimeOrigin::signed(PenpalASender::get()),
|
||||
ASSET_ID.into(),
|
||||
PenpalWestendASender::get().into(),
|
||||
PenpalASender::get().into(),
|
||||
1000,
|
||||
));
|
||||
|
||||
assert!(<PenpalWestendA as PenpalWestendAPallet>::Assets::asset_exists(ASSET_ID));
|
||||
assert!(<PenpalA as PenpalAPallet>::Assets::asset_exists(ASSET_ID));
|
||||
});
|
||||
|
||||
// 2. Create foreign asset on asset_hub_westend:
|
||||
@@ -190,26 +190,24 @@ fn swap_locally_on_chain_using_foreign_assets() {
|
||||
]));
|
||||
|
||||
// Send XCM message from penpal => asset_hub_westend
|
||||
let sudo_penpal_origin = <PenpalWestendA as Chain>::RuntimeOrigin::root();
|
||||
PenpalWestendA::execute_with(|| {
|
||||
assert_ok!(<PenpalWestendA as PenpalWestendAPallet>::PolkadotXcm::send(
|
||||
let sudo_penpal_origin = <PenpalA as Chain>::RuntimeOrigin::root();
|
||||
PenpalA::execute_with(|| {
|
||||
assert_ok!(<PenpalA as PenpalAPallet>::PolkadotXcm::send(
|
||||
sudo_penpal_origin.clone(),
|
||||
bx!(assets_para_destination.clone()),
|
||||
bx!(xcm),
|
||||
));
|
||||
|
||||
type RuntimeEvent = <PenpalWestendA as Chain>::RuntimeEvent;
|
||||
type RuntimeEvent = <PenpalA as Chain>::RuntimeEvent;
|
||||
|
||||
assert_expected_events!(
|
||||
PenpalWestendA,
|
||||
PenpalA,
|
||||
vec![
|
||||
RuntimeEvent::PolkadotXcm(pallet_xcm::Event::Sent { .. }) => {},
|
||||
]
|
||||
);
|
||||
});
|
||||
|
||||
// One block for the MessageQueue to process the message.
|
||||
AssetHubWestend::execute_with(|| {});
|
||||
// Receive XCM message in Assets Parachain in the next block.
|
||||
AssetHubWestend::execute_with(|| {
|
||||
assert!(<AssetHubWestend as AssetHubWestendPallet>::ForeignAssets::asset_exists(
|
||||
-2
@@ -13,8 +13,6 @@
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
#![allow(dead_code)] // <https://github.com/paritytech/cumulus/issues/3027>
|
||||
|
||||
use crate::*;
|
||||
use asset_hub_westend_runtime::xcm_config::XcmConfig as AssetHubWestendXcmConfig;
|
||||
use westend_runtime::xcm_config::XcmConfig as WestendXcmConfig;
|
||||
+1
-1
@@ -14,8 +14,8 @@
|
||||
// limitations under the License.
|
||||
|
||||
use crate::*;
|
||||
use emulated_integration_tests_common::accounts::{ALICE, BOB};
|
||||
use frame_support::traits::fungibles::{Create, Inspect, Mutate};
|
||||
use integration_tests_common::constants::accounts::{ALICE, BOB};
|
||||
use polkadot_runtime_common::impls::VersionedLocatableAsset;
|
||||
use xcm_executor::traits::ConvertLocation;
|
||||
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
[package]
|
||||
name = "bridge-hub-rococo-integration-tests"
|
||||
version = "1.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Bridge Hub Rococo runtime integration tests with xcm-emulator"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false }
|
||||
|
||||
# Substrate
|
||||
frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false}
|
||||
pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue" }
|
||||
|
||||
# Polkadot
|
||||
xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false}
|
||||
pallet-xcm = { path = "../../../../../../../polkadot/xcm/pallet-xcm", default-features = false}
|
||||
xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../polkadot/xcm/xcm-executor", default-features = false}
|
||||
|
||||
# Bridges
|
||||
pallet-bridge-messages = { path = "../../../../../../../bridges/modules/messages", default-features = false}
|
||||
bp-messages = { path = "../../../../../../../bridges/primitives/messages", default-features = false}
|
||||
|
||||
# Cumulus
|
||||
asset-test-utils = { path = "../../../../../../parachains/runtimes/assets/test-utils" }
|
||||
parachains-common = { path = "../../../../../../parachains/common" }
|
||||
cumulus-pallet-xcmp-queue = { path = "../../../../../../pallets/xcmp-queue", default-features = false}
|
||||
cumulus-pallet-dmp-queue = { path = "../../../../../../pallets/dmp-queue", default-features = false}
|
||||
bridge-hub-rococo-runtime = { path = "../../../../../../parachains/runtimes/bridge-hubs/bridge-hub-rococo", default-features = false }
|
||||
emulated-integration-tests-common = { path = "../../../common", default-features = false}
|
||||
rococo-wococo-system-emulated-network ={ path = "../../../networks/rococo-wococo-system" }
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Substrate
|
||||
pub use frame_support::assert_ok;
|
||||
|
||||
// Polkadot
|
||||
pub use xcm::{
|
||||
prelude::{AccountId32 as AccountId32Junction, *},
|
||||
v3::{
|
||||
Error,
|
||||
NetworkId::{Rococo as RococoId, Wococo as WococoId},
|
||||
},
|
||||
};
|
||||
|
||||
// Bridges
|
||||
pub use bp_messages::LaneId;
|
||||
|
||||
// Cumulus
|
||||
pub use emulated_integration_tests_common::{
|
||||
test_parachain_is_trusted_teleporter,
|
||||
xcm_emulator::{
|
||||
assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para,
|
||||
RelayChain as Relay, Test, TestArgs, TestContext, TestExt,
|
||||
},
|
||||
xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution},
|
||||
PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3,
|
||||
};
|
||||
pub use parachains_common::{AccountId, Balance};
|
||||
pub use rococo_wococo_system_emulated_network::{
|
||||
bridge_hub_rococo_emulated_chain::{
|
||||
genesis::ED as BRIDGE_HUB_ROCOCO_ED, BridgeHubRococoParaPallet as BridgeHubRococoPallet,
|
||||
},
|
||||
rococo_emulated_chain::{genesis::ED as ROCOCO_ED, RococoRelayPallet as RococoPallet},
|
||||
AssetHubRococoPara as AssetHubRococo, AssetHubRococoParaReceiver as AssetHubRococoReceiver,
|
||||
AssetHubRococoParaSender as AssetHubRococoSender, AssetHubWococoPara as AssetHubWococo,
|
||||
BridgeHubRococoPara as BridgeHubRococo, BridgeHubRococoParaReceiver as BridgeHubRococoReceiver,
|
||||
BridgeHubRococoParaSender as BridgeHubRococoSender, BridgeHubWococoPara as BridgeHubWococo,
|
||||
RococoRelay as Rococo, RococoRelayReceiver as RococoReceiver,
|
||||
RococoRelaySender as RococoSender,
|
||||
};
|
||||
|
||||
pub const ASSET_ID: u32 = 1;
|
||||
pub const ASSET_MIN_BALANCE: u128 = 1000;
|
||||
pub const ASSETS_PALLET_ID: u8 = 50;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
[package]
|
||||
name = "bridge-hub-westend-integration-tests"
|
||||
version = "1.0.0"
|
||||
authors.workspace = true
|
||||
edition.workspace = true
|
||||
license = "Apache-2.0"
|
||||
description = "Bridge Hub Westend runtime integration tests with xcm-emulator"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false }
|
||||
|
||||
# Substrate
|
||||
frame-support = { path = "../../../../../../../substrate/frame/support", default-features = false}
|
||||
pallet-message-queue = { path = "../../../../../../../substrate/frame/message-queue" }
|
||||
|
||||
# Polkadot
|
||||
xcm = { package = "staging-xcm", path = "../../../../../../../polkadot/xcm", default-features = false}
|
||||
pallet-xcm = { path = "../../../../../../../polkadot/xcm/pallet-xcm", default-features = false}
|
||||
xcm-executor = { package = "staging-xcm-executor", path = "../../../../../../../polkadot/xcm/xcm-executor", default-features = false}
|
||||
|
||||
# Bridges
|
||||
pallet-bridge-messages = { path = "../../../../../../../bridges/modules/messages", default-features = false}
|
||||
bp-messages = { path = "../../../../../../../bridges/primitives/messages", default-features = false}
|
||||
|
||||
# Cumulus
|
||||
asset-test-utils = { path = "../../../../../../parachains/runtimes/assets/test-utils" }
|
||||
parachains-common = { path = "../../../../../../parachains/common" }
|
||||
cumulus-pallet-xcmp-queue = { path = "../../../../../../pallets/xcmp-queue", default-features = false}
|
||||
cumulus-pallet-dmp-queue = { path = "../../../../../../pallets/dmp-queue", default-features = false}
|
||||
bridge-hub-westend-runtime = { path = "../../../../../../parachains/runtimes/bridge-hubs/bridge-hub-westend", default-features = false }
|
||||
emulated-integration-tests-common = { path = "../../../common", default-features = false}
|
||||
westend-system-emulated-network ={ path = "../../../networks/westend-system" }
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
// Copyright (C) Parity Technologies (UK) Ltd.
|
||||
// SPDX-License-Identifier: Apache-2.0
|
||||
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Substrate
|
||||
pub use frame_support::assert_ok;
|
||||
|
||||
// Polkadot
|
||||
pub use xcm::{
|
||||
prelude::{AccountId32 as AccountId32Junction, *},
|
||||
v3::{Error, NetworkId::Rococo as RococoId},
|
||||
};
|
||||
|
||||
// Bridges
|
||||
pub use bp_messages::LaneId;
|
||||
|
||||
// Cumulus
|
||||
pub use emulated_integration_tests_common::{
|
||||
test_parachain_is_trusted_teleporter,
|
||||
xcm_emulator::{
|
||||
assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para,
|
||||
RelayChain as Relay, Test, TestArgs, TestContext, TestExt,
|
||||
},
|
||||
xcm_helpers::{xcm_transact_paid_execution, xcm_transact_unpaid_execution},
|
||||
PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD, XCM_V3,
|
||||
};
|
||||
pub use parachains_common::{AccountId, Balance};
|
||||
pub use westend_system_emulated_network::{
|
||||
bridge_hub_westend_emulated_chain::{
|
||||
genesis::ED as BRIDGE_HUB_ROCOCO_ED, BridgeHubWestendParaPallet as BridgeHubWestendPallet,
|
||||
},
|
||||
westend_emulated_chain::{genesis::ED as ROCOCO_ED, WestendRelayPallet as WestendPallet},
|
||||
AssetHubWestendPara as AssetHubWestend, AssetHubWestendParaReceiver as AssetHubWestendReceiver,
|
||||
AssetHubWestendParaSender as AssetHubWestendSender, BridgeHubWestendPara as BridgeHubWestend,
|
||||
BridgeHubWestendParaReceiver as BridgeHubWestendReceiver,
|
||||
BridgeHubWestendParaSender as BridgeHubWestendSender, WestendRelay as Westend,
|
||||
WestendRelayReceiver as WestendReceiver, WestendRelaySender as WestendSender,
|
||||
};
|
||||
|
||||
pub const ASSET_ID: u32 = 1;
|
||||
pub const ASSET_MIN_BALANCE: u128 = 1000;
|
||||
pub const ASSETS_PALLET_ID: u8 = 50;
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests;
|
||||
+1
-1
@@ -30,7 +30,7 @@ fn example() {
|
||||
UnpaidExecution { weight_limit, check_origin },
|
||||
ExportMessage {
|
||||
network: RococoId,
|
||||
destination: X1(Parachain(AssetHubRococo::para_id().into())),
|
||||
destination: X1(Parachain(AssetHubWestend::para_id().into())),
|
||||
xcm: remote_xcm,
|
||||
},
|
||||
]));
|
||||
+1
-1
@@ -18,7 +18,7 @@ use bridge_hub_westend_runtime::xcm_config::XcmConfig;
|
||||
|
||||
#[test]
|
||||
fn teleport_to_other_system_parachains_works() {
|
||||
let amount = BRIDGE_HUB_WESTEND_ED * 100;
|
||||
let amount = BRIDGE_HUB_ROCOCO_ED * 100;
|
||||
let native_asset: MultiAssets = (Parent, amount).into();
|
||||
|
||||
test_parachain_is_trusted_teleporter!(
|
||||
+125
-109
@@ -170,30 +170,21 @@ pub trait Network {
|
||||
relay_parent_number: u32,
|
||||
parent_head_data: HeadData,
|
||||
) -> ParachainInherentData;
|
||||
}
|
||||
|
||||
pub trait NetworkComponent {
|
||||
type Network: Network;
|
||||
|
||||
fn send_horizontal_messages<I: Iterator<Item = (ParaId, RelayBlockNumber, Vec<u8>)>>(
|
||||
to_para_id: u32,
|
||||
iter: I,
|
||||
) {
|
||||
HORIZONTAL_MESSAGES.with(|b| {
|
||||
b.borrow_mut()
|
||||
.get_mut(Self::Network::name())
|
||||
.get_mut(Self::name())
|
||||
.unwrap()
|
||||
.push_back((to_para_id, iter.collect()))
|
||||
});
|
||||
}
|
||||
|
||||
fn send_upward_message(from_para_id: u32, msg: Vec<u8>) {
|
||||
UPWARD_MESSAGES.with(|b| {
|
||||
b.borrow_mut()
|
||||
.get_mut(Self::Network::name())
|
||||
.unwrap()
|
||||
.push_back((from_para_id, msg))
|
||||
});
|
||||
UPWARD_MESSAGES
|
||||
.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().push_back((from_para_id, msg)));
|
||||
}
|
||||
|
||||
fn send_downward_messages(
|
||||
@@ -202,19 +193,19 @@ pub trait NetworkComponent {
|
||||
) {
|
||||
DOWNWARD_MESSAGES.with(|b| {
|
||||
b.borrow_mut()
|
||||
.get_mut(Self::Network::name())
|
||||
.get_mut(Self::name())
|
||||
.unwrap()
|
||||
.push_back((to_para_id, iter.collect()))
|
||||
});
|
||||
}
|
||||
|
||||
fn send_bridged_messages(msg: BridgeMessage) {
|
||||
BRIDGED_MESSAGES
|
||||
.with(|b| b.borrow_mut().get_mut(Self::Network::name()).unwrap().push_back(msg));
|
||||
BRIDGED_MESSAGES.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().push_back(msg));
|
||||
}
|
||||
}
|
||||
|
||||
pub trait Chain: TestExt + NetworkComponent {
|
||||
pub trait Chain: TestExt {
|
||||
type Network: Network;
|
||||
type Runtime: SystemConfig;
|
||||
type RuntimeCall;
|
||||
type RuntimeOrigin;
|
||||
@@ -234,6 +225,8 @@ pub trait RelayChain: Chain {
|
||||
type SovereignAccountOf: ConvertLocation<AccountIdOf<Self::Runtime>>;
|
||||
type MessageProcessor: ProcessMessage<Origin = ParaId> + ServiceQueues;
|
||||
|
||||
fn init();
|
||||
|
||||
fn child_location_of(id: ParaId) -> MultiLocation {
|
||||
(Ancestor(0), ParachainJunction(id.into())).into()
|
||||
}
|
||||
@@ -348,7 +341,6 @@ macro_rules! decl_test_relay_chains {
|
||||
on_init = $on_init:expr,
|
||||
runtime = $runtime:ident,
|
||||
core = {
|
||||
MessageProcessor: $mp:path,
|
||||
SovereignAccountOf: $sovereign_acc_of:path,
|
||||
},
|
||||
pallets = {
|
||||
@@ -361,9 +353,10 @@ macro_rules! decl_test_relay_chains {
|
||||
) => {
|
||||
$(
|
||||
#[derive(Clone)]
|
||||
pub struct $name;
|
||||
pub struct $name<N>($crate::PhantomData<N>);
|
||||
|
||||
impl $crate::Chain for $name {
|
||||
impl<N: $crate::Network> $crate::Chain for $name<N> {
|
||||
type Network = N;
|
||||
type Runtime = $runtime::Runtime;
|
||||
type RuntimeCall = $runtime::RuntimeCall;
|
||||
type RuntimeOrigin = $runtime::RuntimeOrigin;
|
||||
@@ -382,27 +375,35 @@ macro_rules! decl_test_relay_chains {
|
||||
}
|
||||
}
|
||||
|
||||
impl $crate::RelayChain for $name {
|
||||
impl<N: $crate::Network> $crate::RelayChain for $name<N> {
|
||||
type SovereignAccountOf = $sovereign_acc_of;
|
||||
type MessageProcessor = $mp;
|
||||
type MessageProcessor = $crate::DefaultRelayMessageProcessor<$name<N>>;
|
||||
|
||||
fn init() {
|
||||
use $crate::TestExt;
|
||||
// Initialize the thread local variable
|
||||
$crate::paste::paste! {
|
||||
[<LOCAL_EXT_ $name:upper>].with(|v| *v.borrow_mut() = Self::build_new_ext($genesis));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$crate::paste::paste! {
|
||||
pub trait [<$name Pallet>] {
|
||||
pub trait [<$name RelayPallet>] {
|
||||
$(
|
||||
type $pallet_name;
|
||||
)?
|
||||
}
|
||||
|
||||
impl [<$name Pallet>] for $name {
|
||||
impl<N: $crate::Network> [<$name RelayPallet>] for $name<N> {
|
||||
$(
|
||||
type $pallet_name = $pallet_path;
|
||||
)?
|
||||
}
|
||||
}
|
||||
|
||||
$crate::__impl_test_ext_for_relay_chain!($name, $genesis, $on_init, $api_version);
|
||||
$crate::__impl_check_assertion!($name);
|
||||
$crate::__impl_test_ext_for_relay_chain!($name, N, $genesis, $on_init, $api_version);
|
||||
$crate::__impl_check_assertion!($name, N);
|
||||
)+
|
||||
};
|
||||
}
|
||||
@@ -410,10 +411,11 @@ macro_rules! decl_test_relay_chains {
|
||||
#[macro_export]
|
||||
macro_rules! __impl_test_ext_for_relay_chain {
|
||||
// entry point: generate ext name
|
||||
($name:ident, $genesis:expr, $on_init:expr, $api_version:tt) => {
|
||||
($name:ident, $network:ident, $genesis:expr, $on_init:expr, $api_version:tt) => {
|
||||
$crate::paste::paste! {
|
||||
$crate::__impl_test_ext_for_relay_chain!(
|
||||
@impl $name,
|
||||
$network,
|
||||
$genesis,
|
||||
$on_init,
|
||||
[<ParachainHostV $api_version>],
|
||||
@@ -423,10 +425,10 @@ macro_rules! __impl_test_ext_for_relay_chain {
|
||||
}
|
||||
};
|
||||
// impl
|
||||
(@impl $name:ident, $genesis:expr, $on_init:expr, $api_version:ident, $local_ext:ident, $global_ext:ident) => {
|
||||
(@impl $name:ident, $network:ident, $genesis:expr, $on_init:expr, $api_version:ident, $local_ext:ident, $global_ext:ident) => {
|
||||
thread_local! {
|
||||
pub static $local_ext: $crate::RefCell<$crate::TestExternalities>
|
||||
= $crate::RefCell::new(<$name as $crate::TestExt>::build_new_ext($genesis));
|
||||
= $crate::RefCell::new($crate::TestExternalities::new($genesis));
|
||||
}
|
||||
|
||||
$crate::lazy_static! {
|
||||
@@ -434,9 +436,9 @@ macro_rules! __impl_test_ext_for_relay_chain {
|
||||
= $crate::Mutex::new($crate::RefCell::new($crate::HashMap::new()));
|
||||
}
|
||||
|
||||
impl $crate::TestExt for $name {
|
||||
impl<$network: $crate::Network> $crate::TestExt for $name<$network> {
|
||||
fn build_new_ext(storage: $crate::Storage) -> $crate::TestExternalities {
|
||||
use $crate::{sp_tracing, NetworkComponent, Network, Chain, TestExternalities};
|
||||
use $crate::{sp_tracing, Network, Chain, TestExternalities};
|
||||
|
||||
let mut ext = TestExternalities::new(storage);
|
||||
|
||||
@@ -453,7 +455,7 @@ macro_rules! __impl_test_ext_for_relay_chain {
|
||||
}
|
||||
|
||||
fn new_ext() -> $crate::TestExternalities {
|
||||
<$name>::build_new_ext($genesis)
|
||||
Self::build_new_ext($genesis)
|
||||
}
|
||||
|
||||
fn move_ext_out(id: &'static str) {
|
||||
@@ -504,13 +506,13 @@ macro_rules! __impl_test_ext_for_relay_chain {
|
||||
}
|
||||
|
||||
fn reset_ext() {
|
||||
$local_ext.with(|v| *v.borrow_mut() = <$name>::build_new_ext($genesis));
|
||||
$local_ext.with(|v| *v.borrow_mut() = Self::build_new_ext($genesis));
|
||||
}
|
||||
|
||||
fn execute_with<R>(execute: impl FnOnce() -> R) -> R {
|
||||
use $crate::{Chain, NetworkComponent, Network};
|
||||
use $crate::{Chain, Network};
|
||||
// Make sure the Network is initialized
|
||||
<$name as NetworkComponent>::Network::init();
|
||||
<$network>::init();
|
||||
|
||||
// Execute
|
||||
let r = $local_ext.with(|v| v.borrow_mut().execute_with(execute));
|
||||
@@ -521,7 +523,7 @@ macro_rules! __impl_test_ext_for_relay_chain {
|
||||
use $crate::polkadot_primitives::runtime_api::runtime_decl_for_parachain_host::$api_version;
|
||||
|
||||
//TODO: mark sent count & filter out sent msg
|
||||
for para_id in<$name as NetworkComponent>::Network::para_ids() {
|
||||
for para_id in <$network>::para_ids() {
|
||||
// downward messages
|
||||
let downward_messages = <Self as $crate::Chain>::Runtime::dmq_contents(para_id.into())
|
||||
.into_iter()
|
||||
@@ -529,7 +531,7 @@ macro_rules! __impl_test_ext_for_relay_chain {
|
||||
if downward_messages.len() == 0 {
|
||||
continue;
|
||||
}
|
||||
<$name>::send_downward_messages(para_id, downward_messages.into_iter());
|
||||
<$network>::send_downward_messages(para_id, downward_messages.into_iter());
|
||||
|
||||
// Note: no need to handle horizontal messages, as the
|
||||
// simulator directly sends them to dest (not relayed).
|
||||
@@ -545,7 +547,7 @@ macro_rules! __impl_test_ext_for_relay_chain {
|
||||
})
|
||||
});
|
||||
|
||||
<$name as NetworkComponent>::Network::process_messages();
|
||||
<$network>::process_messages();
|
||||
|
||||
r
|
||||
}
|
||||
@@ -574,7 +576,7 @@ macro_rules! decl_test_parachains {
|
||||
XcmpMessageHandler: $xcmp_message_handler:path,
|
||||
LocationToAccountId: $location_to_account:path,
|
||||
ParachainInfo: $parachain_info:path,
|
||||
MessageProcessor: $message_processor:path,
|
||||
// MessageProcessor: $message_processor:path,
|
||||
},
|
||||
pallets = {
|
||||
$($pallet_name:ident: $pallet_path:path,)*
|
||||
@@ -586,14 +588,15 @@ macro_rules! decl_test_parachains {
|
||||
) => {
|
||||
$(
|
||||
#[derive(Clone)]
|
||||
pub struct $name;
|
||||
pub struct $name<N>($crate::PhantomData<N>);
|
||||
|
||||
impl $crate::Chain for $name {
|
||||
impl<N: $crate::Network> $crate::Chain for $name<N> {
|
||||
type Runtime = $runtime::Runtime;
|
||||
type RuntimeCall = $runtime::RuntimeCall;
|
||||
type RuntimeOrigin = $runtime::RuntimeOrigin;
|
||||
type RuntimeEvent = $runtime::RuntimeEvent;
|
||||
type System = $crate::SystemPallet::<Self::Runtime>;
|
||||
type Network = N;
|
||||
|
||||
fn account_data_of(account: $crate::AccountIdOf<Self::Runtime>) -> $crate::AccountData<$crate::Balance> {
|
||||
<Self as $crate::TestExt>::ext_wrapper(|| $crate::SystemPallet::<Self::Runtime>::account(account).data.into())
|
||||
@@ -607,17 +610,21 @@ macro_rules! decl_test_parachains {
|
||||
}
|
||||
}
|
||||
|
||||
impl $crate::Parachain for $name {
|
||||
impl<N: $crate::Network> $crate::Parachain for $name<N> {
|
||||
type XcmpMessageHandler = $xcmp_message_handler;
|
||||
type LocationToAccountId = $location_to_account;
|
||||
type ParachainSystem = $crate::ParachainSystemPallet<<Self as $crate::Chain>::Runtime>;
|
||||
type ParachainInfo = $parachain_info;
|
||||
type MessageProcessor = $message_processor;
|
||||
type MessageProcessor = $crate::DefaultParaMessageProcessor<$name<N>>;
|
||||
|
||||
// We run an empty block during initialisation to open HRMP channels
|
||||
// and have them ready for the next block
|
||||
fn init() {
|
||||
use $crate::{Chain, HeadData, Network, NetworkComponent, Hooks, Encode, Parachain, TestExt};
|
||||
use $crate::{Chain, HeadData, Network, Hooks, Encode, Parachain, TestExt};
|
||||
// Initialize the thread local variable
|
||||
$crate::paste::paste! {
|
||||
[<LOCAL_EXT_ $name:upper>].with(|v| *v.borrow_mut() = Self::build_new_ext($genesis));
|
||||
}
|
||||
// Set the last block head for later use in the next block
|
||||
Self::set_last_head();
|
||||
// Initialize a new block
|
||||
@@ -627,21 +634,21 @@ macro_rules! decl_test_parachains {
|
||||
}
|
||||
|
||||
fn new_block() {
|
||||
use $crate::{Chain, HeadData, Network, NetworkComponent, Hooks, Encode, Parachain, TestExt};
|
||||
use $crate::{Chain, HeadData, Network, Hooks, Encode, Parachain, TestExt};
|
||||
|
||||
let para_id = Self::para_id().into();
|
||||
|
||||
Self::ext_wrapper(|| {
|
||||
// Increase Relay Chain block number
|
||||
let mut relay_block_number = <$name as NetworkComponent>::Network::relay_block_number();
|
||||
let mut relay_block_number = N::relay_block_number();
|
||||
relay_block_number += 1;
|
||||
<$name as NetworkComponent>::Network::set_relay_block_number(relay_block_number);
|
||||
N::set_relay_block_number(relay_block_number);
|
||||
|
||||
// Initialize a new Parachain block
|
||||
let mut block_number = <Self as Chain>::System::block_number();
|
||||
block_number += 1;
|
||||
let parent_head_data = $crate::LAST_HEAD.with(|b| b.borrow_mut()
|
||||
.get_mut(<Self as NetworkComponent>::Network::name())
|
||||
.get_mut(N::name())
|
||||
.expect("network not initialized?")
|
||||
.get(¶_id)
|
||||
.expect("network not initialized?")
|
||||
@@ -652,13 +659,13 @@ macro_rules! decl_test_parachains {
|
||||
|
||||
let _ = <Self as Parachain>::ParachainSystem::set_validation_data(
|
||||
<Self as Chain>::RuntimeOrigin::none(),
|
||||
<$name as NetworkComponent>::Network::hrmp_channel_parachain_inherent_data(para_id, relay_block_number, parent_head_data),
|
||||
N::hrmp_channel_parachain_inherent_data(para_id, relay_block_number, parent_head_data),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
fn finalize_block() {
|
||||
use $crate::{Chain, Encode, Hooks, Network, NetworkComponent, Parachain, TestExt};
|
||||
use $crate::{Chain, Encode, Hooks, Network, Parachain, TestExt};
|
||||
|
||||
Self::ext_wrapper(|| {
|
||||
let block_number = <Self as Chain>::System::block_number();
|
||||
@@ -670,7 +677,7 @@ macro_rules! decl_test_parachains {
|
||||
|
||||
|
||||
fn set_last_head() {
|
||||
use $crate::{Chain, Encode, HeadData, Network, NetworkComponent, Parachain, TestExt};
|
||||
use $crate::{Chain, Encode, HeadData, Network, Parachain, TestExt};
|
||||
|
||||
let para_id = Self::para_id().into();
|
||||
|
||||
@@ -678,7 +685,7 @@ macro_rules! decl_test_parachains {
|
||||
// Store parent head data for use later.
|
||||
let created_header = <Self as Chain>::System::finalize();
|
||||
$crate::LAST_HEAD.with(|b| b.borrow_mut()
|
||||
.get_mut(<Self as NetworkComponent>::Network::name())
|
||||
.get_mut(N::name())
|
||||
.expect("network not initialized?")
|
||||
.insert(para_id, HeadData(created_header.encode()))
|
||||
);
|
||||
@@ -687,21 +694,21 @@ macro_rules! decl_test_parachains {
|
||||
}
|
||||
|
||||
$crate::paste::paste! {
|
||||
pub trait [<$name Pallet>] {
|
||||
pub trait [<$name ParaPallet>] {
|
||||
$(
|
||||
type $pallet_name;
|
||||
)*
|
||||
}
|
||||
|
||||
impl [<$name Pallet>] for $name {
|
||||
impl<N: $crate::Network> [<$name ParaPallet>] for $name<N> {
|
||||
$(
|
||||
type $pallet_name = $pallet_path;
|
||||
)*
|
||||
}
|
||||
}
|
||||
|
||||
$crate::__impl_test_ext_for_parachain!($name, $genesis, $on_init);
|
||||
$crate::__impl_check_assertion!($name);
|
||||
$crate::__impl_test_ext_for_parachain!($name, N, $genesis, $on_init);
|
||||
$crate::__impl_check_assertion!($name, N);
|
||||
)+
|
||||
};
|
||||
}
|
||||
@@ -709,16 +716,16 @@ macro_rules! decl_test_parachains {
|
||||
#[macro_export]
|
||||
macro_rules! __impl_test_ext_for_parachain {
|
||||
// entry point: generate ext name
|
||||
($name:ident, $genesis:expr, $on_init:expr) => {
|
||||
($name:ident, $network:ident, $genesis:expr, $on_init:expr) => {
|
||||
$crate::paste::paste! {
|
||||
$crate::__impl_test_ext_for_parachain!(@impl $name, $genesis, $on_init, [<LOCAL_EXT_ $name:upper>], [<GLOBAL_EXT_ $name:upper>]);
|
||||
$crate::__impl_test_ext_for_parachain!(@impl $name, $network, $genesis, $on_init, [<LOCAL_EXT_ $name:upper>], [<GLOBAL_EXT_ $name:upper>]);
|
||||
}
|
||||
};
|
||||
// impl
|
||||
(@impl $name:ident, $genesis:expr, $on_init:expr, $local_ext:ident, $global_ext:ident) => {
|
||||
(@impl $name:ident, $network:ident, $genesis:expr, $on_init:expr, $local_ext:ident, $global_ext:ident) => {
|
||||
thread_local! {
|
||||
pub static $local_ext: $crate::RefCell<$crate::TestExternalities>
|
||||
= $crate::RefCell::new(<$name as $crate::TestExt>::build_new_ext($genesis));
|
||||
= $crate::RefCell::new($crate::TestExternalities::new($genesis));
|
||||
}
|
||||
|
||||
$crate::lazy_static! {
|
||||
@@ -726,7 +733,7 @@ macro_rules! __impl_test_ext_for_parachain {
|
||||
= $crate::Mutex::new($crate::RefCell::new($crate::HashMap::new()));
|
||||
}
|
||||
|
||||
impl $crate::TestExt for $name {
|
||||
impl<$network: $crate::Network> $crate::TestExt for $name<$network> {
|
||||
fn build_new_ext(storage: $crate::Storage) -> $crate::TestExternalities {
|
||||
let mut ext = $crate::TestExternalities::new(storage);
|
||||
|
||||
@@ -743,7 +750,7 @@ macro_rules! __impl_test_ext_for_parachain {
|
||||
}
|
||||
|
||||
fn new_ext() -> $crate::TestExternalities {
|
||||
<$name>::build_new_ext($genesis)
|
||||
Self::build_new_ext($genesis)
|
||||
}
|
||||
|
||||
fn move_ext_out(id: &'static str) {
|
||||
@@ -794,14 +801,14 @@ macro_rules! __impl_test_ext_for_parachain {
|
||||
}
|
||||
|
||||
fn reset_ext() {
|
||||
$local_ext.with(|v| *v.borrow_mut() = <$name>::build_new_ext($genesis));
|
||||
$local_ext.with(|v| *v.borrow_mut() = Self::build_new_ext($genesis));
|
||||
}
|
||||
|
||||
fn execute_with<R>(execute: impl FnOnce() -> R) -> R {
|
||||
use $crate::{Chain, Get, Hooks, NetworkComponent, Network, Parachain, Encode};
|
||||
use $crate::{Chain, Get, Hooks, Network, Parachain, Encode};
|
||||
|
||||
// Make sure the Network is initialized
|
||||
<$name as NetworkComponent>::Network::init();
|
||||
<$network>::init();
|
||||
|
||||
// Initialize a new block
|
||||
Self::new_block();
|
||||
@@ -812,7 +819,7 @@ macro_rules! __impl_test_ext_for_parachain {
|
||||
// Finalize the block
|
||||
Self::finalize_block();
|
||||
|
||||
let para_id = <$name>::para_id().into();
|
||||
let para_id = Self::para_id().into();
|
||||
|
||||
// Send messages if needed
|
||||
$local_ext.with(|v| {
|
||||
@@ -828,27 +835,27 @@ macro_rules! __impl_test_ext_for_parachain {
|
||||
let collation_info = <Self as Parachain>::ParachainSystem::collect_collation_info(&mock_header);
|
||||
|
||||
// send upward messages
|
||||
let relay_block_number = <$name as NetworkComponent>::Network::relay_block_number();
|
||||
let relay_block_number = <$network>::relay_block_number();
|
||||
for msg in collation_info.upward_messages.clone() {
|
||||
<$name>::send_upward_message(para_id, msg);
|
||||
<$network>::send_upward_message(para_id, msg);
|
||||
}
|
||||
|
||||
// send horizontal messages
|
||||
for msg in collation_info.horizontal_messages {
|
||||
<$name>::send_horizontal_messages(
|
||||
<$network>::send_horizontal_messages(
|
||||
msg.recipient.into(),
|
||||
vec![(para_id.into(), relay_block_number, msg.data)].into_iter(),
|
||||
);
|
||||
}
|
||||
|
||||
// get bridge messages
|
||||
type NetworkBridge = <<$name as NetworkComponent>::Network as $crate::Network>::Bridge;
|
||||
type NetworkBridge<$network> = <$network as $crate::Network>::Bridge;
|
||||
|
||||
let bridge_messages = <<NetworkBridge as $crate::Bridge>::Handler as $crate::BridgeMessageHandler>::get_source_outbound_messages();
|
||||
let bridge_messages = <<NetworkBridge<$network> as $crate::Bridge>::Handler as $crate::BridgeMessageHandler>::get_source_outbound_messages();
|
||||
|
||||
// send bridged messages
|
||||
for msg in bridge_messages {
|
||||
<$name>::send_bridged_messages(msg);
|
||||
<$network>::send_bridged_messages(msg);
|
||||
}
|
||||
|
||||
// log events
|
||||
@@ -864,7 +871,7 @@ macro_rules! __impl_test_ext_for_parachain {
|
||||
// provide inbound DMP/HRMP messages through a side-channel.
|
||||
// normally this would come through the `set_validation_data`,
|
||||
// but we go around that.
|
||||
<$name as NetworkComponent>::Network::process_messages();
|
||||
<$network>::process_messages();
|
||||
|
||||
r
|
||||
}
|
||||
@@ -886,8 +893,8 @@ macro_rules! decl_test_networks {
|
||||
(
|
||||
$(
|
||||
pub struct $name:ident {
|
||||
relay_chain = $relay_chain:ty,
|
||||
parachains = vec![ $( $parachain:ty, )* ],
|
||||
relay_chain = $relay_chain:ident,
|
||||
parachains = vec![ $( $parachain:ident, )* ],
|
||||
bridge = $bridge:ty
|
||||
}
|
||||
),
|
||||
@@ -895,10 +902,11 @@ macro_rules! decl_test_networks {
|
||||
$(,)?
|
||||
) => {
|
||||
$(
|
||||
#[derive(Clone)]
|
||||
pub struct $name;
|
||||
|
||||
impl $crate::Network for $name {
|
||||
type Relay = $relay_chain;
|
||||
type Relay = $relay_chain<Self>;
|
||||
type Bridge = $bridge;
|
||||
|
||||
fn name() -> &'static str {
|
||||
@@ -916,8 +924,8 @@ macro_rules! decl_test_networks {
|
||||
$crate::BRIDGED_MESSAGES.with(|b| b.borrow_mut().remove(Self::name()));
|
||||
$crate::LAST_HEAD.with(|b| b.borrow_mut().remove(Self::name()));
|
||||
|
||||
<$relay_chain>::reset_ext();
|
||||
$( <$parachain>::reset_ext(); )*
|
||||
<$relay_chain<Self>>::reset_ext();
|
||||
$( <$parachain<Self>>::reset_ext(); )*
|
||||
}
|
||||
|
||||
fn init() {
|
||||
@@ -932,13 +940,14 @@ macro_rules! decl_test_networks {
|
||||
$crate::PARA_IDS.with(|b| b.borrow_mut().insert(Self::name().to_string(), Self::para_ids()));
|
||||
$crate::LAST_HEAD.with(|b| b.borrow_mut().insert(Self::name().to_string(), $crate::HashMap::new()));
|
||||
|
||||
$( <$parachain as $crate::Parachain>::init(); )*
|
||||
<$relay_chain<Self> as $crate::RelayChain>::init();
|
||||
$( <$parachain<Self> as $crate::Parachain>::init(); )*
|
||||
}
|
||||
}
|
||||
|
||||
fn para_ids() -> Vec<u32> {
|
||||
vec![$(
|
||||
<$parachain as $crate::Parachain>::para_id().into(),
|
||||
<$parachain<Self> as $crate::Parachain>::para_id().into(),
|
||||
)*]
|
||||
}
|
||||
|
||||
@@ -976,7 +985,7 @@ macro_rules! decl_test_networks {
|
||||
while let Some((to_para_id, messages))
|
||||
= $crate::DOWNWARD_MESSAGES.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().pop_front()) {
|
||||
$(
|
||||
let para_id: u32 = <$parachain>::para_id().into();
|
||||
let para_id: u32 = <$parachain<Self>>::para_id().into();
|
||||
|
||||
if $crate::PARA_IDS.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().contains(&to_para_id)) && para_id == to_para_id {
|
||||
let mut msg_dedup: Vec<(RelayChainBlockNumber, Vec<u8>)> = Vec::new();
|
||||
@@ -986,21 +995,21 @@ macro_rules! decl_test_networks {
|
||||
msg_dedup.dedup();
|
||||
|
||||
let msgs = msg_dedup.clone().into_iter().filter(|m| {
|
||||
!$crate::DMP_DONE.with(|b| b.borrow().get(stringify!($name))
|
||||
!$crate::DMP_DONE.with(|b| b.borrow().get(Self::name())
|
||||
.unwrap_or(&mut $crate::VecDeque::new())
|
||||
.contains(&(to_para_id, m.0, m.1.clone()))
|
||||
)
|
||||
}).collect::<Vec<(RelayChainBlockNumber, Vec<u8>)>>();
|
||||
|
||||
use $crate::{ProcessMessage, CumulusAggregateMessageOrigin, BoundedSlice, WeightMeter, TestExt};
|
||||
use $crate::{ProcessMessage, CumulusAggregateMessageOrigin, BoundedSlice, WeightMeter};
|
||||
for (block, msg) in msgs.clone().into_iter() {
|
||||
let mut weight_meter = WeightMeter::new();
|
||||
<$parachain>::ext_wrapper(|| {
|
||||
let _ = <$parachain as Parachain>::MessageProcessor::process_message(
|
||||
<$parachain<Self>>::ext_wrapper(|| {
|
||||
let _ = <$parachain<Self> as Parachain>::MessageProcessor::process_message(
|
||||
&msg[..],
|
||||
$crate::CumulusAggregateMessageOrigin::Parent,
|
||||
&mut weight_meter,
|
||||
&mut msg.using_encoded(sp_core::blake2_256),
|
||||
&mut msg.using_encoded($crate::blake2_256),
|
||||
);
|
||||
});
|
||||
$crate::log::debug!(target: concat!("dmp::", stringify!($name)) , "DMP messages processed {:?} to para_id {:?}", msgs.clone(), &to_para_id);
|
||||
@@ -1012,19 +1021,19 @@ macro_rules! decl_test_networks {
|
||||
}
|
||||
|
||||
fn process_horizontal_messages() {
|
||||
use $crate::{XcmpMessageHandler, ServiceQueues, Bounded};
|
||||
use $crate::{XcmpMessageHandler, ServiceQueues, Bounded, Parachain, TestExt};
|
||||
|
||||
while let Some((to_para_id, messages))
|
||||
= $crate::HORIZONTAL_MESSAGES.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().pop_front()) {
|
||||
let iter = messages.iter().map(|(p, b, m)| (*p, *b, &m[..])).collect::<Vec<_>>().into_iter();
|
||||
$(
|
||||
let para_id: u32 = <$parachain>::para_id().into();
|
||||
let para_id: u32 = <$parachain<Self>>::para_id().into();
|
||||
|
||||
if $crate::PARA_IDS.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().contains(&to_para_id)) && para_id == to_para_id {
|
||||
<$parachain>::ext_wrapper(|| {
|
||||
<$parachain as Parachain>::XcmpMessageHandler::handle_xcmp_messages(iter.clone(), $crate::Weight::MAX);
|
||||
<$parachain<Self>>::ext_wrapper(|| {
|
||||
<$parachain<Self> as Parachain>::XcmpMessageHandler::handle_xcmp_messages(iter.clone(), $crate::Weight::MAX);
|
||||
// Nudge the MQ pallet to process immediately instead of in the next block.
|
||||
let _ = <$parachain as Parachain>::MessageProcessor::service_queues($crate::Weight::MAX);
|
||||
let _ = <$parachain<Self> as Parachain>::MessageProcessor::service_queues($crate::Weight::MAX);
|
||||
});
|
||||
$crate::log::debug!(target: concat!("hrmp::", stringify!($name)) , "HRMP messages processed {:?} to para_id {:?}", &messages, &to_para_id);
|
||||
}
|
||||
@@ -1037,8 +1046,8 @@ macro_rules! decl_test_networks {
|
||||
|
||||
while let Some((from_para_id, msg)) = $crate::UPWARD_MESSAGES.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().pop_front()) {
|
||||
let mut weight_meter = WeightMeter::new();
|
||||
<$relay_chain>::ext_wrapper(|| {
|
||||
let _ = <$relay_chain as $crate::RelayChain>::MessageProcessor::process_message(
|
||||
<$relay_chain<Self>>::ext_wrapper(|| {
|
||||
let _ = <$relay_chain<Self> as $crate::RelayChain>::MessageProcessor::process_message(
|
||||
&msg[..],
|
||||
from_para_id.into(),
|
||||
&mut weight_meter,
|
||||
@@ -1121,13 +1130,13 @@ macro_rules! decl_test_networks {
|
||||
}
|
||||
}
|
||||
|
||||
impl $crate::NetworkComponent for $relay_chain {
|
||||
type Network = $name;
|
||||
$crate::paste::paste! {
|
||||
pub type [<$relay_chain Relay>] = $relay_chain<$name>;
|
||||
}
|
||||
|
||||
$(
|
||||
impl $crate::NetworkComponent for $parachain {
|
||||
type Network = $name;
|
||||
$crate::paste::paste! {
|
||||
pub type [<$parachain Para>] = $parachain<$name>;
|
||||
}
|
||||
)*
|
||||
)+
|
||||
@@ -1139,9 +1148,9 @@ macro_rules! decl_test_bridges {
|
||||
(
|
||||
$(
|
||||
pub struct $name:ident {
|
||||
source = $source:ty,
|
||||
target = $target:ty,
|
||||
handler = $handler:ty
|
||||
source = $source:ident,
|
||||
target = $target:ident,
|
||||
handler = $handler:ident
|
||||
}
|
||||
),
|
||||
+
|
||||
@@ -1157,10 +1166,10 @@ macro_rules! decl_test_bridges {
|
||||
type Handler = $handler;
|
||||
|
||||
fn init() {
|
||||
use $crate::{NetworkComponent, Network};
|
||||
use $crate::{Network, Parachain};
|
||||
// Make sure source and target `Network` have been initialized
|
||||
<$source as NetworkComponent>::Network::init();
|
||||
<$target as NetworkComponent>::Network::init();
|
||||
<$source as Chain>::Network::init();
|
||||
<$target as Chain>::Network::init();
|
||||
}
|
||||
}
|
||||
)+
|
||||
@@ -1169,10 +1178,11 @@ macro_rules! decl_test_bridges {
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! __impl_check_assertion {
|
||||
($chain:ident) => {
|
||||
impl<Origin, Destination, Hops, Args>
|
||||
$crate::CheckAssertion<Origin, Destination, Hops, Args> for $chain
|
||||
($chain:ident, $network:ident) => {
|
||||
impl<$network, Origin, Destination, Hops, Args>
|
||||
$crate::CheckAssertion<Origin, Destination, Hops, Args> for $chain<$network>
|
||||
where
|
||||
$network: $crate::Network,
|
||||
Origin: $crate::Chain + Clone,
|
||||
Destination: $crate::Chain + Clone,
|
||||
Origin::RuntimeOrigin:
|
||||
@@ -1185,9 +1195,9 @@ macro_rules! __impl_check_assertion {
|
||||
fn check_assertion(test: $crate::Test<Origin, Destination, Hops, Args>) {
|
||||
use $crate::TestExt;
|
||||
|
||||
let chain_name = std::any::type_name::<$chain>();
|
||||
let chain_name = std::any::type_name::<$chain<$network>>();
|
||||
|
||||
<$chain>::execute_with(|| {
|
||||
<$chain<$network>>::execute_with(|| {
|
||||
if let Some(dispatchable) = test.hops_dispatchable.get(chain_name) {
|
||||
$crate::assert_ok!(dispatchable(test.clone()));
|
||||
}
|
||||
@@ -1213,7 +1223,6 @@ macro_rules! assert_expected_events {
|
||||
let mut event_message: Vec<String> = Vec::new();
|
||||
|
||||
for (index, event) in events.iter().enumerate() {
|
||||
$crate::log::debug!(target: concat!("events::", stringify!($chain)), "{:?}", event);
|
||||
// Have to reset the variable to override a previous partial match
|
||||
meet_conditions = true;
|
||||
match event {
|
||||
@@ -1259,7 +1268,14 @@ macro_rules! assert_expected_events {
|
||||
)
|
||||
);
|
||||
} else if !event_received {
|
||||
message.push(format!("\n\n{}::\x1b[31m{}\x1b[0m was never received. All events:\n{:#?}", stringify!($chain), stringify!($event_pat), <$chain>::events()));
|
||||
message.push(
|
||||
format!(
|
||||
"\n\n{}::\x1b[31m{}\x1b[0m was never received. All events:\n{:#?}",
|
||||
stringify!($chain),
|
||||
stringify!($event_pat),
|
||||
<$chain as $crate::Chain>::events(),
|
||||
)
|
||||
);
|
||||
} else {
|
||||
// If we find a perfect match we remove the event to avoid being potentially assessed multiple times
|
||||
events.remove(index_match);
|
||||
|
||||
Reference in New Issue
Block a user