Skip to content
  • Francisco Aguirre's avatar
    XCMv4 (#1230) · 8428f678
    Francisco Aguirre authored
    
    
    # Note for reviewer
    
    Most changes are just syntax changes necessary for the new version.
    Most important files should be the ones under the `xcm` folder.
    
    # Description 
    
    Added XCMv4.
    
    ## Removed `Multi` prefix
    The following types have been renamed:
    - MultiLocation -> Location
    - MultiAsset -> Asset
    - MultiAssets -> Assets
    - InteriorMultiLocation -> InteriorLocation
    - MultiAssetFilter -> AssetFilter
    - VersionedMultiAsset -> VersionedAsset
    - WildMultiAsset -> WildAsset
    - VersionedMultiLocation -> VersionedLocation
    
    In order to fix a name conflict, the `Assets` in `xcm-executor` were
    renamed to `HoldingAssets`, as they represent assets in holding.
    
    ## Removed `Abstract` asset id
    
    It was not being used anywhere and this simplifies the code.
    
    Now assets are just constructed as follows:
    
    ```rust
    let asset: Asset = (AssetId(Location::new(1, Here)), 100u128).into();
    ```
    
    No need for specifying `Concrete` anymore.
    
    ## Outcome is now a named fields struct
    
    Instead of
    
    ```rust
    pub enum Outcome {
      Complete(Weight),
      Incomplete(Weight, Error),
      Error(Error),
    }
    ```
    
    we now have
    
    ```rust
    pub enum Outcome {
      Complete { used: Weight },
      Incomplete { used: Weight, error: Error },
      Error { error: Error },
    }
    ```
    
    ## Added Reanchorable trait
    
    Now both locations and assets implement this trait, making it easier to
    reanchor both.
    
    ## New syntax for building locations and junctions
    
    Now junctions are built using the following methods:
    
    ```rust
    let location = Location {
        parents: 1,
        interior: [Parachain(1000), PalletInstance(50), GeneralIndex(1984)].into()
    };
    ```
    
    or
    
    ```rust
    let location = Location::new(1, [Parachain(1000), PalletInstance(50), GeneralIndex(1984)]);
    ```
    
    And they are matched like so:
    
    ```rust
    match location.unpack() {
      (1, [Parachain(id)]) => ...
      (0, Here) => ...,
      (1, [_]) => ...,
    }
    ```
    
    This syntax is mandatory in v4, and has been also implemented for v2 and
    v3 for easier migration.
    
    This was needed to make all sizes smaller.
    
    # TODO
    - [x] Scaffold v4
    - [x] Port github.com/paritytech/polkadot/pull/7236
    - [x] Remove `Multi` prefix
    - [x] Remove `Abstract` asset id
    
    ---------
    
    Co-authored-by: command-bot <>
    Co-authored-by: default avatarKeith Yeung <[email protected]>
    8428f678