mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 11:41:02 +00:00
Dispatchable XCMs should translate to v0 (#4062)
* Dispatchable XCMs should translate to v0 * Formatting * Update Westend's XCM WrapVersion
This commit is contained in:
@@ -1323,7 +1323,7 @@ parameter_types! {
|
|||||||
/// individual routers.
|
/// individual routers.
|
||||||
pub type XcmRouter = (
|
pub type XcmRouter = (
|
||||||
// Only one router so far - use DMP to communicate with child parachains.
|
// Only one router so far - use DMP to communicate with child parachains.
|
||||||
xcm_sender::ChildParachainRouter<Runtime, xcm::AlwaysRelease>,
|
xcm_sender::ChildParachainRouter<Runtime, XcmPallet>,
|
||||||
);
|
);
|
||||||
|
|
||||||
parameter_types! {
|
parameter_types! {
|
||||||
|
|||||||
@@ -636,7 +636,7 @@ parameter_types! {
|
|||||||
/// individual routers.
|
/// individual routers.
|
||||||
pub type XcmRouter = (
|
pub type XcmRouter = (
|
||||||
// Only one router so far - use DMP to communicate with child parachains.
|
// Only one router so far - use DMP to communicate with child parachains.
|
||||||
xcm_sender::ChildParachainRouter<Runtime, xcm::AlwaysRelease>,
|
xcm_sender::ChildParachainRouter<Runtime, XcmPallet>,
|
||||||
);
|
);
|
||||||
|
|
||||||
parameter_types! {
|
parameter_types! {
|
||||||
|
|||||||
@@ -958,7 +958,7 @@ type LocalOriginConverter = (
|
|||||||
/// individual routers.
|
/// individual routers.
|
||||||
pub type XcmRouter = (
|
pub type XcmRouter = (
|
||||||
// Only one router so far - use DMP to communicate with child parachains.
|
// Only one router so far - use DMP to communicate with child parachains.
|
||||||
xcm_sender::ChildParachainRouter<Runtime, xcm::AlwaysRelease>,
|
xcm_sender::ChildParachainRouter<Runtime, XcmPallet>,
|
||||||
);
|
);
|
||||||
|
|
||||||
parameter_types! {
|
parameter_types! {
|
||||||
|
|||||||
@@ -526,16 +526,21 @@ pub mod pallet {
|
|||||||
.map_err(|_| Error::<T>::CannotReanchor)?;
|
.map_err(|_| Error::<T>::CannotReanchor)?;
|
||||||
let max_assets = assets.len() as u32;
|
let max_assets = assets.len() as u32;
|
||||||
let assets = assets.into();
|
let assets = assets.into();
|
||||||
|
let mut remote_message = Xcm(vec![
|
||||||
|
BuyExecution { fees, weight_limit: Limited(0) },
|
||||||
|
DepositAsset { assets: Wild(All), max_assets, beneficiary },
|
||||||
|
]);
|
||||||
|
// use local weight for remote message and hope for the best.
|
||||||
|
let remote_weight = T::Weigher::weight(&mut remote_message)
|
||||||
|
.map_err(|()| Error::<T>::UnweighableMessage)?;
|
||||||
|
if let Some(BuyExecution { weight_limit: Limited(ref mut limit), .. }) =
|
||||||
|
remote_message.0.get_mut(0)
|
||||||
|
{
|
||||||
|
*limit = remote_weight;
|
||||||
|
}
|
||||||
let mut message = Xcm(vec![
|
let mut message = Xcm(vec![
|
||||||
WithdrawAsset(assets),
|
WithdrawAsset(assets),
|
||||||
InitiateTeleport {
|
InitiateTeleport { assets: Wild(All), dest, xcm: remote_message.into() },
|
||||||
assets: Wild(All),
|
|
||||||
dest,
|
|
||||||
xcm: Xcm(vec![
|
|
||||||
BuyExecution { fees, weight_limit: Unlimited },
|
|
||||||
DepositAsset { assets: Wild(All), max_assets, beneficiary },
|
|
||||||
]),
|
|
||||||
},
|
|
||||||
]);
|
]);
|
||||||
let weight =
|
let weight =
|
||||||
T::Weigher::weight(&mut message).map_err(|()| Error::<T>::UnweighableMessage)?;
|
T::Weigher::weight(&mut message).map_err(|()| Error::<T>::UnweighableMessage)?;
|
||||||
@@ -597,14 +602,20 @@ pub mod pallet {
|
|||||||
.map_err(|_| Error::<T>::CannotReanchor)?;
|
.map_err(|_| Error::<T>::CannotReanchor)?;
|
||||||
let max_assets = assets.len() as u32;
|
let max_assets = assets.len() as u32;
|
||||||
let assets = assets.into();
|
let assets = assets.into();
|
||||||
let mut message = Xcm(vec![TransferReserveAsset {
|
let mut remote_message = Xcm(vec![
|
||||||
assets,
|
BuyExecution { fees, weight_limit: Limited(0) },
|
||||||
dest,
|
|
||||||
xcm: Xcm(vec![
|
|
||||||
BuyExecution { fees, weight_limit: Unlimited },
|
|
||||||
DepositAsset { assets: Wild(All), max_assets, beneficiary },
|
DepositAsset { assets: Wild(All), max_assets, beneficiary },
|
||||||
]),
|
]);
|
||||||
}]);
|
// use local weight for remote message and hope for the best.
|
||||||
|
let remote_weight = T::Weigher::weight(&mut remote_message)
|
||||||
|
.map_err(|()| Error::<T>::UnweighableMessage)?;
|
||||||
|
if let Some(BuyExecution { weight_limit: Limited(ref mut limit), .. }) =
|
||||||
|
remote_message.0.get_mut(0)
|
||||||
|
{
|
||||||
|
*limit = remote_weight;
|
||||||
|
}
|
||||||
|
let mut message =
|
||||||
|
Xcm(vec![TransferReserveAsset { assets, dest, xcm: remote_message.into() }]);
|
||||||
let weight =
|
let weight =
|
||||||
T::Weigher::weight(&mut message).map_err(|()| Error::<T>::UnweighableMessage)?;
|
T::Weigher::weight(&mut message).map_err(|()| Error::<T>::UnweighableMessage)?;
|
||||||
let outcome =
|
let outcome =
|
||||||
|
|||||||
@@ -310,6 +310,11 @@ pub(crate) fn buy_execution<C>(fees: impl Into<MultiAsset>) -> Instruction<C> {
|
|||||||
BuyExecution { fees: fees.into(), weight_limit: Unlimited }
|
BuyExecution { fees: fees.into(), weight_limit: Unlimited }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) fn buy_limited_execution<C>(fees: impl Into<MultiAsset>, weight: u64) -> Instruction<C> {
|
||||||
|
use xcm::latest::prelude::*;
|
||||||
|
BuyExecution { fees: fees.into(), weight_limit: Limited(weight) }
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn new_test_ext_with_balances(
|
pub(crate) fn new_test_ext_with_balances(
|
||||||
balances: Vec<(AccountId, Balance)>,
|
balances: Vec<(AccountId, Balance)>,
|
||||||
) -> sp_io::TestExternalities {
|
) -> sp_io::TestExternalities {
|
||||||
|
|||||||
@@ -218,14 +218,29 @@ fn teleport_assets_works() {
|
|||||||
new_test_ext_with_balances(balances).execute_with(|| {
|
new_test_ext_with_balances(balances).execute_with(|| {
|
||||||
let weight = 2 * BaseXcmWeight::get();
|
let weight = 2 * BaseXcmWeight::get();
|
||||||
assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE);
|
assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE);
|
||||||
|
let dest: MultiLocation = AccountId32 { network: Any, id: BOB.into() }.into();
|
||||||
assert_ok!(XcmPallet::teleport_assets(
|
assert_ok!(XcmPallet::teleport_assets(
|
||||||
Origin::signed(ALICE),
|
Origin::signed(ALICE),
|
||||||
Box::new(RelayLocation::get().into()),
|
Box::new(RelayLocation::get().into()),
|
||||||
Box::new(AccountId32 { network: Any, id: BOB.into() }.into().into()),
|
Box::new(dest.clone().into()),
|
||||||
Box::new((Here, SEND_AMOUNT).into()),
|
Box::new((Here, SEND_AMOUNT).into()),
|
||||||
0,
|
0,
|
||||||
));
|
));
|
||||||
assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE - SEND_AMOUNT);
|
assert_eq!(Balances::total_balance(&ALICE), INITIAL_BALANCE - SEND_AMOUNT);
|
||||||
|
assert_eq!(
|
||||||
|
sent_xcm(),
|
||||||
|
vec![(
|
||||||
|
RelayLocation::get().into(),
|
||||||
|
Xcm(vec![
|
||||||
|
ReceiveTeleportedAsset((Here, SEND_AMOUNT).into()),
|
||||||
|
ClearOrigin,
|
||||||
|
buy_limited_execution((Here, SEND_AMOUNT), 2000),
|
||||||
|
DepositAsset { assets: All.into(), max_assets: 1, beneficiary: dest },
|
||||||
|
]),
|
||||||
|
)]
|
||||||
|
);
|
||||||
|
let versioned_sent = VersionedXcm::from(sent_xcm().into_iter().next().unwrap().1);
|
||||||
|
let _check_v0_ok: xcm::v0::Xcm<()> = versioned_sent.try_into().unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
last_event(),
|
last_event(),
|
||||||
Event::XcmPallet(crate::Event::Attempted(Outcome::Complete(weight)))
|
Event::XcmPallet(crate::Event::Attempted(Outcome::Complete(weight)))
|
||||||
@@ -265,11 +280,13 @@ fn reserve_transfer_assets_works() {
|
|||||||
Xcm(vec![
|
Xcm(vec![
|
||||||
ReserveAssetDeposited((Parent, SEND_AMOUNT).into()),
|
ReserveAssetDeposited((Parent, SEND_AMOUNT).into()),
|
||||||
ClearOrigin,
|
ClearOrigin,
|
||||||
buy_execution((Parent, SEND_AMOUNT)),
|
buy_limited_execution((Parent, SEND_AMOUNT), 2000),
|
||||||
DepositAsset { assets: All.into(), max_assets: 1, beneficiary: dest },
|
DepositAsset { assets: All.into(), max_assets: 1, beneficiary: dest },
|
||||||
]),
|
]),
|
||||||
)]
|
)]
|
||||||
);
|
);
|
||||||
|
let versioned_sent = VersionedXcm::from(sent_xcm().into_iter().next().unwrap().1);
|
||||||
|
let _check_v0_ok: xcm::v0::Xcm<()> = versioned_sent.try_into().unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
last_event(),
|
last_event(),
|
||||||
Event::XcmPallet(crate::Event::Attempted(Outcome::Complete(weight)))
|
Event::XcmPallet(crate::Event::Attempted(Outcome::Complete(weight)))
|
||||||
|
|||||||
Reference in New Issue
Block a user