From e6837de0921d4f717cdab92f57d76d8fa077c982 Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Fri, 20 Sep 2024 13:49:59 +0200 Subject: [PATCH 1/4] dest and message should be untouched when returning not applicable --- .../primitives/router/src/outbound/mod.rs | 2 + .../primitives/router/src/outbound/tests.rs | 49 +++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/bridges/snowbridge/primitives/router/src/outbound/mod.rs b/bridges/snowbridge/primitives/router/src/outbound/mod.rs index d3b6c116dd7a..5377b35b302d 100644 --- a/bridges/snowbridge/primitives/router/src/outbound/mod.rs +++ b/bridges/snowbridge/primitives/router/src/outbound/mod.rs @@ -71,6 +71,8 @@ impl = + Some([GlobalConsensus(Polkadot), Parachain(1000)].into()); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let channel: u32 = 0; + let assets: Assets = vec![Asset { + id: AssetId([AccountKey20 { network: None, key: token_address }].into()), + fun: Fungible(1000), + }] + .into(); + let fee = assets.clone().get(0).unwrap().clone(); + let filter: AssetFilter = assets.clone().into(); + let msg: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: fee, weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut msg_wrapper: Option> = Some(msg.clone()); + let mut dest_wrapper = Some(destination.clone()); + + let result = + EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + MockTokenIdConvert, + >::validate(network, channel, &mut universal_source, &mut dest_wrapper, &mut msg_wrapper); + + assert_eq!(result, Err(XcmSendError::NotApplicable)); + + // ensure dest and msg are untouched + assert_eq!(Some(destination), dest_wrapper); + assert_eq!(Some(msg), msg_wrapper); +} From b96caa5a9632cab840cd12a1f9b68ef2763235fb Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Fri, 20 Sep 2024 13:55:18 +0200 Subject: [PATCH 2/4] fix test name --- bridges/snowbridge/primitives/router/src/outbound/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bridges/snowbridge/primitives/router/src/outbound/tests.rs b/bridges/snowbridge/primitives/router/src/outbound/tests.rs index 41ae64b247e8..a66e226db73a 100644 --- a/bridges/snowbridge/primitives/router/src/outbound/tests.rs +++ b/bridges/snowbridge/primitives/router/src/outbound/tests.rs @@ -1165,7 +1165,7 @@ fn xcm_converter_transfer_native_token_with_invalid_location_will_fail() { } #[test] -fn exporter_validate_with_unknown_network_yields_not_applicable_does_not_alter_destination() { +fn exporter_validate_with_invalid_dest_does_not_alter_destination() { let network = BridgedNetwork::get(); let mut destination: InteriorLocation = Parachain(1000).into(); From bfc90ba5e9b8f55bf9e13210d06fe66f0e7b50dd Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Fri, 20 Sep 2024 15:46:59 +0200 Subject: [PATCH 3/4] fix another case --- .../primitives/router/src/outbound/mod.rs | 8 ++- .../primitives/router/src/outbound/tests.rs | 65 +++++++++++++++++-- 2 files changed, 67 insertions(+), 6 deletions(-) diff --git a/bridges/snowbridge/primitives/router/src/outbound/mod.rs b/bridges/snowbridge/primitives/router/src/outbound/mod.rs index 5377b35b302d..03bf95bb737d 100644 --- a/bridges/snowbridge/primitives/router/src/outbound/mod.rs +++ b/bridges/snowbridge/primitives/router/src/outbound/mod.rs @@ -71,11 +71,13 @@ impl = - Some([GlobalConsensus(Polkadot), Parachain(1000)].into()); + let universal_source: InteriorLocation = [GlobalConsensus(Polkadot), Parachain(1000)].into(); + + let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); + let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); + + let channel: u32 = 0; + let assets: Assets = vec![Asset { + id: AssetId([AccountKey20 { network: None, key: token_address }].into()), + fun: Fungible(1000), + }] + .into(); + let fee = assets.clone().get(0).unwrap().clone(); + let filter: AssetFilter = assets.clone().into(); + let msg: Xcm<()> = vec![ + WithdrawAsset(assets.clone()), + ClearOrigin, + BuyExecution { fees: fee, weight_limit: Unlimited }, + DepositAsset { + assets: filter, + beneficiary: AccountKey20 { network: None, key: beneficiary_address }.into(), + }, + SetTopic([0; 32]), + ] + .into(); + let mut msg_wrapper: Option> = Some(msg.clone()); + let mut dest_wrapper = Some(destination.clone()); + let mut universal_source_wrapper = Some(universal_source.clone()); + + let result = + EthereumBlobExporter::< + UniversalLocation, + BridgedNetwork, + MockOkOutboundQueue, + AgentIdOf, + MockTokenIdConvert, + >::validate( + network, channel, &mut universal_source_wrapper, &mut dest_wrapper, &mut msg_wrapper + ); + + assert_eq!(result, Err(XcmSendError::NotApplicable)); + + // ensure mutable variables are not changed + assert_eq!(Some(destination), dest_wrapper); + assert_eq!(Some(msg), msg_wrapper); + assert_eq!(Some(universal_source), universal_source_wrapper); +} + +#[test] +fn exporter_validate_with_invalid_universal_source_does_not_alter_universal_source() { + let network = BridgedNetwork::get(); + let destination: InteriorLocation = Here.into(); + + let universal_source: InteriorLocation = [GlobalConsensus(Westend), Parachain(1000)].into(); let token_address: [u8; 20] = hex!("1000000000000000000000000000000000000000"); let beneficiary_address: [u8; 20] = hex!("2000000000000000000000000000000000000000"); @@ -1196,6 +1247,7 @@ fn exporter_validate_with_invalid_dest_does_not_alter_destination() { .into(); let mut msg_wrapper: Option> = Some(msg.clone()); let mut dest_wrapper = Some(destination.clone()); + let mut universal_source_wrapper = Some(universal_source.clone()); let result = EthereumBlobExporter::< @@ -1204,11 +1256,14 @@ fn exporter_validate_with_invalid_dest_does_not_alter_destination() { MockOkOutboundQueue, AgentIdOf, MockTokenIdConvert, - >::validate(network, channel, &mut universal_source, &mut dest_wrapper, &mut msg_wrapper); + >::validate( + network, channel, &mut universal_source_wrapper, &mut dest_wrapper, &mut msg_wrapper + ); assert_eq!(result, Err(XcmSendError::NotApplicable)); - // ensure dest and msg are untouched + // ensure mutable variables are not changed assert_eq!(Some(destination), dest_wrapper); assert_eq!(Some(msg), msg_wrapper); + assert_eq!(Some(universal_source), universal_source_wrapper); } From 4fe408539e2ed56c4e10168059dc2318ac7abeb1 Mon Sep 17 00:00:00 2001 From: claravanstaden Date: Mon, 23 Sep 2024 15:28:28 +0200 Subject: [PATCH 4/4] clone values --- .../primitives/router/src/outbound/mod.rs | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/bridges/snowbridge/primitives/router/src/outbound/mod.rs b/bridges/snowbridge/primitives/router/src/outbound/mod.rs index 03bf95bb737d..a818b4ea9514 100644 --- a/bridges/snowbridge/primitives/router/src/outbound/mod.rs +++ b/bridges/snowbridge/primitives/router/src/outbound/mod.rs @@ -68,17 +68,15 @@ impl