mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-31 23:51:01 +00:00
Withdraw Assets Before Checking Out in OnReapIdentity impl (#2552)
Follow up to fix a bug from #1814 discovered in XCM emulator testing. I mistakenly thought that checking out an asset would withdraw it from the sender. This actually withdraws the asset before checking out. --------- Co-authored-by: Adrian Catangiu <adrian@parity.io> Co-authored-by: Liam Aharon <liam.aharon@hotmail.com>
This commit is contained in:
@@ -79,6 +79,8 @@ impl<Runtime, AccountId> ToParachainIdentityReaper<Runtime, AccountId> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note / Warning: This implementation should only be used in a transactional context. If not, then
|
||||||
|
// an error could result in assets being burned.
|
||||||
impl<Runtime, AccountId> OnReapIdentity<AccountId> for ToParachainIdentityReaper<Runtime, AccountId>
|
impl<Runtime, AccountId> OnReapIdentity<AccountId> for ToParachainIdentityReaper<Runtime, AccountId>
|
||||||
where
|
where
|
||||||
Runtime: frame_system::Config + pallet_xcm::Config,
|
Runtime: frame_system::Config + pallet_xcm::Config,
|
||||||
@@ -100,6 +102,19 @@ where
|
|||||||
// Do `check_out` accounting since the XCM Executor's `InitiateTeleport` doesn't support
|
// Do `check_out` accounting since the XCM Executor's `InitiateTeleport` doesn't support
|
||||||
// unpaid teleports.
|
// unpaid teleports.
|
||||||
|
|
||||||
|
// withdraw the asset from `who`
|
||||||
|
let who_origin =
|
||||||
|
Junction::AccountId32 { network: None, id: who.clone().into() }.into_location();
|
||||||
|
let _withdrawn = xcm_config::LocalAssetTransactor::withdraw_asset(&roc, &who_origin, None)
|
||||||
|
.map_err(|err| {
|
||||||
|
log::error!(
|
||||||
|
target: "runtime::on_reap_identity",
|
||||||
|
"withdraw_asset(what: {:?}, who_origin: {:?}) error: {:?}",
|
||||||
|
roc, who_origin, err
|
||||||
|
);
|
||||||
|
pallet_xcm::Error::<Runtime>::LowBalance
|
||||||
|
})?;
|
||||||
|
|
||||||
// check out
|
// check out
|
||||||
xcm_config::LocalAssetTransactor::can_check_out(
|
xcm_config::LocalAssetTransactor::can_check_out(
|
||||||
&destination,
|
&destination,
|
||||||
@@ -107,7 +122,14 @@ where
|
|||||||
// not used in AssetTransactor
|
// not used in AssetTransactor
|
||||||
&XcmContext { origin: None, message_id: [0; 32], topic: None },
|
&XcmContext { origin: None, message_id: [0; 32], topic: None },
|
||||||
)
|
)
|
||||||
.map_err(|_| pallet_xcm::Error::<Runtime>::CannotCheckOutTeleport)?;
|
.map_err(|err| {
|
||||||
|
log::error!(
|
||||||
|
target: "runtime::on_reap_identity",
|
||||||
|
"can_check_out(destination: {:?}, asset: {:?}, _) error: {:?}",
|
||||||
|
destination, roc, err
|
||||||
|
);
|
||||||
|
pallet_xcm::Error::<Runtime>::CannotCheckOutTeleport
|
||||||
|
})?;
|
||||||
xcm_config::LocalAssetTransactor::check_out(
|
xcm_config::LocalAssetTransactor::check_out(
|
||||||
&destination,
|
&destination,
|
||||||
&roc,
|
&roc,
|
||||||
|
|||||||
@@ -79,6 +79,8 @@ impl<Runtime, AccountId> ToParachainIdentityReaper<Runtime, AccountId> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note / Warning: This implementation should only be used in a transactional context. If not, then
|
||||||
|
// an error could result in assets being burned.
|
||||||
impl<Runtime, AccountId> OnReapIdentity<AccountId> for ToParachainIdentityReaper<Runtime, AccountId>
|
impl<Runtime, AccountId> OnReapIdentity<AccountId> for ToParachainIdentityReaper<Runtime, AccountId>
|
||||||
where
|
where
|
||||||
Runtime: frame_system::Config + pallet_xcm::Config,
|
Runtime: frame_system::Config + pallet_xcm::Config,
|
||||||
@@ -100,6 +102,19 @@ where
|
|||||||
// Do `check_out` accounting since the XCM Executor's `InitiateTeleport` doesn't support
|
// Do `check_out` accounting since the XCM Executor's `InitiateTeleport` doesn't support
|
||||||
// unpaid teleports.
|
// unpaid teleports.
|
||||||
|
|
||||||
|
// withdraw the asset from `who`
|
||||||
|
let who_origin =
|
||||||
|
Junction::AccountId32 { network: None, id: who.clone().into() }.into_location();
|
||||||
|
let _withdrawn = xcm_config::LocalAssetTransactor::withdraw_asset(&wnd, &who_origin, None)
|
||||||
|
.map_err(|err| {
|
||||||
|
log::error!(
|
||||||
|
target: "runtime::on_reap_identity",
|
||||||
|
"withdraw_asset(what: {:?}, who_origin: {:?}) error: {:?}",
|
||||||
|
wnd, who_origin, err
|
||||||
|
);
|
||||||
|
pallet_xcm::Error::<Runtime>::LowBalance
|
||||||
|
})?;
|
||||||
|
|
||||||
// check out
|
// check out
|
||||||
xcm_config::LocalAssetTransactor::can_check_out(
|
xcm_config::LocalAssetTransactor::can_check_out(
|
||||||
&destination,
|
&destination,
|
||||||
@@ -107,7 +122,14 @@ where
|
|||||||
// not used in AssetTransactor
|
// not used in AssetTransactor
|
||||||
&XcmContext { origin: None, message_id: [0; 32], topic: None },
|
&XcmContext { origin: None, message_id: [0; 32], topic: None },
|
||||||
)
|
)
|
||||||
.map_err(|_| pallet_xcm::Error::<Runtime>::CannotCheckOutTeleport)?;
|
.map_err(|err| {
|
||||||
|
log::error!(
|
||||||
|
target: "runtime::on_reap_identity",
|
||||||
|
"can_check_out(destination: {:?}, asset: {:?}, _) error: {:?}",
|
||||||
|
destination, wnd, err
|
||||||
|
);
|
||||||
|
pallet_xcm::Error::<Runtime>::CannotCheckOutTeleport
|
||||||
|
})?;
|
||||||
xcm_config::LocalAssetTransactor::check_out(
|
xcm_config::LocalAssetTransactor::check_out(
|
||||||
&destination,
|
&destination,
|
||||||
&wnd,
|
&wnd,
|
||||||
|
|||||||
Reference in New Issue
Block a user