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

Add Permissionless Asset Registry Feature #1212

Merged
merged 32 commits into from
Jul 20, 2023
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
436fa05
init
ferrell-code Jul 12, 2023
d1e47f4
make metadata not generic
ferrell-code Jul 12, 2023
33c7796
better parameters
ferrell-code Jul 12, 2023
10479c2
tests
ferrell-code Jul 13, 2023
f913999
need native token to create asset
ferrell-code Jul 13, 2023
ab562d5
handle edge cases:
ferrell-code Jul 14, 2023
b7c3a44
Merge branch 'manta' into fer-permissionless-asset
ferrell-code Jul 14, 2023
e441db2
fix comments
ferrell-code Jul 14, 2023
8198ca3
add sanity check
ferrell-code Jul 14, 2023
22af5aa
add to runtimes and mocks
ferrell-code Jul 14, 2023
9b8d59b
add benchmarks
ferrell-code Jul 14, 2023
ccb31dc
fix benchmarks
ferrell-code Jul 14, 2023
152a54c
Merge branch 'manta' into fer-permissionless-asset
ferrell-code Jul 14, 2023
4348059
fix farming benchmarks
ferrell-code Jul 14, 2023
6cb8ac7
update benchmark weights
ferrell-code Jul 14, 2023
a3523fe
weights in runtimes
ferrell-code Jul 14, 2023
8c02acd
add counter tests
ferrell-code Jul 14, 2023
a8f3883
add more tests
ferrell-code Jul 15, 2023
65cc718
fix clippy
ferrell-code Jul 15, 2023
3619a9a
add integration test
ferrell-code Jul 15, 2023
84faf48
Merge branch 'manta' into fer-permissionless-asset
ferrell-code Jul 15, 2023
2443912
Merge branch 'manta' into fer-permissionless-asset
ferrell-code Jul 17, 2023
ca7e550
Merge branch 'manta' into fer-permissionless-asset
ferrell-code Jul 18, 2023
cb06563
use number instead of max
ferrell-code Jul 18, 2023
aefbaba
Merge branch 'manta' into fer-permissionless-asset
ferrell-code Jul 18, 2023
ed1abef
unify string limit param
ferrell-code Jul 19, 2023
63cf5b5
Merge branch 'manta' into fer-permissionless-asset
ferrell-code Jul 19, 2023
7ae2c30
Merge branch 'manta' into fer-permissionless-asset
ferrell-code Jul 20, 2023
60c51d4
add tx diff
ferrell-code Jul 20, 2023
6b87790
Merge branch 'manta' into fer-permissionless-asset
ferrell-code Jul 20, 2023
d687f5b
Do not panic when diff new extrinsic tx fee
Dengjianping Jul 20, 2023
613b1ba
Merge branch 'manta' into fer-permissionless-asset
ghzlatarev Jul 20, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions pallets/asset-manager/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ runtime-benchmarks = [
"frame-support/runtime-benchmarks",
"frame-system/runtime-benchmarks",
"manta-primitives/runtime-benchmarks",
"pallet-assets/runtime-benchmarks",
]
std = [
"codec/std",
Expand Down
52 changes: 33 additions & 19 deletions pallets/asset-manager/src/benchmarking.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,13 @@
#![cfg(feature = "runtime-benchmarks")]

use crate::{Call, Config, Pallet};
use frame_benchmarking::{benchmarks, impl_benchmark_test_suite, whitelisted_caller};
use frame_benchmarking::{benchmarks, impl_benchmark_test_suite, vec, whitelisted_caller};
use frame_support::traits::Get;
use frame_system::{EventRecord, RawOrigin};
use manta_primitives::assets::{AssetConfig, TestingDefault, UnitsPerSecond};
use manta_primitives::{
assets::{AssetConfig, AssetRegistryMetadata, FungibleLedger, TestingDefault, UnitsPerSecond},
types::Balance,
};
use xcm::latest::prelude::*;

fn assert_last_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) {
Expand All @@ -30,11 +34,11 @@ fn assert_last_event<T: Config>(generic_event: <T as Config>::RuntimeEvent) {
}

benchmarks! {
where_clause { where T::Location: From<MultiLocation>, <T as Config>::Balance: From<u32>, <T as Config>::AssetId: From<u32> }
where_clause { where T::Location: From<MultiLocation>, <T as Config>::AssetId: From<u32> }

register_asset {
let location = T::Location::default();
let metadata = <T::AssetConfig as AssetConfig<T>>::AssetRegistryMetadata::testing_default();
let metadata = AssetRegistryMetadata::<Balance>::testing_default();
}: _(RawOrigin::Root, location.clone(), metadata)
verify {
assert_eq!(Pallet::<T>::asset_id_location(crate::NextAssetId::<T>::get() - 1.into()), Some(location));
Expand All @@ -45,13 +49,13 @@ benchmarks! {
for i in 8..assets_count + 8 {
let location: MultiLocation = MultiLocation::new(0, X1(Parachain(i)));
let location = T::Location::from(location.clone());
let metadata = <T::AssetConfig as AssetConfig<T>>::AssetRegistryMetadata::testing_default();
let metadata = AssetRegistryMetadata::<Balance>::testing_default();
Pallet::<T>::register_asset(RawOrigin::Root.into(), location.clone(), metadata.clone())?;
Pallet::<T>::set_units_per_second(RawOrigin::Root.into(), <T as Config>::AssetId::from(i), 0)?;
}
// does not really matter what we register, as long as it is different than the previous
let location = T::Location::default();
let metadata = <T::AssetConfig as AssetConfig<T>>::AssetRegistryMetadata::testing_default();
let metadata = AssetRegistryMetadata::<Balance>::testing_default();
let amount = 10;
Pallet::<T>::register_asset(RawOrigin::Root.into(), location, metadata)?;
let some_valid_asset_id = <T as Config>::AssetId::from(assets_count + 8);
Expand All @@ -65,12 +69,12 @@ benchmarks! {
for i in 0..assets_count {
let location: MultiLocation = MultiLocation::new(0, X1(Parachain(i)));
let location = T::Location::from(location.clone());
let metadata = <T::AssetConfig as AssetConfig<T>>::AssetRegistryMetadata::testing_default();
let metadata = AssetRegistryMetadata::<Balance>::testing_default();
Pallet::<T>::register_asset(RawOrigin::Root.into(), location.clone(), metadata.clone())?;
}
// does not really matter what we register, as long as it is different than the previous
let location = T::Location::default();
let metadata = <T::AssetConfig as AssetConfig<T>>::AssetRegistryMetadata::testing_default();
let metadata = AssetRegistryMetadata::<Balance>::testing_default();
Pallet::<T>::register_asset(RawOrigin::Root.into(), location, metadata)?;
let new_location = T::Location::from(MultiLocation::new(0, X1(Parachain(1000))));
let some_valid_asset_id = <T as Config>::AssetId::from(assets_count);
Expand All @@ -84,12 +88,12 @@ benchmarks! {
for i in 0..assets_count {
let location: MultiLocation = MultiLocation::new(0, X1(Parachain(i)));
let location = T::Location::from(location.clone());
let metadata = <T::AssetConfig as AssetConfig<T>>::AssetRegistryMetadata::testing_default();
let metadata = AssetRegistryMetadata::<Balance>::testing_default();
Pallet::<T>::register_asset(RawOrigin::Root.into(), location.clone(), metadata.clone())?;
}
// does not really matter what we register, as long as it is different than the previous
let location = T::Location::default();
let metadata = <T::AssetConfig as AssetConfig<T>>::AssetRegistryMetadata::testing_default();
let metadata = AssetRegistryMetadata::<Balance>::testing_default();
Pallet::<T>::register_asset(RawOrigin::Root.into(), location, metadata.clone())?;
let some_valid_asset_id = <T as Config>::AssetId::from(assets_count);
}: _(RawOrigin::Root, some_valid_asset_id, metadata.clone())
Expand All @@ -101,35 +105,35 @@ benchmarks! {
let assets_count = 1000;
for i in 0..assets_count {
let location = T::Location::from(MultiLocation::new(0, X1(Parachain(i))));
let metadata = <T::AssetConfig as AssetConfig<T>>::AssetRegistryMetadata::testing_default();
let metadata = AssetRegistryMetadata::<Balance>::testing_default();
Pallet::<T>::register_asset(RawOrigin::Root.into(), location.clone(), metadata.clone())?;
}
let beneficiary: T::AccountId = whitelisted_caller();
let amount = 100;
// does not really matter what we register, as long as it is different than the previous
let location = T::Location::default();
let metadata = <T::AssetConfig as AssetConfig<T>>::AssetRegistryMetadata::testing_default();
let metadata = AssetRegistryMetadata::<Balance>::testing_default();
Pallet::<T>::register_asset(RawOrigin::Root.into(), location, metadata)?;
let some_valid_asset_id = <T as Config>::AssetId::from(assets_count);
}: _(RawOrigin::Root, <T as Config>::AssetId::from(assets_count), beneficiary.clone(), <T as Config>::Balance::from(amount) )
}: _(RawOrigin::Root, <T as Config>::AssetId::from(assets_count), beneficiary.clone(), amount )
verify {
assert_last_event::<T>(crate::Event::AssetMinted { asset_id: some_valid_asset_id, beneficiary, amount: <T as Config>::Balance::from(amount) }.into());
assert_last_event::<T>(crate::Event::AssetMinted { asset_id: some_valid_asset_id, beneficiary, amount }.into());
}

set_min_xcm_fee {
let assets_count = 1000;
for i in 8..assets_count + 8 {
let location: MultiLocation = MultiLocation::new(0, X1(Parachain(i)));
let location = T::Location::from(location.clone());
let metadata = <T::AssetConfig as AssetConfig<T>>::AssetRegistryMetadata::testing_default();
let metadata = AssetRegistryMetadata::<Balance>::testing_default();

Pallet::<T>::register_asset(RawOrigin::Root.into(), location.clone(), metadata.clone())?;
Pallet::<T>::set_units_per_second(RawOrigin::Root.into(), <T as Config>::AssetId::from(i), 0)?;
}

// does not really matter what we register, as long as it is different than the previous
let location = T::Location::default();
let metadata = <T::AssetConfig as AssetConfig<T>>::AssetRegistryMetadata::testing_default();
let metadata = AssetRegistryMetadata::<Balance>::testing_default();
let min_xcm_fee = 10;
Pallet::<T>::register_asset(RawOrigin::Root.into(), location.clone(), metadata)?;

Expand All @@ -143,7 +147,7 @@ benchmarks! {
for i in 0..assets_count {
let location: MultiLocation = MultiLocation::new(0, X1(Parachain(i)));
let location = T::Location::from(location.clone());
let metadata = <T::AssetConfig as AssetConfig<T>>::AssetRegistryMetadata::testing_default();
let metadata = AssetRegistryMetadata::<Balance>::testing_default();
Pallet::<T>::register_asset(RawOrigin::Root.into(), location.clone(), metadata.clone())?;
}
let location: MultiLocation = MultiLocation::new(0, X1(Parachain(1)));
Expand All @@ -158,15 +162,25 @@ benchmarks! {
for i in 8..assets_count {
let location: MultiLocation = MultiLocation::new(0, X1(Parachain(i)));
let location = T::Location::from(location.clone());
let metadata = <T::AssetConfig as AssetConfig<T>>::AssetRegistryMetadata::testing_default();
let metadata = AssetRegistryMetadata::<Balance>::testing_default();
Pallet::<T>::register_asset(RawOrigin::Root.into(), location.clone(), metadata.clone())?;
}
let lp_metadata = <T::AssetConfig as AssetConfig<T>>::AssetRegistryMetadata::testing_default();
let lp_metadata = AssetRegistryMetadata::<Balance>::testing_default();
}: _(RawOrigin::Root, current_asset_id, current_asset_id + 1.into(), lp_metadata)
verify {
assert_eq!(Pallet::<T>::asset_id_pair_to_lp((current_asset_id, current_asset_id + 1.into())), Some(current_asset_id + 2.into()));
assert_eq!(Pallet::<T>::lp_to_asset_id_pair(current_asset_id + 2.into()), Some((current_asset_id, current_asset_id + 1.into())));
}

permissionless_register_asset {
let caller = whitelisted_caller();
let native_asset_id = <T::AssetConfig as AssetConfig<T>>::NativeAssetId::get();
let _ = <T::AssetConfig as AssetConfig<T>>::FungibleLedger::deposit_minting(
native_asset_id,
&caller,
1_000_000_000_000_000_000_000u128
);
}: _(RawOrigin::Signed(caller), vec![].try_into().unwrap(), vec![].try_into().unwrap(), 12, 1_000_000_000_000_000)
}

impl_benchmark_test_suite!(Pallet, crate::mock::new_test_ext(), crate::mock::Runtime);
Loading
Loading