From 351ba2a679abe1e963bc0d1a931e61089e5b2ea1 Mon Sep 17 00:00:00 2001 From: "dzmitry.lahoda" Date: Tue, 23 Nov 2021 13:16:05 +0200 Subject: [PATCH 1/3] ensuring exact error from xcmp propagated --- xtokens/src/lib.rs | 87 +++++++++++++++++++++++++++++++++++++++++++- xtokens/src/tests.rs | 2 +- 2 files changed, 87 insertions(+), 2 deletions(-) diff --git a/xtokens/src/lib.rs b/xtokens/src/lib.rs index b75dbf8cf..76f847d27 100644 --- a/xtokens/src/lib.rs +++ b/xtokens/src/lib.rs @@ -134,6 +134,91 @@ pub mod module { /// The version of the `Versioned` value used is not able to be /// interpreted. BadVersion, + /// same as XCM underlying error + XcmOverflow, + /// same as XCM underlying error + XcmUnimplemented, + /// same as XCM underlying error + XcmUntrustedReserveLocation, + /// same as XCM underlying error + XcmUntrustedTeleportLocation, + /// same as XCM underlying error + XcmMultiLocationFull, + /// same as XCM underlying error + XcmMultiLocationNotInvertible, + /// same as XCM underlying error + XcmBadOrigin, + /// same as XCM underlying error + XcmInvalidLocation, + /// same as XCM underlying error + XcmAssetNotFound, + /// same as XCM underlying error + XcmFailedToTransactAsset, + /// same as XCM underlying error + XcmNotWithdrawable, + /// same as XCM underlying error + XcmLocationCannotHold, + /// same as XCM underlying error + XcmExceedsMaxMessageSize, + /// same as XCM underlying error + XcmDestinationUnsupported, + /// same as XCM underlying error + XcmTransport, + /// same as XCM underlying error + XcmUnroutable, + /// same as XCM underlying error + XcmUnknownClaim, + /// same as XCM underlying error + XcmFailedToDecode, + /// same as XCM underlying error + XcmTooMuchWeightRequired, + /// same as XCM underlying error + XcmNotHoldingFees, + /// same as XCM underlying error + XcmTooExpensive, + /// same as XCM underlying error + XcmTrap, + /// same as XCM underlying error + XcmUnhandledXcmVersion, + /// same as XCM underlying error + XcmWeightLimitReached, + /// same as XCM underlying error + XcmBarrier, + /// same as XCM underlying error + XcmWeightNotComputable, + } + + /// Maps xcm error for detailed response in pallet. + /// Make sure that Xcm transfers are debugable. + fn xcm_to_pallet_error(error: XcmError) -> Error { + match error { + XcmError::Overflow => Error::::XcmOverflow, + XcmError::Unimplemented => Error::::XcmUnimplemented, + XcmError::UntrustedReserveLocation => Error::::XcmUntrustedReserveLocation, + XcmError::UntrustedTeleportLocation => Error::::XcmUntrustedTeleportLocation, + XcmError::MultiLocationFull => Error::::XcmMultiLocationFull, + XcmError::MultiLocationNotInvertible => Error::::XcmMultiLocationNotInvertible, + XcmError::BadOrigin => Error::::XcmBadOrigin, + XcmError::InvalidLocation => Error::::XcmInvalidLocation, + XcmError::AssetNotFound => Error::::XcmAssetNotFound, + XcmError::FailedToTransactAsset(_) => Error::::XcmFailedToTransactAsset, + XcmError::NotWithdrawable => Error::::XcmNotWithdrawable, + XcmError::LocationCannotHold => Error::::XcmLocationCannotHold, + XcmError::ExceedsMaxMessageSize => Error::::XcmExceedsMaxMessageSize, + XcmError::DestinationUnsupported => Error::::XcmDestinationUnsupported, + XcmError::Transport(_) => Error::::XcmTransport, + XcmError::Unroutable => Error::::XcmUnroutable, + XcmError::UnknownClaim => Error::::XcmUnknownClaim, + XcmError::FailedToDecode => Error::::XcmFailedToDecode, + XcmError::TooMuchWeightRequired => Error::::XcmTooMuchWeightRequired, + XcmError::NotHoldingFees => Error::::XcmNotHoldingFees, + XcmError::TooExpensive => Error::::XcmTooExpensive, + XcmError::Trap(_) => Error::::XcmTrap, + XcmError::UnhandledXcmVersion => Error::::XcmUnhandledXcmVersion, + XcmError::WeightLimitReached(_) => Error::::XcmWeightLimitReached, + XcmError::Barrier => Error::::XcmBarrier, + XcmError::WeightNotComputable => Error::::XcmWeightNotComputable, + } } #[pallet::hooks] @@ -245,7 +330,7 @@ pub mod module { let weight = T::Weigher::weight(&mut msg).map_err(|()| Error::::UnweighableMessage)?; T::XcmExecutor::execute_xcm_in_credit(origin_location, msg, weight, weight) .ensure_complete() - .map_err(|_| Error::::XcmExecutionFailed)?; + .map_err(xcm_to_pallet_error::)?; if deposit_event { Self::deposit_event(Event::::TransferredMultiAsset(who, asset, dest)); diff --git a/xtokens/src/tests.rs b/xtokens/src/tests.rs index 74a927d92..79bb43b1f 100644 --- a/xtokens/src/tests.rs +++ b/xtokens/src/tests.rs @@ -101,7 +101,7 @@ fn cannot_lost_fund_on_send_failed() { ), 40, ), - Error::::XcmExecutionFailed + Error::::XcmUnroutable ); assert_eq!(ParaTokens::free_balance(CurrencyId::R, &ALICE), 1_000); From 7cbeb5ec68793b843a131af5031dbc74735f4fe7 Mon Sep 17 00:00:00 2001 From: dzmitry-lahoda Date: Wed, 24 Nov 2021 08:56:39 +0200 Subject: [PATCH 2/3] added logging for xtokens xcm transfer error --- xtokens/src/lib.rs | 94 ++++------------------------------------------ 1 file changed, 7 insertions(+), 87 deletions(-) diff --git a/xtokens/src/lib.rs b/xtokens/src/lib.rs index 76f847d27..d6a8db897 100644 --- a/xtokens/src/lib.rs +++ b/xtokens/src/lib.rs @@ -22,7 +22,7 @@ #![allow(clippy::unused_unit)] #![allow(clippy::large_enum_variant)] -use frame_support::{pallet_prelude::*, require_transactional, traits::Get, transactional, Parameter}; +use frame_support::{log, pallet_prelude::*, require_transactional, traits::Get, transactional, Parameter}; use frame_system::{ensure_signed, pallet_prelude::*}; use sp_runtime::{ traits::{AtLeast32BitUnsigned, Convert, MaybeSerializeDeserialize, Member, Zero}, @@ -54,6 +54,7 @@ use TransferKind::*; #[frame_support::pallet] pub mod module { + use super::*; #[pallet::config] @@ -120,6 +121,7 @@ pub mod module { NotCrossChainTransferableCurrency, /// The message's weight could not be determined. UnweighableMessage, + // TODO: expand into XcmExecutionFailed(XcmError) after https://github.com/paritytech/substrate/pull/10242 done /// XCM execution failed. XcmExecutionFailed, /// Could not re-anchor the assets to declare the fees for the @@ -134,91 +136,6 @@ pub mod module { /// The version of the `Versioned` value used is not able to be /// interpreted. BadVersion, - /// same as XCM underlying error - XcmOverflow, - /// same as XCM underlying error - XcmUnimplemented, - /// same as XCM underlying error - XcmUntrustedReserveLocation, - /// same as XCM underlying error - XcmUntrustedTeleportLocation, - /// same as XCM underlying error - XcmMultiLocationFull, - /// same as XCM underlying error - XcmMultiLocationNotInvertible, - /// same as XCM underlying error - XcmBadOrigin, - /// same as XCM underlying error - XcmInvalidLocation, - /// same as XCM underlying error - XcmAssetNotFound, - /// same as XCM underlying error - XcmFailedToTransactAsset, - /// same as XCM underlying error - XcmNotWithdrawable, - /// same as XCM underlying error - XcmLocationCannotHold, - /// same as XCM underlying error - XcmExceedsMaxMessageSize, - /// same as XCM underlying error - XcmDestinationUnsupported, - /// same as XCM underlying error - XcmTransport, - /// same as XCM underlying error - XcmUnroutable, - /// same as XCM underlying error - XcmUnknownClaim, - /// same as XCM underlying error - XcmFailedToDecode, - /// same as XCM underlying error - XcmTooMuchWeightRequired, - /// same as XCM underlying error - XcmNotHoldingFees, - /// same as XCM underlying error - XcmTooExpensive, - /// same as XCM underlying error - XcmTrap, - /// same as XCM underlying error - XcmUnhandledXcmVersion, - /// same as XCM underlying error - XcmWeightLimitReached, - /// same as XCM underlying error - XcmBarrier, - /// same as XCM underlying error - XcmWeightNotComputable, - } - - /// Maps xcm error for detailed response in pallet. - /// Make sure that Xcm transfers are debugable. - fn xcm_to_pallet_error(error: XcmError) -> Error { - match error { - XcmError::Overflow => Error::::XcmOverflow, - XcmError::Unimplemented => Error::::XcmUnimplemented, - XcmError::UntrustedReserveLocation => Error::::XcmUntrustedReserveLocation, - XcmError::UntrustedTeleportLocation => Error::::XcmUntrustedTeleportLocation, - XcmError::MultiLocationFull => Error::::XcmMultiLocationFull, - XcmError::MultiLocationNotInvertible => Error::::XcmMultiLocationNotInvertible, - XcmError::BadOrigin => Error::::XcmBadOrigin, - XcmError::InvalidLocation => Error::::XcmInvalidLocation, - XcmError::AssetNotFound => Error::::XcmAssetNotFound, - XcmError::FailedToTransactAsset(_) => Error::::XcmFailedToTransactAsset, - XcmError::NotWithdrawable => Error::::XcmNotWithdrawable, - XcmError::LocationCannotHold => Error::::XcmLocationCannotHold, - XcmError::ExceedsMaxMessageSize => Error::::XcmExceedsMaxMessageSize, - XcmError::DestinationUnsupported => Error::::XcmDestinationUnsupported, - XcmError::Transport(_) => Error::::XcmTransport, - XcmError::Unroutable => Error::::XcmUnroutable, - XcmError::UnknownClaim => Error::::XcmUnknownClaim, - XcmError::FailedToDecode => Error::::XcmFailedToDecode, - XcmError::TooMuchWeightRequired => Error::::XcmTooMuchWeightRequired, - XcmError::NotHoldingFees => Error::::XcmNotHoldingFees, - XcmError::TooExpensive => Error::::XcmTooExpensive, - XcmError::Trap(_) => Error::::XcmTrap, - XcmError::UnhandledXcmVersion => Error::::XcmUnhandledXcmVersion, - XcmError::WeightLimitReached(_) => Error::::XcmWeightLimitReached, - XcmError::Barrier => Error::::XcmBarrier, - XcmError::WeightNotComputable => Error::::XcmWeightNotComputable, - } } #[pallet::hooks] @@ -330,7 +247,10 @@ pub mod module { let weight = T::Weigher::weight(&mut msg).map_err(|()| Error::::UnweighableMessage)?; T::XcmExecutor::execute_xcm_in_credit(origin_location, msg, weight, weight) .ensure_complete() - .map_err(xcm_to_pallet_error::)?; + .map_err(|error| { + log::trace!("Failed execute transfer message with {:?}", error); + Error::::XcmExecutionFailed + })?; if deposit_event { Self::deposit_event(Event::::TransferredMultiAsset(who, asset, dest)); From 8711e06a9c6d5c5b7afd2bbc4a2057e7a8829f6d Mon Sep 17 00:00:00 2001 From: "dzmitry.lahoda" Date: Thu, 25 Nov 2021 00:26:11 +0200 Subject: [PATCH 3/3] make xcm exec error to be error in logs --- xtokens/src/lib.rs | 2 +- xtokens/src/tests.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/xtokens/src/lib.rs b/xtokens/src/lib.rs index d6a8db897..70df21775 100644 --- a/xtokens/src/lib.rs +++ b/xtokens/src/lib.rs @@ -248,7 +248,7 @@ pub mod module { T::XcmExecutor::execute_xcm_in_credit(origin_location, msg, weight, weight) .ensure_complete() .map_err(|error| { - log::trace!("Failed execute transfer message with {:?}", error); + log::error!("Failed execute transfer message with {:?}", error); Error::::XcmExecutionFailed })?; diff --git a/xtokens/src/tests.rs b/xtokens/src/tests.rs index 79bb43b1f..74a927d92 100644 --- a/xtokens/src/tests.rs +++ b/xtokens/src/tests.rs @@ -101,7 +101,7 @@ fn cannot_lost_fund_on_send_failed() { ), 40, ), - Error::::XcmUnroutable + Error::::XcmExecutionFailed ); assert_eq!(ParaTokens::free_balance(CurrencyId::R, &ALICE), 1_000);