Skip to content
  • Pavel Orlov's avatar
    XCM Fee Payment Runtime API (#3607) · 3c972fc1
    Pavel Orlov authored
    
    
    The PR provides API for obtaining:
    - the weight required to execute an XCM message,
    - a list of acceptable `AssetId`s for message execution payment,
    - the cost of the weight in the specified acceptable `AssetId`.
    
    It is meant to address an issue where one has to guess how much fee to
    pay for execution. Also, at the moment, a client has to guess which
    assets are acceptable for fee execution payment.
    See the related issue
    https://github.com/paritytech/polkadot-sdk/issues/690.
    With this API, a client is supposed to query the list of the supported
    asset IDs (in the XCM version format the client understands), weigh the
    XCM program the client wants to execute and convert the weight into one
    of the acceptable assets. Note that the client is supposed to know what
    program will be executed on what chains. However, having a small
    companion JS library for the pallet-xcm and xtokens should be enough to
    determine what XCM programs will be executed and where (since these
    pallets compose a known small set of programs).
    ```Rust
    pub trait XcmPaymentApi<Call>
    	where
    		Call: Codec,
    	{
    		/// Returns a list of acceptable payment assets.
    		///
    		/// # Arguments
    		///
    		/// * `xcm_version`: Version.
    		fn query_acceptable_payment_assets(xcm_version: Version) -> Result<Vec<VersionedAssetId>, Error>;
    		/// Returns a weight needed to execute a XCM.
    		///
    		/// # Arguments
    		///
    		/// * `message`: `VersionedXcm`.
    		fn query_xcm_weight(message: VersionedXcm<Call>) -> Result<Weight, Error>;
    		/// Converts a weight into a fee for the specified `AssetId`.
    		///
    		/// # Arguments
    		///
    		/// * `weight`: convertible `Weight`.
    		/// * `asset`: `VersionedAssetId`.
    		fn query_weight_to_asset_fee(weight: Weight, asset: VersionedAssetId) -> Result<u128, Error>;
    		/// Get delivery fees for sending a specific `message` to a `destination`.
    		/// These always come in a specific asset, defined by the chain.
    		///
    		/// # Arguments
    		/// * `message`: The message that'll be sent, necessary because most delivery fees are based on the
    		///   size of the message.
    		/// * `destination`: The destination to send the message to. Different destinations may use
    		///   different senders that charge different fees.
    		fn query_delivery_fees(destination: VersionedLocation, message: VersionedXcm<()>) -> Result<VersionedAssets, Error>;
    	}
    ```
    An
    [example](https://gist.github.com/PraetorP/4bc323ff85401abe253897ba990ec29d)
    of a client side code.
    
    ---------
    
    Co-authored-by: default avatarFrancisco Aguirre <[email protected]>
    Co-authored-by: default avatarAdrian Catangiu <[email protected]>
    Co-authored-by: default avatarDaniel Shiposha <[email protected]>
    3c972fc1