Allow receive bridged Xcm::Trap on Westmint

This commit is contained in:
Branislav Kontur
2023-01-04 12:31:31 +01:00
parent a7dd1fcd9d
commit 2ff5c4fb4f
4 changed files with 90 additions and 8 deletions
@@ -56,6 +56,11 @@ impl<Runtime: frame_system::Config + pallet_balances::Config + pallet_session::C
self
}
pub fn with_tracing(self) -> Self {
frame_support::sp_tracing::try_init_simple();
self
}
pub fn build(self) -> sp_io::TestExternalities
where
Runtime:
@@ -211,7 +211,8 @@ impl<Call> XcmWeightInfo<Call> for WestmintXcmWeight<Call> {
XcmGeneric::<Runtime>::clear_transact_status().ref_time()
}
fn universal_origin(_: &Junction) -> XCMWeight {
Weight::MAX.ref_time()
// TODO:check-parameter - temporary fix - replace with correct weight for benchmark (set UniversalAliases)
XcmGeneric::<Runtime>::unpaid_execution().ref_time()
}
fn export_message(_: &NetworkId, _: &Junctions, _: &Xcm<()>) -> XCMWeight {
Weight::MAX.ref_time()
@@ -20,7 +20,7 @@ use super::{
};
use frame_support::{
match_types, parameter_types,
traits::{ConstU32, EnsureOrigin, EnsureOriginWithArg, Everything, Nothing, PalletInfoAccess},
traits::{ConstU32, Contains, EnsureOrigin, EnsureOriginWithArg, Everything, PalletInfoAccess},
};
use pallet_xcm::{EnsureXcm, XcmPassthrough};
use parachains_common::{
@@ -39,9 +39,10 @@ use xcm_builder::{
NativeAsset, ParentAsSuperuser, ParentIsPreset, RelayChainAsNative, SiblingParachainAsNative,
SiblingParachainConvertsVia, SignedAccountId32AsNative, SignedToAccountId32,
SovereignSignedViaLocation, TakeWeightCredit, UsingComponents, WeightInfoBounds,
WithComputedOrigin,
};
use xcm_executor::{
traits::{Convert, JustTry},
traits::{Convert, JustTry, ShouldExecute},
XcmExecutor,
};
@@ -49,7 +50,7 @@ parameter_types! {
pub const WestendLocation: MultiLocation = MultiLocation::parent();
pub RelayNetwork: NetworkId = NetworkId::Westend;
pub RelayChainOrigin: RuntimeOrigin = cumulus_pallet_xcm::Origin::Relay.into();
pub UniversalLocation: InteriorMultiLocation = Parachain(ParachainInfo::parachain_id().into()).into();
pub UniversalLocation: InteriorMultiLocation = X2(GlobalConsensus(RelayNetwork::get()), Parachain(ParachainInfo::parachain_id().into()));
pub const Local: MultiLocation = Here.into_location();
// todo: accept all instances, perhaps need a type for each instance?
pub TrustBackedAssetsPalletLocation: MultiLocation =
@@ -152,6 +153,12 @@ match_types! {
MultiLocation { parents: 1, interior: Here } |
MultiLocation { parents: 1, interior: X1(Plurality { .. }) }
};
// TODO:check-parameter - add new pallet and persist/manage this via governance?
// Means, that we accept some `GlobalConsensus` from some `MultiLocation` (which is supposed to be our bridge-hub)
pub type TrustedBridgedNetworks: impl Contains<(MultiLocation, Junction)> = {
(MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, GlobalConsensus(NetworkId::Rococo))
};
}
pub type Barrier = DenyThenTry<
@@ -165,6 +172,8 @@ pub type Barrier = DenyThenTry<
AllowKnownQueryResponses<PolkadotXcm>,
// Subscriptions for version tracking are OK.
AllowSubscriptionsFrom<Everything>,
// Specific barrier for bridged calls from different globalConsensus/network
WithComputedOrigin<BridgedCallsBarrier, UniversalLocation, ConstU32<2>>,
),
>;
@@ -225,7 +234,7 @@ impl xcm_executor::Config for XcmConfig {
type AssetExchanger = ();
type FeeManager = ();
type MessageExporter = ();
type UniversalAliases = Nothing;
type UniversalAliases = TrustedBridgedNetworks;
type CallDispatcher = RuntimeCall;
}
@@ -302,3 +311,33 @@ impl EnsureOriginWithArg<RuntimeOrigin, MultiLocation> for ForeignCreators {
pallet_xcm::Origin::Xcm(a.clone()).into()
}
}
pub type BridgedCallsBarrier = (
// TODO:check-parameter - verify, if we need for production (usefull at least for testing connection in production)
AllowExecutionForTrapFrom<Everything>,
// Expected responses are OK.
AllowKnownQueryResponses<PolkadotXcm>,
// Subscriptions for version tracking are OK.
AllowSubscriptionsFrom<Everything>,
);
pub struct AllowExecutionForTrapFrom<T>(sp_std::marker::PhantomData<T>);
impl<T: Contains<MultiLocation>> ShouldExecute for AllowExecutionForTrapFrom<T> {
fn should_execute<RuntimeCall>(
origin: &MultiLocation,
instructions: &mut [Instruction<RuntimeCall>],
max_weight: xcm::latest::Weight,
_weight_credit: &mut xcm::latest::Weight,
) -> Result<(), ()> {
log::warn!(
target: "xcm::barriers",
"(TODO:remove-in-production) AllowExecutionForTrapFrom origin: {:?}, instructions: {:?}, max_weight: {:?}, weight_credit: {:?}",
origin, instructions, max_weight, _weight_credit,
);
match instructions.first() {
Some(Trap { .. }) => Ok(()),
_ => Err(()),
}
}
}
@@ -1,16 +1,17 @@
use asset_test_utils::{ExtBuilder, RuntimeHelper};
use codec::Encode;
use frame_support::{
assert_noop, assert_ok,
assert_noop, assert_ok, sp_io,
traits::PalletInfo,
weights::{Weight, WeightToFee as WeightToFeeT},
};
use parachains_common::{AccountId, AuraId};
pub use westmint_runtime::{
constants::fee::WeightToFee, xcm_config::XcmConfig, Balances, ExistentialDeposit, Runtime,
SessionKeys, System, TrustBackedAssets,
RuntimeCall, RuntimeEvent, SessionKeys, System, TrustBackedAssets,
};
use xcm::latest::prelude::*;
use xcm_executor::traits::WeightTrader;
use xcm_executor::{traits::WeightTrader, XcmExecutor};
pub const ALICE: [u8; 32] = [1u8; 32];
@@ -303,3 +304,39 @@ fn test_that_buying_ed_refund_does_not_refund() {
assert_eq!(Assets::total_supply(1), ExistentialDeposit::get());
});
}
#[test]
fn test_bridged_xcm_trap_works() {
ExtBuilder::<Runtime>::default()
.with_collators(vec![AccountId::from(ALICE)])
.with_session_keys(vec![(
AccountId::from(ALICE),
AccountId::from(ALICE),
SessionKeys { aura: AuraId::from(sp_core::sr25519::Public::from_raw(ALICE)) },
)])
.with_tracing()
.build()
.execute_with(|| {
// simulate received message:
// 2022-12-21 14:38:54.047 DEBUG tokio-runtime-worker xcm::execute_xcm: [Parachain] origin: MultiLocation { parents: 1, interior: X1(Parachain(1014)) }, message: Xcm([UniversalOrigin(GlobalConsensus(Rococo)), DescendOrigin(X1(AccountId32 { network: Some(Rococo), id: [28, 189, 45, 67, 83, 10, 68, 112, 90, 208, 136, 175, 49, 62, 24, 248, 11, 83, 239, 22, 179, 97, 119, 205, 75, 119, 184, 70, 242, 165, 240, 124] })), Transact { origin_kind: SovereignAccount, require_weight_at_most: 1000000000, call: [0, 8, 20, 104, 101, 108, 108, 111] }]), weight_limit: 41666666666
// origin as BridgeHub
let origin = MultiLocation { parents: 1, interior: X1(Parachain(1014)) };
let xcm = Xcm(vec![
UniversalOrigin(GlobalConsensus(Rococo)),
DescendOrigin(X1(AccountId32 {
network: Some(Rococo),
id: [
28, 189, 45, 67, 83, 10, 68, 112, 90, 208, 136, 175, 49, 62, 24, 248, 11,
83, 239, 22, 179, 97, 119, 205, 75, 119, 184, 70, 242, 165, 240, 124,
],
})),
Trap(1234),
]);
let hash = xcm.using_encoded(sp_io::hashing::blake2_256);
let weight_limit = 41666666666;
let outcome = XcmExecutor::<XcmConfig>::execute_xcm(origin, xcm, hash, weight_limit);
log::trace!(target: "xcm::execute", "outcome: {:?}", outcome);
assert_eq!(outcome.ensure_complete(), Err(xcm::latest::Error::Trap(1234)));
});
}