From 04842d4bcddaf2477a61aad6d47d98f2afc1262e Mon Sep 17 00:00:00 2001 From: ron Date: Tue, 16 Jan 2024 12:13:21 +0800 Subject: [PATCH 01/16] More integration tests --- .../bridge-hub-rococo/src/tests/snowbridge.rs | 136 +++++++++++++++++- 1 file changed, 134 insertions(+), 2 deletions(-) diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index 29b881e0e10e..3480959fe228 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -17,13 +17,14 @@ use codec::{Decode, Encode}; use emulated_integration_tests_common::xcm_emulator::ConvertLocation; use frame_support::pallet_prelude::TypeInfo; use hex_literal::hex; -use snowbridge_core::outbound::OperatingMode; use parachains_common::rococo::snowbridge::EthereumNetwork; +use snowbridge_core::outbound::OperatingMode; +use snowbridge_pallet_system; use snowbridge_router_primitives::inbound::{ Command, Destination, GlobalConsensusEthereumConvertsFor, MessageV1, VersionedMessage, }; -use snowbridge_pallet_system; use sp_core::H256; +use sp_runtime::{ArithmeticError::Underflow, DispatchError::Arithmetic}; const INITIAL_FUND: u128 = 5_000_000_000 * ROCOCO_ED; const CHAIN_ID: u64 = 11155111; @@ -190,6 +191,11 @@ fn register_weth_token_from_ethereum_to_asset_hub() { chain_id: CHAIN_ID, command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, }); + assert_ok!(EthereumInboundQueue::refund_relayer( + AssetHubRococo::para_id(), + AssetHubRococoReceiver::get(), + message.encode().len() as u32, + )); let (xcm, fee) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); assert_ok!(EthereumInboundQueue::burn_fees(AssetHubRococo::para_id().into(), fee)); @@ -338,6 +344,11 @@ fn send_token_from_ethereum_to_asset_hub() { chain_id: CHAIN_ID, command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, }); + assert_ok!(EthereumInboundQueue::refund_relayer( + AssetHubRococo::para_id(), + AssetHubRococoReceiver::get(), + message.encode().len() as u32, + )); let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); let message = VersionedMessage::V1(MessageV1 { @@ -506,3 +517,124 @@ fn send_weth_asset_from_asset_hub_to_ethereum() { ); }); } + +#[test] +fn register_weth_token_in_asset_hub_fail_for_insufficient_fee() { + BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id().into(), INITIAL_FUND); + + let message_id_: H256 = [1; 32].into(); + + BridgeHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + type EthereumInboundQueue = + ::EthereumInboundQueue; + let message = VersionedMessage::V1(MessageV1 { + chain_id: CHAIN_ID, + // Insufficient fee + command: Command::RegisterToken { token: WETH.into(), fee: 1_000 }, + }); + let (xcm, fee) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); + + assert_ok!(EthereumInboundQueue::burn_fees(AssetHubRococo::para_id().into(), fee)); + + let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + + assert_expected_events!( + BridgeHubRococo, + vec![ + RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, + ] + ); + }); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { success:false, .. }) => {}, + ] + ); + }); +} + +#[test] +fn send_token_from_ethereum_to_asset_hub_fail_for_insufficient_fund() { + // Insufficient fund + BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id().into(), 1_000); + + BridgeHubRococo::execute_with(|| { + type EthereumInboundQueue = + ::EthereumInboundQueue; + let message = VersionedMessage::V1(MessageV1 { + chain_id: CHAIN_ID, + command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, + }); + assert_err!( + EthereumInboundQueue::refund_relayer( + AssetHubRococo::para_id(), + AssetHubRococoReceiver::get(), + message.encode().len() as u32, + ), + Arithmetic(Underflow) + ); + }); +} + +#[test] +fn send_token_from_ethereum_to_asset_hub_fail_for_insufficient_fee() { + BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id().into(), INITIAL_FUND); + + // Fund ethereum sovereign in asset hub + AssetHubRococo::fund_accounts(vec![(AssetHubRococoReceiver::get(), INITIAL_FUND)]); + + let message_id_: H256 = [1; 32].into(); + + BridgeHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + type EthereumInboundQueue = + ::EthereumInboundQueue; + let message = VersionedMessage::V1(MessageV1 { + chain_id: CHAIN_ID, + command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, + }); + assert_ok!(EthereumInboundQueue::refund_relayer( + AssetHubRococo::para_id(), + AssetHubRococoReceiver::get(), + message.encode().len() as u32, + )); + let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); + let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + let message = VersionedMessage::V1(MessageV1 { + chain_id: CHAIN_ID, + command: Command::SendToken { + token: WETH.into(), + destination: Destination::AccountId32 { id: AssetHubRococoReceiver::get().into() }, + amount: 1_000_000_000, + // Insufficient fee + fee: 1_000, + }, + }); + let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); + let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + + assert_expected_events!( + BridgeHubRococo, + vec![ + RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, + ] + ); + }); + + AssetHubRococo::execute_with(|| { + type RuntimeEvent = ::RuntimeEvent; + + assert_expected_events!( + AssetHubRococo, + vec![ + RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { success:false, .. }) => {}, + ] + ); + }); +} From 6d0f0969978b0929a827a3a9312407c1c078761a Mon Sep 17 00:00:00 2001 From: ron Date: Wed, 17 Jan 2024 17:42:28 +0800 Subject: [PATCH 02/16] Fix tests --- .../bridges/bridge-hub-rococo/src/tests/snowbridge.rs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index a2ca02eb27ce..b8d9374234ad 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -203,7 +203,7 @@ fn register_weth_token_from_ethereum_to_asset_hub() { AssetHubRococoReceiver::get(), message.encode().len() as u32, )); - let (xcm, fee) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); + let (xcm, fee) = EthereumInboundQueue::do_convert(message_id, message).unwrap(); assert_ok!(EthereumInboundQueue::burn_fees(AssetHubRococo::para_id().into(), fee)); @@ -243,7 +243,7 @@ fn send_token_from_ethereum_to_penpal() { // Fund PenPal sender and receiver PenpalA::fund_accounts(vec![ (PenpalAReceiver::get(), INITIAL_FUND), // for receiving the sent asset on PenPal - (PenpalASender::get(), INITIAL_FUND), // for creating the asset on PenPal + (PenpalASender::get(), INITIAL_FUND), // for creating the asset on PenPal ]); // The Weth asset location, identified by the contract address on Ethereum @@ -368,7 +368,7 @@ fn send_token_from_ethereum_to_asset_hub() { AssetHubRococoReceiver::get(), message.encode().len() as u32, )); - let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); + let (xcm, _) = EthereumInboundQueue::do_convert(message_id, message).unwrap(); let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); // Construct SendToken message @@ -448,7 +448,8 @@ fn send_weth_asset_from_asset_hub_to_ethereum() { command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, }); // Converts the versioned message to XCM - let (xcm, _) = EthereumInboundQueue::do_convert(message_id_register_token, message).unwrap(); + let (xcm, _) = + EthereumInboundQueue::do_convert(message_id_register_token, message).unwrap(); let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); // Check that the register token message was sent using xcm From cadd771ff1e3f6b07a5637c7a6e68434c52b4ab4 Mon Sep 17 00:00:00 2001 From: ron Date: Tue, 23 Jan 2024 20:50:32 +0800 Subject: [PATCH 03/16] Register token with inbound fixture --- .../bridges/bridge-hub-rococo/Cargo.toml | 2 +- .../bridge-hub-rococo/src/tests/snowbridge.rs | 24 +++++++++++++------ .../bridge-hubs/bridge-hub-rococo/Cargo.toml | 1 + .../bridge-hubs/bridge-hub-rococo/src/lib.rs | 7 ------ 4 files changed, 19 insertions(+), 15 deletions(-) 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 a7d3bfe2fcbd..f16cb43ffc17 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 @@ -49,5 +49,5 @@ asset-hub-rococo-runtime = { path = "../../../../../runtimes/assets/asset-hub-ro snowbridge-core = { path = "../../../../../../../../parachain/primitives/core", default-features = false } snowbridge-router-primitives = { path = "../../../../../../../../parachain/primitives/router", default-features = false } snowbridge-pallet-system = { path = "../../../../../../../../parachain/pallets/system", default-features = false } -snowbridge-pallet-inbound-queue = { path = "../../../../../../../../parachain/pallets/inbound-queue", default-features = false } snowbridge-pallet-outbound-queue = { path = "../../../../../../../../parachain/pallets/outbound-queue", default-features = false } +snowbridge-pallet-inbound-queue = { path = "../../../../../../../../parachain/pallets/inbound-queue", features = ["test-helpers"] } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index 944be9c399ff..86363b791015 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -13,12 +13,15 @@ // See the License for the specific language governing permissions and // limitations under the License. use crate::*; +use bridge_hub_rococo_runtime::EthereumBeaconClient; use codec::{Decode, Encode}; use emulated_integration_tests_common::xcm_emulator::ConvertLocation; use frame_support::pallet_prelude::TypeInfo; use hex_literal::hex; use parachains_common::rococo::snowbridge::EthereumNetwork; +use rococo_westend_system_emulated_network::BridgeHubRococoParaSender as BridgeHubRococoSender; use snowbridge_core::outbound::OperatingMode; +use snowbridge_pallet_inbound_queue::fixtures::make_create_message; use snowbridge_pallet_system; use snowbridge_router_primitives::inbound::{ Command, Destination, GlobalConsensusEthereumConvertsFor, MessageV1, VersionedMessage, @@ -191,17 +194,24 @@ fn register_weth_token_from_ethereum_to_asset_hub() { BridgeHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; + type RuntimeOrigin = ::RuntimeOrigin; type EthereumInboundQueue = ::EthereumInboundQueue; - let message = VersionedMessage::V1(MessageV1 { - chain_id: CHAIN_ID, - command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, - }); - let (xcm, fee) = EthereumInboundQueue::do_convert(message_id, message).unwrap(); - assert_ok!(EthereumInboundQueue::burn_fees(AssetHubRococo::para_id().into(), fee)); + let create_message = make_create_message(); - let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + EthereumBeaconClient::store_execution_header( + create_message.message.proof.block_hash, + create_message.execution_header, + 0, + H256::default(), + ); + + EthereumInboundQueue::submit( + RuntimeOrigin::signed(BridgeHubRococoSender::get()), + create_message.message, + ) + .unwrap(); assert_expected_events!( BridgeHubRococo, diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 5eac8468bfc1..0e89fd99acc0 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -249,6 +249,7 @@ runtime-benchmarks = [ "parachains-common/runtime-benchmarks", "polkadot-parachain-primitives/runtime-benchmarks", "polkadot-runtime-common/runtime-benchmarks", + "snowbridge-beacon-primitives/runtime-benchmarks", "snowbridge-core/runtime-benchmarks", "snowbridge-pallet-ethereum-client/runtime-benchmarks", "snowbridge-pallet-inbound-queue/runtime-benchmarks", diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs index 553a45aeb3fb..287436f05bc0 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/lib.rs @@ -490,13 +490,6 @@ impl pallet_utility::Config for Runtime { } // Ethereum Bridge - -#[cfg(not(feature = "runtime-benchmarks"))] -parameter_types! { - pub storage EthereumGatewayAddress: H160 = H160::zero(); -} - -#[cfg(feature = "runtime-benchmarks")] parameter_types! { pub storage EthereumGatewayAddress: H160 = H160(hex_literal::hex!("EDa338E4dC46038493b885327842fD3E301CaB39")); } From e5baadadab289091c2176681ea7265354b90b66c Mon Sep 17 00:00:00 2001 From: ron Date: Wed, 24 Jan 2024 00:25:36 +0800 Subject: [PATCH 04/16] Import snowbridge-pallet-inbound-queue-fixtures --- Cargo.lock | 16 ++++++++++++++++ .../tests/bridges/bridge-hub-rococo/Cargo.toml | 3 ++- .../bridge-hub-rococo/src/tests/snowbridge.rs | 9 ++++----- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cf5e7f67ec88..a4ea8838ca1d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1988,6 +1988,7 @@ dependencies = [ "scale-info", "snowbridge-core", "snowbridge-pallet-inbound-queue", + "snowbridge-pallet-inbound-queue-fixtures", "snowbridge-pallet-outbound-queue", "snowbridge-pallet-system", "snowbridge-router-primitives", @@ -17745,6 +17746,7 @@ dependencies = [ "snowbridge-beacon-primitives", "snowbridge-core", "snowbridge-ethereum", + "snowbridge-pallet-inbound-queue-fixtures", "snowbridge-router-primitives", "sp-core", "sp-io", @@ -17755,6 +17757,20 @@ dependencies = [ "staging-xcm-executor", ] +[[package]] +name = "snowbridge-pallet-inbound-queue-fixtures" +version = "0.9.0" +dependencies = [ + "frame-benchmarking", + "frame-support", + "frame-system", + "hex-literal", + "snowbridge-beacon-primitives", + "snowbridge-core", + "sp-core", + "sp-std 8.0.0", +] + [[package]] name = "snowbridge-pallet-outbound-queue" version = "0.9.0" 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 f16cb43ffc17..1972eb5091f7 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 @@ -50,4 +50,5 @@ snowbridge-core = { path = "../../../../../../../../parachain/primitives/core", snowbridge-router-primitives = { path = "../../../../../../../../parachain/primitives/router", default-features = false } snowbridge-pallet-system = { path = "../../../../../../../../parachain/pallets/system", default-features = false } snowbridge-pallet-outbound-queue = { path = "../../../../../../../../parachain/pallets/outbound-queue", default-features = false } -snowbridge-pallet-inbound-queue = { path = "../../../../../../../../parachain/pallets/inbound-queue", features = ["test-helpers"] } +snowbridge-pallet-inbound-queue = { path = "../../../../../../../../parachain/pallets/inbound-queue", default-features = false } +snowbridge-pallet-inbound-queue-fixtures = { path = "../../../../../../../../parachain/pallets/inbound-queue/fixtures" } diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index 86363b791015..a27de68c1e6d 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -21,7 +21,7 @@ use hex_literal::hex; use parachains_common::rococo::snowbridge::EthereumNetwork; use rococo_westend_system_emulated_network::BridgeHubRococoParaSender as BridgeHubRococoSender; use snowbridge_core::outbound::OperatingMode; -use snowbridge_pallet_inbound_queue::fixtures::make_create_message; +use snowbridge_pallet_inbound_queue_fixtures::make_register_asset_message; use snowbridge_pallet_system; use snowbridge_router_primitives::inbound::{ Command, Destination, GlobalConsensusEthereumConvertsFor, MessageV1, VersionedMessage, @@ -190,15 +190,13 @@ fn register_weth_token_from_ethereum_to_asset_hub() { // Fund AssetHub sovereign account so that it can pay execution fees. BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id().into(), INITIAL_FUND); - let message_id: H256 = [1; 32].into(); - BridgeHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; type RuntimeOrigin = ::RuntimeOrigin; type EthereumInboundQueue = ::EthereumInboundQueue; - let create_message = make_create_message(); + let create_message = make_register_asset_message(); EthereumBeaconClient::store_execution_header( create_message.message.proof.block_hash, @@ -446,7 +444,8 @@ fn send_weth_asset_from_asset_hub_to_ethereum() { command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, }); // Converts the versioned message to XCM - let (xcm, _) = EthereumInboundQueue::do_convert(message_id_register_token, message).unwrap(); + let (xcm, _) = + EthereumInboundQueue::do_convert(message_id_register_token, message).unwrap(); let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); // Check that the register token message was sent using xcm From 8fc508eaf60f8fdb3d11c47445dd80236bb9a8f4 Mon Sep 17 00:00:00 2001 From: ron Date: Wed, 24 Jan 2024 08:39:05 +0800 Subject: [PATCH 05/16] Cleanup Cargo.toml --- .../parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml index 0e89fd99acc0..5eac8468bfc1 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/Cargo.toml @@ -249,7 +249,6 @@ runtime-benchmarks = [ "parachains-common/runtime-benchmarks", "polkadot-parachain-primitives/runtime-benchmarks", "polkadot-runtime-common/runtime-benchmarks", - "snowbridge-beacon-primitives/runtime-benchmarks", "snowbridge-core/runtime-benchmarks", "snowbridge-pallet-ethereum-client/runtime-benchmarks", "snowbridge-pallet-inbound-queue/runtime-benchmarks", From 977cb9f6175d19987e0d545ec4c25b217b0ee12c Mon Sep 17 00:00:00 2001 From: ron Date: Wed, 24 Jan 2024 12:43:05 +0800 Subject: [PATCH 06/16] Update emulated test --- .../bridge-hub-rococo/src/tests/snowbridge.rs | 35 +++++++++++-------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index a27de68c1e6d..cc05f83e5489 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -21,7 +21,7 @@ use hex_literal::hex; use parachains_common::rococo::snowbridge::EthereumNetwork; use rococo_westend_system_emulated_network::BridgeHubRococoParaSender as BridgeHubRococoSender; use snowbridge_core::outbound::OperatingMode; -use snowbridge_pallet_inbound_queue_fixtures::make_register_asset_message; +use snowbridge_pallet_inbound_queue_fixtures::register_asset::make_register_asset_message; use snowbridge_pallet_system; use snowbridge_router_primitives::inbound::{ Command, Destination, GlobalConsensusEthereumConvertsFor, MessageV1, VersionedMessage, @@ -196,18 +196,18 @@ fn register_weth_token_from_ethereum_to_asset_hub() { type EthereumInboundQueue = ::EthereumInboundQueue; - let create_message = make_register_asset_message(); + let register_asset_message = make_register_asset_message(); EthereumBeaconClient::store_execution_header( - create_message.message.proof.block_hash, - create_message.execution_header, + register_asset_message.message.proof.block_hash, + register_asset_message.execution_header, 0, H256::default(), ); EthereumInboundQueue::submit( RuntimeOrigin::signed(BridgeHubRococoSender::get()), - create_message.message, + register_asset_message.message, ) .unwrap(); @@ -358,17 +358,24 @@ fn send_token_from_ethereum_to_asset_hub() { BridgeHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; + type RuntimeOrigin = ::RuntimeOrigin; type EthereumInboundQueue = ::EthereumInboundQueue; - // Construct RegisterToken message - let message = VersionedMessage::V1(MessageV1 { - chain_id: CHAIN_ID, - command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, - }); - // Convert the message to XCM - let (xcm, _) = EthereumInboundQueue::do_convert(message_id, message).unwrap(); - // Send the XCM - let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + + let register_asset_message = make_register_asset_message(); + + EthereumBeaconClient::store_execution_header( + register_asset_message.message.proof.block_hash, + register_asset_message.execution_header, + 0, + H256::default(), + ); + + EthereumInboundQueue::submit( + RuntimeOrigin::signed(BridgeHubRococoSender::get()), + register_asset_message.message, + ) + .unwrap(); // Construct SendToken message let message = VersionedMessage::V1(MessageV1 { From d3b3e97f68bf6fec24f736242dffd5c7e227133b Mon Sep 17 00:00:00 2001 From: ron Date: Wed, 24 Jan 2024 14:27:43 +0800 Subject: [PATCH 07/16] Fix emulated test --- .../emulated/common/src/lib.rs | 2 +- .../bridge-hub-rococo/src/tests/snowbridge.rs | 33 ++++++++++--------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/cumulus/parachains/integration-tests/emulated/common/src/lib.rs b/cumulus/parachains/integration-tests/emulated/common/src/lib.rs index ad69d5576aae..882a188e0f75 100644 --- a/cumulus/parachains/integration-tests/emulated/common/src/lib.rs +++ b/cumulus/parachains/integration-tests/emulated/common/src/lib.rs @@ -100,7 +100,7 @@ pub mod accounts { pub const CHARLIE: &str = "Charlie"; pub const DAVE: &str = "Dave"; pub const EVE: &str = "Eve"; - pub const FERDIE: &str = "Ferdei"; + pub const FERDIE: &str = "Ferdie"; pub const ALICE_STASH: &str = "Alice//stash"; pub const BOB_STASH: &str = "Bob//stash"; pub const CHARLIE_STASH: &str = "Charlie//stash"; diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index cc05f83e5489..7d1ad311b6b5 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -21,7 +21,9 @@ use hex_literal::hex; use parachains_common::rococo::snowbridge::EthereumNetwork; use rococo_westend_system_emulated_network::BridgeHubRococoParaSender as BridgeHubRococoSender; use snowbridge_core::outbound::OperatingMode; -use snowbridge_pallet_inbound_queue_fixtures::register_asset::make_register_asset_message; +use snowbridge_pallet_inbound_queue_fixtures::{ + register_asset::make_register_asset_message, send_token::make_send_token_message, +}; use snowbridge_pallet_system; use snowbridge_router_primitives::inbound::{ Command, Destination, GlobalConsensusEthereumConvertsFor, MessageV1, VersionedMessage, @@ -354,8 +356,6 @@ fn send_token_from_ethereum_to_asset_hub() { // Fund ethereum sovereign on AssetHub AssetHubRococo::fund_accounts(vec![(AssetHubRococoReceiver::get(), INITIAL_FUND)]); - let message_id: H256 = [1; 32].into(); - BridgeHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; type RuntimeOrigin = ::RuntimeOrigin; @@ -378,19 +378,20 @@ fn send_token_from_ethereum_to_asset_hub() { .unwrap(); // Construct SendToken message - let message = VersionedMessage::V1(MessageV1 { - chain_id: CHAIN_ID, - command: Command::SendToken { - token: WETH.into(), - destination: Destination::AccountId32 { id: AssetHubRococoReceiver::get().into() }, - amount: 1_000_000_000, - fee: XCM_FEE, - }, - }); - // Convert the message to XCM - let (xcm, _) = EthereumInboundQueue::do_convert(message_id, message).unwrap(); - // Send the XCM - let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + let send_token_message = make_send_token_message(); + + EthereumBeaconClient::store_execution_header( + send_token_message.message.proof.block_hash, + send_token_message.execution_header, + 0, + H256::default(), + ); + + EthereumInboundQueue::submit( + RuntimeOrigin::signed(BridgeHubRococoSender::get()), + send_token_message.message, + ) + .unwrap(); // Check that the message was sent assert_expected_events!( From e4f4d59e87ff8b34a6288ba62716eb31a02eb2de Mon Sep 17 00:00:00 2001 From: ron Date: Wed, 24 Jan 2024 16:31:52 +0800 Subject: [PATCH 08/16] Rename to register_token --- .../tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index 7d1ad311b6b5..27c4ee830064 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -22,7 +22,7 @@ use parachains_common::rococo::snowbridge::EthereumNetwork; use rococo_westend_system_emulated_network::BridgeHubRococoParaSender as BridgeHubRococoSender; use snowbridge_core::outbound::OperatingMode; use snowbridge_pallet_inbound_queue_fixtures::{ - register_asset::make_register_asset_message, send_token::make_send_token_message, + register_token::make_register_token_message, send_token::make_send_token_message, }; use snowbridge_pallet_system; use snowbridge_router_primitives::inbound::{ @@ -198,7 +198,7 @@ fn register_weth_token_from_ethereum_to_asset_hub() { type EthereumInboundQueue = ::EthereumInboundQueue; - let register_asset_message = make_register_asset_message(); + let register_asset_message = make_register_token_message(); EthereumBeaconClient::store_execution_header( register_asset_message.message.proof.block_hash, @@ -362,7 +362,7 @@ fn send_token_from_ethereum_to_asset_hub() { type EthereumInboundQueue = ::EthereumInboundQueue; - let register_asset_message = make_register_asset_message(); + let register_asset_message = make_register_token_message(); EthereumBeaconClient::store_execution_header( register_asset_message.message.proof.block_hash, From 70ee6ea95f2c20605509fac633285aa61a0544e1 Mon Sep 17 00:00:00 2001 From: ron Date: Thu, 25 Jan 2024 10:25:50 +0800 Subject: [PATCH 09/16] Update emulated tests --- .../bridge-hub-rococo/src/tests/snowbridge.rs | 99 +++++-------------- 1 file changed, 25 insertions(+), 74 deletions(-) diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index 4c66575b3ae7..057776ad89ce 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -13,7 +13,7 @@ // See the License for the specific language governing permissions and // limitations under the License. use crate::*; -use bridge_hub_rococo_runtime::EthereumBeaconClient; +use bridge_hub_rococo_runtime::{EthereumBeaconClient, EthereumInboundQueue, RuntimeOrigin}; use codec::{Decode, Encode}; use emulated_integration_tests_common::xcm_emulator::ConvertLocation; use frame_support::pallet_prelude::TypeInfo; @@ -23,6 +23,7 @@ use rococo_westend_system_emulated_network::BridgeHubRococoParaSender as BridgeH use snowbridge_core::outbound::OperatingMode; use snowbridge_pallet_inbound_queue_fixtures::{ register_token::make_register_token_message, send_token::make_send_token_message, + InboundQueueFixture, }; use snowbridge_pallet_system; use snowbridge_router_primitives::inbound::{ @@ -54,6 +55,20 @@ pub enum SnowbridgeControl { Control(ControlCall), } +pub fn send_inbound_message(fixture: InboundQueueFixture) -> DispatchResult { + EthereumBeaconClient::store_execution_header( + fixture.message.proof.block_hash, + fixture.execution_header, + 0, + H256::default(), + ); + + EthereumInboundQueue::submit( + RuntimeOrigin::signed(BridgeHubRococoSender::get()), + fixture.message, + ) +} + /// Create an agent on Ethereum. An agent is a representation of an entity in the Polkadot /// ecosystem (like a parachain) on Ethereum. #[test] @@ -195,24 +210,9 @@ fn register_weth_token_from_ethereum_to_asset_hub() { BridgeHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; - type RuntimeOrigin = ::RuntimeOrigin; - type EthereumInboundQueue = - ::EthereumInboundQueue; - - let register_asset_message = make_register_token_message(); - - EthereumBeaconClient::store_execution_header( - register_asset_message.message.proof.block_hash, - register_asset_message.execution_header, - 0, - H256::default(), - ); - EthereumInboundQueue::submit( - RuntimeOrigin::signed(BridgeHubRococoSender::get()), - register_asset_message.message, - ) - .unwrap(); + // Construct RegisterToken message and sent to inbound queue + send_inbound_message(make_register_token_message()).unwrap(); assert_expected_events!( BridgeHubRococo, @@ -359,40 +359,12 @@ fn send_token_from_ethereum_to_asset_hub() { BridgeHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; - type RuntimeOrigin = ::RuntimeOrigin; - type EthereumInboundQueue = - ::EthereumInboundQueue; - - let register_asset_message = make_register_token_message(); - - EthereumBeaconClient::store_execution_header( - register_asset_message.message.proof.block_hash, - register_asset_message.execution_header, - 0, - H256::default(), - ); - - EthereumInboundQueue::submit( - RuntimeOrigin::signed(BridgeHubRococoSender::get()), - register_asset_message.message, - ) - .unwrap(); - - // Construct SendToken message - let send_token_message = make_send_token_message(); - EthereumBeaconClient::store_execution_header( - send_token_message.message.proof.block_hash, - send_token_message.execution_header, - 0, - H256::default(), - ); + // Construct RegisterToken message and sent to inbound queue + send_inbound_message(make_register_token_message()).unwrap(); - EthereumInboundQueue::submit( - RuntimeOrigin::signed(BridgeHubRococoSender::get()), - send_token_message.message, - ) - .unwrap(); + // Construct SendToken message and sent to inbound queue + send_inbound_message(make_send_token_message()).unwrap(); // Check that the message was sent assert_expected_events!( @@ -439,7 +411,6 @@ fn send_weth_asset_from_asset_hub_to_ethereum() { AssetHubRococo::fund_accounts(vec![(AssetHubRococoReceiver::get(), INITIAL_FUND)]); const WETH_AMOUNT: u128 = 1_000_000_000; - let message_id_register_token: H256 = [1; 32].into(); let message_id_send_token: H256 = [2; 32].into(); BridgeHubRococo::execute_with(|| { @@ -447,15 +418,8 @@ fn send_weth_asset_from_asset_hub_to_ethereum() { type EthereumInboundQueue = ::EthereumInboundQueue; - // Register ERC-20 token on AssetHub - let message = VersionedMessage::V1(MessageV1 { - chain_id: CHAIN_ID, - command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, - }); - // Converts the versioned message to XCM - let (xcm, _) = - EthereumInboundQueue::do_convert(message_id_register_token, message).unwrap(); - let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + // Construct RegisterToken message and sent to inbound queue + send_inbound_message(make_register_token_message()).unwrap(); // Check that the register token message was sent using xcm assert_expected_events!( @@ -620,20 +584,7 @@ fn send_token_from_ethereum_to_asset_hub_fail_for_insufficient_fund() { BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id().into(), 1_000); BridgeHubRococo::execute_with(|| { - type EthereumInboundQueue = - ::EthereumInboundQueue; - let message = VersionedMessage::V1(MessageV1 { - chain_id: CHAIN_ID, - command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, - }); - assert_err!( - EthereumInboundQueue::refund_relayer( - AssetHubRococo::para_id(), - AssetHubRococoReceiver::get(), - message.encode().len() as u32, - ), - Arithmetic(Underflow) - ); + assert_err!(send_inbound_message(make_register_token_message()), Arithmetic(Underflow)); }); } From 1f948f6edc7502c6a6ea5fe2c4c182a697c47124 Mon Sep 17 00:00:00 2001 From: ron Date: Thu, 25 Jan 2024 14:42:15 +0800 Subject: [PATCH 10/16] Update tests --- .../bridge-hub-rococo/src/tests/snowbridge.rs | 36 ++++--------------- 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index 057776ad89ce..dada19b914af 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -411,12 +411,9 @@ fn send_weth_asset_from_asset_hub_to_ethereum() { AssetHubRococo::fund_accounts(vec![(AssetHubRococoReceiver::get(), INITIAL_FUND)]); const WETH_AMOUNT: u128 = 1_000_000_000; - let message_id_send_token: H256 = [2; 32].into(); BridgeHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; - type EthereumInboundQueue = - ::EthereumInboundQueue; // Construct RegisterToken message and sent to inbound queue send_inbound_message(make_register_token_message()).unwrap(); @@ -429,19 +426,8 @@ fn send_weth_asset_from_asset_hub_to_ethereum() { ] ); - // Send ERC-20 token to AssetHub - let message = VersionedMessage::V1(MessageV1 { - chain_id: CHAIN_ID, - command: Command::SendToken { - token: WETH.into(), - destination: Destination::AccountId32 { id: AssetHubRococoReceiver::get().into() }, - amount: WETH_AMOUNT, - fee: XCM_FEE, - }, - }); - // Converts the versioned message to XCM - let (xcm, _) = EthereumInboundQueue::do_convert(message_id_send_token, message).unwrap(); - let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + // Construct SendToken message and sent to inbound queue + send_inbound_message(make_send_token_message()).unwrap(); // Check that the send token message was sent using xcm assert_expected_events!( @@ -552,9 +538,7 @@ fn register_weth_token_in_asset_hub_fail_for_insufficient_fee() { // Insufficient fee command: Command::RegisterToken { token: WETH.into(), fee: 1_000 }, }); - let (xcm, fee) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); - - assert_ok!(EthereumInboundQueue::burn_fees(AssetHubRococo::para_id().into(), fee)); + let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); @@ -601,17 +585,9 @@ fn send_token_from_ethereum_to_asset_hub_fail_for_insufficient_fee() { type RuntimeEvent = ::RuntimeEvent; type EthereumInboundQueue = ::EthereumInboundQueue; - let message = VersionedMessage::V1(MessageV1 { - chain_id: CHAIN_ID, - command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, - }); - assert_ok!(EthereumInboundQueue::refund_relayer( - AssetHubRococo::para_id(), - AssetHubRococoReceiver::get(), - message.encode().len() as u32, - )); - let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); - let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + // Construct RegisterToken message and sent to inbound queue + send_inbound_message(make_register_token_message()).unwrap(); + let message = VersionedMessage::V1(MessageV1 { chain_id: CHAIN_ID, command: Command::SendToken { From b13e343087877ef2ccaf0da66a5048b0543db3ce Mon Sep 17 00:00:00 2001 From: ron Date: Thu, 25 Jan 2024 15:13:24 +0800 Subject: [PATCH 11/16] Disable create agent/channel by xcm --- .../bridges/bridge-hub-rococo/src/tests/snowbridge.rs | 2 ++ .../bridge-hubs/bridge-hub-rococo/src/xcm_config.rs | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index dada19b914af..3ca7a50a7c8f 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -72,6 +72,7 @@ pub fn send_inbound_message(fixture: InboundQueueFixture) -> DispatchResult { /// Create an agent on Ethereum. An agent is a representation of an entity in the Polkadot /// ecosystem (like a parachain) on Ethereum. #[test] +#[ignore] fn create_agent() { let origin_para: u32 = 1001; // Fund the origin parachain sovereign account so that it can pay execution fees. @@ -128,6 +129,7 @@ fn create_agent() { /// Create a channel for a consensus system. A channel is a bidirectional messaging channel /// between BridgeHub and Ethereum. #[test] +#[ignore] fn create_channel() { let origin_para: u32 = 1001; // Fund AssetHub sovereign account so that it can pay execution fees. diff --git a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs index f641b428d4c6..462745252e22 100644 --- a/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs +++ b/cumulus/parachains/runtimes/bridge-hubs/bridge-hub-rococo/src/xcm_config.rs @@ -222,7 +222,14 @@ impl Contains for SafeCallFilter { snowbridge_pallet_inbound_queue::Call::set_operating_mode { .. }, ) | RuntimeCall::EthereumOutboundQueue( snowbridge_pallet_outbound_queue::Call::set_operating_mode { .. }, - ) | RuntimeCall::EthereumSystem(..) + ) | RuntimeCall::EthereumSystem( + snowbridge_pallet_system::Call::upgrade { .. } | + snowbridge_pallet_system::Call::set_operating_mode { .. } | + snowbridge_pallet_system::Call::set_pricing_parameters { .. } | + snowbridge_pallet_system::Call::force_update_channel { .. } | + snowbridge_pallet_system::Call::force_transfer_native_from_agent { .. } | + snowbridge_pallet_system::Call::set_token_transfer_fees { .. }, + ) ) } } From fc711a77319724b612492ef396e1e844906c18d6 Mon Sep 17 00:00:00 2001 From: ron Date: Thu, 25 Jan 2024 16:45:09 +0800 Subject: [PATCH 12/16] More checks --- Cargo.lock | 1 + .../bridge-hub-rococo/src/tests/snowbridge.rs | 36 +++++++++++++++---- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c967093238f1..db756cb225f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17768,6 +17768,7 @@ dependencies = [ "frame-support", "frame-system", "hex-literal", + "parity-scale-codec", "snowbridge-beacon-primitives", "snowbridge-core", "sp-core", diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index 3ca7a50a7c8f..268077ddc5cd 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -20,7 +20,7 @@ use frame_support::pallet_prelude::TypeInfo; use hex_literal::hex; use parachains_common::rococo::snowbridge::EthereumNetwork; use rococo_westend_system_emulated_network::BridgeHubRococoParaSender as BridgeHubRococoSender; -use snowbridge_core::outbound::OperatingMode; +use snowbridge_core::{derive_channel_id_for_sibling, outbound::OperatingMode, ChannelId}; use snowbridge_pallet_inbound_queue_fixtures::{ register_token::make_register_token_message, send_token::make_send_token_message, InboundQueueFixture, @@ -212,9 +212,12 @@ fn register_weth_token_from_ethereum_to_asset_hub() { BridgeHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; + type Runtime = ::Runtime; + type Balances = ::Balances; // Construct RegisterToken message and sent to inbound queue - send_inbound_message(make_register_token_message()).unwrap(); + let register_token_message = make_register_token_message(); + send_inbound_message(register_token_message.clone()).unwrap(); assert_expected_events!( BridgeHubRococo, @@ -222,6 +225,29 @@ fn register_weth_token_from_ethereum_to_asset_hub() { RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, ] ); + + // Assert fees charged from sovereign account of AH as expected + let message = VersionedMessage::V1(MessageV1 { + chain_id: CHAIN_ID, + command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, + }); + let delivery_fee = EthereumInboundQueue::calculate_delivery_cost( + register_token_message.encode().len() as u32, + ); + let (_, xcm_fee) = EthereumInboundQueue::do_convert([1; 32].into(), message).unwrap(); + let total_fee = delivery_fee + xcm_fee; + let asset_hub_sovereign = BridgeHubRococo::sovereign_account_id_of(Location::new( + 1, + [Parachain(AssetHubRococo::para_id().into())], + )); + let free_balance_after = Balances::free_balance(asset_hub_sovereign); + let diff = INITIAL_FUND - free_balance_after; + assert_eq!(diff >= total_fee, true); + + // Assert nonce incremented + let channel_id: ChannelId = derive_channel_id_for_sibling(AssetHubRococo::para_id()); + let nonce = snowbridge_pallet_inbound_queue::Nonce::::get(channel_id); + assert_eq!(nonce, 1); }); AssetHubRococo::execute_with(|| { @@ -533,8 +559,7 @@ fn register_weth_token_in_asset_hub_fail_for_insufficient_fee() { BridgeHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; - type EthereumInboundQueue = - ::EthereumInboundQueue; + let message = VersionedMessage::V1(MessageV1 { chain_id: CHAIN_ID, // Insufficient fee @@ -585,8 +610,7 @@ fn send_token_from_ethereum_to_asset_hub_fail_for_insufficient_fee() { BridgeHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; - type EthereumInboundQueue = - ::EthereumInboundQueue; + // Construct RegisterToken message and sent to inbound queue send_inbound_message(make_register_token_message()).unwrap(); From eda5ccc03a36418afc1c2778514939504c4f49fa Mon Sep 17 00:00:00 2001 From: ron Date: Thu, 25 Jan 2024 16:52:18 +0800 Subject: [PATCH 13/16] Fix test --- Cargo.lock | 1 - .../tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index db756cb225f9..c967093238f1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17768,7 +17768,6 @@ dependencies = [ "frame-support", "frame-system", "hex-literal", - "parity-scale-codec", "snowbridge-beacon-primitives", "snowbridge-core", "sp-core", diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index 268077ddc5cd..219d08456617 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -232,7 +232,7 @@ fn register_weth_token_from_ethereum_to_asset_hub() { command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, }); let delivery_fee = EthereumInboundQueue::calculate_delivery_cost( - register_token_message.encode().len() as u32, + register_token_message.message.encode().len() as u32, ); let (_, xcm_fee) = EthereumInboundQueue::do_convert([1; 32].into(), message).unwrap(); let total_fee = delivery_fee + xcm_fee; From 62588bacb9270c6735b664dc668e862d80b2f73f Mon Sep 17 00:00:00 2001 From: ron Date: Fri, 26 Jan 2024 22:37:51 +0800 Subject: [PATCH 14/16] Clean test case --- .../bridge-hub-rococo/src/tests/snowbridge.rs | 66 ++----------------- 1 file changed, 6 insertions(+), 60 deletions(-) diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index 219d08456617..eb7571e482ec 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -22,8 +22,9 @@ use parachains_common::rococo::snowbridge::EthereumNetwork; use rococo_westend_system_emulated_network::BridgeHubRococoParaSender as BridgeHubRococoSender; use snowbridge_core::{derive_channel_id_for_sibling, outbound::OperatingMode, ChannelId}; use snowbridge_pallet_inbound_queue_fixtures::{ - register_token::make_register_token_message, send_token::make_send_token_message, - InboundQueueFixture, + register_token::make_register_token_message, + register_token_with_insufficient_fee::make_register_token_with_infufficient_fee_message, + send_token::make_send_token_message, InboundQueueFixture, }; use snowbridge_pallet_system; use snowbridge_router_primitives::inbound::{ @@ -555,19 +556,12 @@ fn send_weth_asset_from_asset_hub_to_ethereum() { fn register_weth_token_in_asset_hub_fail_for_insufficient_fee() { BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id().into(), INITIAL_FUND); - let message_id_: H256 = [1; 32].into(); - BridgeHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; - let message = VersionedMessage::V1(MessageV1 { - chain_id: CHAIN_ID, - // Insufficient fee - command: Command::RegisterToken { token: WETH.into(), fee: 1_000 }, - }); - let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); - - let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + // Construct RegisterToken message and sent to inbound queue + let message = make_register_token_with_infufficient_fee_message(); + send_inbound_message(message).unwrap(); assert_expected_events!( BridgeHubRococo, @@ -598,51 +592,3 @@ fn send_token_from_ethereum_to_asset_hub_fail_for_insufficient_fund() { assert_err!(send_inbound_message(make_register_token_message()), Arithmetic(Underflow)); }); } - -#[test] -fn send_token_from_ethereum_to_asset_hub_fail_for_insufficient_fee() { - BridgeHubRococo::fund_para_sovereign(AssetHubRococo::para_id().into(), INITIAL_FUND); - - // Fund ethereum sovereign in asset hub - AssetHubRococo::fund_accounts(vec![(AssetHubRococoReceiver::get(), INITIAL_FUND)]); - - let message_id_: H256 = [1; 32].into(); - - BridgeHubRococo::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - // Construct RegisterToken message and sent to inbound queue - send_inbound_message(make_register_token_message()).unwrap(); - - let message = VersionedMessage::V1(MessageV1 { - chain_id: CHAIN_ID, - command: Command::SendToken { - token: WETH.into(), - destination: Destination::AccountId32 { id: AssetHubRococoReceiver::get().into() }, - amount: 1_000_000_000, - // Insufficient fee - fee: 1_000, - }, - }); - let (xcm, _) = EthereumInboundQueue::do_convert(message_id_, message).unwrap(); - let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); - - assert_expected_events!( - BridgeHubRococo, - vec![ - RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, - ] - ); - }); - - AssetHubRococo::execute_with(|| { - type RuntimeEvent = ::RuntimeEvent; - - assert_expected_events!( - AssetHubRococo, - vec![ - RuntimeEvent::MessageQueue(pallet_message_queue::Event::Processed { success:false, .. }) => {}, - ] - ); - }); -} From aeba49666264d700cedf01ed45cdf3b15edff13c Mon Sep 17 00:00:00 2001 From: ron Date: Fri, 26 Jan 2024 23:03:06 +0800 Subject: [PATCH 15/16] Test fixture sent token to penpal --- .../bridge-hub-rococo/src/tests/snowbridge.rs | 43 ++++--------------- 1 file changed, 8 insertions(+), 35 deletions(-) diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index eb7571e482ec..3f6093587057 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -24,7 +24,8 @@ use snowbridge_core::{derive_channel_id_for_sibling, outbound::OperatingMode, Ch use snowbridge_pallet_inbound_queue_fixtures::{ register_token::make_register_token_message, register_token_with_insufficient_fee::make_register_token_with_infufficient_fee_message, - send_token::make_send_token_message, InboundQueueFixture, + send_token::make_send_token_message, send_token_to_penpal::make_send_token_to_penpal_message, + InboundQueueFixture, }; use snowbridge_pallet_system; use snowbridge_router_primitives::inbound::{ @@ -294,20 +295,6 @@ fn send_token_from_ethereum_to_penpal() { .unwrap(); AssetHubRococo::fund_accounts(vec![(ethereum_sovereign.clone(), INITIAL_FUND)]); - // Create asset on AssetHub, since that is where the asset reserve is located - AssetHubRococo::execute_with(|| { - assert_ok!(::ForeignAssets::create( - pallet_xcm::Origin::Xcm(origin_location).into(), - weth_asset_id, - asset_hub_sovereign.clone().into(), - 1000, - )); - - assert!(::ForeignAssets::asset_exists( - weth_asset_id - )); - }); - // Create asset on the Penpal parachain. PenpalA::execute_with(|| { assert_ok!(::ForeignAssets::create( @@ -324,26 +311,12 @@ fn send_token_from_ethereum_to_penpal() { BridgeHubRococo::execute_with(|| { type RuntimeEvent = ::RuntimeEvent; - type EthereumInboundQueue = - ::EthereumInboundQueue; - // Construct SendToken message - let message = VersionedMessage::V1(MessageV1 { - chain_id: CHAIN_ID, - command: Command::SendToken { - token: WETH.into(), - destination: Destination::ForeignAccountId32 { - para_id: 2000, - id: PenpalAReceiver::get().into(), - fee: XCM_FEE, - }, - amount: 1_000_000_000, - fee: XCM_FEE, - }, - }); - // Convert the message to XCM - let (xcm, _) = EthereumInboundQueue::do_convert(message_id, message).unwrap(); - // Send the XCM - let _ = EthereumInboundQueue::send_xcm(xcm, AssetHubRococo::para_id().into()).unwrap(); + + // Construct RegisterToken message and sent to inbound queue + send_inbound_message(make_register_token_message()).unwrap(); + + // Construct SendToken message and sent to inbound queue + send_inbound_message(make_send_token_to_penpal_message()).unwrap(); assert_expected_events!( BridgeHubRococo, From cade895e4eb85a43d6a67b3c43a7768cc1ce410e Mon Sep 17 00:00:00 2001 From: ron Date: Mon, 29 Jan 2024 19:16:28 +0800 Subject: [PATCH 16/16] Update test --- .../bridge-hub-rococo/src/tests/snowbridge.rs | 29 ++----------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs index 3f6093587057..3dd73c649fac 100644 --- a/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs +++ b/cumulus/parachains/integration-tests/emulated/tests/bridges/bridge-hub-rococo/src/tests/snowbridge.rs @@ -20,7 +20,7 @@ use frame_support::pallet_prelude::TypeInfo; use hex_literal::hex; use parachains_common::rococo::snowbridge::EthereumNetwork; use rococo_westend_system_emulated_network::BridgeHubRococoParaSender as BridgeHubRococoSender; -use snowbridge_core::{derive_channel_id_for_sibling, outbound::OperatingMode, ChannelId}; +use snowbridge_core::outbound::OperatingMode; use snowbridge_pallet_inbound_queue_fixtures::{ register_token::make_register_token_message, register_token_with_insufficient_fee::make_register_token_with_infufficient_fee_message, @@ -28,9 +28,7 @@ use snowbridge_pallet_inbound_queue_fixtures::{ InboundQueueFixture, }; use snowbridge_pallet_system; -use snowbridge_router_primitives::inbound::{ - Command, Destination, GlobalConsensusEthereumConvertsFor, MessageV1, VersionedMessage, -}; +use snowbridge_router_primitives::inbound::GlobalConsensusEthereumConvertsFor; use sp_core::H256; use sp_runtime::{ArithmeticError::Underflow, DispatchError::Arithmetic}; @@ -227,29 +225,6 @@ fn register_weth_token_from_ethereum_to_asset_hub() { RuntimeEvent::XcmpQueue(cumulus_pallet_xcmp_queue::Event::XcmpMessageSent { .. }) => {}, ] ); - - // Assert fees charged from sovereign account of AH as expected - let message = VersionedMessage::V1(MessageV1 { - chain_id: CHAIN_ID, - command: Command::RegisterToken { token: WETH.into(), fee: XCM_FEE }, - }); - let delivery_fee = EthereumInboundQueue::calculate_delivery_cost( - register_token_message.message.encode().len() as u32, - ); - let (_, xcm_fee) = EthereumInboundQueue::do_convert([1; 32].into(), message).unwrap(); - let total_fee = delivery_fee + xcm_fee; - let asset_hub_sovereign = BridgeHubRococo::sovereign_account_id_of(Location::new( - 1, - [Parachain(AssetHubRococo::para_id().into())], - )); - let free_balance_after = Balances::free_balance(asset_hub_sovereign); - let diff = INITIAL_FUND - free_balance_after; - assert_eq!(diff >= total_fee, true); - - // Assert nonce incremented - let channel_id: ChannelId = derive_channel_id_for_sibling(AssetHubRococo::para_id()); - let nonce = snowbridge_pallet_inbound_queue::Nonce::::get(channel_id); - assert_eq!(nonce, 1); }); AssetHubRococo::execute_with(|| {