diff --git a/Cargo.lock b/Cargo.lock index 238e680f86061..ee8045dc824f2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1996,6 +1996,7 @@ dependencies = [ "emulated-integration-tests-common", "frame-support", "hex-literal", +<<<<<<< HEAD "pallet-asset-conversion", "pallet-assets", "pallet-balances", @@ -2004,6 +2005,15 @@ dependencies = [ "pallet-xcm", "pallet-xcm-bridge-hub", "parachains-common", +======= + "pallet-asset-conversion 10.0.0", + "pallet-assets 29.1.0", + "pallet-balances 28.0.0", + "pallet-bridge-messages 0.7.0", + "pallet-message-queue 31.0.0", + "pallet-xcm 7.0.0", + "parachains-common 7.0.0", +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) "parity-scale-codec", "rococo-system-emulated-network", "rococo-westend-system-emulated-network", @@ -2126,6 +2136,7 @@ dependencies = [ name = "bridge-hub-test-utils" version = "0.17.0" dependencies = [ +<<<<<<< HEAD "asset-test-utils", "bp-header-chain", "bp-messages", @@ -2138,6 +2149,20 @@ dependencies = [ "cumulus-pallet-xcmp-queue", "frame-support", "frame-system", +======= + "asset-test-utils 7.0.0", + "bp-header-chain 0.7.0", + "bp-messages 0.7.0", + "bp-parachains 0.7.0", + "bp-polkadot-core 0.7.0", + "bp-relayers 0.7.0", + "bp-runtime 0.7.0", + "bp-test-utils 0.7.0", + "cumulus-pallet-parachain-system 0.7.0", + "cumulus-pallet-xcmp-queue 0.7.0", + "frame-support 28.0.0", + "frame-system 28.0.0", +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) "impl-trait-for-tuples", "log", "pallet-balances", @@ -2150,6 +2175,7 @@ dependencies = [ "parachains-common", "parachains-runtimes-test-utils", "parity-scale-codec", +<<<<<<< HEAD "sp-core", "sp-io", "sp-keyring", @@ -2158,6 +2184,61 @@ dependencies = [ "staging-xcm", "staging-xcm-builder", "staging-xcm-executor", +======= + "sp-core 28.0.0", + "sp-io 30.0.0", + "sp-keyring 31.0.0", + "sp-runtime 31.0.1", + "sp-std 14.0.0", + "sp-tracing 16.0.0", + "staging-xcm 7.0.0", + "staging-xcm-builder 7.0.0", + "staging-xcm-executor 7.0.0", +] + +[[package]] +name = "bridge-hub-test-utils" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0b3aa5fd8481a06ca16e47fd3d2d9c6abe76b27d922ec8980a853f242173b3" +dependencies = [ + "asset-test-utils 18.0.0", + "bp-header-chain 0.18.1", + "bp-messages 0.18.0", + "bp-parachains 0.18.0", + "bp-polkadot-core 0.18.0", + "bp-relayers 0.18.0", + "bp-runtime 0.18.0", + "bp-test-utils 0.18.0", + "bp-xcm-bridge-hub 0.4.0", + "bridge-runtime-common 0.18.0", + "cumulus-pallet-parachain-system 0.17.1", + "cumulus-pallet-xcmp-queue 0.17.0", + "frame-support 38.0.0", + "frame-system 38.0.0", + "impl-trait-for-tuples", + "log", + "pallet-balances 39.0.0", + "pallet-bridge-grandpa 0.18.0", + "pallet-bridge-messages 0.18.0", + "pallet-bridge-parachains 0.18.0", + "pallet-bridge-relayers 0.18.0", + "pallet-timestamp 37.0.0", + "pallet-utility 38.0.0", + "pallet-xcm 17.0.0", + "pallet-xcm-bridge-hub 0.13.0", + "parachains-common 18.0.0", + "parachains-runtimes-test-utils 17.0.0", + "parity-scale-codec", + "sp-core 34.0.0", + "sp-io 38.0.0", + "sp-keyring 39.0.0", + "sp-runtime 39.0.2", + "sp-tracing 17.0.1", + "staging-xcm 14.2.0", + "staging-xcm-builder 17.0.1", + "staging-xcm-executor 17.0.0", +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) ] [[package]] @@ -2181,6 +2262,7 @@ dependencies = [ "emulated-integration-tests-common", "frame-support", "hex-literal", +<<<<<<< HEAD "pallet-asset-conversion", "pallet-assets", "pallet-balances", @@ -2189,6 +2271,17 @@ dependencies = [ "pallet-xcm", "pallet-xcm-bridge-hub", "parachains-common", +======= + "log", + "pallet-asset-conversion 10.0.0", + "pallet-assets 29.1.0", + "pallet-balances 28.0.0", + "pallet-bridge-messages 0.7.0", + "pallet-message-queue 31.0.0", + "pallet-xcm 7.0.0", + "parachains-common 7.0.0", + "parity-scale-codec", +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) "rococo-westend-system-emulated-network", "sp-core", "sp-runtime", diff --git a/bridges/modules/xcm-bridge-hub/src/lib.rs b/bridges/modules/xcm-bridge-hub/src/lib.rs index 60b988497fc59..b4c2543421e71 100644 --- a/bridges/modules/xcm-bridge-hub/src/lib.rs +++ b/bridges/modules/xcm-bridge-hub/src/lib.rs @@ -19,8 +19,22 @@ #![warn(missing_docs)] #![cfg_attr(not(feature = "std"), no_std)] +<<<<<<< HEAD use bridge_runtime_common::messages_xcm_extension::XcmBlobHauler; use pallet_bridge_messages::Config as BridgeMessagesConfig; +======= +use bp_messages::{LaneState, MessageNonce}; +use bp_runtime::{AccountIdOf, BalanceOf, RangeInclusiveExt}; +use bp_xcm_bridge_hub::BridgeLocationsError; +pub use bp_xcm_bridge_hub::{ + Bridge, BridgeId, BridgeLocations, BridgeState, LocalXcmChannelManager, +}; +use frame_support::{traits::fungible::MutateHold, DefaultNoBound}; +use frame_system::Config as SystemConfig; +use pallet_bridge_messages::{Config as BridgeMessagesConfig, LanesManagerError}; +use sp_runtime::traits::Zero; +use sp_std::{boxed::Box, vec::Vec}; +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) use xcm::prelude::*; pub use exporter::PalletAsHaulBlobExporter; diff --git a/cumulus/pallets/xcmp-queue/src/bridging.rs b/cumulus/pallets/xcmp-queue/src/bridging.rs index eff4a37b0cef7..622e698546a43 100644 --- a/cumulus/pallets/xcmp-queue/src/bridging.rs +++ b/cumulus/pallets/xcmp-queue/src/bridging.rs @@ -42,6 +42,7 @@ impl, Runtime: crate::Config> } } +<<<<<<< HEAD /// Adapter implementation for `bp_xcm_bridge_hub_router::XcmChannelStatusProvider` which checks /// only `OutboundXcmpStatus` for defined `SiblingParaId` if is suspended. pub struct OutXcmpChannelStatusProvider( @@ -53,6 +54,19 @@ impl, Runtime: crate::Config> { fn is_congested() -> bool { let sibling_bridge_hub_id: ParaId = SiblingBridgeHubParaId::get(); +======= +/// Adapter implementation for `bp_xcm_bridge::ChannelStatusProvider` and/or +/// `bp_xcm_bridge_hub_router::XcmChannelStatusProvider` which checks only `OutboundXcmpStatus` +/// for defined `Location` if is suspended. +pub struct OutXcmpChannelStatusProvider(core::marker::PhantomData); +impl OutXcmpChannelStatusProvider { + fn is_congested(with: &Location) -> bool { + // handle congestion only for a sibling parachain locations. + let sibling_para_id: ParaId = match with.unpack() { + (_, [Parachain(para_id)]) => (*para_id).into(), + _ => return false, + }; +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) // let's find the channel's state with the sibling parachain, let Some((outbound_state, queued_pages)) = @@ -84,6 +98,14 @@ impl, Runtime: crate::Config> } } +impl bp_xcm_bridge_hub_router::XcmChannelStatusProvider + for OutXcmpChannelStatusProvider +{ + fn is_congested(with: &Location) -> bool { + Self::is_congested(with) + } +} + #[cfg(feature = "runtime-benchmarks")] pub fn suspend_channel_for_benchmarks(target: ParaId) { pallet::Pallet::::suspend_channel(target) diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml index 34eec8ea1ee06..35d2ec22e9e82 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/Cargo.toml @@ -13,6 +13,7 @@ workspace = true [dependencies] codec = { workspace = true } scale-info = { features = ["derive"], workspace = true } +<<<<<<< HEAD hex-literal = { workspace = true, default-features = true } sp-core.workspace = true frame-support.workspace = true @@ -41,3 +42,38 @@ snowbridge-pallet-system.workspace = true snowbridge-pallet-outbound-queue.workspace = true snowbridge-pallet-inbound-queue-fixtures.workspace = true snowbridge-pallet-inbound-queue-fixtures.default-features = true +======= + +# Substrate +frame-support = { workspace = true } +pallet-asset-conversion = { workspace = true } +pallet-assets = { workspace = true } +pallet-balances = { workspace = true } +pallet-message-queue = { workspace = true, default-features = true } +sp-core = { workspace = true } +sp-runtime = { workspace = true } + +# Polkadot +pallet-xcm = { workspace = true } +xcm = { workspace = true } +xcm-executor = { workspace = true } +xcm-runtime-apis = { workspace = true } + +# Bridges +pallet-bridge-messages = { workspace = true } + +# Cumulus +cumulus-pallet-xcmp-queue = { workspace = true } +emulated-integration-tests-common = { workspace = true } +parachains-common = { workspace = true, default-features = true } +rococo-system-emulated-network = { workspace = true } +rococo-westend-system-emulated-network = { workspace = true } +testnet-parachains-constants = { features = ["rococo", "westend"], workspace = true, default-features = true } + +# Snowbridge +snowbridge-core = { workspace = true } +snowbridge-pallet-inbound-queue-fixtures = { workspace = true, default-features = true } +snowbridge-pallet-outbound-queue = { workspace = true } +snowbridge-pallet-system = { workspace = true } +snowbridge-router-primitives = { workspace = true } +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml index e23247adad515..da16a67a87dfc 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-westend/Cargo.toml @@ -12,6 +12,7 @@ workspace = true [dependencies] hex-literal = { workspace = true, default-features = true } +<<<<<<< HEAD frame-support.workspace = true pallet-assets.workspace = true pallet-asset-conversion.workspace = true @@ -31,3 +32,42 @@ emulated-integration-tests-common.workspace = true parachains-common.workspace = true parachains-common.default-features = true rococo-westend-system-emulated-network.workspace = true +======= +log = { workspace = true } +scale-info = { workspace = true } + +# Substrate +frame-support = { workspace = true } +pallet-asset-conversion = { workspace = true } +pallet-assets = { workspace = true } +pallet-balances = { workspace = true } +pallet-message-queue = { workspace = true, default-features = true } +sp-core = { workspace = true } +sp-runtime = { workspace = true } + +# Polkadot +pallet-xcm = { workspace = true } +xcm = { workspace = true } +xcm-executor = { workspace = true } +xcm-runtime-apis = { workspace = true } + +# Bridges +pallet-bridge-messages = { workspace = true } + +# Cumulus +asset-hub-westend-runtime = { workspace = true } +bridge-hub-westend-runtime = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +emulated-integration-tests-common = { workspace = true } +parachains-common = { workspace = true, default-features = true } +rococo-westend-system-emulated-network = { workspace = true } +testnet-parachains-constants = { features = ["rococo", "westend"], workspace = true, default-features = true } + +# Snowbridge +snowbridge-core = { workspace = true } +snowbridge-pallet-inbound-queue = { workspace = true } +snowbridge-pallet-inbound-queue-fixtures = { workspace = true } +snowbridge-pallet-outbound-queue = { workspace = true } +snowbridge-pallet-system = { workspace = true } +snowbridge-router-primitives = { workspace = true } +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml index b550140b70387..ce044f4aa5bf0 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/Cargo.toml @@ -13,6 +13,7 @@ workspace = true codec = { features = ["derive", "max-encoded-len"], workspace = true } impl-trait-for-tuples = { workspace = true } log = { workspace = true } +<<<<<<< HEAD frame-support.workspace = true frame-system.workspace = true sp-core.workspace = true @@ -42,6 +43,44 @@ bp-runtime.workspace = true bp-test-utils.workspace = true pallet-bridge-grandpa.workspace = true pallet-bridge-parachains.workspace = true +======= + +# Substrate +frame-support = { workspace = true } +frame-system = { workspace = true } +pallet-balances = { workspace = true } +pallet-timestamp = { workspace = true } +pallet-utility = { workspace = true } +sp-core = { workspace = true } +sp-io = { workspace = true } +sp-keyring = { workspace = true, default-features = true } +sp-runtime = { workspace = true } +sp-std = { workspace = true } +sp-tracing = { workspace = true, default-features = true } + +# Cumulus +asset-test-utils = { workspace = true, default-features = true } +cumulus-pallet-parachain-system = { workspace = true } +cumulus-pallet-xcmp-queue = { workspace = true } +parachains-common = { workspace = true } +parachains-runtimes-test-utils = { workspace = true } + +# Polkadot +pallet-xcm = { workspace = true } +xcm = { workspace = true } +xcm-builder = { workspace = true } +xcm-executor = { workspace = true } + +# Bridges +bp-header-chain = { workspace = true } +bp-messages = { workspace = true } +bp-parachains = { workspace = true } +bp-polkadot-core = { workspace = true } +bp-relayers = { workspace = true } +bp-runtime = { workspace = true } +bp-test-utils = { workspace = true } +pallet-bridge-grandpa = { workspace = true } +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) pallet-bridge-messages = { features = ["test-helpers"], workspace = true } pallet-bridge-relayers.workspace = true bridge-runtime-common.workspace = true @@ -56,7 +95,10 @@ std = [ "bp-relayers/std", "bp-runtime/std", "bp-test-utils/std", +<<<<<<< HEAD "bridge-runtime-common/std", +======= +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) "codec/std", "cumulus-pallet-parachain-system/std", "cumulus-pallet-xcmp-queue/std", @@ -75,6 +117,7 @@ std = [ "sp-core/std", "sp-io/std", "sp-runtime/std", + "sp-std/std", "xcm-builder/std", "xcm-executor/std", "xcm/std", diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs index 0b3463f0df974..c9336ae937f01 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/lib.rs @@ -24,6 +24,12 @@ extern crate alloc; pub use bp_test_utils::test_header; pub use parachains_runtimes_test_utils::*; use sp_runtime::Perbill; +<<<<<<< HEAD +======= +pub use test_cases::helpers::for_pallet_xcm_bridge_hub::{ + ensure_opened_bridge, open_bridge_with_extrinsic, open_bridge_with_storage, +}; +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) /// A helper function for comparing the actual value of a fee constant with its estimated value. The /// estimated value can be overestimated (`overestimate_in_percent`), and if the difference to the diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs index d6dfa93731a7d..7a26a33d5665f 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_grandpa_chain.rs @@ -20,13 +20,17 @@ use crate::{ test_cases::{bridges_prelude::*, helpers, run_test}, test_data, + test_data::XcmAsPlainPayload, }; use alloc::{boxed::Box, vec}; use bp_header_chain::ChainWithGrandpa; use bp_messages::{LaneId, UnrewardedRelayersState}; use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; +<<<<<<< HEAD use bridge_runtime_common::messages_xcm_extension::XcmAsPlainPayload; +======= +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) use frame_support::traits::{OnFinalize, OnInitialize}; use frame_system::pallet_prelude::BlockNumberFor; use pallet_bridge_messages::{BridgedChainOf, ThisChainOf}; diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs index 728b4e76b1055..24a6af89508a5 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/from_parachain.rs @@ -20,6 +20,7 @@ use crate::{ test_cases::{bridges_prelude::*, helpers, run_test}, test_data, + test_data::XcmAsPlainPayload, }; use alloc::{boxed::Box, vec}; @@ -28,7 +29,10 @@ use bp_messages::{LaneId, UnrewardedRelayersState}; use bp_polkadot_core::parachains::ParaHash; use bp_relayers::{RewardsAccountOwner, RewardsAccountParams}; use bp_runtime::{Chain, Parachain}; +<<<<<<< HEAD use bridge_runtime_common::messages_xcm_extension::XcmAsPlainPayload; +======= +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) use frame_support::traits::{OnFinalize, OnInitialize}; use frame_system::pallet_prelude::BlockNumberFor; use pallet_bridge_messages::{BridgedChainOf, ThisChainOf}; diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs index 78b8a170f0d4b..8bf9ea643bdbd 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/helpers.rs @@ -22,6 +22,10 @@ use asset_test_utils::BasicParachainRuntime; use bp_messages::{LaneId, MessageNonce}; use bp_polkadot_core::parachains::{ParaHash, ParaId}; use bp_relayers::RewardsAccountParams; +<<<<<<< HEAD +======= +use bp_runtime::Chain; +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) use codec::Decode; use core::marker::PhantomData; use frame_support::{ @@ -378,3 +382,214 @@ fn execute_and_verify_calls( verifier.verify_outcome(); } } +<<<<<<< HEAD +======= + +pub(crate) mod for_pallet_xcm_bridge_hub { + use super::{super::for_pallet_xcm_bridge_hub::*, *}; + + /// Helper function to open the bridge/lane for `source` and `destination` while ensuring all + /// required balances are placed into the SA of the source. + pub fn ensure_opened_bridge< + Runtime, + XcmOverBridgePalletInstance, + LocationToAccountId, + TokenLocation> + (source: Location, destination: InteriorLocation, is_paid_xcm_execution: bool, bridge_opener: impl Fn(pallet_xcm_bridge_hub::BridgeLocations, Option)) -> (pallet_xcm_bridge_hub::BridgeLocations, pallet_xcm_bridge_hub::LaneIdOf) + where + Runtime: BasicParachainRuntime + BridgeXcmOverBridgeConfig, + XcmOverBridgePalletInstance: 'static, + ::RuntimeCall: GetDispatchInfo + From>, + ::Balance: From<<>::BridgeMessagesPalletInstance>>::ThisChain as bp_runtime::Chain>::Balance>, + ::Balance: From, + LocationToAccountId: ConvertLocation>, + TokenLocation: Get + { + // construct expected bridge configuration + let locations = + pallet_xcm_bridge_hub::Pallet::::bridge_locations( + source.clone().into(), + destination.clone().into(), + ) + .expect("valid bridge locations"); + assert!(pallet_xcm_bridge_hub::Bridges::::get( + locations.bridge_id() + ) + .is_none()); + + // SA of source location needs to have some required balance + if !>::AllowWithoutBridgeDeposit::contains(&source) { + // required balance: ED + fee + BridgeDeposit + let bridge_deposit = + >::BridgeDeposit::get(); + let balance_needed = ::ExistentialDeposit::get() + bridge_deposit.into(); + + let source_account_id = LocationToAccountId::convert_location(&source).expect("valid location"); + let _ = >::mint_into(&source_account_id, balance_needed) + .expect("mint_into passes"); + }; + + let maybe_paid_execution = if is_paid_xcm_execution { + // random high enough value for `BuyExecution` fees + let buy_execution_fee_amount = 5_000_000_000_000_u128; + let buy_execution_fee = (TokenLocation::get(), buy_execution_fee_amount).into(); + + let balance_needed = ::ExistentialDeposit::get() + + buy_execution_fee_amount.into(); + let source_account_id = + LocationToAccountId::convert_location(&source).expect("valid location"); + let _ = + >::mint_into(&source_account_id, balance_needed) + .expect("mint_into passes"); + Some(buy_execution_fee) + } else { + None + }; + + // call the bridge opener + bridge_opener(*locations.clone(), maybe_paid_execution); + + // check opened bridge + let bridge = pallet_xcm_bridge_hub::Bridges::::get( + locations.bridge_id(), + ) + .expect("opened bridge"); + + // check state + assert_ok!( + pallet_xcm_bridge_hub::Pallet::::do_try_state() + ); + + // return locations + (*locations, bridge.lane_id) + } + + /// Utility for opening bridge with dedicated `pallet_xcm_bridge_hub`'s extrinsic. + pub fn open_bridge_with_extrinsic( + (origin, origin_kind): (Location, OriginKind), + bridge_destination_universal_location: InteriorLocation, + maybe_paid_execution: Option, + ) where + Runtime: frame_system::Config + + pallet_xcm_bridge_hub::Config + + cumulus_pallet_parachain_system::Config + + pallet_xcm::Config, + XcmOverBridgePalletInstance: 'static, + ::RuntimeCall: + GetDispatchInfo + From>, + { + // open bridge with `Transact` call + let open_bridge_call = RuntimeCallOf::::from(BridgeXcmOverBridgeCall::< + Runtime, + XcmOverBridgePalletInstance, + >::open_bridge { + bridge_destination_universal_location: Box::new( + bridge_destination_universal_location.clone().into(), + ), + }); + + // execute XCM as source origin would do with `Transact -> Origin::Xcm` + assert_ok!(RuntimeHelper::::execute_as_origin( + (origin, origin_kind), + open_bridge_call, + maybe_paid_execution + ) + .ensure_complete()); + } + + /// Utility for opening bridge directly inserting data to the `pallet_xcm_bridge_hub`'s storage + /// (used only for legacy purposes). + pub fn open_bridge_with_storage( + locations: pallet_xcm_bridge_hub::BridgeLocations, + lane_id: pallet_xcm_bridge_hub::LaneIdOf, + ) where + Runtime: pallet_xcm_bridge_hub::Config, + XcmOverBridgePalletInstance: 'static, + { + // insert bridge data directly to the storage + assert_ok!( + pallet_xcm_bridge_hub::Pallet::::do_open_bridge( + Box::new(locations), + lane_id, + true + ) + ); + } + + /// Helper function to close the bridge/lane for `source` and `destination`. + pub fn close_bridge( + expected_source: Location, + bridge_destination_universal_location: InteriorLocation, + (origin, origin_kind): (Location, OriginKind), + is_paid_xcm_execution: bool + ) where + Runtime: BasicParachainRuntime + BridgeXcmOverBridgeConfig, + XcmOverBridgePalletInstance: 'static, + ::RuntimeCall: GetDispatchInfo + From>, + ::Balance: From<<>::BridgeMessagesPalletInstance>>::ThisChain as bp_runtime::Chain>::Balance>, + ::Balance: From, + LocationToAccountId: ConvertLocation>, + TokenLocation: Get + { + // construct expected bridge configuration + let locations = + pallet_xcm_bridge_hub::Pallet::::bridge_locations( + expected_source.clone().into(), + bridge_destination_universal_location.clone().into(), + ) + .expect("valid bridge locations"); + assert!(pallet_xcm_bridge_hub::Bridges::::get( + locations.bridge_id() + ) + .is_some()); + + // required balance: ED + fee + BridgeDeposit + let maybe_paid_execution = if is_paid_xcm_execution { + // random high enough value for `BuyExecution` fees + let buy_execution_fee_amount = 2_500_000_000_000_u128; + let buy_execution_fee = (TokenLocation::get(), buy_execution_fee_amount).into(); + + let balance_needed = ::ExistentialDeposit::get() + + buy_execution_fee_amount.into(); + let source_account_id = + LocationToAccountId::convert_location(&expected_source).expect("valid location"); + let _ = + >::mint_into(&source_account_id, balance_needed) + .expect("mint_into passes"); + Some(buy_execution_fee) + } else { + None + }; + + // close bridge with `Transact` call + let close_bridge_call = RuntimeCallOf::::from(BridgeXcmOverBridgeCall::< + Runtime, + XcmOverBridgePalletInstance, + >::close_bridge { + bridge_destination_universal_location: Box::new( + bridge_destination_universal_location.into(), + ), + may_prune_messages: 16, + }); + + // execute XCM as source origin would do with `Transact -> Origin::Xcm` + assert_ok!(RuntimeHelper::::execute_as_origin( + (origin, origin_kind), + close_bridge_call, + maybe_paid_execution + ) + .ensure_complete()); + + // bridge is closed + assert!(pallet_xcm_bridge_hub::Bridges::::get( + locations.bridge_id() + ) + .is_none()); + + // check state + assert_ok!( + pallet_xcm_bridge_hub::Pallet::::do_try_state() + ); + } +} +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs index bc1c7ec5e032c..d3507592919bd 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_cases/mod.rs @@ -32,9 +32,12 @@ use bp_messages::{ LaneId, MessageKey, MessagesOperatingMode, OutboundLaneData, }; use bp_runtime::BasicOperatingMode; +<<<<<<< HEAD use bridge_runtime_common::messages_xcm_extension::{ XcmAsPlainPayload, XcmBlobMessageDispatchResult, }; +======= +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) use codec::Encode; use frame_support::{ assert_ok, @@ -60,11 +63,18 @@ pub(crate) mod bridges_prelude { pub use pallet_bridge_grandpa::{Call as BridgeGrandpaCall, Config as BridgeGrandpaConfig}; pub use pallet_bridge_messages::{Call as BridgeMessagesCall, Config as BridgeMessagesConfig}; pub use pallet_bridge_parachains::{ +<<<<<<< HEAD Call as BridgeParachainsCall, Config as BridgeParachainsConfig, RelayBlockHash, RelayBlockNumber, +======= + Call as BridgeParachainsCall, Config as BridgeParachainsConfig, +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) }; } +// Re-export test-case +pub use for_pallet_xcm_bridge_hub::open_and_close_bridge_works; + // Re-export test_case from assets pub use asset_test_utils::include_teleports_for_native_asset_works; @@ -435,7 +445,7 @@ pub fn message_dispatch_routing_works< ) where Runtime: BasicParachainRuntime + cumulus_pallet_xcmp_queue::Config - + BridgeMessagesConfig, + + BridgeMessagesConfig, AllPalletsWithoutSystem: OnInitialize> + OnFinalize>, AccountIdOf: From @@ -455,9 +465,15 @@ pub fn message_dispatch_routing_works< Location::new(C::get(), [GlobalConsensus(N::get())]) } } - assert_ne!(runtime_para_id, sibling_parachain_id); + #[derive(Debug)] + enum XcmBlobMessageDispatchResult { + Dispatched, + #[allow(dead_code)] + NotDispatched(Option), + } + run_test::(collator_session_key, runtime_para_id, vec![], || { prepare_configuration(); @@ -643,3 +659,154 @@ where estimated_fee.into() } +<<<<<<< HEAD +======= + +pub(crate) mod for_pallet_xcm_bridge_hub { + use super::*; + use crate::test_cases::helpers::for_pallet_xcm_bridge_hub::{ + close_bridge, ensure_opened_bridge, open_bridge_with_extrinsic, + }; + pub(crate) use pallet_xcm_bridge_hub::{ + Bridge, BridgeState, Call as BridgeXcmOverBridgeCall, Config as BridgeXcmOverBridgeConfig, + LanesManagerOf, + }; + + /// Test-case makes sure that `Runtime` can open/close bridges. + pub fn open_and_close_bridge_works( + collator_session_key: CollatorSessionKeys, + runtime_para_id: u32, + expected_source: Location, + destination: InteriorLocation, + origin_with_origin_kind: (Location, OriginKind), + is_paid_xcm_execution: bool, + ) where + Runtime: BasicParachainRuntime + BridgeXcmOverBridgeConfig, + XcmOverBridgePalletInstance: 'static, + ::RuntimeCall: GetDispatchInfo + From>, + ::Balance: From<<>::BridgeMessagesPalletInstance>>::ThisChain as bp_runtime::Chain>::Balance>, + ::Balance: From, + <>::BridgeMessagesPalletInstance>>::ThisChain as bp_runtime::Chain>::AccountId: From<::AccountId>, + LocationToAccountId: ConvertLocation>, + TokenLocation: Get, + { + run_test::(collator_session_key, runtime_para_id, vec![], || { + // construct expected bridge configuration + let locations = pallet_xcm_bridge_hub::Pallet::::bridge_locations( + expected_source.clone().into(), + destination.clone().into(), + ).expect("valid bridge locations"); + let expected_lane_id = + locations.calculate_lane_id(xcm::latest::VERSION).expect("valid laneId"); + let lanes_manager = LanesManagerOf::::new(); + + let expected_deposit = if >::AllowWithoutBridgeDeposit::contains( + locations.bridge_origin_relative_location() + ) { + Zero::zero() + } else { + >::BridgeDeposit::get() + }; + + // check bridge/lane DOES not exist + assert_eq!( + pallet_xcm_bridge_hub::Bridges::::get( + locations.bridge_id() + ), + None + ); + assert_eq!( + lanes_manager.active_inbound_lane(expected_lane_id).map(drop), + Err(LanesManagerError::UnknownInboundLane) + ); + assert_eq!( + lanes_manager.active_outbound_lane(expected_lane_id).map(drop), + Err(LanesManagerError::UnknownOutboundLane) + ); + + // open bridge with Transact call + assert_eq!( + ensure_opened_bridge::< + Runtime, + XcmOverBridgePalletInstance, + LocationToAccountId, + TokenLocation, + >( + expected_source.clone(), + destination.clone(), + is_paid_xcm_execution, + |locations, maybe_paid_execution| open_bridge_with_extrinsic::< + Runtime, + XcmOverBridgePalletInstance, + >( + origin_with_origin_kind.clone(), + locations.bridge_destination_universal_location().clone(), + maybe_paid_execution + ) + ) + .0 + .bridge_id(), + locations.bridge_id() + ); + + // check bridge/lane DOES exist + assert_eq!( + pallet_xcm_bridge_hub::Bridges::::get( + locations.bridge_id() + ), + Some(Bridge { + bridge_origin_relative_location: Box::new(expected_source.clone().into()), + bridge_origin_universal_location: Box::new( + locations.bridge_origin_universal_location().clone().into() + ), + bridge_destination_universal_location: Box::new( + locations.bridge_destination_universal_location().clone().into() + ), + state: BridgeState::Opened, + bridge_owner_account: LocationToAccountId::convert_location(&expected_source) + .expect("valid location") + .into(), + deposit: expected_deposit, + lane_id: expected_lane_id, + }) + ); + assert_eq!( + lanes_manager.active_inbound_lane(expected_lane_id).map(|lane| lane.state()), + Ok(LaneState::Opened) + ); + assert_eq!( + lanes_manager.active_outbound_lane(expected_lane_id).map(|lane| lane.state()), + Ok(LaneState::Opened) + ); + + // close bridge with Transact call + close_bridge::( + expected_source, + destination, + origin_with_origin_kind, + is_paid_xcm_execution, + ); + + // check bridge/lane DOES not exist + assert_eq!( + pallet_xcm_bridge_hub::Bridges::::get( + locations.bridge_id() + ), + None + ); + assert_eq!( + lanes_manager.active_inbound_lane(expected_lane_id).map(drop), + Err(LanesManagerError::UnknownInboundLane) + ); + assert_eq!( + lanes_manager.active_outbound_lane(expected_lane_id).map(drop), + Err(LanesManagerError::UnknownOutboundLane) + ); + }); + } +} +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs index c61a31e5454ba..92ea24af0d691 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_grandpa_chain.rs @@ -16,7 +16,7 @@ //! Generating test data for bridges with remote GRANDPA chains. -use crate::test_data::prepare_inbound_xcm; +use crate::test_data::{prepare_inbound_xcm, XcmAsPlainPayload}; use bp_messages::{ source_chain::FromBridgedChainMessagesDeliveryProof, @@ -25,7 +25,10 @@ use bp_messages::{ }; use bp_runtime::{AccountIdOf, BlockNumberOf, Chain, HeaderOf, UnverifiedStorageProofParams}; use bp_test_utils::make_default_justification; +<<<<<<< HEAD use bridge_runtime_common::messages_xcm_extension::XcmAsPlainPayload; +======= +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) use codec::Encode; use pallet_bridge_grandpa::{BridgedChain, BridgedHeader}; use sp_runtime::traits::Header as HeaderT; diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs index 897fe0d0b0f17..e05c4f831d7d9 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/from_parachain.rs @@ -16,7 +16,10 @@ //! Generating test data for bridges with remote parachains. -use super::{from_grandpa_chain::make_complex_bridged_grandpa_header_proof, prepare_inbound_xcm}; +use super::{ + from_grandpa_chain::make_complex_bridged_grandpa_header_proof, prepare_inbound_xcm, + XcmAsPlainPayload, +}; use bp_messages::{ source_chain::FromBridgedChainMessagesDeliveryProof, @@ -27,7 +30,10 @@ use bp_runtime::{ AccountIdOf, BlockNumberOf, Chain, HeaderOf, Parachain, UnverifiedStorageProofParams, }; use bp_test_utils::prepare_parachain_heads_proof; +<<<<<<< HEAD use bridge_runtime_common::messages_xcm_extension::XcmAsPlainPayload; +======= +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) use codec::Encode; use pallet_bridge_grandpa::BridgedHeader; use pallet_bridge_parachains::{RelayBlockHash, RelayBlockNumber}; diff --git a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs index ee3fc1ed2c41f..f7e1686f4af0f 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/test-utils/src/test_data/mod.rs @@ -35,10 +35,16 @@ use xcm::GetVersion; use xcm_builder::{HaulBlob, HaulBlobError, HaulBlobExporter}; use xcm_executor::traits::{validate_export, ExportXcm}; +<<<<<<< HEAD pub fn prepare_inbound_xcm( xcm_message: Xcm, destination: InteriorLocation, ) -> Vec { +======= +pub(crate) type XcmAsPlainPayload = sp_std::vec::Vec; + +pub fn prepare_inbound_xcm(xcm_message: Xcm<()>, destination: InteriorLocation) -> Vec { +>>>>>>> ada12be (Bridges small nits/improvements (#7383)) let location = xcm::VersionedInteriorLocation::from(destination); let xcm = xcm::VersionedXcm::::from(xcm_message); // this is the `BridgeMessage` from polkadot xcm builder, but it has no constructor diff --git a/prdoc/pr_7383.prdoc b/prdoc/pr_7383.prdoc new file mode 100644 index 0000000000000..bd421d73ab202 --- /dev/null +++ b/prdoc/pr_7383.prdoc @@ -0,0 +1,12 @@ +title: Bridges small nits/improvements +doc: +- audience: Runtime Dev + description: 'This PR contains small fixes and backwards compatibility issues identified + during work on the larger PR: https://github.com/paritytech/polkadot-sdk/issues/6906.' +crates: +- name: cumulus-pallet-xcmp-queue + bump: patch +- name: pallet-xcm-bridge-hub + bump: minor +- name: bridge-hub-test-utils + bump: minor