Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Girazoki supported fee payment assets storage #1118

Merged
merged 82 commits into from Feb 23, 2022
Merged
Show file tree
Hide file tree
Changes from 72 commits
Commits
Show all changes
82 commits
Select commit Hold shift + click to select a range
811b8ef
Migration part written
girazoki Dec 20, 2021
1917a70
Add log
girazoki Dec 20, 2021
fdfebab
Pallet works
girazoki Dec 20, 2021
1fadacc
Adapt all tests to new pallets
girazoki Dec 20, 2021
0533b65
wip
girazoki Dec 20, 2021
e39eec1
Missing file
girazoki Dec 21, 2021
bd5561f
Implement trait for tuples
girazoki Dec 21, 2021
199f07f
Log line
girazoki Dec 21, 2021
9f08cf2
Remove trait bound to migrations::config
girazoki Dec 21, 2021
c58f1e4
Toml sort
girazoki Dec 21, 2021
12ad56a
Add pallet-maintenance-mode to try-runtime
girazoki Dec 21, 2021
8a23df6
Make try-runtime compile
girazoki Dec 21, 2021
e5b4cc1
Toml sort
girazoki Dec 21, 2021
a3a5b3e
Merge remote-tracking branch 'upstream/girazoki-fix-try-runtime-palle…
girazoki Dec 21, 2021
26df9e1
Compile
girazoki Dec 21, 2021
22c1ee6
Merge remote-tracking branch 'upstream/master' into girazoki-fix-try-…
girazoki Dec 21, 2021
9152eb4
Merge remote-tracking branch 'upstream/girazoki-fix-try-runtime-palle…
girazoki Dec 21, 2021
9733f06
Adapt to new transact trait
girazoki Dec 22, 2021
6cc33ae
Toml sort
girazoki Dec 22, 2021
12cb706
Remove other components from transact info, as it seems they are not …
girazoki Dec 22, 2021
8754001
Rework typescript test to match new transactor
girazoki Dec 22, 2021
c0f6986
Toml sort
girazoki Dec 22, 2021
d036fde
Start by using a separate storage for supported assets
girazoki Dec 22, 2021
65ce1d0
Updated tests
girazoki Dec 22, 2021
8c00111
Add usage of new storage item to trader
girazoki Dec 22, 2021
1b432c0
Add migration and first test
girazoki Dec 23, 2021
07629f6
Add migration to migrations
girazoki Dec 23, 2021
8b64ad9
Commit migrations
girazoki Dec 23, 2021
77137f4
Cargo sort
girazoki Dec 23, 2021
eb74af6
Merge remote-tracking branch 'upstream/master' into girazoki-xcm-max-…
girazoki Dec 23, 2021
b010466
Update benchmarks
girazoki Dec 23, 2021
249c878
Merge remote-tracking branch 'upstream/master' into girazoki-xcm-max-…
girazoki Dec 27, 2021
decbd6f
adapt tests to master
girazoki Dec 27, 2021
87de8b1
Adapt tests and remove unneded polkadot-runtime-common
girazoki Dec 27, 2021
b97d5d1
Cargo lock
girazoki Dec 27, 2021
915bdec
Cargo sort
girazoki Dec 27, 2021
8080ffd
Merge remote-tracking branch 'upstream/girazoki-xcm-max-ump-weight-an…
girazoki Dec 27, 2021
87636a5
Adapt to latest asset manager
girazoki Dec 28, 2021
25a212e
Update benchmark
girazoki Dec 28, 2021
4ee189c
Update weights
girazoki Dec 28, 2021
fd1fd63
Update fee in test since for whatever reason requires one unit more
girazoki Dec 29, 2021
27d3afa
Merge remote-tracking branch 'upstream/master' into girazoki-supporte…
girazoki Jan 24, 2022
06a7477
Left overs from rebasing
girazoki Jan 24, 2022
ff1564c
Fix benchmarks
girazoki Jan 24, 2022
970f72a
Cosmetic fixes
girazoki Jan 24, 2022
61c264a
editorconfig
girazoki Jan 25, 2022
ca041c0
Include where clause in benchmarks
girazoki Jan 25, 2022
165ca2d
Change the way change_existing_asset_type benchmark was written
girazoki Jan 25, 2022
e850f32
Re-write remove_supported_asset benchmark
girazoki Jan 25, 2022
66a8ac0
Make remove_supported_assets dependent on weight hint
girazoki Jan 25, 2022
8db2b59
Add new weights
girazoki Jan 25, 2022
8f138bf
EditorCOnfig
girazoki Jan 26, 2022
24c4f0f
Merge remote-tracking branch 'upstream/master' into girazoki-supporte…
girazoki Feb 1, 2022
0e455d5
Merge remote-tracking branch 'upstream/master' into girazoki-supporte…
girazoki Feb 11, 2022
8bc35ff
missing brace
girazoki Feb 11, 2022
db40475
Missing try runtime
girazoki Feb 11, 2022
4e09af7
Merge remote-tracking branch 'upstream/master' into girazoki-supporte…
girazoki Feb 17, 2022
ba3136d
Add test proving supported fee works
girazoki Feb 17, 2022
2347dab
add not supported storage
girazoki Feb 17, 2022
ed0e8c0
Fix migration
girazoki Feb 17, 2022
20dde4e
Editorconfig
girazoki Feb 18, 2022
1cd9955
Evaluate set units per second based on the existing assets already
girazoki Feb 18, 2022
e1dcf3b
UPdate benchmarks to take into account vec length
girazoki Feb 18, 2022
f131de0
Keep adapting benchmarks
girazoki Feb 18, 2022
2e9e9fa
Final weights
girazoki Feb 18, 2022
7bde5b3
weight hint for setAssetsUnitsPerSecond
girazoki Feb 18, 2022
90470f6
Merge remote-tracking branch 'upstream/master' into girazoki-supporte…
girazoki Feb 18, 2022
54ec016
Prettier plus more tests
girazoki Feb 18, 2022
66d9040
add remove supported fee typescript test
girazoki Feb 18, 2022
1a2d423
Merge remote-tracking branch 'upstream/master' into girazoki-supporte…
girazoki Feb 18, 2022
f7529ce
Fix migration
girazoki Feb 21, 2022
61ac152
Include asset-manager with try-runtime
girazoki Feb 21, 2022
aedbbec
Merge remote-tracking branch 'upstream/master' into girazoki-supporte…
girazoki Feb 22, 2022
bcab2b9
apply PR suggestions
girazoki Feb 22, 2022
bc98d4c
Keep old weight for register asset
girazoki Feb 22, 2022
c65ecb4
Fix hrmp tests
girazoki Feb 22, 2022
938179f
Merge remote-tracking branch 'upstream/master' into girazoki-supporte…
girazoki Feb 22, 2022
30f5e2d
Merge remote-tracking branch 'upstream/master' into girazoki-supporte…
girazoki Feb 22, 2022
9a2c418
Update to binary search
girazoki Feb 22, 2022
cf879dc
Updated weights with benchmarks
girazoki Feb 22, 2022
a22f2d4
Merge remote-tracking branch 'upstream/master' into girazoki-supporte…
girazoki Feb 22, 2022
41f1739
Fix tests
girazoki Feb 23, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
66 changes: 51 additions & 15 deletions pallets/asset-manager/src/benchmarks.rs
Expand Up @@ -37,37 +37,73 @@ benchmarks! {
}

