Skip to content
Snippets Groups Projects
  • Francisco Aguirre's avatar
    Swaps for XCM delivery fees (#5131) · 5291412e
    Francisco Aguirre authored
    # Context
    
    Fees can already be paid in other assets locally thanks to the Trader
    implementations we have.
    This doesn't work when sending messages because delivery fees go through
    a different mechanism altogether.
    The idea is to fix this leveraging the `AssetExchanger` config item
    that's able to turn the asset the user wants to pay fees in into the
    asset the router expects for delivery fees.
    
    # Main addition
    
    An adapter was needed to use `pallet-asset-conversion` for exchanging
    assets in XCM.
    This was created in
    https://github.com/paritytech/polkadot-sdk/pull/5130.
    
    The XCM executor was modified to use `AssetExchanger` (when available)
    to swap assets to pay for delivery fees.
    
    ## Limitations
    
    We can only pay for delivery fees in different assets in intermediate
    hops. We can't pay in different assets locally. The first hop will
    always need the native token of the chain (or whatever is specified in
    the `XcmRouter`).
    This is a byproduct of using the `BuyExecution` instruction to know
    which asset should be used for delivery fee payment.
    Since this instruction is not present when executing an XCM locally, we
    are left with this limitation.
    To illustrate this limitation, I'll show two scenarios. All chains
    involved have pools.
    
    ### Scenario 1
    
    Parachain A --> Parachain B
    
    Here, parachain A can use any asset in a pool with its native asset to
    pay for local execution fees.
    However, as of now we can't use those for local delivery fees.
    This means transfers from A to B need some amount of A's native token to
    pay for delivery fees.
    
    ### Scenario 2
    
    Parachain A --> Parachain C --> Parachain B
    
    Here, Parachain C's remote delivery fees can be paid with any asset in a
    pool with its native asset.
    This allows a reserve asset transfer between A and B with C as the
    reserve to only need A's native token at the starting hop.
    After that, it could all be pool assets.
    
    ## Future work
    
    The fact that delivery fees go through a totally different mechanism
    results in a lot of bugs and pain points.
    Unfortunately, this is not so easy to solve in a backwards compatible
    manner.
    Delivery fees will be integrated into the language in future XCM
    versions, following
    https://github.com/polkadot-fellows/xcm-format/pull/53.
    
    Old PR: https://github.com/paritytech/polkadot-sdk/pull/4375.
    Unverified
    5291412e
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
Cargo.lock 510.84 KiB