diff --git a/runtime/parachains/src/ump.rs b/runtime/parachains/src/ump.rs index bc9fa4d7905e..d6d561f4f683 100644 --- a/runtime/parachains/src/ump.rs +++ b/runtime/parachains/src/ump.rs @@ -73,7 +73,7 @@ impl, Call> UmpSink for XcmSink Some(w), - Outcome::Error(XcmError::WeightLimitReached) => None, + Outcome::Error(XcmError::WeightLimitReached(..)) => None, Outcome::Error(_) => Some(0), } } diff --git a/xcm/src/v0/multi_location.rs b/xcm/src/v0/multi_location.rs index 5226c67cc7e7..f001f5018a0d 100644 --- a/xcm/src/v0/multi_location.rs +++ b/xcm/src/v0/multi_location.rs @@ -578,7 +578,7 @@ impl MultiLocation { let self_parents = self.parent_count(); let prefix_rest = prefix.len() - prefix.parent_count(); let skipped = self_parents.min(prefix_rest); - if self.len() + prefix.len() - 2 * skipped > 4 { + if self.len() + prefix.len() - 2 * skipped > 8 { return Err(prefix); } diff --git a/xcm/src/v0/traits.rs b/xcm/src/v0/traits.rs index e863433d8527..8734bb6c7f95 100644 --- a/xcm/src/v0/traits.rs +++ b/xcm/src/v0/traits.rs @@ -43,7 +43,9 @@ pub enum Error { BadOrigin, ExceedsMaxMessageSize, FailedToTransactAsset(#[codec(skip)] &'static str), - WeightLimitReached, + /// Execution of the XCM would potentially result in a greater weight used than the pre-specified + /// weight limit. The amount that is potentially required is the parameter. + WeightLimitReached(Weight), Wildcard, /// The case where an XCM message has specified a optional weight limit and the weight required for /// processing is too great. diff --git a/xcm/xcm-executor/src/lib.rs b/xcm/xcm-executor/src/lib.rs index 96cdc47a2992..3a43eef8724f 100644 --- a/xcm/xcm-executor/src/lib.rs +++ b/xcm/xcm-executor/src/lib.rs @@ -54,10 +54,10 @@ impl ExecuteXcm for XcmExecutor { }; let maximum_weight = match shallow_weight.checked_add(deep_weight) { Some(x) => x, - None => return Outcome::Error(XcmError::WeightLimitReached), + None => return Outcome::Error(XcmError::Overflow), }; if maximum_weight > weight_limit { - return Outcome::Error(XcmError::WeightLimitReached); + return Outcome::Error(XcmError::WeightLimitReached(maximum_weight)); } let mut trader = Config::Trader::new(); let result = Self::do_execute_xcm(origin, true, message, &mut 0, Some(shallow_weight), &mut trader);