mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-18 23:31:04 +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/
|
**/.criterion/
|
||||||
**/*.rs.bk
|
**/*.rs.bk
|
||||||
**/chains/
|
|
||||||
**/hfuzz_target/
|
**/hfuzz_target/
|
||||||
**/hfuzz_workspace/
|
**/hfuzz_workspace/
|
||||||
**/node_modules
|
**/node_modules
|
||||||
|
|||||||
Generated
+250
-82
@@ -874,6 +874,21 @@ dependencies = [
|
|||||||
"substrate-wasm-builder",
|
"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]]
|
[[package]]
|
||||||
name = "asset-hub-rococo-integration-tests"
|
name = "asset-hub-rococo-integration-tests"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
@@ -881,23 +896,19 @@ dependencies = [
|
|||||||
"assert_matches",
|
"assert_matches",
|
||||||
"asset-hub-rococo-runtime",
|
"asset-hub-rococo-runtime",
|
||||||
"asset-test-utils",
|
"asset-test-utils",
|
||||||
|
"emulated-integration-tests-common",
|
||||||
"frame-support",
|
"frame-support",
|
||||||
"frame-system",
|
|
||||||
"integration-tests-common",
|
|
||||||
"pallet-asset-conversion",
|
"pallet-asset-conversion",
|
||||||
"pallet-assets",
|
"pallet-assets",
|
||||||
"pallet-balances",
|
"pallet-balances",
|
||||||
"pallet-xcm",
|
"pallet-xcm",
|
||||||
"parachains-common",
|
"parachains-common",
|
||||||
"parity-scale-codec",
|
"parity-scale-codec",
|
||||||
"polkadot-core-primitives",
|
|
||||||
"polkadot-parachain-primitives",
|
|
||||||
"polkadot-runtime-parachains",
|
|
||||||
"rococo-runtime",
|
"rococo-runtime",
|
||||||
|
"rococo-system-emulated-network",
|
||||||
"sp-runtime",
|
"sp-runtime",
|
||||||
"staging-xcm",
|
"staging-xcm",
|
||||||
"staging-xcm-executor",
|
"staging-xcm-executor",
|
||||||
"xcm-emulator",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -982,6 +993,21 @@ dependencies = [
|
|||||||
"substrate-wasm-builder",
|
"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]]
|
[[package]]
|
||||||
name = "asset-hub-westend-integration-tests"
|
name = "asset-hub-westend-integration-tests"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
@@ -991,9 +1017,9 @@ dependencies = [
|
|||||||
"asset-test-utils",
|
"asset-test-utils",
|
||||||
"cumulus-pallet-dmp-queue",
|
"cumulus-pallet-dmp-queue",
|
||||||
"cumulus-pallet-parachain-system",
|
"cumulus-pallet-parachain-system",
|
||||||
|
"emulated-integration-tests-common",
|
||||||
"frame-support",
|
"frame-support",
|
||||||
"frame-system",
|
"frame-system",
|
||||||
"integration-tests-common",
|
|
||||||
"pallet-asset-conversion",
|
"pallet-asset-conversion",
|
||||||
"pallet-asset-rate",
|
"pallet-asset-rate",
|
||||||
"pallet-assets",
|
"pallet-assets",
|
||||||
@@ -1003,17 +1029,14 @@ dependencies = [
|
|||||||
"pallet-xcm",
|
"pallet-xcm",
|
||||||
"parachains-common",
|
"parachains-common",
|
||||||
"parity-scale-codec",
|
"parity-scale-codec",
|
||||||
"polkadot-core-primitives",
|
|
||||||
"polkadot-parachain-primitives",
|
|
||||||
"polkadot-runtime-common",
|
"polkadot-runtime-common",
|
||||||
"polkadot-runtime-parachains",
|
|
||||||
"sp-runtime",
|
"sp-runtime",
|
||||||
"staging-xcm",
|
"staging-xcm",
|
||||||
"staging-xcm-builder",
|
"staging-xcm-builder",
|
||||||
"staging-xcm-executor",
|
"staging-xcm-executor",
|
||||||
"westend-runtime",
|
"westend-runtime",
|
||||||
"westend-runtime-constants",
|
"westend-runtime-constants",
|
||||||
"xcm-emulator",
|
"westend-system-emulated-network",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -1094,6 +1117,22 @@ dependencies = [
|
|||||||
"westend-runtime-constants",
|
"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]]
|
[[package]]
|
||||||
name = "asset-test-utils"
|
name = "asset-test-utils"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
@@ -2136,6 +2175,20 @@ dependencies = [
|
|||||||
"substrate-wasm-builder",
|
"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]]
|
[[package]]
|
||||||
name = "bridge-hub-rococo-integration-tests"
|
name = "bridge-hub-rococo-integration-tests"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
@@ -2145,24 +2198,16 @@ dependencies = [
|
|||||||
"bridge-hub-rococo-runtime",
|
"bridge-hub-rococo-runtime",
|
||||||
"cumulus-pallet-dmp-queue",
|
"cumulus-pallet-dmp-queue",
|
||||||
"cumulus-pallet-xcmp-queue",
|
"cumulus-pallet-xcmp-queue",
|
||||||
|
"emulated-integration-tests-common",
|
||||||
"frame-support",
|
"frame-support",
|
||||||
"frame-system",
|
|
||||||
"integration-tests-common",
|
|
||||||
"pallet-assets",
|
|
||||||
"pallet-balances",
|
|
||||||
"pallet-bridge-messages",
|
"pallet-bridge-messages",
|
||||||
"pallet-message-queue",
|
"pallet-message-queue",
|
||||||
"pallet-xcm",
|
"pallet-xcm",
|
||||||
"parachains-common",
|
"parachains-common",
|
||||||
"parity-scale-codec",
|
"parity-scale-codec",
|
||||||
"polkadot-core-primitives",
|
"rococo-wococo-system-emulated-network",
|
||||||
"polkadot-parachain-primitives",
|
|
||||||
"polkadot-runtime-parachains",
|
|
||||||
"sp-core",
|
|
||||||
"sp-weights",
|
|
||||||
"staging-xcm",
|
"staging-xcm",
|
||||||
"staging-xcm-executor",
|
"staging-xcm-executor",
|
||||||
"xcm-emulator",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -2298,6 +2343,20 @@ dependencies = [
|
|||||||
"staging-xcm-executor",
|
"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]]
|
[[package]]
|
||||||
name = "bridge-hub-westend-integration-tests"
|
name = "bridge-hub-westend-integration-tests"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
@@ -2307,24 +2366,16 @@ dependencies = [
|
|||||||
"bridge-hub-westend-runtime",
|
"bridge-hub-westend-runtime",
|
||||||
"cumulus-pallet-dmp-queue",
|
"cumulus-pallet-dmp-queue",
|
||||||
"cumulus-pallet-xcmp-queue",
|
"cumulus-pallet-xcmp-queue",
|
||||||
|
"emulated-integration-tests-common",
|
||||||
"frame-support",
|
"frame-support",
|
||||||
"frame-system",
|
|
||||||
"integration-tests-common",
|
|
||||||
"pallet-assets",
|
|
||||||
"pallet-balances",
|
|
||||||
"pallet-bridge-messages",
|
"pallet-bridge-messages",
|
||||||
"pallet-message-queue",
|
"pallet-message-queue",
|
||||||
"pallet-xcm",
|
"pallet-xcm",
|
||||||
"parachains-common",
|
"parachains-common",
|
||||||
"parity-scale-codec",
|
"parity-scale-codec",
|
||||||
"polkadot-core-primitives",
|
|
||||||
"polkadot-parachain-primitives",
|
|
||||||
"polkadot-runtime-parachains",
|
|
||||||
"sp-core",
|
|
||||||
"sp-weights",
|
|
||||||
"staging-xcm",
|
"staging-xcm",
|
||||||
"staging-xcm-executor",
|
"staging-xcm-executor",
|
||||||
"xcm-emulator",
|
"westend-system-emulated-network",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -2410,6 +2461,21 @@ dependencies = [
|
|||||||
"westend-runtime-constants",
|
"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]]
|
[[package]]
|
||||||
name = "bridge-runtime-common"
|
name = "bridge-runtime-common"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@@ -4988,6 +5054,40 @@ dependencies = [
|
|||||||
"zeroize",
|
"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]]
|
[[package]]
|
||||||
name = "encode_unicode"
|
name = "encode_unicode"
|
||||||
version = "0.3.6"
|
version = "0.3.6"
|
||||||
@@ -6735,57 +6835,6 @@ dependencies = [
|
|||||||
"num-traits",
|
"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]]
|
[[package]]
|
||||||
name = "interceptor"
|
name = "interceptor"
|
||||||
version = "0.8.2"
|
version = "0.8.2"
|
||||||
@@ -11547,6 +11596,20 @@ dependencies = [
|
|||||||
"base64ct",
|
"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]]
|
[[package]]
|
||||||
name = "penpal-runtime"
|
name = "penpal-runtime"
|
||||||
version = "0.9.27"
|
version = "0.9.27"
|
||||||
@@ -14288,6 +14351,25 @@ dependencies = [
|
|||||||
"librocksdb-sys",
|
"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]]
|
[[package]]
|
||||||
name = "rococo-parachain-runtime"
|
name = "rococo-parachain-runtime"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@@ -14455,6 +14537,30 @@ dependencies = [
|
|||||||
"staging-xcm",
|
"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]]
|
[[package]]
|
||||||
name = "rpassword"
|
name = "rpassword"
|
||||||
version = "7.2.0"
|
version = "7.2.0"
|
||||||
@@ -20682,6 +20788,26 @@ dependencies = [
|
|||||||
"winapi",
|
"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]]
|
[[package]]
|
||||||
name = "westend-runtime"
|
name = "westend-runtime"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
@@ -20807,6 +20933,17 @@ dependencies = [
|
|||||||
"staging-xcm",
|
"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]]
|
[[package]]
|
||||||
name = "which"
|
name = "which"
|
||||||
version = "4.4.0"
|
version = "4.4.0"
|
||||||
@@ -21068,6 +21205,37 @@ dependencies = [
|
|||||||
"windows-sys 0.48.0",
|
"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]]
|
[[package]]
|
||||||
name = "wyz"
|
name = "wyz"
|
||||||
version = "0.5.1"
|
version = "0.5.1"
|
||||||
|
|||||||
+16
-4
@@ -65,11 +65,23 @@ members = [
|
|||||||
"cumulus/parachain-template/pallets/template",
|
"cumulus/parachain-template/pallets/template",
|
||||||
"cumulus/parachain-template/runtime",
|
"cumulus/parachain-template/runtime",
|
||||||
"cumulus/parachains/common",
|
"cumulus/parachains/common",
|
||||||
"cumulus/parachains/integration-tests/emulated/assets/asset-hub-rococo",
|
"cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-rococo",
|
||||||
"cumulus/parachains/integration-tests/emulated/assets/asset-hub-westend",
|
"cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend",
|
||||||
"cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-rococo",
|
"cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo",
|
||||||
"cumulus/parachains/integration-tests/emulated/bridges/bridge-hub-westend",
|
"cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend",
|
||||||
"cumulus/parachains/integration-tests/emulated/common",
|
"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/collective-content",
|
||||||
"cumulus/parachains/pallets/parachain-info",
|
"cumulus/parachains/pallets/parachain-info",
|
||||||
"cumulus/parachains/pallets/ping",
|
"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]
|
[package]
|
||||||
name = "integration-tests-common"
|
name = "emulated-integration-tests-common"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
authors.workspace = true
|
authors.workspace = true
|
||||||
edition.workspace = true
|
edition.workspace = true
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
description = "Common resources for integration testing with xcm-emulator"
|
description = "Common resources for integration testing with xcm-emulator"
|
||||||
publish = false
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
codec = { package = "parity-scale-codec", version = "3.4.0", default-features = false }
|
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}
|
sp-consensus-babe = { path = "../../../../../substrate/primitives/consensus/babe", default-features = false}
|
||||||
pallet-assets = { path = "../../../../../substrate/frame/assets", default-features = false}
|
pallet-assets = { path = "../../../../../substrate/frame/assets", default-features = false}
|
||||||
pallet-balances = { path = "../../../../../substrate/frame/balances", 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-message-queue = { path = "../../../../../substrate/frame/message-queue", default-features = false}
|
||||||
pallet-im-online = { path = "../../../../../substrate/frame/im-online", 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" }
|
beefy-primitives = { package = "sp-consensus-beefy", path = "../../../../../substrate/primitives/consensus/beefy" }
|
||||||
sc-chain-spec = { path = "../../../../../substrate/client/chain-spec", default-features = false }
|
|
||||||
|
|
||||||
# Polkadot
|
# 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-service = { path = "../../../../../polkadot/node/service", default-features = false, features = ["full-node"] }
|
||||||
polkadot-primitives = { path = "../../../../../polkadot/primitives", default-features = false}
|
polkadot-primitives = { path = "../../../../../polkadot/primitives", default-features = false}
|
||||||
polkadot-runtime-parachains = { path = "../../../../../polkadot/runtime/parachains" }
|
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}
|
xcm = { package = "staging-xcm", path = "../../../../../polkadot/xcm", default-features = false}
|
||||||
pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false}
|
pallet-xcm = { path = "../../../../../polkadot/xcm/pallet-xcm", default-features = false}
|
||||||
|
|
||||||
# Cumulus
|
# Cumulus
|
||||||
parachains-common = { path = "../../../common" }
|
parachains-common = { path = "../../../common" }
|
||||||
cumulus-primitives-core = { path = "../../../../primitives/core" }
|
cumulus-primitives-core = { path = "../../../../primitives/core" }
|
||||||
penpal-runtime = { path = "../../../runtimes/testing/penpal" }
|
xcm-emulator = { path = "../../../../xcm/xcm-emulator", default-features = false}
|
||||||
asset-hub-polkadot-runtime = { path = "../../../runtimes/assets/asset-hub-polkadot" }
|
cumulus-pallet-xcmp-queue = { path = "../../../../pallets/xcmp-queue", default-features = false}
|
||||||
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" }
|
|
||||||
cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system" }
|
cumulus-pallet-parachain-system = { path = "../../../../pallets/parachain-system" }
|
||||||
|
asset-test-utils = { path = "../../../runtimes/assets/test-utils" }
|
||||||
|
|
||||||
|
# Bridges
|
||||||
bp-messages = { path = "../../../../../bridges/primitives/messages" }
|
bp-messages = { path = "../../../../../bridges/primitives/messages" }
|
||||||
pallet-bridge-messages = { path = "../../../../../bridges/modules/messages" }
|
pallet-bridge-messages = { path = "../../../../../bridges/modules/messages" }
|
||||||
bridge-runtime-common = { path = "../../../../../bridges/bin/runtime-common" }
|
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 paste;
|
||||||
|
|
||||||
pub use crate::{
|
pub use crate::{
|
||||||
constants::{PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD},
|
xcm_helpers::xcm_transact_unpaid_execution, PROOF_SIZE_THRESHOLD, REF_TIME_THRESHOLD,
|
||||||
xcm_helpers::xcm_transact_unpaid_execution,
|
|
||||||
BridgeHubRococo, BridgeHubWococo,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Substrate
|
// Substrate
|
||||||
pub use frame_support::{
|
pub use frame_support::{
|
||||||
assert_ok,
|
assert_ok,
|
||||||
|
sp_runtime::AccountId32,
|
||||||
traits::fungibles::Inspect,
|
traits::fungibles::Inspect,
|
||||||
weights::{Weight, WeightMeter},
|
weights::{Weight, WeightMeter},
|
||||||
};
|
};
|
||||||
pub use pallet_assets;
|
pub use pallet_assets;
|
||||||
pub use pallet_message_queue;
|
pub use pallet_message_queue;
|
||||||
|
pub use pallet_xcm;
|
||||||
use sp_core::Get;
|
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
|
// Polkadot
|
||||||
pub use pallet_xcm;
|
|
||||||
pub use polkadot_runtime_parachains::{
|
pub use polkadot_runtime_parachains::{
|
||||||
dmp, hrmp,
|
dmp, hrmp,
|
||||||
inclusion::{AggregateMessageOrigin, UmpQueueId},
|
inclusion::{AggregateMessageOrigin, UmpQueueId},
|
||||||
@@ -62,6 +43,28 @@ pub use xcm::{
|
|||||||
DoubleEncoded,
|
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> {
|
pub struct BridgeHubMessageHandler<S, T, I> {
|
||||||
_marker: std::marker::PhantomData<(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>
|
impl<S, T, I> BridgeMessageHandler for BridgeHubMessageHandler<S, T, I>
|
||||||
where
|
where
|
||||||
S: Config<Instance1>,
|
S: Config<Instance1>,
|
||||||
@@ -171,12 +166,12 @@ where
|
|||||||
macro_rules! impl_accounts_helpers_for_relay_chain {
|
macro_rules! impl_accounts_helpers_for_relay_chain {
|
||||||
( $chain:ident ) => {
|
( $chain:ident ) => {
|
||||||
$crate::impls::paste::paste! {
|
$crate::impls::paste::paste! {
|
||||||
impl $chain {
|
impl<N: $crate::impls::Network> $chain<N> {
|
||||||
/// Fund a set of accounts with a balance
|
/// Fund a set of accounts with a balance
|
||||||
pub fn fund_accounts(accounts: Vec<($crate::impls::AccountId, $crate::impls::Balance)>) {
|
pub fn fund_accounts(accounts: Vec<($crate::impls::AccountId, $crate::impls::Balance)>) {
|
||||||
<Self as $crate::impls::TestExt>::execute_with(|| {
|
<Self as $crate::impls::TestExt>::execute_with(|| {
|
||||||
for account in accounts {
|
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(),
|
<Self as $crate::impls::Chain>::RuntimeOrigin::root(),
|
||||||
account.0.into(),
|
account.0.into(),
|
||||||
account.1,
|
account.1,
|
||||||
@@ -185,7 +180,7 @@ macro_rules! impl_accounts_helpers_for_relay_chain {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
/// Fund a sovereign account based on its Parachain Id
|
/// 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);
|
let sovereign_account = <Self as $crate::impls::RelayChain>::sovereign_account_id_of_child_para(para_id);
|
||||||
Self::fund_accounts(vec![(sovereign_account.clone(), amount)]);
|
Self::fund_accounts(vec![(sovereign_account.clone(), amount)]);
|
||||||
sovereign_account
|
sovereign_account
|
||||||
@@ -199,15 +194,15 @@ macro_rules! impl_accounts_helpers_for_relay_chain {
|
|||||||
macro_rules! impl_assert_events_helpers_for_relay_chain {
|
macro_rules! impl_assert_events_helpers_for_relay_chain {
|
||||||
( $chain:ident ) => {
|
( $chain:ident ) => {
|
||||||
$crate::impls::paste::paste! {
|
$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
|
/// Asserts a dispatchable is completely executed and XCM sent
|
||||||
pub fn assert_xcm_pallet_attempted_complete(expected_weight: Option<$crate::impls::Weight>) {
|
pub fn assert_xcm_pallet_attempted_complete(expected_weight: Option<$crate::impls::Weight>) {
|
||||||
$crate::impls::assert_expected_events!(
|
$crate::impls::assert_expected_events!(
|
||||||
Self,
|
Self,
|
||||||
vec![
|
vec![
|
||||||
[<$chain RuntimeEvent>]::XcmPallet(
|
[<$chain RuntimeEvent>]::<N>::XcmPallet(
|
||||||
$crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Complete(weight) }
|
$crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Complete(weight) }
|
||||||
) => {
|
) => {
|
||||||
weight: $crate::impls::weight_within_threshold(
|
weight: $crate::impls::weight_within_threshold(
|
||||||
@@ -229,7 +224,7 @@ macro_rules! impl_assert_events_helpers_for_relay_chain {
|
|||||||
Self,
|
Self,
|
||||||
vec![
|
vec![
|
||||||
// Dispatchable is properly executed and XCM message sent
|
// 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) }
|
$crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Incomplete(weight, error) }
|
||||||
) => {
|
) => {
|
||||||
weight: $crate::impls::weight_within_threshold(
|
weight: $crate::impls::weight_within_threshold(
|
||||||
@@ -248,7 +243,7 @@ macro_rules! impl_assert_events_helpers_for_relay_chain {
|
|||||||
$crate::impls::assert_expected_events!(
|
$crate::impls::assert_expected_events!(
|
||||||
Self,
|
Self,
|
||||||
vec![
|
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,
|
Self,
|
||||||
vec![
|
vec![
|
||||||
// XCM is succesfully received and proccessed
|
// 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)),
|
origin: $crate::impls::AggregateMessageOrigin::Ump($crate::impls::UmpQueueId::Para(id)),
|
||||||
weight_used,
|
weight_used,
|
||||||
success,
|
success,
|
||||||
@@ -289,7 +284,7 @@ macro_rules! impl_assert_events_helpers_for_relay_chain {
|
|||||||
macro_rules! impl_hrmp_channels_helpers_for_relay_chain {
|
macro_rules! impl_hrmp_channels_helpers_for_relay_chain {
|
||||||
( $chain:ident ) => {
|
( $chain:ident ) => {
|
||||||
$crate::impls::paste::paste! {
|
$crate::impls::paste::paste! {
|
||||||
impl $chain {
|
impl<N: $crate::impls::Network> $chain<N> {
|
||||||
/// Init open channel request with another Parachain
|
/// Init open channel request with another Parachain
|
||||||
pub fn init_open_channel_call(
|
pub fn init_open_channel_call(
|
||||||
recipient_para_id: $crate::impls::ParaId,
|
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();
|
let relay_root_origin = <Self as Chain>::RuntimeOrigin::root();
|
||||||
|
|
||||||
// Force process HRMP open channel requests without waiting for the next session
|
// 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,
|
relay_root_origin,
|
||||||
0
|
0
|
||||||
));
|
));
|
||||||
@@ -353,7 +348,7 @@ macro_rules! impl_hrmp_channels_helpers_for_relay_chain {
|
|||||||
macro_rules! impl_send_transact_helpers_for_relay_chain {
|
macro_rules! impl_send_transact_helpers_for_relay_chain {
|
||||||
( $chain:ident ) => {
|
( $chain:ident ) => {
|
||||||
$crate::impls::paste::paste! {
|
$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.
|
/// 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(
|
pub fn send_unpaid_transact_to_parachain_as_root(
|
||||||
recipient: $crate::impls::ParaId,
|
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);
|
let xcm = $crate::impls::xcm_transact_unpaid_execution(call, $crate::impls::OriginKind::Superuser);
|
||||||
|
|
||||||
// Send XCM `Transact`
|
// 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,
|
root_origin,
|
||||||
bx!(destination.into()),
|
bx!(destination.into()),
|
||||||
bx!(xcm),
|
bx!(xcm),
|
||||||
@@ -384,12 +379,12 @@ macro_rules! impl_send_transact_helpers_for_relay_chain {
|
|||||||
macro_rules! impl_accounts_helpers_for_parachain {
|
macro_rules! impl_accounts_helpers_for_parachain {
|
||||||
( $chain:ident ) => {
|
( $chain:ident ) => {
|
||||||
$crate::impls::paste::paste! {
|
$crate::impls::paste::paste! {
|
||||||
impl $chain {
|
impl<N: $crate::impls::Network> $chain<N> {
|
||||||
/// Fund a set of accounts with a balance
|
/// Fund a set of accounts with a balance
|
||||||
pub fn fund_accounts(accounts: Vec<($crate::impls::AccountId, $crate::impls::Balance)>) {
|
pub fn fund_accounts(accounts: Vec<($crate::impls::AccountId, $crate::impls::Balance)>) {
|
||||||
<Self as $crate::impls::TestExt>::execute_with(|| {
|
<Self as $crate::impls::TestExt>::execute_with(|| {
|
||||||
for account in accounts {
|
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(),
|
<Self as $crate::impls::Chain>::RuntimeOrigin::root(),
|
||||||
account.0.into(),
|
account.0.into(),
|
||||||
account.1,
|
account.1,
|
||||||
@@ -406,15 +401,15 @@ macro_rules! impl_accounts_helpers_for_parachain {
|
|||||||
macro_rules! impl_assert_events_helpers_for_parachain {
|
macro_rules! impl_assert_events_helpers_for_parachain {
|
||||||
( $chain:ident ) => {
|
( $chain:ident ) => {
|
||||||
$crate::impls::paste::paste! {
|
$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
|
/// Asserts a dispatchable is completely executed and XCM sent
|
||||||
pub fn assert_xcm_pallet_attempted_complete(expected_weight: Option<$crate::impls::Weight>) {
|
pub fn assert_xcm_pallet_attempted_complete(expected_weight: Option<$crate::impls::Weight>) {
|
||||||
$crate::impls::assert_expected_events!(
|
$crate::impls::assert_expected_events!(
|
||||||
Self,
|
Self,
|
||||||
vec![
|
vec![
|
||||||
[<$chain RuntimeEvent>]::PolkadotXcm(
|
[<$chain RuntimeEvent>]::<N>::PolkadotXcm(
|
||||||
$crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Complete(weight) }
|
$crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Complete(weight) }
|
||||||
) => {
|
) => {
|
||||||
weight: $crate::impls::weight_within_threshold(
|
weight: $crate::impls::weight_within_threshold(
|
||||||
@@ -436,7 +431,7 @@ macro_rules! impl_assert_events_helpers_for_parachain {
|
|||||||
Self,
|
Self,
|
||||||
vec![
|
vec![
|
||||||
// Dispatchable is properly executed and XCM message sent
|
// 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) }
|
$crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Incomplete(weight, error) }
|
||||||
) => {
|
) => {
|
||||||
weight: $crate::impls::weight_within_threshold(
|
weight: $crate::impls::weight_within_threshold(
|
||||||
@@ -456,7 +451,7 @@ macro_rules! impl_assert_events_helpers_for_parachain {
|
|||||||
Self,
|
Self,
|
||||||
vec![
|
vec![
|
||||||
// Execution fails in the origin with `Barrier`
|
// 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) }
|
$crate::impls::pallet_xcm::Event::Attempted { outcome: $crate::impls::Outcome::Error(error) }
|
||||||
) => {
|
) => {
|
||||||
error: *error == expected_error.unwrap_or(*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!(
|
$crate::impls::assert_expected_events!(
|
||||||
Self,
|
Self,
|
||||||
vec![
|
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!(
|
$crate::impls::assert_expected_events!(
|
||||||
Self,
|
Self,
|
||||||
vec![
|
vec![
|
||||||
[<$chain RuntimeEvent>]::ParachainSystem(
|
[<$chain RuntimeEvent>]::<N>::ParachainSystem(
|
||||||
$crate::impls::cumulus_pallet_parachain_system::Event::UpwardMessageSent { .. }
|
$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!(
|
$crate::impls::assert_expected_events!(
|
||||||
Self,
|
Self,
|
||||||
vec![
|
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, ..
|
success: true, weight_used: weight, ..
|
||||||
}) => {
|
}) => {
|
||||||
weight: $crate::impls::weight_within_threshold(
|
weight: $crate::impls::weight_within_threshold(
|
||||||
@@ -512,7 +507,7 @@ macro_rules! impl_assert_events_helpers_for_parachain {
|
|||||||
$crate::impls::assert_expected_events!(
|
$crate::impls::assert_expected_events!(
|
||||||
Self,
|
Self,
|
||||||
vec![
|
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, ..
|
success: false, weight_used: weight, ..
|
||||||
}) => {
|
}) => {
|
||||||
weight: $crate::impls::weight_within_threshold(
|
weight: $crate::impls::weight_within_threshold(
|
||||||
@@ -530,7 +525,7 @@ macro_rules! impl_assert_events_helpers_for_parachain {
|
|||||||
$crate::impls::assert_expected_events!(
|
$crate::impls::assert_expected_events!(
|
||||||
Self,
|
Self,
|
||||||
vec![
|
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!(
|
$crate::impls::assert_expected_events!(
|
||||||
Self,
|
Self,
|
||||||
vec![
|
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(
|
weight: $crate::impls::weight_within_threshold(
|
||||||
($crate::impls::REF_TIME_THRESHOLD, $crate::impls::PROOF_SIZE_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_export]
|
||||||
macro_rules! impl_assets_helpers_for_parachain {
|
macro_rules! impl_assets_helpers_for_system_parachain {
|
||||||
( $chain:ident, $relay_chain:ident ) => {
|
( $chain:ident, $relay_chain:ident ) => {
|
||||||
$crate::impls::paste::paste! {
|
$crate::impls::paste::paste! {
|
||||||
impl $chain {
|
impl<N: $crate::impls::Network> $chain<N> {
|
||||||
/// Returns the encoded call for `force_create` from the assets pallet
|
/// Returns the encoded call for `force_create` from the assets pallet
|
||||||
pub fn force_create_asset_call(
|
pub fn force_create_asset_call(
|
||||||
asset_id: u32,
|
asset_id: u32,
|
||||||
@@ -607,19 +602,19 @@ macro_rules! impl_assets_helpers_for_parachain {
|
|||||||
amount_to_mint: u128,
|
amount_to_mint: u128,
|
||||||
) {
|
) {
|
||||||
<Self as $crate::impls::TestExt>::execute_with(|| {
|
<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,
|
signed_origin,
|
||||||
id.into(),
|
id.into(),
|
||||||
beneficiary.clone().into(),
|
beneficiary.clone().into(),
|
||||||
amount_to_mint
|
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!(
|
$crate::impls::assert_expected_events!(
|
||||||
Self,
|
Self,
|
||||||
vec![
|
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,
|
asset_id: *asset_id == id,
|
||||||
owner: *owner == beneficiary.clone().into(),
|
owner: *owner == beneficiary.clone().into(),
|
||||||
amount: *amount == amount_to_mint,
|
amount: *amount == amount_to_mint,
|
||||||
@@ -664,28 +659,28 @@ macro_rules! impl_assets_helpers_for_parachain {
|
|||||||
) {
|
) {
|
||||||
use $crate::impls::{Parachain, Inspect, TestExt};
|
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::para_id(),
|
||||||
Self::force_create_asset_call(id, asset_owner.clone(), is_sufficient, min_balance),
|
Self::force_create_asset_call(id, asset_owner.clone(), is_sufficient, min_balance),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Receive XCM message in Assets Parachain
|
// Receive XCM message in Assets Parachain
|
||||||
Self::execute_with(|| {
|
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);
|
Self::assert_dmp_queue_complete(dmp_weight_threshold);
|
||||||
|
|
||||||
$crate::impls::assert_expected_events!(
|
$crate::impls::assert_expected_events!(
|
||||||
Self,
|
Self,
|
||||||
vec![
|
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,
|
asset_id: *asset_id == id,
|
||||||
owner: *owner == asset_owner,
|
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
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
pub mod constants;
|
|
||||||
pub mod impls;
|
pub mod impls;
|
||||||
pub mod macros;
|
pub mod macros;
|
||||||
pub mod xcm_helpers;
|
pub mod xcm_helpers;
|
||||||
|
|
||||||
use constants::{
|
pub use xcm_emulator;
|
||||||
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;
|
|
||||||
|
|
||||||
// Substrate
|
// Substrate
|
||||||
use frame_support::traits::OnInitialize;
|
use grandpa::AuthorityId as GrandpaId;
|
||||||
pub use pallet_balances;
|
use pallet_im_online::sr25519::AuthorityId as ImOnlineId;
|
||||||
pub use pallet_message_queue;
|
use sp_authority_discovery::AuthorityId as AuthorityDiscoveryId;
|
||||||
|
use sp_consensus_babe::AuthorityId as BabeId;
|
||||||
// Cumulus
|
use sp_core::{sr25519, storage::Storage, Pair, Public};
|
||||||
pub use cumulus_pallet_xcmp_queue;
|
use sp_runtime::{
|
||||||
pub use xcm_emulator::Chain;
|
traits::{IdentifyAccount, Verify},
|
||||||
use xcm_emulator::{
|
BuildStorage, MultiSignature,
|
||||||
decl_test_bridges, decl_test_networks, decl_test_parachains, decl_test_relay_chains,
|
|
||||||
decl_test_sender_receiver_accounts_parameter_types, DefaultParaMessageProcessor,
|
|
||||||
DefaultRelayMessageProcessor, Parachain, TestExt,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Polkadot
|
// Polakdot
|
||||||
pub use pallet_xcm;
|
use parachains_common::BlockNumber;
|
||||||
pub use xcm::prelude::{AccountId32, WeightLimit};
|
use polkadot_runtime_parachains::configuration::HostConfiguration;
|
||||||
|
use xcm;
|
||||||
|
|
||||||
decl_test_relay_chains! {
|
// Cumulus
|
||||||
#[api_version(8)]
|
use parachains_common::{AccountId, AssetHubPolkadotAuraId, AuraId};
|
||||||
pub struct Westend {
|
use polkadot_primitives::{AssignmentId, ValidatorId};
|
||||||
genesis = westend::genesis(),
|
use polkadot_service::chain_spec::get_authority_keys_from_seed_no_beefy;
|
||||||
on_init = (),
|
|
||||||
runtime = westend_runtime,
|
pub const XCM_V2: u32 = 2;
|
||||||
core = {
|
pub const XCM_V3: u32 = 3;
|
||||||
MessageProcessor: DefaultRelayMessageProcessor<Westend>,
|
pub const REF_TIME_THRESHOLD: u64 = 33;
|
||||||
SovereignAccountOf: westend_runtime::xcm_config::LocationConverter, //TODO: rename to SovereignAccountOf,
|
pub const PROOF_SIZE_THRESHOLD: u64 = 33;
|
||||||
},
|
|
||||||
pallets = {
|
/// The default XCM version to set in genesis config.
|
||||||
XcmPallet: westend_runtime::XcmPallet,
|
pub const SAFE_XCM_VERSION: u32 = xcm::prelude::XCM_VERSION;
|
||||||
Sudo: westend_runtime::Sudo,
|
|
||||||
Balances: westend_runtime::Balances,
|
type AccountPublic = <MultiSignature as Verify>::Signer;
|
||||||
Treasury: westend_runtime::Treasury,
|
|
||||||
AssetRate: westend_runtime::AssetRate,
|
/// 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)
|
||||||
#[api_version(8)]
|
.expect("static values are valid; qed")
|
||||||
pub struct Rococo {
|
.public()
|
||||||
genesis = rococo::genesis(),
|
}
|
||||||
on_init = (),
|
|
||||||
runtime = rococo_runtime,
|
/// Helper function to generate an account ID from seed.
|
||||||
core = {
|
pub fn get_account_id_from_seed<TPublic: Public>(seed: &str) -> AccountId
|
||||||
MessageProcessor: DefaultRelayMessageProcessor<Rococo>,
|
where
|
||||||
SovereignAccountOf: rococo_runtime::xcm_config::LocationConverter, //TODO: rename to SovereignAccountOf,
|
AccountPublic: From<<TPublic::Pair as Pair>::Public>,
|
||||||
},
|
{
|
||||||
pallets = {
|
AccountPublic::from(get_from_seed::<TPublic>(seed)).into_account()
|
||||||
XcmPallet: rococo_runtime::XcmPallet,
|
}
|
||||||
Sudo: rococo_runtime::Sudo,
|
|
||||||
Balances: rococo_runtime::Balances,
|
pub fn get_host_config() -> HostConfiguration<BlockNumber> {
|
||||||
Hrmp: rococo_runtime::Hrmp,
|
HostConfiguration {
|
||||||
}
|
max_upward_queue_count: 10,
|
||||||
},
|
max_upward_queue_size: 51200,
|
||||||
#[api_version(8)]
|
max_upward_message_size: 51200,
|
||||||
pub struct Wococo {
|
max_upward_message_num_per_candidate: 10,
|
||||||
genesis = rococo::genesis(),
|
max_downward_message_size: 51200,
|
||||||
on_init = (),
|
hrmp_sender_deposit: 0,
|
||||||
runtime = rococo_runtime,
|
hrmp_recipient_deposit: 0,
|
||||||
core = {
|
hrmp_channel_max_capacity: 1000,
|
||||||
MessageProcessor: DefaultRelayMessageProcessor<Wococo>,
|
hrmp_channel_max_message_size: 102400,
|
||||||
SovereignAccountOf: rococo_runtime::xcm_config::LocationConverter, //TODO: rename to SovereignAccountOf,
|
hrmp_channel_max_total_size: 102400,
|
||||||
},
|
hrmp_max_parachain_outbound_channels: 30,
|
||||||
pallets = {
|
hrmp_max_parachain_inbound_channels: 30,
|
||||||
XcmPallet: rococo_runtime::XcmPallet,
|
..Default::default()
|
||||||
Sudo: rococo_runtime::Sudo,
|
|
||||||
Balances: rococo_runtime::Balances,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
decl_test_parachains! {
|
/// Helper function used in tests to build the genesis storage using given RuntimeGenesisConfig and
|
||||||
// Westend Parachains
|
/// code Used in `legacy_vs_json_check` submods to verify storage building with JSON patch against
|
||||||
pub struct AssetHubWestend {
|
/// building with RuntimeGenesisConfig struct.
|
||||||
genesis = asset_hub_westend::genesis(),
|
pub fn build_genesis_storage_legacy(builder: &dyn BuildStorage, code: &[u8]) -> Storage {
|
||||||
on_init = {
|
let mut storage = builder.build_storage().unwrap();
|
||||||
asset_hub_westend_runtime::AuraExt::on_initialize(1);
|
storage
|
||||||
},
|
.top
|
||||||
runtime = asset_hub_westend_runtime,
|
.insert(sp_core::storage::well_known_keys::CODE.to_vec(), code.into());
|
||||||
core = {
|
storage
|
||||||
XcmpMessageHandler: asset_hub_westend_runtime::XcmpQueue,
|
}
|
||||||
LocationToAccountId: asset_hub_westend_runtime::xcm_config::LocationToAccountId,
|
|
||||||
ParachainInfo: asset_hub_westend_runtime::ParachainInfo,
|
pub mod accounts {
|
||||||
MessageProcessor: DefaultParaMessageProcessor<AssetHubWestend>,
|
use super::*;
|
||||||
},
|
pub const ALICE: &str = "Alice";
|
||||||
pallets = {
|
pub const BOB: &str = "Bob";
|
||||||
PolkadotXcm: asset_hub_westend_runtime::PolkadotXcm,
|
pub const CHARLIE: &str = "Charlie";
|
||||||
Balances: asset_hub_westend_runtime::Balances,
|
pub const DAVE: &str = "Dave";
|
||||||
Assets: asset_hub_westend_runtime::Assets,
|
pub const EVE: &str = "Eve";
|
||||||
ForeignAssets: asset_hub_westend_runtime::ForeignAssets,
|
pub const FERDIE: &str = "Ferdei";
|
||||||
PoolAssets: asset_hub_westend_runtime::PoolAssets,
|
pub const ALICE_STASH: &str = "Alice//stash";
|
||||||
AssetConversion: asset_hub_westend_runtime::AssetConversion,
|
pub const BOB_STASH: &str = "Bob//stash";
|
||||||
}
|
pub const CHARLIE_STASH: &str = "Charlie//stash";
|
||||||
},
|
pub const DAVE_STASH: &str = "Dave//stash";
|
||||||
pub struct BridgeHubWestend {
|
pub const EVE_STASH: &str = "Eve//stash";
|
||||||
genesis = bridge_hub_westend::genesis(),
|
pub const FERDIE_STASH: &str = "Ferdie//stash";
|
||||||
on_init = {
|
pub const FERDIE_BEEFY: &str = "Ferdie//stash";
|
||||||
bridge_hub_westend_runtime::AuraExt::on_initialize(1);
|
|
||||||
},
|
pub fn init_balances() -> Vec<AccountId> {
|
||||||
runtime = bridge_hub_westend_runtime,
|
vec![
|
||||||
core = {
|
get_account_id_from_seed::<sr25519::Public>(ALICE),
|
||||||
XcmpMessageHandler: bridge_hub_westend_runtime::XcmpQueue,
|
get_account_id_from_seed::<sr25519::Public>(BOB),
|
||||||
LocationToAccountId: bridge_hub_westend_runtime::xcm_config::LocationToAccountId,
|
get_account_id_from_seed::<sr25519::Public>(CHARLIE),
|
||||||
ParachainInfo: bridge_hub_westend_runtime::ParachainInfo,
|
get_account_id_from_seed::<sr25519::Public>(DAVE),
|
||||||
MessageProcessor: DefaultParaMessageProcessor<BridgeHubWestend>,
|
get_account_id_from_seed::<sr25519::Public>(EVE),
|
||||||
},
|
get_account_id_from_seed::<sr25519::Public>(FERDIE),
|
||||||
pallets = {
|
get_account_id_from_seed::<sr25519::Public>(ALICE_STASH),
|
||||||
PolkadotXcm: bridge_hub_westend_runtime::PolkadotXcm,
|
get_account_id_from_seed::<sr25519::Public>(BOB_STASH),
|
||||||
Balances: bridge_hub_westend_runtime::Balances,
|
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),
|
||||||
pub struct PenpalWestendA {
|
get_account_id_from_seed::<sr25519::Public>(FERDIE_STASH),
|
||||||
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,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
decl_test_networks! {
|
pub mod collators {
|
||||||
pub struct WestendMockNet {
|
use super::*;
|
||||||
relay_chain = Westend,
|
|
||||||
parachains = vec![
|
pub fn invulnerables_asset_hub_polkadot() -> Vec<(AccountId, AssetHubPolkadotAuraId)> {
|
||||||
AssetHubWestend,
|
vec![
|
||||||
BridgeHubWestend,
|
(
|
||||||
PenpalWestendA,
|
get_account_id_from_seed::<sr25519::Public>("Alice"),
|
||||||
],
|
get_from_seed::<AssetHubPolkadotAuraId>("Alice"),
|
||||||
bridge = ()
|
),
|
||||||
},
|
(
|
||||||
pub struct RococoMockNet {
|
get_account_id_from_seed::<sr25519::Public>("Bob"),
|
||||||
relay_chain = Rococo,
|
get_from_seed::<AssetHubPolkadotAuraId>("Bob"),
|
||||||
parachains = vec![
|
),
|
||||||
AssetHubRococo,
|
]
|
||||||
BridgeHubRococo,
|
}
|
||||||
PenpalRococoA,
|
|
||||||
PenpalRococoB,
|
pub fn invulnerables() -> Vec<(AccountId, AuraId)> {
|
||||||
],
|
vec![
|
||||||
bridge = RococoWococoMockBridge
|
(
|
||||||
},
|
get_account_id_from_seed::<sr25519::Public>("Alice"),
|
||||||
pub struct WococoMockNet {
|
get_from_seed::<AuraId>("Alice"),
|
||||||
relay_chain = Wococo,
|
),
|
||||||
parachains = vec![
|
(get_account_id_from_seed::<sr25519::Public>("Bob"), get_from_seed::<AuraId>("Bob")),
|
||||||
AssetHubWococo,
|
]
|
||||||
BridgeHubWococo,
|
|
||||||
],
|
|
||||||
bridge = WococoRococoMockBridge
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
decl_test_bridges! {
|
pub mod validators {
|
||||||
pub struct RococoWococoMockBridge {
|
use super::*;
|
||||||
source = BridgeHubRococo,
|
|
||||||
target = BridgeHubWococo,
|
pub fn initial_authorities() -> Vec<(
|
||||||
handler = RococoWococoMessageHandler
|
AccountId,
|
||||||
},
|
AccountId,
|
||||||
pub struct WococoRococoMockBridge {
|
BabeId,
|
||||||
source = BridgeHubWococo,
|
GrandpaId,
|
||||||
target = BridgeHubRococo,
|
ImOnlineId,
|
||||||
handler = WococoRococoMessageHandler
|
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
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// 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_export]
|
||||||
macro_rules! test_parachain_is_trusted_teleporter {
|
macro_rules! test_parachain_is_trusted_teleporter {
|
||||||
( $sender_para:ty, $sender_xcm_config:ty, vec![$( $receiver_para:ty ),+], ($assets:expr, $amount:expr) ) => {
|
( $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
|
// init Origin variables
|
||||||
let sender = [<$sender_para Sender>]::get();
|
let sender = [<$sender_para Sender>]::get();
|
||||||
let mut para_sender_balance_before =
|
let mut para_sender_balance_before =
|
||||||
<$sender_para as $crate::Chain>::account_data_of(sender.clone()).free;
|
<$sender_para as $crate::macros::Chain>::account_data_of(sender.clone()).free;
|
||||||
let origin = <$sender_para as $crate::Chain>::RuntimeOrigin::signed(sender.clone());
|
let origin = <$sender_para as $crate::macros::Chain>::RuntimeOrigin::signed(sender.clone());
|
||||||
let fee_asset_item = 0;
|
let fee_asset_item = 0;
|
||||||
let weight_limit = $crate::WeightLimit::Unlimited;
|
let weight_limit = $crate::macros::WeightLimit::Unlimited;
|
||||||
|
|
||||||
$(
|
$(
|
||||||
{
|
{
|
||||||
// init Destination variables
|
// init Destination variables
|
||||||
let receiver = [<$receiver_para Receiver>]::get();
|
let receiver = [<$receiver_para Receiver>]::get();
|
||||||
let para_receiver_balance_before =
|
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 =
|
let para_destination =
|
||||||
<$sender_para>::sibling_location_of(<$receiver_para>::para_id());
|
<$sender_para>::sibling_location_of(<$receiver_para>::para_id());
|
||||||
let beneficiary: MultiLocation =
|
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
|
// Send XCM message from Origin Parachain
|
||||||
// We are only testing the limited teleport version, which should be ok since success will
|
// 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(),
|
weight_limit.clone(),
|
||||||
));
|
));
|
||||||
|
|
||||||
type RuntimeEvent = <$sender_para as $crate::Chain>::RuntimeEvent;
|
type RuntimeEvent = <$sender_para as $crate::macros::Chain>::RuntimeEvent;
|
||||||
|
|
||||||
assert_expected_events!(
|
assert_expected_events!(
|
||||||
$sender_para,
|
$sender_para,
|
||||||
vec![
|
vec![
|
||||||
RuntimeEvent::PolkadotXcm(
|
RuntimeEvent::PolkadotXcm(
|
||||||
$crate::pallet_xcm::Event::Attempted { outcome: Outcome::Complete { .. } }
|
$crate::macros::pallet_xcm::Event::Attempted { outcome: Outcome::Complete { .. } }
|
||||||
) => {},
|
) => {},
|
||||||
RuntimeEvent::XcmpQueue(
|
RuntimeEvent::XcmpQueue(
|
||||||
$crate::cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }
|
$crate::macros::cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }
|
||||||
) => {},
|
) => {},
|
||||||
RuntimeEvent::Balances(
|
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
|
// Receive XCM message in Destination Parachain
|
||||||
<$receiver_para>::execute_with(|| {
|
<$receiver_para>::execute_with(|| {
|
||||||
type RuntimeEvent = <$receiver_para as $crate::Chain>::RuntimeEvent;
|
type RuntimeEvent = <$receiver_para as $crate::macros::Chain>::RuntimeEvent;
|
||||||
|
|
||||||
assert_expected_events!(
|
assert_expected_events!(
|
||||||
$receiver_para,
|
$receiver_para,
|
||||||
vec![
|
vec![
|
||||||
RuntimeEvent::Balances(
|
RuntimeEvent::Balances(
|
||||||
$crate::pallet_balances::Event::Deposit { who: receiver, .. }
|
$crate::macros::pallet_balances::Event::Deposit { who: receiver, .. }
|
||||||
) => {},
|
) => {},
|
||||||
RuntimeEvent::MessageQueue(
|
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
|
// Check if balances are updated accordingly in Origin and Destination Parachains
|
||||||
let para_sender_balance_after =
|
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 =
|
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(|| {
|
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,
|
<$sender_xcm_config as xcm_executor::Config>::XcmSender,
|
||||||
>($assets.clone(), fee_asset_item, weight_limit.clone(), beneficiary, para_destination)
|
>($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);
|
assert!(para_receiver_balance_after > para_receiver_balance_before);
|
||||||
|
|
||||||
// Update sender balance
|
// 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
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
// Cumulus
|
||||||
use parachains_common::AccountId;
|
use parachains_common::AccountId;
|
||||||
|
|
||||||
|
// Polkadot
|
||||||
use xcm::{prelude::*, DoubleEncoded};
|
use xcm::{prelude::*, DoubleEncoded};
|
||||||
|
|
||||||
/// Helper method to build a XCM with a `Transact` instruction and paying for its execution
|
/// 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
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
pub use asset_test_utils::xcm_helpers;
|
|
||||||
pub use codec::Encode;
|
pub use codec::Encode;
|
||||||
|
|
||||||
|
// Substrate
|
||||||
pub use frame_support::{
|
pub use frame_support::{
|
||||||
assert_err, assert_ok,
|
assert_err, assert_ok,
|
||||||
pallet_prelude::Weight,
|
pallet_prelude::Weight,
|
||||||
sp_runtime::{AccountId32, DispatchError, DispatchResult},
|
sp_runtime::{AccountId32, DispatchError, DispatchResult},
|
||||||
traits::fungibles::Inspect,
|
traits::fungibles::Inspect,
|
||||||
};
|
};
|
||||||
pub use integration_tests_common::{
|
|
||||||
constants::{
|
// Polkadot
|
||||||
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};
|
|
||||||
pub use xcm::{
|
pub use xcm::{
|
||||||
prelude::{AccountId32 as AccountId32Junction, *},
|
prelude::{AccountId32 as AccountId32Junction, *},
|
||||||
v3::{Error, NetworkId::Rococo as RococoId},
|
v3::{Error, NetworkId::Rococo as RococoId},
|
||||||
};
|
};
|
||||||
pub use xcm_emulator::{
|
|
||||||
assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para,
|
// Cumulus
|
||||||
RelayChain as Relay, Test, TestArgs, TestContext, TestExt,
|
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;
|
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 RelayToSystemParaTest = Test<Rococo, AssetHubRococo>;
|
||||||
pub type SystemParaToRelayTest = Test<AssetHubRococo, Rococo>;
|
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
|
/// Returns a `TestArgs` instance to de used for the Relay Chain accross integraton tests
|
||||||
pub fn relay_test_args(amount: Balance) -> TestArgs {
|
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]
|
#[test]
|
||||||
fn limited_reserve_transfer_native_asset_from_system_para_to_para() {
|
fn limited_reserve_transfer_native_asset_from_system_para_to_para() {
|
||||||
// Init values for System Parachain
|
// Init values for System Parachain
|
||||||
let destination = AssetHubRococo::sibling_location_of(PenpalRococoA::para_id());
|
let destination = AssetHubRococo::sibling_location_of(PenpalA::para_id());
|
||||||
let beneficiary_id = PenpalRococoAReceiver::get();
|
let beneficiary_id = PenpalAReceiver::get();
|
||||||
let amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 1000;
|
let amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 1000;
|
||||||
let assets = (Parent, amount_to_send).into();
|
let assets = (Parent, amount_to_send).into();
|
||||||
|
|
||||||
let test_args = TestContext {
|
let test_args = TestContext {
|
||||||
sender: AssetHubRococoSender::get(),
|
sender: AssetHubRococoSender::get(),
|
||||||
receiver: PenpalRococoAReceiver::get(),
|
receiver: PenpalAReceiver::get(),
|
||||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
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]
|
#[test]
|
||||||
fn reserve_transfer_native_asset_from_system_para_to_para() {
|
fn reserve_transfer_native_asset_from_system_para_to_para() {
|
||||||
// Init values for System Parachain
|
// Init values for System Parachain
|
||||||
let destination = AssetHubRococo::sibling_location_of(PenpalRococoA::para_id());
|
let destination = AssetHubRococo::sibling_location_of(PenpalA::para_id());
|
||||||
let beneficiary_id = PenpalRococoAReceiver::get();
|
let beneficiary_id = PenpalAReceiver::get();
|
||||||
let amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 1000;
|
let amount_to_send: Balance = ASSET_HUB_ROCOCO_ED * 1000;
|
||||||
let assets = (Parent, amount_to_send).into();
|
let assets = (Parent, amount_to_send).into();
|
||||||
|
|
||||||
let test_args = TestContext {
|
let test_args = TestContext {
|
||||||
sender: AssetHubRococoSender::get(),
|
sender: AssetHubRococoSender::get(),
|
||||||
receiver: PenpalRococoAReceiver::get(),
|
receiver: PenpalAReceiver::get(),
|
||||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
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
|
// Init values for System Parachain
|
||||||
let destination = AssetHubRococo::sibling_location_of(PenpalRococoA::para_id());
|
let destination = AssetHubRococo::sibling_location_of(PenpalA::para_id());
|
||||||
let beneficiary_id = PenpalRococoAReceiver::get();
|
let beneficiary_id = PenpalAReceiver::get();
|
||||||
let amount_to_send = ASSET_MIN_BALANCE * 1000;
|
let amount_to_send = ASSET_MIN_BALANCE * 1000;
|
||||||
let assets =
|
let assets =
|
||||||
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send)
|
(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 {
|
let system_para_test_args = TestContext {
|
||||||
sender: AssetHubRococoSender::get(),
|
sender: AssetHubRococoSender::get(),
|
||||||
receiver: PenpalRococoAReceiver::get(),
|
receiver: PenpalAReceiver::get(),
|
||||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
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
|
// Init values for System Parachain
|
||||||
let destination = AssetHubRococo::sibling_location_of(PenpalRococoA::para_id());
|
let destination = AssetHubRococo::sibling_location_of(PenpalA::para_id());
|
||||||
let beneficiary_id = PenpalRococoAReceiver::get();
|
let beneficiary_id = PenpalAReceiver::get();
|
||||||
let amount_to_send = ASSET_MIN_BALANCE * 1000;
|
let amount_to_send = ASSET_MIN_BALANCE * 1000;
|
||||||
let assets =
|
let assets =
|
||||||
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send)
|
(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 {
|
let system_para_test_args = TestContext {
|
||||||
sender: AssetHubRococoSender::get(),
|
sender: AssetHubRococoSender::get(),
|
||||||
receiver: PenpalRococoAReceiver::get(),
|
receiver: PenpalAReceiver::get(),
|
||||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
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]
|
#[test]
|
||||||
fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() {
|
fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() {
|
||||||
let para_sovereign_account = AssetHubRococo::sovereign_account_id_of(
|
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
|
// 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 =
|
let native_asset =
|
||||||
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount).into();
|
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount).into();
|
||||||
|
|
||||||
let root_origin = <PenpalRococoA as Chain>::RuntimeOrigin::root();
|
let root_origin = <PenpalA as Chain>::RuntimeOrigin::root();
|
||||||
let system_para_destination =
|
let system_para_destination = PenpalA::sibling_location_of(AssetHubRococo::para_id()).into();
|
||||||
PenpalRococoA::sibling_location_of(AssetHubRococo::para_id()).into();
|
|
||||||
let xcm = xcm_transact_paid_execution(
|
let xcm = xcm_transact_paid_execution(
|
||||||
call,
|
call,
|
||||||
origin_kind,
|
origin_kind,
|
||||||
@@ -70,14 +69,14 @@ fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() {
|
|||||||
para_sovereign_account.clone(),
|
para_sovereign_account.clone(),
|
||||||
);
|
);
|
||||||
|
|
||||||
PenpalRococoA::execute_with(|| {
|
PenpalA::execute_with(|| {
|
||||||
assert_ok!(<PenpalRococoA as PenpalRococoAPallet>::PolkadotXcm::send(
|
assert_ok!(<PenpalA as PenpalAPallet>::PolkadotXcm::send(
|
||||||
root_origin,
|
root_origin,
|
||||||
bx!(system_para_destination),
|
bx!(system_para_destination),
|
||||||
bx!(xcm),
|
bx!(xcm),
|
||||||
));
|
));
|
||||||
|
|
||||||
PenpalRococoA::assert_xcm_pallet_sent();
|
PenpalA::assert_xcm_pallet_sent();
|
||||||
});
|
});
|
||||||
|
|
||||||
AssetHubRococo::execute_with(|| {
|
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 {
|
let foreign_asset1_at_asset_hub_rococo = Box::new(MultiLocation {
|
||||||
parents: 1,
|
parents: 1,
|
||||||
interior: X3(
|
interior: X3(
|
||||||
Parachain(PenpalRococoA::para_id().into()),
|
Parachain(PenpalA::para_id().into()),
|
||||||
PalletInstance(ASSETS_PALLET_ID),
|
PalletInstance(ASSETS_PALLET_ID),
|
||||||
GeneralIndex(ASSET_ID.into()),
|
GeneralIndex(ASSET_ID.into()),
|
||||||
),
|
),
|
||||||
@@ -136,18 +136,18 @@ fn swap_locally_on_chain_using_foreign_assets() {
|
|||||||
.into();
|
.into();
|
||||||
|
|
||||||
let penpal_location =
|
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:
|
// 1. Create asset on penpal:
|
||||||
PenpalRococoA::execute_with(|| {
|
PenpalA::execute_with(|| {
|
||||||
assert_ok!(<PenpalRococoA as PenpalRococoAPallet>::Assets::create(
|
assert_ok!(<PenpalA as PenpalAPallet>::Assets::create(
|
||||||
<PenpalRococoA as Chain>::RuntimeOrigin::signed(PenpalRococoASender::get()),
|
<PenpalA as Chain>::RuntimeOrigin::signed(PenpalASender::get()),
|
||||||
ASSET_ID.into(),
|
ASSET_ID.into(),
|
||||||
PenpalRococoASender::get().into(),
|
PenpalASender::get().into(),
|
||||||
1000,
|
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:
|
// 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
|
// Send XCM message from penpal => asset_hub_rococo
|
||||||
let sudo_penpal_origin = <PenpalRococoA as Chain>::RuntimeOrigin::root();
|
let sudo_penpal_origin = <PenpalA as Chain>::RuntimeOrigin::root();
|
||||||
PenpalRococoA::execute_with(|| {
|
PenpalA::execute_with(|| {
|
||||||
assert_ok!(<PenpalRococoA as PenpalRococoAPallet>::PolkadotXcm::send(
|
assert_ok!(<PenpalA as PenpalAPallet>::PolkadotXcm::send(
|
||||||
sudo_penpal_origin.clone(),
|
sudo_penpal_origin.clone(),
|
||||||
bx!(assets_para_destination.clone()),
|
bx!(assets_para_destination.clone()),
|
||||||
bx!(xcm),
|
bx!(xcm),
|
||||||
));
|
));
|
||||||
|
|
||||||
type RuntimeEvent = <PenpalRococoA as Chain>::RuntimeEvent;
|
type RuntimeEvent = <PenpalA as Chain>::RuntimeEvent;
|
||||||
|
|
||||||
assert_expected_events!(
|
assert_expected_events!(
|
||||||
PenpalRococoA,
|
PenpalA,
|
||||||
vec![
|
vec![
|
||||||
RuntimeEvent::PolkadotXcm(pallet_xcm::Event::Sent { .. }) => {},
|
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
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
pub use asset_test_utils::xcm_helpers;
|
|
||||||
pub use codec::Encode;
|
pub use codec::Encode;
|
||||||
|
|
||||||
|
// Substrate
|
||||||
pub use frame_support::{
|
pub use frame_support::{
|
||||||
assert_err, assert_ok,
|
assert_err, assert_ok,
|
||||||
instances::Instance2,
|
instances::Instance2,
|
||||||
@@ -23,25 +24,36 @@ pub use frame_support::{
|
|||||||
traits::fungibles::Inspect,
|
traits::fungibles::Inspect,
|
||||||
BoundedVec,
|
BoundedVec,
|
||||||
};
|
};
|
||||||
pub use integration_tests_common::{
|
|
||||||
constants::{
|
// Polkadot
|
||||||
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};
|
|
||||||
pub use xcm::{
|
pub use xcm::{
|
||||||
prelude::{AccountId32 as AccountId32Junction, *},
|
prelude::{AccountId32 as AccountId32Junction, *},
|
||||||
v3::{Error, NetworkId::Westend as WestendId},
|
v3::{Error, NetworkId::Westend as WestendId},
|
||||||
};
|
};
|
||||||
pub use xcm_emulator::{
|
|
||||||
assert_expected_events, bx, helpers::weight_within_threshold, Chain, Parachain as Para,
|
// Cumulus
|
||||||
RelayChain as Relay, Test, TestArgs, TestContext, TestExt,
|
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;
|
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 RelayToSystemParaTest = Test<Westend, AssetHubWestend>;
|
||||||
pub type SystemParaToRelayTest = Test<AssetHubWestend, Westend>;
|
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
|
/// Returns a `TestArgs` instance to de used for the Relay Chain accross integraton tests
|
||||||
pub fn relay_test_args(amount: Balance) -> TestArgs {
|
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]
|
#[test]
|
||||||
fn limited_reserve_transfer_native_asset_from_system_para_to_para() {
|
fn limited_reserve_transfer_native_asset_from_system_para_to_para() {
|
||||||
// Init values for System Parachain
|
// Init values for System Parachain
|
||||||
let destination = AssetHubWestend::sibling_location_of(PenpalWestendA::para_id());
|
let destination = AssetHubWestend::sibling_location_of(PenpalA::para_id());
|
||||||
let beneficiary_id = PenpalWestendAReceiver::get();
|
let beneficiary_id = PenpalAReceiver::get();
|
||||||
let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000;
|
let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000;
|
||||||
let assets = (Parent, amount_to_send).into();
|
let assets = (Parent, amount_to_send).into();
|
||||||
|
|
||||||
let test_args = TestContext {
|
let test_args = TestContext {
|
||||||
sender: AssetHubWestendSender::get(),
|
sender: AssetHubWestendSender::get(),
|
||||||
receiver: PenpalWestendAReceiver::get(),
|
receiver: PenpalAReceiver::get(),
|
||||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
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]
|
#[test]
|
||||||
fn reserve_transfer_native_asset_from_system_para_to_para() {
|
fn reserve_transfer_native_asset_from_system_para_to_para() {
|
||||||
// Init values for System Parachain
|
// Init values for System Parachain
|
||||||
let destination = AssetHubWestend::sibling_location_of(PenpalWestendA::para_id());
|
let destination = AssetHubWestend::sibling_location_of(PenpalA::para_id());
|
||||||
let beneficiary_id = PenpalWestendAReceiver::get();
|
let beneficiary_id = PenpalAReceiver::get();
|
||||||
let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000;
|
let amount_to_send: Balance = ASSET_HUB_WESTEND_ED * 1000;
|
||||||
let assets = (Parent, amount_to_send).into();
|
let assets = (Parent, amount_to_send).into();
|
||||||
|
|
||||||
let test_args = TestContext {
|
let test_args = TestContext {
|
||||||
sender: AssetHubWestendSender::get(),
|
sender: AssetHubWestendSender::get(),
|
||||||
receiver: PenpalWestendAReceiver::get(),
|
receiver: PenpalAReceiver::get(),
|
||||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
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
|
// Init values for System Parachain
|
||||||
let destination = AssetHubWestend::sibling_location_of(PenpalWestendA::para_id());
|
let destination = AssetHubWestend::sibling_location_of(PenpalA::para_id());
|
||||||
let beneficiary_id = PenpalWestendAReceiver::get();
|
let beneficiary_id = PenpalAReceiver::get();
|
||||||
let amount_to_send = ASSET_MIN_BALANCE * 1000;
|
let amount_to_send = ASSET_MIN_BALANCE * 1000;
|
||||||
let assets =
|
let assets =
|
||||||
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send)
|
(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 {
|
let system_para_test_args = TestContext {
|
||||||
sender: AssetHubWestendSender::get(),
|
sender: AssetHubWestendSender::get(),
|
||||||
receiver: PenpalWestendAReceiver::get(),
|
receiver: PenpalAReceiver::get(),
|
||||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
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
|
// Init values for System Parachain
|
||||||
let destination = AssetHubWestend::sibling_location_of(PenpalWestendA::para_id());
|
let destination = AssetHubWestend::sibling_location_of(PenpalA::para_id());
|
||||||
let beneficiary_id = PenpalWestendAReceiver::get();
|
let beneficiary_id = PenpalAReceiver::get();
|
||||||
let amount_to_send = ASSET_MIN_BALANCE * 1000;
|
let amount_to_send = ASSET_MIN_BALANCE * 1000;
|
||||||
let assets =
|
let assets =
|
||||||
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), amount_to_send)
|
(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 {
|
let system_para_test_args = TestContext {
|
||||||
sender: AssetHubWestendSender::get(),
|
sender: AssetHubWestendSender::get(),
|
||||||
receiver: PenpalWestendAReceiver::get(),
|
receiver: PenpalAReceiver::get(),
|
||||||
args: system_para_test_args(destination, beneficiary_id, amount_to_send, assets, None),
|
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]
|
#[test]
|
||||||
fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() {
|
fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() {
|
||||||
let para_sovereign_account = AssetHubWestend::sovereign_account_id_of(
|
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
|
// 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 =
|
let native_asset =
|
||||||
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount).into();
|
(X2(PalletInstance(ASSETS_PALLET_ID), GeneralIndex(ASSET_ID.into())), fee_amount).into();
|
||||||
|
|
||||||
let root_origin = <PenpalWestendA as Chain>::RuntimeOrigin::root();
|
let root_origin = <PenpalA as Chain>::RuntimeOrigin::root();
|
||||||
let system_para_destination =
|
let system_para_destination = PenpalA::sibling_location_of(AssetHubWestend::para_id()).into();
|
||||||
PenpalWestendA::sibling_location_of(AssetHubWestend::para_id()).into();
|
|
||||||
let xcm = xcm_transact_paid_execution(
|
let xcm = xcm_transact_paid_execution(
|
||||||
call,
|
call,
|
||||||
origin_kind,
|
origin_kind,
|
||||||
@@ -70,14 +69,14 @@ fn send_xcm_from_para_to_system_para_paying_fee_with_assets_works() {
|
|||||||
para_sovereign_account.clone(),
|
para_sovereign_account.clone(),
|
||||||
);
|
);
|
||||||
|
|
||||||
PenpalWestendA::execute_with(|| {
|
PenpalA::execute_with(|| {
|
||||||
assert_ok!(<PenpalWestendA as PenpalWestendAPallet>::PolkadotXcm::send(
|
assert_ok!(<PenpalA as PenpalAPallet>::PolkadotXcm::send(
|
||||||
root_origin,
|
root_origin,
|
||||||
bx!(system_para_destination),
|
bx!(system_para_destination),
|
||||||
bx!(xcm),
|
bx!(xcm),
|
||||||
));
|
));
|
||||||
|
|
||||||
PenpalWestendA::assert_xcm_pallet_sent();
|
PenpalA::assert_xcm_pallet_sent();
|
||||||
});
|
});
|
||||||
|
|
||||||
AssetHubWestend::execute_with(|| {
|
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 {
|
let foreign_asset1_at_asset_hub_westend = Box::new(MultiLocation {
|
||||||
parents: 1,
|
parents: 1,
|
||||||
interior: X3(
|
interior: X3(
|
||||||
Parachain(PenpalWestendA::para_id().into()),
|
Parachain(PenpalA::para_id().into()),
|
||||||
PalletInstance(ASSETS_PALLET_ID),
|
PalletInstance(ASSETS_PALLET_ID),
|
||||||
GeneralIndex(ASSET_ID.into()),
|
GeneralIndex(ASSET_ID.into()),
|
||||||
),
|
),
|
||||||
@@ -125,18 +125,18 @@ fn swap_locally_on_chain_using_foreign_assets() {
|
|||||||
.into();
|
.into();
|
||||||
|
|
||||||
let penpal_location =
|
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:
|
// 1. Create asset on penpal:
|
||||||
PenpalWestendA::execute_with(|| {
|
PenpalA::execute_with(|| {
|
||||||
assert_ok!(<PenpalWestendA as PenpalWestendAPallet>::Assets::create(
|
assert_ok!(<PenpalA as PenpalAPallet>::Assets::create(
|
||||||
<PenpalWestendA as Chain>::RuntimeOrigin::signed(PenpalWestendASender::get()),
|
<PenpalA as Chain>::RuntimeOrigin::signed(PenpalASender::get()),
|
||||||
ASSET_ID.into(),
|
ASSET_ID.into(),
|
||||||
PenpalWestendASender::get().into(),
|
PenpalASender::get().into(),
|
||||||
1000,
|
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:
|
// 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
|
// Send XCM message from penpal => asset_hub_westend
|
||||||
let sudo_penpal_origin = <PenpalWestendA as Chain>::RuntimeOrigin::root();
|
let sudo_penpal_origin = <PenpalA as Chain>::RuntimeOrigin::root();
|
||||||
PenpalWestendA::execute_with(|| {
|
PenpalA::execute_with(|| {
|
||||||
assert_ok!(<PenpalWestendA as PenpalWestendAPallet>::PolkadotXcm::send(
|
assert_ok!(<PenpalA as PenpalAPallet>::PolkadotXcm::send(
|
||||||
sudo_penpal_origin.clone(),
|
sudo_penpal_origin.clone(),
|
||||||
bx!(assets_para_destination.clone()),
|
bx!(assets_para_destination.clone()),
|
||||||
bx!(xcm),
|
bx!(xcm),
|
||||||
));
|
));
|
||||||
|
|
||||||
type RuntimeEvent = <PenpalWestendA as Chain>::RuntimeEvent;
|
type RuntimeEvent = <PenpalA as Chain>::RuntimeEvent;
|
||||||
|
|
||||||
assert_expected_events!(
|
assert_expected_events!(
|
||||||
PenpalWestendA,
|
PenpalA,
|
||||||
vec![
|
vec![
|
||||||
RuntimeEvent::PolkadotXcm(pallet_xcm::Event::Sent { .. }) => {},
|
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.
|
// Receive XCM message in Assets Parachain in the next block.
|
||||||
AssetHubWestend::execute_with(|| {
|
AssetHubWestend::execute_with(|| {
|
||||||
assert!(<AssetHubWestend as AssetHubWestendPallet>::ForeignAssets::asset_exists(
|
assert!(<AssetHubWestend as AssetHubWestendPallet>::ForeignAssets::asset_exists(
|
||||||
-2
@@ -13,8 +13,6 @@
|
|||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
#![allow(dead_code)] // <https://github.com/paritytech/cumulus/issues/3027>
|
|
||||||
|
|
||||||
use crate::*;
|
use crate::*;
|
||||||
use asset_hub_westend_runtime::xcm_config::XcmConfig as AssetHubWestendXcmConfig;
|
use asset_hub_westend_runtime::xcm_config::XcmConfig as AssetHubWestendXcmConfig;
|
||||||
use westend_runtime::xcm_config::XcmConfig as WestendXcmConfig;
|
use westend_runtime::xcm_config::XcmConfig as WestendXcmConfig;
|
||||||
+1
-1
@@ -14,8 +14,8 @@
|
|||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
use crate::*;
|
use crate::*;
|
||||||
|
use emulated_integration_tests_common::accounts::{ALICE, BOB};
|
||||||
use frame_support::traits::fungibles::{Create, Inspect, Mutate};
|
use frame_support::traits::fungibles::{Create, Inspect, Mutate};
|
||||||
use integration_tests_common::constants::accounts::{ALICE, BOB};
|
|
||||||
use polkadot_runtime_common::impls::VersionedLocatableAsset;
|
use polkadot_runtime_common::impls::VersionedLocatableAsset;
|
||||||
use xcm_executor::traits::ConvertLocation;
|
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 },
|
UnpaidExecution { weight_limit, check_origin },
|
||||||
ExportMessage {
|
ExportMessage {
|
||||||
network: RococoId,
|
network: RococoId,
|
||||||
destination: X1(Parachain(AssetHubRococo::para_id().into())),
|
destination: X1(Parachain(AssetHubWestend::para_id().into())),
|
||||||
xcm: remote_xcm,
|
xcm: remote_xcm,
|
||||||
},
|
},
|
||||||
]));
|
]));
|
||||||
+1
-1
@@ -18,7 +18,7 @@ use bridge_hub_westend_runtime::xcm_config::XcmConfig;
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn teleport_to_other_system_parachains_works() {
|
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();
|
let native_asset: MultiAssets = (Parent, amount).into();
|
||||||
|
|
||||||
test_parachain_is_trusted_teleporter!(
|
test_parachain_is_trusted_teleporter!(
|
||||||
+125
-109
@@ -170,30 +170,21 @@ pub trait Network {
|
|||||||
relay_parent_number: u32,
|
relay_parent_number: u32,
|
||||||
parent_head_data: HeadData,
|
parent_head_data: HeadData,
|
||||||
) -> ParachainInherentData;
|
) -> ParachainInherentData;
|
||||||
}
|
|
||||||
|
|
||||||
pub trait NetworkComponent {
|
|
||||||
type Network: Network;
|
|
||||||
|
|
||||||
fn send_horizontal_messages<I: Iterator<Item = (ParaId, RelayBlockNumber, Vec<u8>)>>(
|
fn send_horizontal_messages<I: Iterator<Item = (ParaId, RelayBlockNumber, Vec<u8>)>>(
|
||||||
to_para_id: u32,
|
to_para_id: u32,
|
||||||
iter: I,
|
iter: I,
|
||||||
) {
|
) {
|
||||||
HORIZONTAL_MESSAGES.with(|b| {
|
HORIZONTAL_MESSAGES.with(|b| {
|
||||||
b.borrow_mut()
|
b.borrow_mut()
|
||||||
.get_mut(Self::Network::name())
|
.get_mut(Self::name())
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.push_back((to_para_id, iter.collect()))
|
.push_back((to_para_id, iter.collect()))
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_upward_message(from_para_id: u32, msg: Vec<u8>) {
|
fn send_upward_message(from_para_id: u32, msg: Vec<u8>) {
|
||||||
UPWARD_MESSAGES.with(|b| {
|
UPWARD_MESSAGES
|
||||||
b.borrow_mut()
|
.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().push_back((from_para_id, msg)));
|
||||||
.get_mut(Self::Network::name())
|
|
||||||
.unwrap()
|
|
||||||
.push_back((from_para_id, msg))
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_downward_messages(
|
fn send_downward_messages(
|
||||||
@@ -202,19 +193,19 @@ pub trait NetworkComponent {
|
|||||||
) {
|
) {
|
||||||
DOWNWARD_MESSAGES.with(|b| {
|
DOWNWARD_MESSAGES.with(|b| {
|
||||||
b.borrow_mut()
|
b.borrow_mut()
|
||||||
.get_mut(Self::Network::name())
|
.get_mut(Self::name())
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.push_back((to_para_id, iter.collect()))
|
.push_back((to_para_id, iter.collect()))
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_bridged_messages(msg: BridgeMessage) {
|
fn send_bridged_messages(msg: BridgeMessage) {
|
||||||
BRIDGED_MESSAGES
|
BRIDGED_MESSAGES.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().push_back(msg));
|
||||||
.with(|b| b.borrow_mut().get_mut(Self::Network::name()).unwrap().push_back(msg));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub trait Chain: TestExt + NetworkComponent {
|
pub trait Chain: TestExt {
|
||||||
|
type Network: Network;
|
||||||
type Runtime: SystemConfig;
|
type Runtime: SystemConfig;
|
||||||
type RuntimeCall;
|
type RuntimeCall;
|
||||||
type RuntimeOrigin;
|
type RuntimeOrigin;
|
||||||
@@ -234,6 +225,8 @@ pub trait RelayChain: Chain {
|
|||||||
type SovereignAccountOf: ConvertLocation<AccountIdOf<Self::Runtime>>;
|
type SovereignAccountOf: ConvertLocation<AccountIdOf<Self::Runtime>>;
|
||||||
type MessageProcessor: ProcessMessage<Origin = ParaId> + ServiceQueues;
|
type MessageProcessor: ProcessMessage<Origin = ParaId> + ServiceQueues;
|
||||||
|
|
||||||
|
fn init();
|
||||||
|
|
||||||
fn child_location_of(id: ParaId) -> MultiLocation {
|
fn child_location_of(id: ParaId) -> MultiLocation {
|
||||||
(Ancestor(0), ParachainJunction(id.into())).into()
|
(Ancestor(0), ParachainJunction(id.into())).into()
|
||||||
}
|
}
|
||||||
@@ -348,7 +341,6 @@ macro_rules! decl_test_relay_chains {
|
|||||||
on_init = $on_init:expr,
|
on_init = $on_init:expr,
|
||||||
runtime = $runtime:ident,
|
runtime = $runtime:ident,
|
||||||
core = {
|
core = {
|
||||||
MessageProcessor: $mp:path,
|
|
||||||
SovereignAccountOf: $sovereign_acc_of:path,
|
SovereignAccountOf: $sovereign_acc_of:path,
|
||||||
},
|
},
|
||||||
pallets = {
|
pallets = {
|
||||||
@@ -361,9 +353,10 @@ macro_rules! decl_test_relay_chains {
|
|||||||
) => {
|
) => {
|
||||||
$(
|
$(
|
||||||
#[derive(Clone)]
|
#[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 Runtime = $runtime::Runtime;
|
||||||
type RuntimeCall = $runtime::RuntimeCall;
|
type RuntimeCall = $runtime::RuntimeCall;
|
||||||
type RuntimeOrigin = $runtime::RuntimeOrigin;
|
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 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! {
|
$crate::paste::paste! {
|
||||||
pub trait [<$name Pallet>] {
|
pub trait [<$name RelayPallet>] {
|
||||||
$(
|
$(
|
||||||
type $pallet_name;
|
type $pallet_name;
|
||||||
)?
|
)?
|
||||||
}
|
}
|
||||||
|
|
||||||
impl [<$name Pallet>] for $name {
|
impl<N: $crate::Network> [<$name RelayPallet>] for $name<N> {
|
||||||
$(
|
$(
|
||||||
type $pallet_name = $pallet_path;
|
type $pallet_name = $pallet_path;
|
||||||
)?
|
)?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$crate::__impl_test_ext_for_relay_chain!($name, $genesis, $on_init, $api_version);
|
$crate::__impl_test_ext_for_relay_chain!($name, N, $genesis, $on_init, $api_version);
|
||||||
$crate::__impl_check_assertion!($name);
|
$crate::__impl_check_assertion!($name, N);
|
||||||
)+
|
)+
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -410,10 +411,11 @@ macro_rules! decl_test_relay_chains {
|
|||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! __impl_test_ext_for_relay_chain {
|
macro_rules! __impl_test_ext_for_relay_chain {
|
||||||
// entry point: generate ext name
|
// 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::paste::paste! {
|
||||||
$crate::__impl_test_ext_for_relay_chain!(
|
$crate::__impl_test_ext_for_relay_chain!(
|
||||||
@impl $name,
|
@impl $name,
|
||||||
|
$network,
|
||||||
$genesis,
|
$genesis,
|
||||||
$on_init,
|
$on_init,
|
||||||
[<ParachainHostV $api_version>],
|
[<ParachainHostV $api_version>],
|
||||||
@@ -423,10 +425,10 @@ macro_rules! __impl_test_ext_for_relay_chain {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
// impl
|
// 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! {
|
thread_local! {
|
||||||
pub static $local_ext: $crate::RefCell<$crate::TestExternalities>
|
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! {
|
$crate::lazy_static! {
|
||||||
@@ -434,9 +436,9 @@ macro_rules! __impl_test_ext_for_relay_chain {
|
|||||||
= $crate::Mutex::new($crate::RefCell::new($crate::HashMap::new()));
|
= $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 {
|
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);
|
let mut ext = TestExternalities::new(storage);
|
||||||
|
|
||||||
@@ -453,7 +455,7 @@ macro_rules! __impl_test_ext_for_relay_chain {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn new_ext() -> $crate::TestExternalities {
|
fn new_ext() -> $crate::TestExternalities {
|
||||||
<$name>::build_new_ext($genesis)
|
Self::build_new_ext($genesis)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn move_ext_out(id: &'static str) {
|
fn move_ext_out(id: &'static str) {
|
||||||
@@ -504,13 +506,13 @@ macro_rules! __impl_test_ext_for_relay_chain {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn reset_ext() {
|
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 {
|
fn execute_with<R>(execute: impl FnOnce() -> R) -> R {
|
||||||
use $crate::{Chain, NetworkComponent, Network};
|
use $crate::{Chain, Network};
|
||||||
// Make sure the Network is initialized
|
// Make sure the Network is initialized
|
||||||
<$name as NetworkComponent>::Network::init();
|
<$network>::init();
|
||||||
|
|
||||||
// Execute
|
// Execute
|
||||||
let r = $local_ext.with(|v| v.borrow_mut().execute_with(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;
|
use $crate::polkadot_primitives::runtime_api::runtime_decl_for_parachain_host::$api_version;
|
||||||
|
|
||||||
//TODO: mark sent count & filter out sent msg
|
//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
|
// downward messages
|
||||||
let downward_messages = <Self as $crate::Chain>::Runtime::dmq_contents(para_id.into())
|
let downward_messages = <Self as $crate::Chain>::Runtime::dmq_contents(para_id.into())
|
||||||
.into_iter()
|
.into_iter()
|
||||||
@@ -529,7 +531,7 @@ macro_rules! __impl_test_ext_for_relay_chain {
|
|||||||
if downward_messages.len() == 0 {
|
if downward_messages.len() == 0 {
|
||||||
continue;
|
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
|
// Note: no need to handle horizontal messages, as the
|
||||||
// simulator directly sends them to dest (not relayed).
|
// 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
|
r
|
||||||
}
|
}
|
||||||
@@ -574,7 +576,7 @@ macro_rules! decl_test_parachains {
|
|||||||
XcmpMessageHandler: $xcmp_message_handler:path,
|
XcmpMessageHandler: $xcmp_message_handler:path,
|
||||||
LocationToAccountId: $location_to_account:path,
|
LocationToAccountId: $location_to_account:path,
|
||||||
ParachainInfo: $parachain_info:path,
|
ParachainInfo: $parachain_info:path,
|
||||||
MessageProcessor: $message_processor:path,
|
// MessageProcessor: $message_processor:path,
|
||||||
},
|
},
|
||||||
pallets = {
|
pallets = {
|
||||||
$($pallet_name:ident: $pallet_path:path,)*
|
$($pallet_name:ident: $pallet_path:path,)*
|
||||||
@@ -586,14 +588,15 @@ macro_rules! decl_test_parachains {
|
|||||||
) => {
|
) => {
|
||||||
$(
|
$(
|
||||||
#[derive(Clone)]
|
#[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 Runtime = $runtime::Runtime;
|
||||||
type RuntimeCall = $runtime::RuntimeCall;
|
type RuntimeCall = $runtime::RuntimeCall;
|
||||||
type RuntimeOrigin = $runtime::RuntimeOrigin;
|
type RuntimeOrigin = $runtime::RuntimeOrigin;
|
||||||
type RuntimeEvent = $runtime::RuntimeEvent;
|
type RuntimeEvent = $runtime::RuntimeEvent;
|
||||||
type System = $crate::SystemPallet::<Self::Runtime>;
|
type System = $crate::SystemPallet::<Self::Runtime>;
|
||||||
|
type Network = N;
|
||||||
|
|
||||||
fn account_data_of(account: $crate::AccountIdOf<Self::Runtime>) -> $crate::AccountData<$crate::Balance> {
|
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())
|
<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 XcmpMessageHandler = $xcmp_message_handler;
|
||||||
type LocationToAccountId = $location_to_account;
|
type LocationToAccountId = $location_to_account;
|
||||||
type ParachainSystem = $crate::ParachainSystemPallet<<Self as $crate::Chain>::Runtime>;
|
type ParachainSystem = $crate::ParachainSystemPallet<<Self as $crate::Chain>::Runtime>;
|
||||||
type ParachainInfo = $parachain_info;
|
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
|
// We run an empty block during initialisation to open HRMP channels
|
||||||
// and have them ready for the next block
|
// and have them ready for the next block
|
||||||
fn init() {
|
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
|
// Set the last block head for later use in the next block
|
||||||
Self::set_last_head();
|
Self::set_last_head();
|
||||||
// Initialize a new block
|
// Initialize a new block
|
||||||
@@ -627,21 +634,21 @@ macro_rules! decl_test_parachains {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn new_block() {
|
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();
|
let para_id = Self::para_id().into();
|
||||||
|
|
||||||
Self::ext_wrapper(|| {
|
Self::ext_wrapper(|| {
|
||||||
// Increase Relay Chain block number
|
// 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;
|
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
|
// Initialize a new Parachain block
|
||||||
let mut block_number = <Self as Chain>::System::block_number();
|
let mut block_number = <Self as Chain>::System::block_number();
|
||||||
block_number += 1;
|
block_number += 1;
|
||||||
let parent_head_data = $crate::LAST_HEAD.with(|b| b.borrow_mut()
|
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?")
|
.expect("network not initialized?")
|
||||||
.get(¶_id)
|
.get(¶_id)
|
||||||
.expect("network not initialized?")
|
.expect("network not initialized?")
|
||||||
@@ -652,13 +659,13 @@ macro_rules! decl_test_parachains {
|
|||||||
|
|
||||||
let _ = <Self as Parachain>::ParachainSystem::set_validation_data(
|
let _ = <Self as Parachain>::ParachainSystem::set_validation_data(
|
||||||
<Self as Chain>::RuntimeOrigin::none(),
|
<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() {
|
fn finalize_block() {
|
||||||
use $crate::{Chain, Encode, Hooks, Network, NetworkComponent, Parachain, TestExt};
|
use $crate::{Chain, Encode, Hooks, Network, Parachain, TestExt};
|
||||||
|
|
||||||
Self::ext_wrapper(|| {
|
Self::ext_wrapper(|| {
|
||||||
let block_number = <Self as Chain>::System::block_number();
|
let block_number = <Self as Chain>::System::block_number();
|
||||||
@@ -670,7 +677,7 @@ macro_rules! decl_test_parachains {
|
|||||||
|
|
||||||
|
|
||||||
fn set_last_head() {
|
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();
|
let para_id = Self::para_id().into();
|
||||||
|
|
||||||
@@ -678,7 +685,7 @@ macro_rules! decl_test_parachains {
|
|||||||
// Store parent head data for use later.
|
// Store parent head data for use later.
|
||||||
let created_header = <Self as Chain>::System::finalize();
|
let created_header = <Self as Chain>::System::finalize();
|
||||||
$crate::LAST_HEAD.with(|b| b.borrow_mut()
|
$crate::LAST_HEAD.with(|b| b.borrow_mut()
|
||||||
.get_mut(<Self as NetworkComponent>::Network::name())
|
.get_mut(N::name())
|
||||||
.expect("network not initialized?")
|
.expect("network not initialized?")
|
||||||
.insert(para_id, HeadData(created_header.encode()))
|
.insert(para_id, HeadData(created_header.encode()))
|
||||||
);
|
);
|
||||||
@@ -687,21 +694,21 @@ macro_rules! decl_test_parachains {
|
|||||||
}
|
}
|
||||||
|
|
||||||
$crate::paste::paste! {
|
$crate::paste::paste! {
|
||||||
pub trait [<$name Pallet>] {
|
pub trait [<$name ParaPallet>] {
|
||||||
$(
|
$(
|
||||||
type $pallet_name;
|
type $pallet_name;
|
||||||
)*
|
)*
|
||||||
}
|
}
|
||||||
|
|
||||||
impl [<$name Pallet>] for $name {
|
impl<N: $crate::Network> [<$name ParaPallet>] for $name<N> {
|
||||||
$(
|
$(
|
||||||
type $pallet_name = $pallet_path;
|
type $pallet_name = $pallet_path;
|
||||||
)*
|
)*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$crate::__impl_test_ext_for_parachain!($name, $genesis, $on_init);
|
$crate::__impl_test_ext_for_parachain!($name, N, $genesis, $on_init);
|
||||||
$crate::__impl_check_assertion!($name);
|
$crate::__impl_check_assertion!($name, N);
|
||||||
)+
|
)+
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -709,16 +716,16 @@ macro_rules! decl_test_parachains {
|
|||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! __impl_test_ext_for_parachain {
|
macro_rules! __impl_test_ext_for_parachain {
|
||||||
// entry point: generate ext name
|
// 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::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
|
||||||
(@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! {
|
thread_local! {
|
||||||
pub static $local_ext: $crate::RefCell<$crate::TestExternalities>
|
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! {
|
$crate::lazy_static! {
|
||||||
@@ -726,7 +733,7 @@ macro_rules! __impl_test_ext_for_parachain {
|
|||||||
= $crate::Mutex::new($crate::RefCell::new($crate::HashMap::new()));
|
= $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 {
|
fn build_new_ext(storage: $crate::Storage) -> $crate::TestExternalities {
|
||||||
let mut ext = $crate::TestExternalities::new(storage);
|
let mut ext = $crate::TestExternalities::new(storage);
|
||||||
|
|
||||||
@@ -743,7 +750,7 @@ macro_rules! __impl_test_ext_for_parachain {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn new_ext() -> $crate::TestExternalities {
|
fn new_ext() -> $crate::TestExternalities {
|
||||||
<$name>::build_new_ext($genesis)
|
Self::build_new_ext($genesis)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn move_ext_out(id: &'static str) {
|
fn move_ext_out(id: &'static str) {
|
||||||
@@ -794,14 +801,14 @@ macro_rules! __impl_test_ext_for_parachain {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn reset_ext() {
|
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 {
|
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
|
// Make sure the Network is initialized
|
||||||
<$name as NetworkComponent>::Network::init();
|
<$network>::init();
|
||||||
|
|
||||||
// Initialize a new block
|
// Initialize a new block
|
||||||
Self::new_block();
|
Self::new_block();
|
||||||
@@ -812,7 +819,7 @@ macro_rules! __impl_test_ext_for_parachain {
|
|||||||
// Finalize the block
|
// Finalize the block
|
||||||
Self::finalize_block();
|
Self::finalize_block();
|
||||||
|
|
||||||
let para_id = <$name>::para_id().into();
|
let para_id = Self::para_id().into();
|
||||||
|
|
||||||
// Send messages if needed
|
// Send messages if needed
|
||||||
$local_ext.with(|v| {
|
$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);
|
let collation_info = <Self as Parachain>::ParachainSystem::collect_collation_info(&mock_header);
|
||||||
|
|
||||||
// send upward messages
|
// 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() {
|
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
|
// send horizontal messages
|
||||||
for msg in collation_info.horizontal_messages {
|
for msg in collation_info.horizontal_messages {
|
||||||
<$name>::send_horizontal_messages(
|
<$network>::send_horizontal_messages(
|
||||||
msg.recipient.into(),
|
msg.recipient.into(),
|
||||||
vec![(para_id.into(), relay_block_number, msg.data)].into_iter(),
|
vec![(para_id.into(), relay_block_number, msg.data)].into_iter(),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// get bridge messages
|
// 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
|
// send bridged messages
|
||||||
for msg in bridge_messages {
|
for msg in bridge_messages {
|
||||||
<$name>::send_bridged_messages(msg);
|
<$network>::send_bridged_messages(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
// log events
|
// log events
|
||||||
@@ -864,7 +871,7 @@ macro_rules! __impl_test_ext_for_parachain {
|
|||||||
// provide inbound DMP/HRMP messages through a side-channel.
|
// provide inbound DMP/HRMP messages through a side-channel.
|
||||||
// normally this would come through the `set_validation_data`,
|
// normally this would come through the `set_validation_data`,
|
||||||
// but we go around that.
|
// but we go around that.
|
||||||
<$name as NetworkComponent>::Network::process_messages();
|
<$network>::process_messages();
|
||||||
|
|
||||||
r
|
r
|
||||||
}
|
}
|
||||||
@@ -886,8 +893,8 @@ macro_rules! decl_test_networks {
|
|||||||
(
|
(
|
||||||
$(
|
$(
|
||||||
pub struct $name:ident {
|
pub struct $name:ident {
|
||||||
relay_chain = $relay_chain:ty,
|
relay_chain = $relay_chain:ident,
|
||||||
parachains = vec![ $( $parachain:ty, )* ],
|
parachains = vec![ $( $parachain:ident, )* ],
|
||||||
bridge = $bridge:ty
|
bridge = $bridge:ty
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
@@ -895,10 +902,11 @@ macro_rules! decl_test_networks {
|
|||||||
$(,)?
|
$(,)?
|
||||||
) => {
|
) => {
|
||||||
$(
|
$(
|
||||||
|
#[derive(Clone)]
|
||||||
pub struct $name;
|
pub struct $name;
|
||||||
|
|
||||||
impl $crate::Network for $name {
|
impl $crate::Network for $name {
|
||||||
type Relay = $relay_chain;
|
type Relay = $relay_chain<Self>;
|
||||||
type Bridge = $bridge;
|
type Bridge = $bridge;
|
||||||
|
|
||||||
fn name() -> &'static str {
|
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::BRIDGED_MESSAGES.with(|b| b.borrow_mut().remove(Self::name()));
|
||||||
$crate::LAST_HEAD.with(|b| b.borrow_mut().remove(Self::name()));
|
$crate::LAST_HEAD.with(|b| b.borrow_mut().remove(Self::name()));
|
||||||
|
|
||||||
<$relay_chain>::reset_ext();
|
<$relay_chain<Self>>::reset_ext();
|
||||||
$( <$parachain>::reset_ext(); )*
|
$( <$parachain<Self>>::reset_ext(); )*
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init() {
|
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::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()));
|
$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> {
|
fn para_ids() -> Vec<u32> {
|
||||||
vec![$(
|
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))
|
while let Some((to_para_id, messages))
|
||||||
= $crate::DOWNWARD_MESSAGES.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().pop_front()) {
|
= $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 {
|
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();
|
let mut msg_dedup: Vec<(RelayChainBlockNumber, Vec<u8>)> = Vec::new();
|
||||||
@@ -986,21 +995,21 @@ macro_rules! decl_test_networks {
|
|||||||
msg_dedup.dedup();
|
msg_dedup.dedup();
|
||||||
|
|
||||||
let msgs = msg_dedup.clone().into_iter().filter(|m| {
|
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())
|
.unwrap_or(&mut $crate::VecDeque::new())
|
||||||
.contains(&(to_para_id, m.0, m.1.clone()))
|
.contains(&(to_para_id, m.0, m.1.clone()))
|
||||||
)
|
)
|
||||||
}).collect::<Vec<(RelayChainBlockNumber, Vec<u8>)>>();
|
}).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() {
|
for (block, msg) in msgs.clone().into_iter() {
|
||||||
let mut weight_meter = WeightMeter::new();
|
let mut weight_meter = WeightMeter::new();
|
||||||
<$parachain>::ext_wrapper(|| {
|
<$parachain<Self>>::ext_wrapper(|| {
|
||||||
let _ = <$parachain as Parachain>::MessageProcessor::process_message(
|
let _ = <$parachain<Self> as Parachain>::MessageProcessor::process_message(
|
||||||
&msg[..],
|
&msg[..],
|
||||||
$crate::CumulusAggregateMessageOrigin::Parent,
|
$crate::CumulusAggregateMessageOrigin::Parent,
|
||||||
&mut weight_meter,
|
&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);
|
$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() {
|
fn process_horizontal_messages() {
|
||||||
use $crate::{XcmpMessageHandler, ServiceQueues, Bounded};
|
use $crate::{XcmpMessageHandler, ServiceQueues, Bounded, Parachain, TestExt};
|
||||||
|
|
||||||
while let Some((to_para_id, messages))
|
while let Some((to_para_id, messages))
|
||||||
= $crate::HORIZONTAL_MESSAGES.with(|b| b.borrow_mut().get_mut(Self::name()).unwrap().pop_front()) {
|
= $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 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 {
|
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<Self>>::ext_wrapper(|| {
|
||||||
<$parachain as Parachain>::XcmpMessageHandler::handle_xcmp_messages(iter.clone(), $crate::Weight::MAX);
|
<$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.
|
// 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);
|
$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()) {
|
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();
|
let mut weight_meter = WeightMeter::new();
|
||||||
<$relay_chain>::ext_wrapper(|| {
|
<$relay_chain<Self>>::ext_wrapper(|| {
|
||||||
let _ = <$relay_chain as $crate::RelayChain>::MessageProcessor::process_message(
|
let _ = <$relay_chain<Self> as $crate::RelayChain>::MessageProcessor::process_message(
|
||||||
&msg[..],
|
&msg[..],
|
||||||
from_para_id.into(),
|
from_para_id.into(),
|
||||||
&mut weight_meter,
|
&mut weight_meter,
|
||||||
@@ -1121,13 +1130,13 @@ macro_rules! decl_test_networks {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl $crate::NetworkComponent for $relay_chain {
|
$crate::paste::paste! {
|
||||||
type Network = $name;
|
pub type [<$relay_chain Relay>] = $relay_chain<$name>;
|
||||||
}
|
}
|
||||||
|
|
||||||
$(
|
$(
|
||||||
impl $crate::NetworkComponent for $parachain {
|
$crate::paste::paste! {
|
||||||
type Network = $name;
|
pub type [<$parachain Para>] = $parachain<$name>;
|
||||||
}
|
}
|
||||||
)*
|
)*
|
||||||
)+
|
)+
|
||||||
@@ -1139,9 +1148,9 @@ macro_rules! decl_test_bridges {
|
|||||||
(
|
(
|
||||||
$(
|
$(
|
||||||
pub struct $name:ident {
|
pub struct $name:ident {
|
||||||
source = $source:ty,
|
source = $source:ident,
|
||||||
target = $target:ty,
|
target = $target:ident,
|
||||||
handler = $handler:ty
|
handler = $handler:ident
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
+
|
+
|
||||||
@@ -1157,10 +1166,10 @@ macro_rules! decl_test_bridges {
|
|||||||
type Handler = $handler;
|
type Handler = $handler;
|
||||||
|
|
||||||
fn init() {
|
fn init() {
|
||||||
use $crate::{NetworkComponent, Network};
|
use $crate::{Network, Parachain};
|
||||||
// Make sure source and target `Network` have been initialized
|
// Make sure source and target `Network` have been initialized
|
||||||
<$source as NetworkComponent>::Network::init();
|
<$source as Chain>::Network::init();
|
||||||
<$target as NetworkComponent>::Network::init();
|
<$target as Chain>::Network::init();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
)+
|
)+
|
||||||
@@ -1169,10 +1178,11 @@ macro_rules! decl_test_bridges {
|
|||||||
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! __impl_check_assertion {
|
macro_rules! __impl_check_assertion {
|
||||||
($chain:ident) => {
|
($chain:ident, $network:ident) => {
|
||||||
impl<Origin, Destination, Hops, Args>
|
impl<$network, Origin, Destination, Hops, Args>
|
||||||
$crate::CheckAssertion<Origin, Destination, Hops, Args> for $chain
|
$crate::CheckAssertion<Origin, Destination, Hops, Args> for $chain<$network>
|
||||||
where
|
where
|
||||||
|
$network: $crate::Network,
|
||||||
Origin: $crate::Chain + Clone,
|
Origin: $crate::Chain + Clone,
|
||||||
Destination: $crate::Chain + Clone,
|
Destination: $crate::Chain + Clone,
|
||||||
Origin::RuntimeOrigin:
|
Origin::RuntimeOrigin:
|
||||||
@@ -1185,9 +1195,9 @@ macro_rules! __impl_check_assertion {
|
|||||||
fn check_assertion(test: $crate::Test<Origin, Destination, Hops, Args>) {
|
fn check_assertion(test: $crate::Test<Origin, Destination, Hops, Args>) {
|
||||||
use $crate::TestExt;
|
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) {
|
if let Some(dispatchable) = test.hops_dispatchable.get(chain_name) {
|
||||||
$crate::assert_ok!(dispatchable(test.clone()));
|
$crate::assert_ok!(dispatchable(test.clone()));
|
||||||
}
|
}
|
||||||
@@ -1213,7 +1223,6 @@ macro_rules! assert_expected_events {
|
|||||||
let mut event_message: Vec<String> = Vec::new();
|
let mut event_message: Vec<String> = Vec::new();
|
||||||
|
|
||||||
for (index, event) in events.iter().enumerate() {
|
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
|
// Have to reset the variable to override a previous partial match
|
||||||
meet_conditions = true;
|
meet_conditions = true;
|
||||||
match event {
|
match event {
|
||||||
@@ -1259,7 +1268,14 @@ macro_rules! assert_expected_events {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
} else if !event_received {
|
} 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 {
|
} else {
|
||||||
// If we find a perfect match we remove the event to avoid being potentially assessed multiple times
|
// If we find a perfect match we remove the event to avoid being potentially assessed multiple times
|
||||||
events.remove(index_match);
|
events.remove(index_match);
|
||||||
|
|||||||
Reference in New Issue
Block a user