Replace XCM Error::Undefined usage (#2580)

* Replace undefined error in currency adapter.

* Update tranact asset errors.

* Update TransactAsset trait documentations.

* Update currency adapter error documentation.
This commit is contained in:
Shaun Wang
2021-03-10 03:46:30 +13:00
committed by GitHub
parent 2e34eed312
commit d859734ed9
3 changed files with 51 additions and 10 deletions
@@ -15,11 +15,33 @@
// along with Polkadot. If not, see <http://www.gnu.org/licenses/>.
use sp_std::{result, convert::TryInto, marker::PhantomData};
use xcm::v0::{Error, Result, MultiAsset, MultiLocation};
use xcm::v0::{Error as XcmError, Result, MultiAsset, MultiLocation};
use sp_arithmetic::traits::SaturatedConversion;
use frame_support::traits::{ExistenceRequirement::AllowDeath, WithdrawReasons};
use xcm_executor::traits::{MatchesFungible, LocationConversion, TransactAsset};
/// Asset transaction errors.
enum Error {
/// Asset not found.
AssetNotFound,
/// `MultiLocation` to `AccountId` Conversion failed.
AccountIdConversionFailed,
/// `u128` amount to currency `Balance` conversion failed.
AmountToBalanceConversionFailed,
}
impl From<Error> for XcmError {
fn from(e: Error) -> Self {
match e {
Error::AssetNotFound => XcmError::FailedToTransactAsset("AssetNotFound"),
Error::AccountIdConversionFailed =>
XcmError::FailedToTransactAsset("AccountIdConversionFailed"),
Error::AmountToBalanceConversionFailed =>
XcmError::FailedToTransactAsset("AmountToBalanceConversionFailed"),
}
}
}
pub struct CurrencyAdapter<Currency, Matcher, AccountIdConverter, AccountId>(
PhantomData<Currency>,
PhantomData<Matcher>,
@@ -36,19 +58,33 @@ impl<
fn deposit_asset(what: &MultiAsset, who: &MultiLocation) -> Result {
// Check we handle this asset.
let amount: u128 = Matcher::matches_fungible(&what).ok_or(())?.saturated_into();
let who = AccountIdConverter::from_location(who).ok_or(())?;
let balance_amount = amount.try_into().map_err(|_| ())?;
let amount: u128 = Matcher::matches_fungible(&what)
.ok_or(XcmError::from(Error::AssetNotFound))?
.saturated_into();
let who = AccountIdConverter::from_location(who)
.ok_or(XcmError::from(Error::AccountIdConversionFailed))?;
let balance_amount = amount
.try_into()
.map_err(|_| XcmError::from(Error::AmountToBalanceConversionFailed))?;
let _imbalance = Currency::deposit_creating(&who, balance_amount);
Ok(())
}
fn withdraw_asset(what: &MultiAsset, who: &MultiLocation) -> result::Result<MultiAsset, Error> {
fn withdraw_asset(
what: &MultiAsset,
who: &MultiLocation
) -> result::Result<MultiAsset, XcmError> {
// Check we handle this asset.
let amount: u128 = Matcher::matches_fungible(&what).ok_or(())?.saturated_into();
let who = AccountIdConverter::from_location(who).ok_or(())?;
let balance_amount = amount.try_into().map_err(|_| ())?;
Currency::withdraw(&who, balance_amount, WithdrawReasons::TRANSFER, AllowDeath).map_err(|_| ())?;
let amount: u128 = Matcher::matches_fungible(&what)
.ok_or(XcmError::from(Error::AssetNotFound))?
.saturated_into();
let who = AccountIdConverter::from_location(who)
.ok_or(XcmError::from(Error::AccountIdConversionFailed))?;
let balance_amount = amount
.try_into()
.map_err(|_| XcmError::from(Error::AmountToBalanceConversionFailed))?;
Currency::withdraw(&who, balance_amount, WithdrawReasons::TRANSFER, AllowDeath)
.map_err(|e| XcmError::FailedToTransactAsset(e.into()))?;
Ok(what.clone())
}
}