set_asset_units_per_second {
// does not really matter what we register
// We make it dependent on the number of existing assets already
let x in 5..100;
for i in 0..x {
let asset_type: T::AssetType = MultiLocation::new(0, X1(GeneralIndex(i as u128))).into();
let metadata = T::AssetRegistrarMetadata::default();
let amount = 1u32.into();
Pallet::<T>::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?;
Pallet::<T>::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1, i)?;
}

// does not really matter what we register, as long as it is different than the previous
let asset_type = T::AssetType::default();
let metadata = T::AssetRegistrarMetadata::default();
let amount = 1u32.into();
let asset_id: T::AssetId = asset_type.clone().into();
Pallet::<T>::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?;

}: _(RawOrigin::Root, asset_type.clone(), 1)
}: _(RawOrigin::Root, asset_type.clone(), 1, x)
verify {
assert!(Pallet::<T>::supported_fee_payment_assets().contains(&asset_type));
assert_eq!(Pallet::<T>::asset_type_units_per_second(asset_type), Some(1));
}

change_existing_asset_type {
// does not really matter what we register
let asset_type = T::AssetType::default();
let new_asset_type: T::AssetType = MultiLocation::new(
// We make it dependent on the number of existing assets already
let x in 5..100;
for i in 0..x {
let asset_type: T::AssetType = MultiLocation::new(0, X1(GeneralIndex(i as u128))).into();
let metadata = T::AssetRegistrarMetadata::default();
let amount = 1u32.into();
Pallet::<T>::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?;
Pallet::<T>::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1, i)?;
}

let new_asset_type = T::AssetType::default();
let asset_type_to_be_changed: T::AssetType = MultiLocation::new(
0,
X1(GeneralIndex(0))
X1(GeneralIndex((x-1) as u128))
).into();
let asset_id_to_be_changed = asset_type_to_be_changed.into();

let metadata = T::AssetRegistrarMetadata::default();
let amount = 1u32.into();
let asset_id: T::AssetId = asset_type.clone().into();
Pallet::<T>::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?;
// Worst case: we also set assets units per second
Pallet::<T>::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1)?;

}: _(RawOrigin::Root, asset_id, new_asset_type.clone())
}: _(RawOrigin::Root, asset_id_to_be_changed, new_asset_type.clone(), x)
verify {
assert_eq!(Pallet::<T>::asset_id_type(asset_id), Some(new_asset_type.clone()));
assert_eq!(Pallet::<T>::asset_id_type(asset_id_to_be_changed), Some(new_asset_type.clone()));
assert_eq!(Pallet::<T>::asset_type_units_per_second(&new_asset_type), Some(1));
assert!(Pallet::<T>::supported_fee_payment_assets().contains(&new_asset_type));
}

