Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit 3a89f88

Browse files
muharemtonyalaribe
authored andcommitted
Descend origin to an asset sender (#6970)
* descend origin to an asset sender * sender as tuple of dest and sender
1 parent 8018784 commit 3a89f88

File tree

1 file changed

+20
-27
lines changed

1 file changed

+20
-27
lines changed

xcm/xcm-builder/src/pay.rs

+20-27
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use frame_support::traits::{
2222
};
2323
use sp_std::{marker::PhantomData, vec};
2424
use xcm::prelude::*;
25-
use xcm_executor::traits::{Convert, QueryResponseStatus, XcmQueryHandler};
25+
use xcm_executor::traits::{QueryResponseStatus, XcmQueryHandler};
2626

2727
/// Implementation of the `frame_support_traits::tokens::Pay` trait, to allow
2828
/// for generic payments of a given `AssetKind` and `Balance` from an implied origin, to a
@@ -31,28 +31,20 @@ use xcm_executor::traits::{Convert, QueryResponseStatus, XcmQueryHandler};
3131
/// `PayOverXcm::pay` is asynchronous, and returns a `QueryId` which can then be used in
3232
/// `check_payment` to check the status of the XCM transaction.
3333
///
34-
pub struct PayOverXcm<
35-
DestChain,
36-
Router,
37-
Querier,
38-
BlockNumber,
39-
Timeout,
40-
AccountId,
41-
AccountIdConverter,
42-
>(PhantomData<(DestChain, Router, Querier, BlockNumber, Timeout, AccountId, AccountIdConverter)>);
34+
pub struct PayOverXcm<Sender, Router, Querier, Timeout, Beneficiary, AssetKind>(
35+
PhantomData<(Sender, Router, Querier, Timeout, Beneficiary, AssetKind)>,
36+
);
4337
impl<
44-
DestChain: Get<xcm::latest::MultiLocation>,
38+
Sender: Get<(MultiLocation, InteriorMultiLocation)>,
4539
Router: SendXcm,
4640
Querier: XcmQueryHandler,
47-
BlockNumber,
4841
Timeout: Get<Querier::BlockNumber>,
49-
AccountId: Clone,
50-
AccountIdConverter: Convert<MultiLocation, AccountId>,
51-
> Pay
52-
for PayOverXcm<DestChain, Router, Querier, BlockNumber, Timeout, AccountId, AccountIdConverter>
42+
Beneficiary: Into<MultiLocation> + Clone,
43+
AssetKind: Into<AssetId>,
44+
> Pay for PayOverXcm<Sender, Router, Querier, Timeout, Beneficiary, AssetKind>
5345
{
54-
type Beneficiary = AccountId;
55-
type AssetKind = xcm::latest::AssetId;
46+
type Beneficiary = Beneficiary;
47+
type AssetKind = AssetKind;
5648
type Balance = u128;
5749
type Id = Querier::QueryId;
5850

@@ -61,20 +53,21 @@ impl<
6153
asset_kind: Self::AssetKind,
6254
amount: Self::Balance,
6355
) -> Result<Self::Id, ()> {
64-
let beneficiary = AccountIdConverter::reverse(who.clone()).map_err(|_| ())?;
56+
let (dest, sender) = Sender::get();
6557
let mut message = Xcm(vec![
6658
UnpaidExecution { weight_limit: Unlimited, check_origin: None },
59+
DescendOrigin(sender),
6760
TransferAsset {
68-
beneficiary,
69-
assets: vec![MultiAsset { id: asset_kind, fun: Fungibility::Fungible(amount) }]
70-
.into(),
61+
beneficiary: who.clone().into(),
62+
assets: vec![MultiAsset {
63+
id: asset_kind.into(),
64+
fun: Fungibility::Fungible(amount),
65+
}]
66+
.into(),
7167
},
7268
]);
73-
let destination = DestChain::get();
74-
let id =
75-
Querier::report_outcome(&mut message, destination, Timeout::get()).map_err(|_| ())?;
76-
let (ticket, _) =
77-
Router::validate(&mut Some(destination), &mut Some(message)).map_err(|_| ())?;
69+
let id = Querier::report_outcome(&mut message, dest, Timeout::get()).map_err(|_| ())?;
70+
let (ticket, _) = Router::validate(&mut Some(dest), &mut Some(message)).map_err(|_| ())?;
7871
Router::deliver(ticket).map_err(|_| ())?;
7972
Ok(id)
8073
}

0 commit comments

Comments
 (0)