difftreelog
fix(xcm) improve denythentry, deny transact xcm
in: master
8 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -4572,6 +4572,16 @@
]
[[package]]
+name = "logtest"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb3e43a8657c1d64516dcc9db8ca03826a4aceaf89d5ce1b37b59f6ff0e43026"
+dependencies = [
+ "lazy_static",
+ "log",
+]
+
+[[package]]
name = "lru"
version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -5148,7 +5158,9 @@
"frame-system-rpc-runtime-api",
"frame-try-runtime",
"hex-literal",
+ "impl-trait-for-tuples",
"log",
+ "logtest",
"orml-tokens",
"orml-traits",
"orml-vesting",
@@ -8466,7 +8478,9 @@
"frame-system-rpc-runtime-api",
"frame-try-runtime",
"hex-literal",
+ "impl-trait-for-tuples",
"log",
+ "logtest",
"orml-tokens",
"orml-traits",
"orml-vesting",
@@ -12206,7 +12220,7 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675"
dependencies = [
- "cfg-if 0.1.10",
+ "cfg-if 1.0.0",
"digest 0.10.3",
"rand 0.8.5",
"static_assertions",
@@ -12459,7 +12473,9 @@
"frame-system-rpc-runtime-api",
"frame-try-runtime",
"hex-literal",
+ "impl-trait-for-tuples",
"log",
+ "logtest",
"orml-tokens",
"orml-traits",
"orml-vesting",
runtime/common/config/xcm.rsdiffbeforeafterboth--- a/runtime/common/config/xcm.rs
+++ b/runtime/common/config/xcm.rs
@@ -172,13 +172,32 @@
};
}
+pub trait TryPass {
+ fn try_pass<Call>(
+ origin: &MultiLocation,
+ message: &mut Xcm<Call>,
+ ) -> Result<(), ()>;
+}
+
+#[impl_trait_for_tuples::impl_for_tuples(30)]
+impl TryPass for Tuple {
+ fn try_pass<Call>(
+ origin: &MultiLocation,
+ message: &mut Xcm<Call>,
+ ) -> Result<(), ()> {
+ for_tuples!( #(
+ Tuple::try_pass(origin, message)?;
+ )* );
+
+ Ok(())
+ }
+}
+
pub struct DenyTransact;
-impl ShouldExecute for DenyTransact {
- fn should_execute<Call>(
+impl TryPass for DenyTransact {
+ fn try_pass<Call>(
_origin: &MultiLocation,
message: &mut Xcm<Call>,
- _max_weight: Weight,
- _weight_credit: &mut Weight,
) -> Result<(), ()> {
let transact_inst = message
.0
@@ -203,12 +222,12 @@
/// If it passes the Deny, and matches one of the Allow cases then it is let through.
pub struct DenyThenTry<Deny, Allow>(PhantomData<Deny>, PhantomData<Allow>)
where
- Deny: ShouldExecute,
+ Deny: TryPass,
Allow: ShouldExecute;
impl<Deny, Allow> ShouldExecute for DenyThenTry<Deny, Allow>
where
- Deny: ShouldExecute,
+ Deny: TryPass,
Allow: ShouldExecute,
{
fn should_execute<Call>(
@@ -217,7 +236,7 @@
max_weight: Weight,
weight_credit: &mut Weight,
) -> Result<(), ()> {
- Deny::should_execute(origin, message, max_weight, weight_credit)?;
+ Deny::try_pass(origin, message)?;
Allow::should_execute(origin, message, max_weight, weight_credit)
}
}
runtime/common/tests/xcm.rsdiffbeforeafterboth--- a/runtime/common/tests/xcm.rs
+++ b/runtime/common/tests/xcm.rs
@@ -34,7 +34,7 @@
}
#[test]
-fn xcm_barrier_does_not_allow_transact() {
+fn xcm_barrier_denies_transact() {
// We have a `AllowTopLevelPaidExecutionFrom` barrier,
// so an XCM program should start from one of the following commands:
// * `WithdrawAsset`
runtime/opal/Cargo.tomldiffbeforeafterboth--- a/runtime/opal/Cargo.toml
+++ b/runtime/opal/Cargo.toml
@@ -463,6 +463,11 @@
pallet-foreing-assets = { default-features = false, path = "../../pallets/foreing-assets" }
################################################################################
+# Other Dependencies
+
+impl-trait-for-tuples = "0.2.2"
+
+################################################################################
# Dev Dependencies
[dev-dependencies.logtest]
runtime/quartz/Cargo.tomldiffbeforeafterboth--- a/runtime/quartz/Cargo.toml
+++ b/runtime/quartz/Cargo.toml
@@ -471,6 +471,11 @@
pallet-foreing-assets = { default-features = false, path = "../../pallets/foreing-assets" }
################################################################################
+# Other Dependencies
+
+impl-trait-for-tuples = "0.2.2"
+
+################################################################################
# Dev Dependencies
[dev-dependencies.logtest]
runtime/quartz/src/xcm_config.rsdiffbeforeafterboth41};41};42use xcm_executor::{42use xcm_executor::{43 {Config, XcmExecutor},43 {Config, XcmExecutor},44 traits::{Convert as ConvertXcm, FilterAssetLocation, JustTry, MatchesFungible, ShouldExecute},44 traits::{Convert as ConvertXcm, FilterAssetLocation, JustTry, MatchesFungible},45};45};464647use up_common::{47use up_common::{939394// Allow xcm exchange only with locations in list94// Allow xcm exchange only with locations in list95pub struct DenyExchangeWithUnknownLocation;95pub struct DenyExchangeWithUnknownLocation;96impl ShouldExecute for DenyExchangeWithUnknownLocation {96impl TryPass for DenyExchangeWithUnknownLocation {97 fn should_execute<Call>(97 fn try_pass<Call>(98 origin: &MultiLocation,98 origin: &MultiLocation,99 message: &mut Xcm<Call>,99 message: &mut Xcm<Call>,100 _max_weight: Weight,101 _weight_credit: &mut Weight,102 ) -> Result<(), ()> {100 ) -> Result<(), ()> {103101104 // Check if deposit or transfer belongs to allowed parachains102 // Check if deposit or transfer belongs to allowed parachains126}124}127125128pub type Barrier = DenyThenTry<126pub type Barrier = DenyThenTry<127 (128 DenyTransact,129 DenyExchangeWithUnknownLocation,129 DenyExchangeWithUnknownLocation,130 ),130 (131 (131 DenyTransact,132 TakeWeightCredit,132 TakeWeightCredit,133 AllowTopLevelPaidExecutionFrom<Everything>,133 AllowTopLevelPaidExecutionFrom<Everything>,134 // Parent and its exec plurality get free execution134 // Parent and its exec plurality get free executionruntime/unique/Cargo.tomldiffbeforeafterboth--- a/runtime/unique/Cargo.toml
+++ b/runtime/unique/Cargo.toml
@@ -463,6 +463,11 @@
pallet-foreing-assets = { default-features = false, path = "../../pallets/foreing-assets" }
################################################################################
+# Other Dependencies
+
+impl-trait-for-tuples = "0.2.2"
+
+################################################################################
# Dev Dependencies
[dev-dependencies.logtest]
runtime/unique/src/xcm_config.rsdiffbeforeafterboth--- a/runtime/unique/src/xcm_config.rs
+++ b/runtime/unique/src/xcm_config.rs
@@ -41,7 +41,7 @@
};
use xcm_executor::{
{Config, XcmExecutor},
- traits::{Convert as ConvertXcm, FilterAssetLocation, JustTry, MatchesFungible, ShouldExecute},
+ traits::{Convert as ConvertXcm, FilterAssetLocation, JustTry, MatchesFungible},
};
use up_common::{
@@ -67,9 +67,11 @@
pub type Barrier = DenyThenTry<
- DenyExchangeWithUnknownLocation,
(
DenyTransact,
+ DenyExchangeWithUnknownLocation,
+ ),
+ (
TakeWeightCredit,
AllowTopLevelPaidExecutionFrom<Everything>,
// Parent and its exec plurality get free execution
@@ -98,12 +100,10 @@
// Allow xcm exchange only with locations in list
pub struct DenyExchangeWithUnknownLocation;
-impl ShouldExecute for DenyExchangeWithUnknownLocation {
- fn should_execute<Call>(
+impl TryPass for DenyExchangeWithUnknownLocation {
+ fn try_pass<Call>(
origin: &MultiLocation,
message: &mut Xcm<Call>,
- _max_weight: Weight,
- _weight_credit: &mut Weight,
) -> Result<(), ()> {
// Check if deposit or transfer belongs to allowed parachains