remove_supported_asset {
// We make it dependent on the number of existing assets already
let x in 5..100;
for i in 0..x {
let asset_type: T::AssetType = MultiLocation::new(0, X1(GeneralIndex(i as u128))).into();
let metadata = T::AssetRegistrarMetadata::default();
let amount = 1u32.into();
Pallet::<T>::register_asset(RawOrigin::Root.into(), asset_type.clone(), metadata, amount, true)?;
Pallet::<T>::set_asset_units_per_second(RawOrigin::Root.into(), asset_type.clone(), 1, i)?;
}
let asset_type_to_be_removed: T::AssetType = MultiLocation::new(
0,
X1(GeneralIndex((x-1) as u128))
).into();
// We try to remove the last asset type
}: _(RawOrigin::Root, asset_type_to_be_removed.clone(), x)
verify {
assert!(!Pallet::<T>::supported_fee_payment_assets().contains(&asset_type_to_be_removed));
assert_eq!(Pallet::<T>::asset_type_units_per_second(asset_type_to_be_removed), None);
}
}

Expand Down
108 changes: 105 additions & 3 deletions pallets/asset-manager/src/lib.rs
Expand Up @@ -53,6 +53,7 @@ pub mod pallet {
use frame_system::pallet_prelude::*;
use parity_scale_codec::HasCompact;
use sp_runtime::traits::{AccountIdConversion, AtLeast32BitUnsigned};
use sp_std::vec::Vec;

#[pallet::pallet]
#[pallet::without_storage_info]
Expand Down Expand Up @@ -85,6 +86,9 @@ pub mod pallet {
}

impl<T: Config> xcm_primitives::UnitsToWeightRatio<T::AssetType> for Pallet<T> {
fn payment_is_supported(asset_type: T::AssetType) -> bool {
SupportedFeePaymentAssets::<T>::get().contains(&asset_type)
}
fn get_units_per_second(asset_type: T::AssetType) -> Option<u128> {
AssetTypeUnitsPerSecond::<T>::get(asset_type)
}
Expand Down Expand Up @@ -121,6 +125,7 @@ pub mod pallet {
ErrorCreatingAsset,
AssetAlreadyExists,
AssetDoesNotExist,
TooLowNumAssetsWeightHint,
}

#[pallet::event]
Expand All @@ -129,6 +134,7 @@ pub mod pallet {
AssetRegistered(T::AssetId, T::AssetType, T::AssetRegistrarMetadata),
UnitsPerSecondChanged(T::AssetType, u128),
AssetTypeChanged(T::AssetId, T::AssetType),
SupportedAssetRemoved(T::AssetType),
}

/// Mapping from an asset id to asset type.
Expand All @@ -154,6 +160,11 @@ pub mod pallet {
pub type AssetTypeUnitsPerSecond<T: Config> =
StorageMap<_, Blake2_128Concat, T::AssetType, u128>;

// Supported fee asset payments
#[pallet::storage]
#[pallet::getter(fn supported_fee_payment_assets)]
pub type SupportedFeePaymentAssets<T: Config> = StorageValue<_, Vec<T::AssetType>, ValueQuery>;

#[pallet::call]
impl<T: Config> Pallet<T> {
/// Register new asset with the asset manager
Expand Down Expand Up @@ -182,12 +193,13 @@ pub mod pallet {
Ok(())
}

/// Change the amount of units we are charging per execution second for a given AssetId
#[pallet::weight(T::WeightInfo::set_asset_units_per_second())]
/// Change the amount of units we are charging per execution second for a given AssetType
#[pallet::weight(T::WeightInfo::set_asset_units_per_second(*num_assets_weight_hint))]
pub fn set_asset_units_per_second(
origin: OriginFor<T>,
asset_type: T::AssetType,
units_per_second: u128,
num_assets_weight_hint: u32,
) -> DispatchResult {
T::AssetModifierOrigin::ensure_origin(origin)?;

Expand All @@ -196,6 +208,20 @@ pub mod pallet {
Error::<T>::AssetDoesNotExist
);

// Grab supported assets
let mut supported_assets = SupportedFeePaymentAssets::<T>::get();

ensure!(
num_assets_weight_hint >= (supported_assets.len() as u32),
Error::<T>::TooLowNumAssetsWeightHint
);

// If not in our supported asset list, then put it
if !supported_assets.contains(&asset_type) {
supported_assets.push(asset_type.clone());
SupportedFeePaymentAssets::<T>::put(supported_assets);
}

AssetTypeUnitsPerSecond::<T>::insert(&asset_type, &units_per_second);

Self::deposit_event(Event::UnitsPerSecondChanged(asset_type, units_per_second));
Expand All @@ -205,14 +231,23 @@ pub mod pallet {
/// Change the xcm type mapping for a given assetId
/// We also change this if the previous units per second where pointing at the old
/// assetType
#[pallet::weight(T::WeightInfo::change_existing_asset_type())]
#[pallet::weight(T::WeightInfo::change_existing_asset_type(*num_assets_weight_hint))]
pub fn change_existing_asset_type(
origin: OriginFor<T>,
asset_id: T::AssetId,
new_asset_type: T::AssetType,
num_assets_weight_hint: u32,
) -> DispatchResult {
T::AssetModifierOrigin::ensure_origin(origin)?;

// Grab supported assets
let mut supported_assets = SupportedFeePaymentAssets::<T>::get();

ensure!(
num_assets_weight_hint >= (supported_assets.len() as u32),
Error::<T>::TooLowNumAssetsWeightHint
);

let previous_asset_type =
AssetIdType::<T>::get(&asset_id).ok_or(Error::<T>::AssetDoesNotExist)?;

Expand All @@ -223,7 +258,33 @@ pub mod pallet {
// Remove previous asset type info
AssetTypeId::<T>::remove(&previous_asset_type);

// Change AssetTypeUnitsPerSecond
if let Some(units) = AssetTypeUnitsPerSecond::<T>::get(&previous_asset_type) {
// If the old exists in supported assts (it should), remove it
if let Some(index) =
supported_assets
.iter()
.enumerate()
.find_map(|(index, asset)| {
if previous_asset_type == asset.clone() {
Some(index)
} else {
None
}
}) {
// Remove
supported_assets.remove(index);
}

// If new is not in supported assets, push it
if !supported_assets.contains(&new_asset_type) {
// Push the new one
supported_assets.push(new_asset_type.clone());
}

// Insert supported fee payment assets
SupportedFeePaymentAssets::<T>::put(supported_assets);

// Remove previous asset type info
AssetTypeUnitsPerSecond::<T>::remove(&previous_asset_type);
AssetTypeUnitsPerSecond::<T>::insert(&new_asset_type, units);
Expand All @@ -232,6 +293,47 @@ pub mod pallet {
Self::deposit_event(Event::AssetTypeChanged(asset_id, new_asset_type));
Ok(())
}

/// Remove a given assetType from the supported assets for fee payment
#[pallet::weight(T::WeightInfo::remove_supported_asset(*num_assets_weight_hint))]
pub fn remove_supported_asset(
origin: OriginFor<T>,
asset_type: T::AssetType,
num_assets_weight_hint: u32,
) -> DispatchResult {
T::AssetModifierOrigin::ensure_origin(origin)?;

// Grab supported assets
let mut supported_assets = SupportedFeePaymentAssets::<T>::get();

ensure!(
num_assets_weight_hint >= (supported_assets.len() as u32),
Error::<T>::TooLowNumAssetsWeightHint
);
let index = supported_assets
.iter()
.enumerate()
.find_map(|(index, asset)| {
if asset_type == asset.clone() {
Some(index)
} else {
None
}
})
.ok_or(Error::<T>::AssetDoesNotExist)?;

// Remove
supported_assets.remove(index);

// Insert
SupportedFeePaymentAssets::<T>::put(supported_assets);

// Remove
AssetTypeUnitsPerSecond::<T>::remove(&asset_type);

Self::deposit_event(Event::SupportedAssetRemoved(asset_type));
Ok(())
}
}

impl<T: Config> Pallet<T> {
Expand Down