@@ -22,7 +22,7 @@ use frame_support::traits::{
22
22
} ;
23
23
use sp_std:: { marker:: PhantomData , vec} ;
24
24
use xcm:: prelude:: * ;
25
- use xcm_executor:: traits:: { Convert , QueryResponseStatus , XcmQueryHandler } ;
25
+ use xcm_executor:: traits:: { QueryResponseStatus , XcmQueryHandler } ;
26
26
27
27
/// Implementation of the `frame_support_traits::tokens::Pay` trait, to allow
28
28
/// 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};
31
31
/// `PayOverXcm::pay` is asynchronous, and returns a `QueryId` which can then be used in
32
32
/// `check_payment` to check the status of the XCM transaction.
33
33
///
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
+ ) ;
43
37
impl <
44
- DestChain : Get < xcm :: latest :: MultiLocation > ,
38
+ Sender : Get < ( MultiLocation , InteriorMultiLocation ) > ,
45
39
Router : SendXcm ,
46
40
Querier : XcmQueryHandler ,
47
- BlockNumber ,
48
41
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 >
53
45
{
54
- type Beneficiary = AccountId ;
55
- type AssetKind = xcm :: latest :: AssetId ;
46
+ type Beneficiary = Beneficiary ;
47
+ type AssetKind = AssetKind ;
56
48
type Balance = u128 ;
57
49
type Id = Querier :: QueryId ;
58
50
@@ -61,20 +53,21 @@ impl<
61
53
asset_kind : Self :: AssetKind ,
62
54
amount : Self :: Balance ,
63
55
) -> Result < Self :: Id , ( ) > {
64
- let beneficiary = AccountIdConverter :: reverse ( who . clone ( ) ) . map_err ( |_| ( ) ) ? ;
56
+ let ( dest , sender ) = Sender :: get ( ) ;
65
57
let mut message = Xcm ( vec ! [
66
58
UnpaidExecution { weight_limit: Unlimited , check_origin: None } ,
59
+ DescendOrigin ( sender) ,
67
60
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( ) ,
71
67
} ,
72
68
] ) ;
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 ( |_| ( ) ) ?;
78
71
Router :: deliver ( ticket) . map_err ( |_| ( ) ) ?;
79
72
Ok ( id)
80
73
}
0 commit comments