asset_test_utils/
xcm_helpers.rs1use xcm::latest::prelude::*;
20
21pub fn teleport_assets_delivery_fees<S: SendXcm>(
25 assets: Assets,
26 fee_asset_item: u32,
27 weight_limit: WeightLimit,
28 beneficiary: Location,
29 destination: Location,
30) -> u128 {
31 let message = teleport_assets_dummy_message(assets, fee_asset_item, weight_limit, beneficiary);
32 get_fungible_delivery_fees::<S>(destination, message)
33}
34
35pub fn query_response_delivery_fees<S: SendXcm>(querier: Location) -> u128 {
38 let message = Xcm(vec![
42 SetFeesMode { jit_withdraw: true },
43 QueryResponse {
44 query_id: 0, response: Response::ExecutionResult(None),
46 max_weight: Weight::zero(),
47 querier: Some(querier.clone()),
48 },
49 SetTopic([0u8; 32]), ]);
51 get_fungible_delivery_fees::<S>(querier, message)
52}
53
54pub fn pay_over_xcm_delivery_fees<S: SendXcm>(
56 interior: Junctions,
57 destination: Location,
58 beneficiary: Location,
59 asset: Asset,
60) -> u128 {
61 let message = Xcm(vec![
64 DescendOrigin(interior),
65 UnpaidExecution { weight_limit: Unlimited, check_origin: None },
66 SetAppendix(Xcm(vec![
67 SetFeesMode { jit_withdraw: true },
68 ReportError(QueryResponseInfo {
69 destination: destination.clone(),
70 query_id: 0,
71 max_weight: Weight::zero(),
72 }),
73 ])),
74 TransferAsset { beneficiary, assets: vec![asset].into() },
75 ]);
76 get_fungible_delivery_fees::<S>(destination, message)
77}
78
79fn teleport_assets_dummy_message(
84 assets: Assets,
85 fee_asset_item: u32,
86 weight_limit: WeightLimit,
87 beneficiary: Location,
88) -> Xcm<()> {
89 Xcm(vec![
90 ReceiveTeleportedAsset(assets.clone()), ClearOrigin,
92 BuyExecution { fees: assets.get(fee_asset_item as usize).unwrap().clone(), weight_limit },
93 DepositAsset { assets: Wild(AllCounted(assets.len() as u32)), beneficiary },
94 SetTopic([0u8; 32]), ])
96}
97
98fn get_fungible_delivery_fees<S: SendXcm>(destination: Location, message: Xcm<()>) -> u128 {
100 let delivery_fees = match validate_send::<S>(destination, message) {
101 Ok((_, delivery_fees)) => delivery_fees,
102 Err(e) => unreachable!("message can be sent - {:?}; qed", e),
103 };
104 if let Some(delivery_fee) = delivery_fees.inner().first() {
105 let Fungible(delivery_fee_amount) = delivery_fee.fun else {
106 unreachable!("asset is fungible; qed");
107 };
108 delivery_fee_amount
109 } else {
110 0
111 }
112}