Skip to content
Snippets Groups Projects
  • Francisco Aguirre's avatar
    XcmDryRunApi - Dry-running extrinsics to get their XCM effects (#3872) · 7213e363
    Francisco Aguirre authored
    
    # Context
    
    Estimating fees for XCM execution and sending has been an area with bad
    UX.
    The addition of the
    [XcmPaymentApi](https://github.com/paritytech/polkadot-sdk/pull/3607)
    exposed the necessary components to be able to estimate XCM fees
    correctly, however, that was not the full story.
    The `XcmPaymentApi` works for estimating fees only if you know the
    specific XCM you want to execute or send.
    This is necessary but most UIs want to estimate the fees for extrinsics,
    they don't necessarily know the XCM program that's executed by them.
    
    # Main addition
    
    A new runtime API is introduced, the `XcmDryRunApi`, that given an
    extrinsic, or an XCM program, returns its effects:
    - Execution result
    - Local XCM (in the case of an extrinsic)
    - Forwarded XCMs
    - List of events
    
    This API can be used on its own for dry-running purposes, for
    double-checking or testing, but it mainly shines when used in
    conjunction with the `XcmPaymentApi`.
    UIs can use these two APIs to estimate transfers.
    
    # How it works
    
    New tests are added to exemplify how to incorporate both APIs.
    There's a mock test just to make sure everything works under
    `xcm-fee-payment-runtime-api`.
    There's a real-world test using Westend and AssetHubWestend under
    `cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/xcm_fee_estimation.rs`.
    Added both a test for a simple teleport between chains and a reserve
    transfer asset between two parachains going through a reserve.
    
    The steps to follow:
    - Use `XcmDryRunApi::dry_run_extrinsic` to get local XCM program and
    forwarded messages
    - For each forwarded message
    - Use `XcmPaymentApi::query_delivery_fee` LOCALLY to get the delivery
    fees
    - Use `XcmPaymentApi::query_xcm_weight` ON THE DESTINATION to get the
    remote execution weight
    - (optional) Use `XcmPaymentApi::query_acceptable_payment_assets` ON THE
    DESTINATION to know on which assets the execution fees can be paid
    - Use `XcmPaymentApi::query_weight_to_asset_fee` ON THE DESTINATION to
    convert weight to the actual remote execution fees
    - Use `XcmDryRunApi::dry_run_xcm` ON THE DESTINATION to know if a new
    message will be forwarded, if so, continue
    
    # Dear reviewer
    
    The changes in this PR are grouped as follows, and in order of
    importance:
    - Addition of new runtime API
    - Definition, mock and simple tests:
    polkadot/xcm/xcm-fee-payment-runtime-api/*
    - Implemented on Westend, Asset Hub Westend and Penpal, will implement
    on every runtime in a following PR
    - Addition of a new config item to the XCM executor for recording xcms
    about to be executed
      - Definition: polkadot/xcm/xcm-executor/*
      - Implementation: polkadot/xcm/pallet-xcm/*
    - had to update all runtime xcm_config.rs files with `type XcmRecorder =
    XcmPallet;`
    - Addition of a new trait for inspecting the messages in queues
      - Definition: polkadot/xcm/xcm-builder/src/routing.rs
      - Implemented it on all routers:
        - ChildParachainRouter: polkadot/runtime/common/src/xcm_sender.rs
    - ParentAsUmp: cumulus/primitives/utility/src/lib.rs (piggybacked on
    implementation in cumulus/pallets/parachain-system/src/lib.rs)
        - XcmpQueue: cumulus/pallets/xcmp-queue/src/lib.rs
        - Bridge: bridges/modules/xcm-bridge-hub-router/src/lib.rs
    - More complicated and useful tests:
    -
    cumulus/parachains/integration-tests/emulated/tests/assets/asset-hub-westend/src/tests/xcm_fee_estimation.rs
    
    ## Next steps
    
    With this PR, Westend, AssetHubWestend, Rococo and AssetHubRococo have
    the new API.
    UIs can test on these runtimes to create better experiences around
    cross-chain operations.
    
    Next:
    - Add XcmDryRunApi to all system parachains
    - Integrate xcm fee estimation in all emulated tests
    - Get this on the fellowship runtimes
    
    ---------
    
    Co-authored-by: default avatarAdrian Catangiu <adrian@parity.io>
    Unverified
    7213e363
Code owners
Assign users and groups as approvers for specific file changes. Learn more.