mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 09:21:04 +00:00
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:
@@ -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())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user