Skip to content
  • PG Herveou's avatar
    Contracts: xcm host fn fixes (#3086) · ca382f32
    PG Herveou authored
    ## Xcm changes:
    - Fix `pallet_xcm::execute`, move the logic into The `ExecuteController`
    so it can be shared with anything that implement that trait.
    - Make `ExecuteController::execute` retursn `DispatchErrorWithPostInfo`
    instead of `DispatchError`, so that we don't charge the full
    `max_weight` provided if the execution is incomplete (useful for
    force_batch or contracts calls)
    - Fix docstring for `pallet_xcm::execute`, to reflect the changes from
    #2405
    - Update the signature for `ExecuteController::execute`, we don't need
    to return the `Outcome` anymore since we only care about
    `Outcome::Complete`
    
    ## Contracts changes:
    
    - Update host fn `xcm_exexute`, we don't need to write the `Outcome` to
    the sandbox memory anymore. This was also not charged as well before so
    it if fixes this too.
    - One of the issue was that the dry_run of a contract that call
    `xcm_execute` would exhaust the `gas_limit`.
    
    This is because `XcmExecuteController::execute` takes a `max_weight`
    argument, and since we don't want the user to specify it manually we
    were passing everything left by pre-charghing
    `ctx.ext.gas_meter().gas_left()`
    
    - To fix it I added a `fn influence_lowest_limit` on the `Token` trait
    and make it return false for `RuntimeCost::XcmExecute`.
    - Got rid of the `RuntimeToken` indirection, we can just use
    `RuntimeCost` directly.
    
    ---------
    
    Co-authored-by: command-bot <>
    ca382f32