Skip to content
This repository has been archived by the owner on Nov 15, 2023. It is now read-only.

Commit

Permalink
[Fix] Weight calculations for Wild -> affects teleports (#1639)
Browse files Browse the repository at this point in the history
* [Fix] Weight calculations for Wild -> affects teleports

* introduce a separate asset limit for teleports

* fix deposit

* reshuffle abstractions

* fix imports

* little refactoring

* Update parachains/common/src/xcm_config.rs

Co-authored-by: Squirrel <gilescope@gmail.com>

* add comments

Co-authored-by: Squirrel <gilescope@gmail.com>
  • Loading branch information
ruseinov and gilescope authored Sep 19, 2022
1 parent 778d6bb commit 14115c8
Show file tree
Hide file tree
Showing 4 changed files with 68 additions and 33 deletions.
14 changes: 14 additions & 0 deletions parachains/common/src/xcm_config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -119,3 +119,17 @@ impl<Location: Get<MultiLocation>> FilterAssetLocation for ConcreteNativeAssetFr
matches!(asset.id, Concrete(ref id) if id == origin && origin == &Location::get())
}
}

/// A generic function to use for MultiAssetFilter implementations, currently used to differentiate
/// between reserve operations and the rest of them.
pub fn weigh_multi_assets_generic(
filter: &MultiAssetFilter,
weight: Weight,
max_assets: u32,
) -> XCMWeight {
let multiplier = match filter {
MultiAssetFilter::Definite(assets) => assets.len() as u64,
MultiAssetFilter::Wild(_) => max_assets as u64,
};
weight.saturating_mul(multiplier).ref_time()
}
29 changes: 18 additions & 11 deletions parachains/runtimes/assets/statemine/src/weights/xcm/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use crate::Runtime;
use frame_support::weights::Weight;
use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight;
use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric;
use sp_std::prelude::*;
use parachains_common::xcm_config::weigh_multi_assets_generic;
use xcm::{
latest::{prelude::*, Weight as XCMWeight},
DoubleEncoded,
Expand All @@ -31,22 +31,29 @@ trait WeighMultiAssets {
fn weigh_multi_assets(&self, weight: Weight) -> XCMWeight;
}

const MAX_ASSETS: u32 = 100;
trait WeighMultiAssetsReserve {
fn weigh_multi_assets_reserve(&self, weight: Weight) -> XCMWeight;
}

const RESERVE_MAX_ASSETS: u32 = 100;
/// For teleports and deposits
const MAX_ASSETS: u32 = 1;

impl WeighMultiAssets for MultiAssetFilter {
fn weigh_multi_assets(&self, weight: Weight) -> XCMWeight {
let weight = match self {
Self::Definite(assets) =>
weight.saturating_mul(assets.inner().into_iter().count() as u64),
Self::Wild(_) => weight.saturating_mul(MAX_ASSETS as u64),
};
weight.ref_time()
weigh_multi_assets_generic(self, weight, MAX_ASSETS)
}
}

impl WeighMultiAssetsReserve for MultiAssetFilter {
fn weigh_multi_assets_reserve(&self, weight: Weight) -> XCMWeight {
weigh_multi_assets_generic(self, weight, RESERVE_MAX_ASSETS)
}
}

impl WeighMultiAssets for MultiAssets {
fn weigh_multi_assets(&self, weight: Weight) -> XCMWeight {
weight.saturating_mul(self.inner().into_iter().count() as u64).ref_time()
weight.saturating_mul(self.len() as u64).ref_time()
}
}

Expand Down Expand Up @@ -125,7 +132,7 @@ impl<Call> XcmWeightInfo<Call> for StatemineXcmWeight<Call> {
_dest: &MultiLocation,
_xcm: &Xcm<()>,
) -> XCMWeight {
assets.weigh_multi_assets(XcmFungibleWeight::<Runtime>::deposit_reserve_asset())
assets.weigh_multi_assets_reserve(XcmFungibleWeight::<Runtime>::deposit_reserve_asset())
}
fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets) -> XCMWeight {
Weight::MAX.ref_time()
Expand All @@ -135,7 +142,7 @@ impl<Call> XcmWeightInfo<Call> for StatemineXcmWeight<Call> {
_reserve: &MultiLocation,
_xcm: &Xcm<()>,
) -> XCMWeight {
assets.weigh_multi_assets(XcmGeneric::<Runtime>::initiate_reserve_withdraw())
assets.weigh_multi_assets_reserve(XcmGeneric::<Runtime>::initiate_reserve_withdraw())
}
fn initiate_teleport(
assets: &MultiAssetFilter,
Expand Down
29 changes: 18 additions & 11 deletions parachains/runtimes/assets/statemint/src/weights/xcm/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use crate::Runtime;
use frame_support::weights::Weight;
use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight;
use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric;
use sp_std::prelude::*;
use parachains_common::xcm_config::weigh_multi_assets_generic;
use xcm::{
latest::{prelude::*, Weight as XCMWeight},
DoubleEncoded,
Expand All @@ -31,22 +31,29 @@ trait WeighMultiAssets {
fn weigh_multi_assets(&self, weight: Weight) -> XCMWeight;
}

const MAX_ASSETS: u32 = 100;
trait WeighMultiAssetsReserve {
fn weigh_multi_assets_reserve(&self, weight: Weight) -> XCMWeight;
}

const RESERVE_MAX_ASSETS: u32 = 100;
/// For teleports and deposits
const MAX_ASSETS: u32 = 1;

impl WeighMultiAssets for MultiAssetFilter {
fn weigh_multi_assets(&self, weight: Weight) -> XCMWeight {
let weight = match self {
Self::Definite(assets) =>
weight.saturating_mul(assets.inner().into_iter().count() as u64),
Self::Wild(_) => weight.saturating_mul(MAX_ASSETS as u64),
};
weight.ref_time()
weigh_multi_assets_generic(self, weight, MAX_ASSETS)
}
}

impl WeighMultiAssetsReserve for MultiAssetFilter {
fn weigh_multi_assets_reserve(&self, weight: Weight) -> XCMWeight {
weigh_multi_assets_generic(self, weight, RESERVE_MAX_ASSETS)
}
}

impl WeighMultiAssets for MultiAssets {
fn weigh_multi_assets(&self, weight: Weight) -> XCMWeight {
weight.saturating_mul(self.inner().into_iter().count() as u64).ref_time()
weight.saturating_mul(self.len() as u64).ref_time()
}
}

Expand Down Expand Up @@ -125,7 +132,7 @@ impl<Call> XcmWeightInfo<Call> for StatemintXcmWeight<Call> {
_dest: &MultiLocation,
_xcm: &Xcm<()>,
) -> XCMWeight {
assets.weigh_multi_assets(XcmFungibleWeight::<Runtime>::deposit_reserve_asset())
assets.weigh_multi_assets_reserve(XcmFungibleWeight::<Runtime>::deposit_reserve_asset())
}
fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets) -> XCMWeight {
Weight::MAX.ref_time()
Expand All @@ -135,7 +142,7 @@ impl<Call> XcmWeightInfo<Call> for StatemintXcmWeight<Call> {
_reserve: &MultiLocation,
_xcm: &Xcm<()>,
) -> XCMWeight {
assets.weigh_multi_assets(XcmGeneric::<Runtime>::initiate_reserve_withdraw())
assets.weigh_multi_assets_reserve(XcmGeneric::<Runtime>::initiate_reserve_withdraw())
}
fn initiate_teleport(
assets: &MultiAssetFilter,
Expand Down
29 changes: 18 additions & 11 deletions parachains/runtimes/assets/westmint/src/weights/xcm/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use crate::Runtime;
use frame_support::weights::Weight;
use pallet_xcm_benchmarks_fungible::WeightInfo as XcmFungibleWeight;
use pallet_xcm_benchmarks_generic::WeightInfo as XcmGeneric;
use sp_std::prelude::*;
use parachains_common::xcm_config::weigh_multi_assets_generic;
use xcm::{
latest::{prelude::*, Weight as XCMWeight},
DoubleEncoded,
Expand All @@ -31,22 +31,29 @@ trait WeighMultiAssets {
fn weigh_multi_assets(&self, weight: Weight) -> XCMWeight;
}

const MAX_ASSETS: u32 = 100;
trait WeighMultiAssetsReserve {
fn weigh_multi_assets_reserve(&self, weight: Weight) -> XCMWeight;
}

const RESERVE_MAX_ASSETS: u32 = 100;
/// For teleports and deposits
const MAX_ASSETS: u32 = 1;

impl WeighMultiAssets for MultiAssetFilter {
fn weigh_multi_assets(&self, weight: Weight) -> XCMWeight {
let weight = match self {
Self::Definite(assets) =>
weight.saturating_mul(assets.inner().into_iter().count() as u64),
Self::Wild(_) => weight.saturating_mul(MAX_ASSETS as u64),
};
weight.ref_time()
weigh_multi_assets_generic(self, weight, MAX_ASSETS)
}
}

impl WeighMultiAssetsReserve for MultiAssetFilter {
fn weigh_multi_assets_reserve(&self, weight: Weight) -> XCMWeight {
weigh_multi_assets_generic(self, weight, RESERVE_MAX_ASSETS)
}
}

impl WeighMultiAssets for MultiAssets {
fn weigh_multi_assets(&self, weight: Weight) -> XCMWeight {
weight.saturating_mul(self.inner().into_iter().count() as u64).ref_time()
weight.saturating_mul(self.len() as u64).ref_time()
}
}

Expand Down Expand Up @@ -125,7 +132,7 @@ impl<Call> XcmWeightInfo<Call> for WestmintXcmWeight<Call> {
_dest: &MultiLocation,
_xcm: &Xcm<()>,
) -> XCMWeight {
assets.weigh_multi_assets(XcmFungibleWeight::<Runtime>::deposit_reserve_asset())
assets.weigh_multi_assets_reserve(XcmFungibleWeight::<Runtime>::deposit_reserve_asset())
}
fn exchange_asset(_give: &MultiAssetFilter, _receive: &MultiAssets) -> XCMWeight {
Weight::MAX.ref_time()
Expand All @@ -135,7 +142,7 @@ impl<Call> XcmWeightInfo<Call> for WestmintXcmWeight<Call> {
_reserve: &MultiLocation,
_xcm: &Xcm<()>,
) -> XCMWeight {
assets.weigh_multi_assets(XcmGeneric::<Runtime>::initiate_reserve_withdraw())
assets.weigh_multi_assets_reserve(XcmGeneric::<Runtime>::initiate_reserve_withdraw())
}
fn initiate_teleport(
assets: &MultiAssetFilter,
Expand Down

0 comments on commit 14115c8

Please sign in to comment.