mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 19:51:02 +00:00
XCMv4 (#1230)
# 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: Keith Yeung <kungfukeith11@gmail.com>
This commit is contained in:
committed by
GitHub
parent
ec7bfae00a
commit
8428f678fe
@@ -52,10 +52,10 @@ where
|
||||
fn validate(
|
||||
network: NetworkId,
|
||||
channel: u32,
|
||||
universal_source: &mut Option<InteriorMultiLocation>,
|
||||
destination: &mut Option<InteriorMultiLocation>,
|
||||
universal_source: &mut Option<InteriorLocation>,
|
||||
destination: &mut Option<InteriorLocation>,
|
||||
message: &mut Option<Xcm<()>>,
|
||||
) -> Result<(Self::Ticket, MultiAssets), SendError> {
|
||||
) -> Result<(Self::Ticket, Assets), SendError> {
|
||||
// Find supported lane_id.
|
||||
let sender_and_lane = Self::lane_for(
|
||||
universal_source.as_ref().ok_or(SendError::MissingArgument)?,
|
||||
@@ -137,11 +137,11 @@ mod tests {
|
||||
use frame_support::assert_ok;
|
||||
use xcm_executor::traits::export_xcm;
|
||||
|
||||
fn universal_source() -> InteriorMultiLocation {
|
||||
X2(GlobalConsensus(RelayNetwork::get()), Parachain(SIBLING_ASSET_HUB_ID))
|
||||
fn universal_source() -> InteriorLocation {
|
||||
[GlobalConsensus(RelayNetwork::get()), Parachain(SIBLING_ASSET_HUB_ID)].into()
|
||||
}
|
||||
|
||||
fn universal_destination() -> InteriorMultiLocation {
|
||||
fn universal_destination() -> InteriorLocation {
|
||||
BridgedDestination::get()
|
||||
}
|
||||
|
||||
|
||||
@@ -45,25 +45,25 @@ pub mod pallet {
|
||||
BridgeMessagesConfig<Self::BridgeMessagesPalletInstance>
|
||||
{
|
||||
/// Runtime's universal location.
|
||||
type UniversalLocation: Get<InteriorMultiLocation>;
|
||||
type UniversalLocation: Get<InteriorLocation>;
|
||||
// TODO: https://github.com/paritytech/parity-bridges-common/issues/1666 remove `ChainId` and
|
||||
// replace it with the `NetworkId` - then we'll be able to use
|
||||
// `T as pallet_bridge_messages::Config<T::BridgeMessagesPalletInstance>::BridgedChain::NetworkId`
|
||||
/// Bridged network as relative location of bridged `GlobalConsensus`.
|
||||
#[pallet::constant]
|
||||
type BridgedNetwork: Get<MultiLocation>;
|
||||
type BridgedNetwork: Get<Location>;
|
||||
/// Associated messages pallet instance that bridges us with the
|
||||
/// `BridgedNetworkId` consensus.
|
||||
type BridgeMessagesPalletInstance: 'static;
|
||||
|
||||
/// Price of single message export to the bridged consensus (`Self::BridgedNetworkId`).
|
||||
type MessageExportPrice: Get<MultiAssets>;
|
||||
type MessageExportPrice: Get<Assets>;
|
||||
/// Checks the XCM version for the destination.
|
||||
type DestinationVersion: GetVersion;
|
||||
|
||||
/// Get point-to-point links with bridged consensus (`Self::BridgedNetworkId`).
|
||||
/// (this will be replaced with dynamic on-chain bridges - `Bridges V2`)
|
||||
type Lanes: Get<sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorMultiLocation))>>;
|
||||
type Lanes: Get<sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorLocation))>>;
|
||||
/// Support for point-to-point links
|
||||
/// (this will be replaced with dynamic on-chain bridges - `Bridges V2`)
|
||||
type LanesSupport: XcmBlobHauler;
|
||||
@@ -86,10 +86,10 @@ pub mod pallet {
|
||||
impl<T: Config<I>, I: 'static> Pallet<T, I> {
|
||||
/// Returns dedicated/configured lane identifier.
|
||||
pub(crate) fn lane_for(
|
||||
source: &InteriorMultiLocation,
|
||||
dest: (&NetworkId, &InteriorMultiLocation),
|
||||
source: &InteriorLocation,
|
||||
dest: (&NetworkId, &InteriorLocation),
|
||||
) -> Option<SenderAndLane> {
|
||||
let source = source.relative_to(&T::UniversalLocation::get());
|
||||
let source = source.clone().relative_to(&T::UniversalLocation::get());
|
||||
|
||||
// Check that we have configured a point-to-point lane for 'source' and `dest`.
|
||||
T::Lanes::get()
|
||||
|
||||
@@ -170,16 +170,13 @@ impl pallet_bridge_messages::WeightInfoExt for TestMessagesWeights {
|
||||
parameter_types! {
|
||||
pub const RelayNetwork: NetworkId = NetworkId::Kusama;
|
||||
pub const BridgedRelayNetwork: NetworkId = NetworkId::Polkadot;
|
||||
pub const BridgedRelayNetworkLocation: MultiLocation = MultiLocation {
|
||||
parents: 1,
|
||||
interior: X1(GlobalConsensus(BridgedRelayNetwork::get()))
|
||||
};
|
||||
pub BridgedRelayNetworkLocation: Location = (Parent, GlobalConsensus(BridgedRelayNetwork::get())).into();
|
||||
pub const NonBridgedRelayNetwork: NetworkId = NetworkId::Rococo;
|
||||
pub const BridgeReserve: Balance = 100_000;
|
||||
pub UniversalLocation: InteriorMultiLocation = X2(
|
||||
pub UniversalLocation: InteriorLocation = [
|
||||
GlobalConsensus(RelayNetwork::get()),
|
||||
Parachain(THIS_BRIDGE_HUB_ID),
|
||||
);
|
||||
].into();
|
||||
pub const Penalty: Balance = 1_000;
|
||||
}
|
||||
|
||||
@@ -197,13 +194,13 @@ impl pallet_xcm_bridge_hub::Config for TestRuntime {
|
||||
|
||||
parameter_types! {
|
||||
pub TestSenderAndLane: SenderAndLane = SenderAndLane {
|
||||
location: MultiLocation::new(1, X1(Parachain(SIBLING_ASSET_HUB_ID))),
|
||||
location: Location::new(1, [Parachain(SIBLING_ASSET_HUB_ID)]),
|
||||
lane: TEST_LANE_ID,
|
||||
};
|
||||
pub const BridgedDestination: InteriorMultiLocation = X1(
|
||||
pub BridgedDestination: InteriorLocation = [
|
||||
Parachain(BRIDGED_ASSET_HUB_ID)
|
||||
);
|
||||
pub TestLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorMultiLocation))> = sp_std::vec![
|
||||
].into();
|
||||
pub TestLanes: sp_std::vec::Vec<(SenderAndLane, (NetworkId, InteriorLocation))> = sp_std::vec![
|
||||
(TestSenderAndLane::get(), (BridgedRelayNetwork::get(), BridgedDestination::get()))
|
||||
];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user