use xcm::latest::prelude::*;
pub fn teleport_assets_delivery_fees<S: SendXcm>(
assets: Assets,
fee_asset_item: u32,
weight_limit: WeightLimit,
beneficiary: Location,
destination: Location,
) -> u128 {
let message = teleport_assets_dummy_message(assets, fee_asset_item, weight_limit, beneficiary);
get_fungible_delivery_fees::<S>(destination, message)
}
pub fn query_response_delivery_fees<S: SendXcm>(querier: Location) -> u128 {
let message = Xcm(vec![
SetFeesMode { jit_withdraw: true },
QueryResponse {
query_id: 0, response: Response::ExecutionResult(None),
max_weight: Weight::zero(),
querier: Some(querier.clone()),
},
SetTopic([0u8; 32]), ]);
get_fungible_delivery_fees::<S>(querier, message)
}
pub fn pay_over_xcm_delivery_fees<S: SendXcm>(
interior: Junctions,
destination: Location,
beneficiary: Location,
asset: Asset,
) -> u128 {
let message = Xcm(vec![
DescendOrigin(interior),
UnpaidExecution { weight_limit: Unlimited, check_origin: None },
SetAppendix(Xcm(vec![
SetFeesMode { jit_withdraw: true },
ReportError(QueryResponseInfo {
destination: destination.clone(),
query_id: 0,
max_weight: Weight::zero(),
}),
])),
TransferAsset { beneficiary, assets: vec![asset].into() },
]);
get_fungible_delivery_fees::<S>(destination, message)
}
fn teleport_assets_dummy_message(
assets: Assets,
fee_asset_item: u32,
weight_limit: WeightLimit,
beneficiary: Location,
) -> Xcm<()> {
Xcm(vec![
ReceiveTeleportedAsset(assets.clone()), ClearOrigin,
BuyExecution { fees: assets.get(fee_asset_item as usize).unwrap().clone(), weight_limit },
DepositAsset { assets: Wild(AllCounted(assets.len() as u32)), beneficiary },
SetTopic([0u8; 32]), ])
}
fn get_fungible_delivery_fees<S: SendXcm>(destination: Location, message: Xcm<()>) -> u128 {
let Ok((_, delivery_fees)) = validate_send::<S>(destination, message) else {
unreachable!("message can be sent; qed")
};
if let Some(delivery_fee) = delivery_fees.inner().first() {
let Fungible(delivery_fee_amount) = delivery_fee.fun else {
unreachable!("asset is fungible; qed");
};
delivery_fee_amount
} else {
0
}
}