Dispatchable XCMs should translate to v0 (#4062)

* Dispatchable XCMs should translate to v0

* Formatting

* Update Westend's XCM WrapVersion
This commit is contained in:
Gavin Wood
2021-10-12 15:35:10 +02:00
committed by GitHub
parent 67032af69f
commit 533cdb6e7c
6 changed files with 54 additions and 21 deletions
+1 -1
View File
@@ -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! {
+1 -1
View File
@@ -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! {
+1 -1
View File
@@ -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! {
+27 -16
View File
@@ -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, DepositAsset { assets: Wild(All), max_assets, beneficiary },
xcm: Xcm(vec![ ]);
BuyExecution { fees, weight_limit: Unlimited }, // use local weight for remote message and hope for the best.
DepositAsset { assets: Wild(All), max_assets, beneficiary }, 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 =
+5
View File
@@ -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 {
+19 -2
View File
@@ -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)))