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

Commit cb450b6

Browse files
Pallets: Asset Rate - Rename AssetId to AssetKind, Introduce AssetKindFactory Trait (#14514)
* asset-rate rename asset_id to asset_kind * asset-rate pallet benchmarks asset kind factory * rename to SEED * fixes * Update frame/asset-rate/src/benchmarking.rs Co-authored-by: joe petrowski <[email protected]> * sp-core optional dep * sp-core included for benchmarks * sp-core to dev dep * sp-core add dep prefix --------- Co-authored-by: joe petrowski <[email protected]>
1 parent 9780579 commit cb450b6

File tree

6 files changed

+79
-51
lines changed

6 files changed

+79
-51
lines changed

bin/node/runtime/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1145,9 +1145,11 @@ impl pallet_asset_rate::Config for Runtime {
11451145
type UpdateOrigin = EnsureRoot<AccountId>;
11461146
type Balance = Balance;
11471147
type Currency = Balances;
1148-
type AssetId = u32;
1148+
type AssetKind = u32;
11491149
type RuntimeEvent = RuntimeEvent;
11501150
type WeightInfo = pallet_asset_rate::weights::SubstrateWeight<Runtime>;
1151+
#[cfg(feature = "runtime-benchmarks")]
1152+
type BenchmarkHelper = ();
11511153
}
11521154

11531155
parameter_types! {

frame/asset-rate/Cargo.toml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,12 @@ frame-support = { version = "4.0.0-dev", default-features = false, path = "../su
2222
frame-system = { version = "4.0.0-dev", default-features = false, path = "../system" }
2323
sp-runtime = { version = "24.0.0", default-features = false, path = "../../primitives/runtime" }
2424
sp-std = { version = "8.0.0", default-features = false, path = "../../primitives/std" }
25+
sp-core = { version = "21.0.0", default-features = false, optional = true, path = "../../primitives/core" }
2526

2627
[dev-dependencies]
2728
pallet-balances = { version = "4.0.0-dev", path = "../balances" }
28-
sp-core = { version = "21.0.0", path = "../../primitives/core" }
2929
sp-io = { version = "23.0.0", path = "../../primitives/io" }
30+
sp-core = { version = "21.0.0", default-features = false, path = "../../primitives/core" }
3031

3132
[features]
3233
default = ["std"]
@@ -38,12 +39,14 @@ std = [
3839
"scale-info/std",
3940
"sp-runtime/std",
4041
"sp-std/std",
42+
"sp-core?/std",
4143
]
4244
runtime-benchmarks = [
4345
"frame-benchmarking/runtime-benchmarks",
4446
"frame-support/runtime-benchmarks",
4547
"frame-system/runtime-benchmarks",
4648
"sp-runtime/runtime-benchmarks",
49+
"dep:sp-core",
4750
]
4851
try-runtime = [
4952
"frame-support/try-runtime",

frame/asset-rate/src/benchmarking.rs

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,65 +20,80 @@
2020
use super::*;
2121
use crate::{pallet as pallet_asset_rate, Pallet as AssetRate};
2222

23+
use codec::Encode;
2324
use frame_benchmarking::v2::*;
2425
use frame_support::assert_ok;
2526
use frame_system::RawOrigin;
27+
use sp_core::crypto::FromEntropy;
2628

27-
const ASSET_ID: u32 = 1;
29+
/// Trait describing the factory function for the `AssetKind` parameter.
30+
pub trait AssetKindFactory<AssetKind> {
31+
fn create_asset_kind(seed: u32) -> AssetKind;
32+
}
33+
impl<AssetKind> AssetKindFactory<AssetKind> for ()
34+
where
35+
AssetKind: FromEntropy,
36+
{
37+
fn create_asset_kind(seed: u32) -> AssetKind {
38+
AssetKind::from_entropy(&mut seed.encode().as_slice()).unwrap()
39+
}
40+
}
41+
42+
const SEED: u32 = 1;
2843

2944
fn default_conversion_rate() -> FixedU128 {
3045
FixedU128::from_u32(1u32)
3146
}
3247

33-
#[benchmarks(where <T as Config>::AssetId: From<u32>)]
48+
#[benchmarks]
3449
mod benchmarks {
3550
use super::*;
3651

3752
#[benchmark]
3853
fn create() -> Result<(), BenchmarkError> {
39-
let asset_id: T::AssetId = ASSET_ID.into();
54+
let asset_kind: T::AssetKind = T::BenchmarkHelper::create_asset_kind(SEED);
4055
#[extrinsic_call]
41-
_(RawOrigin::Root, asset_id.clone(), default_conversion_rate());
56+
_(RawOrigin::Root, asset_kind.clone(), default_conversion_rate());
4257

4358
assert_eq!(
44-
pallet_asset_rate::ConversionRateToNative::<T>::get(asset_id),
59+
pallet_asset_rate::ConversionRateToNative::<T>::get(asset_kind),
4560
Some(default_conversion_rate())
4661
);
4762
Ok(())
4863
}
4964

5065
#[benchmark]
5166
fn update() -> Result<(), BenchmarkError> {
52-
let asset_id: T::AssetId = ASSET_ID.into();
67+
let asset_kind: T::AssetKind = T::BenchmarkHelper::create_asset_kind(SEED);
5368
assert_ok!(AssetRate::<T>::create(
5469
RawOrigin::Root.into(),
55-
asset_id.clone(),
70+
asset_kind.clone(),
5671
default_conversion_rate()
5772
));
5873

5974
#[extrinsic_call]
60-
_(RawOrigin::Root, asset_id.clone(), FixedU128::from_u32(2));
75+
_(RawOrigin::Root, asset_kind.clone(), FixedU128::from_u32(2));
6176

6277
assert_eq!(
63-
pallet_asset_rate::ConversionRateToNative::<T>::get(asset_id),
78+
pallet_asset_rate::ConversionRateToNative::<T>::get(asset_kind),
6479
Some(FixedU128::from_u32(2))
6580
);
6681
Ok(())
6782
}
6883

6984
#[benchmark]
7085
fn remove() -> Result<(), BenchmarkError> {
71-
let asset_id: T::AssetId = ASSET_ID.into();
86+
let asset_kind: T::AssetKind = T::BenchmarkHelper::create_asset_kind(SEED);
7287
assert_ok!(AssetRate::<T>::create(
7388
RawOrigin::Root.into(),
74-
ASSET_ID.into(),
89+
asset_kind.clone(),
7590
default_conversion_rate()
7691
));
7792

7893
#[extrinsic_call]
79-
_(RawOrigin::Root, asset_id.clone());
94+
_(RawOrigin::Root, asset_kind.clone());
8095

81-
assert!(pallet_asset_rate::ConversionRateToNative::<T>::get(asset_id).is_none());
96+
assert!(pallet_asset_rate::ConversionRateToNative::<T>::get(asset_kind).is_none());
8297
Ok(())
8398
}
8499

frame/asset-rate/src/lib.rs

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -69,17 +69,19 @@ pub use pallet::*;
6969
pub use weights::WeightInfo;
7070

7171
#[cfg(feature = "runtime-benchmarks")]
72-
pub mod benchmarking;
72+
mod benchmarking;
7373
#[cfg(test)]
7474
mod mock;
7575
#[cfg(test)]
7676
mod tests;
7777
pub mod weights;
78+
#[cfg(feature = "runtime-benchmarks")]
79+
pub use benchmarking::AssetKindFactory;
7880

7981
// Type alias for `frame_system`'s account id.
8082
type AccountIdOf<T> = <T as frame_system::Config>::AccountId;
81-
// This pallet's asset id and balance type.
82-
type AssetIdOf<T> = <T as Config>::AssetId;
83+
// This pallet's asset kind and balance type.
84+
type AssetKindOf<T> = <T as Config>::AssetKind;
8385
// Generic fungible balance type.
8486
type BalanceOf<T> = <<T as Config>::Currency as Inspect<AccountIdOf<T>>>::Balance;
8587

@@ -115,32 +117,36 @@ pub mod pallet {
115117
/// The currency mechanism for this pallet.
116118
type Currency: Inspect<Self::AccountId, Balance = Self::Balance>;
117119

118-
/// The identifier for the class of asset.
119-
type AssetId: frame_support::traits::tokens::AssetId;
120+
/// The type for asset kinds for which the conversion rate to native balance is set.
121+
type AssetKind: Parameter + MaxEncodedLen;
122+
123+
/// Helper type for benchmarks.
124+
#[cfg(feature = "runtime-benchmarks")]
125+
type BenchmarkHelper: crate::AssetKindFactory<Self::AssetKind>;
120126
}
121127

122128
/// Maps an asset to its fixed point representation in the native balance.
123129
///
124-
/// E.g. `native_amount = asset_amount * ConversionRateToNative::<T>::get(asset_id)`
130+
/// E.g. `native_amount = asset_amount * ConversionRateToNative::<T>::get(asset_kind)`
125131
#[pallet::storage]
126132
pub type ConversionRateToNative<T: Config> =
127-
StorageMap<_, Blake2_128Concat, T::AssetId, FixedU128, OptionQuery>;
133+
StorageMap<_, Blake2_128Concat, T::AssetKind, FixedU128, OptionQuery>;
128134

129135
#[pallet::event]
130136
#[pallet::generate_deposit(pub(super) fn deposit_event)]
131137
pub enum Event<T: Config> {
132-
// Some `asset_id` conversion rate was created.
133-
AssetRateCreated { asset_id: T::AssetId, rate: FixedU128 },
134-
// Some `asset_id` conversion rate was removed.
135-
AssetRateRemoved { asset_id: T::AssetId },
136-
// Some existing `asset_id` conversion rate was updated from `old` to `new`.
137-
AssetRateUpdated { asset_id: T::AssetId, old: FixedU128, new: FixedU128 },
138+
// Some `asset_kind` conversion rate was created.
139+
AssetRateCreated { asset_kind: T::AssetKind, rate: FixedU128 },
140+
// Some `asset_kind` conversion rate was removed.
141+
AssetRateRemoved { asset_kind: T::AssetKind },
142+
// Some existing `asset_kind` conversion rate was updated from `old` to `new`.
143+
AssetRateUpdated { asset_kind: T::AssetKind, old: FixedU128, new: FixedU128 },
138144
}
139145

140146
#[pallet::error]
141147
pub enum Error<T> {
142148
/// The given asset ID is unknown.
143-
UnknownAssetId,
149+
UnknownAssetKind,
144150
/// The given asset ID already has an assigned conversion rate and cannot be re-created.
145151
AlreadyExists,
146152
}
@@ -155,18 +161,18 @@ pub mod pallet {
155161
#[pallet::weight(T::WeightInfo::create())]
156162
pub fn create(
157163
origin: OriginFor<T>,
158-
asset_id: T::AssetId,
164+
asset_kind: T::AssetKind,
159165
rate: FixedU128,
160166
) -> DispatchResult {
161167
T::CreateOrigin::ensure_origin(origin)?;
162168

163169
ensure!(
164-
!ConversionRateToNative::<T>::contains_key(asset_id.clone()),
170+
!ConversionRateToNative::<T>::contains_key(asset_kind.clone()),
165171
Error::<T>::AlreadyExists
166172
);
167-
ConversionRateToNative::<T>::set(asset_id.clone(), Some(rate));
173+
ConversionRateToNative::<T>::set(asset_kind.clone(), Some(rate));
168174

169-
Self::deposit_event(Event::AssetRateCreated { asset_id, rate });
175+
Self::deposit_event(Event::AssetRateCreated { asset_kind, rate });
170176
Ok(())
171177
}
172178

@@ -178,24 +184,24 @@ pub mod pallet {
178184
#[pallet::weight(T::WeightInfo::update())]
179185
pub fn update(
180186
origin: OriginFor<T>,
181-
asset_id: T::AssetId,
187+
asset_kind: T::AssetKind,
182188
rate: FixedU128,
183189
) -> DispatchResult {
184190
T::UpdateOrigin::ensure_origin(origin)?;
185191

186192
let mut old = FixedU128::zero();
187-
ConversionRateToNative::<T>::mutate(asset_id.clone(), |maybe_rate| {
193+
ConversionRateToNative::<T>::mutate(asset_kind.clone(), |maybe_rate| {
188194
if let Some(r) = maybe_rate {
189195
old = *r;
190196
*r = rate;
191197

192198
Ok(())
193199
} else {
194-
Err(Error::<T>::UnknownAssetId)
200+
Err(Error::<T>::UnknownAssetKind)
195201
}
196202
})?;
197203

198-
Self::deposit_event(Event::AssetRateUpdated { asset_id, old, new: rate });
204+
Self::deposit_event(Event::AssetRateUpdated { asset_kind, old, new: rate });
199205
Ok(())
200206
}
201207

@@ -205,23 +211,23 @@ pub mod pallet {
205211
/// - O(1)
206212
#[pallet::call_index(2)]
207213
#[pallet::weight(T::WeightInfo::remove())]
208-
pub fn remove(origin: OriginFor<T>, asset_id: T::AssetId) -> DispatchResult {
214+
pub fn remove(origin: OriginFor<T>, asset_kind: T::AssetKind) -> DispatchResult {
209215
T::RemoveOrigin::ensure_origin(origin)?;
210216

211217
ensure!(
212-
ConversionRateToNative::<T>::contains_key(asset_id.clone()),
213-
Error::<T>::UnknownAssetId
218+
ConversionRateToNative::<T>::contains_key(asset_kind.clone()),
219+
Error::<T>::UnknownAssetKind
214220
);
215-
ConversionRateToNative::<T>::remove(asset_id.clone());
221+
ConversionRateToNative::<T>::remove(asset_kind.clone());
216222

217-
Self::deposit_event(Event::AssetRateRemoved { asset_id });
223+
Self::deposit_event(Event::AssetRateRemoved { asset_kind });
218224
Ok(())
219225
}
220226
}
221227
}
222228

223229
/// Exposes conversion of an arbitrary balance of an asset to native balance.
224-
impl<T> ConversionFromAssetBalance<BalanceOf<T>, AssetIdOf<T>, BalanceOf<T>> for Pallet<T>
230+
impl<T> ConversionFromAssetBalance<BalanceOf<T>, AssetKindOf<T>, BalanceOf<T>> for Pallet<T>
225231
where
226232
T: Config,
227233
BalanceOf<T>: FixedPointOperand + Zero,
@@ -230,10 +236,10 @@ where
230236

231237
fn from_asset_balance(
232238
balance: BalanceOf<T>,
233-
asset_id: AssetIdOf<T>,
239+
asset_kind: AssetKindOf<T>,
234240
) -> Result<BalanceOf<T>, pallet::Error<T>> {
235-
let rate = pallet::ConversionRateToNative::<T>::get(asset_id)
236-
.ok_or(pallet::Error::<T>::UnknownAssetId.into())?;
241+
let rate = pallet::ConversionRateToNative::<T>::get(asset_kind)
242+
.ok_or(pallet::Error::<T>::UnknownAssetKind.into())?;
237243
Ok(rate.saturating_mul_int(balance))
238244
}
239245
}

frame/asset-rate/src/mock.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,9 @@ impl pallet_asset_rate::Config for Test {
8686
type UpdateOrigin = frame_system::EnsureRoot<u64>;
8787
type Balance = u64;
8888
type Currency = Balances;
89-
type AssetId = u32;
89+
type AssetKind = u32;
90+
#[cfg(feature = "runtime-benchmarks")]
91+
type BenchmarkHelper = ();
9092
}
9193

9294
// Build genesis storage according to the mock runtime.

frame/asset-rate/src/tests.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ fn remove_unknown_throws() {
6666
new_test_ext().execute_with(|| {
6767
assert_noop!(
6868
AssetRate::remove(RuntimeOrigin::root(), ASSET_ID,),
69-
Error::<Test>::UnknownAssetId
69+
Error::<Test>::UnknownAssetKind
7070
);
7171
});
7272
}
@@ -89,7 +89,7 @@ fn update_unknown_throws() {
8989
new_test_ext().execute_with(|| {
9090
assert_noop!(
9191
AssetRate::update(RuntimeOrigin::root(), ASSET_ID, FixedU128::from_float(0.5)),
92-
Error::<Test>::UnknownAssetId
92+
Error::<Test>::UnknownAssetKind
9393
);
9494
});
9595
}
@@ -101,7 +101,7 @@ fn convert_works() {
101101

102102
let conversion = <AssetRate as ConversionFromAssetBalance<
103103
BalanceOf<Test>,
104-
<Test as pallet_asset_rate::Config>::AssetId,
104+
<Test as pallet_asset_rate::Config>::AssetKind,
105105
BalanceOf<Test>,
106106
>>::from_asset_balance(10, ASSET_ID);
107107
assert_eq!(conversion.expect("Conversion rate exists for asset"), 25);
@@ -113,7 +113,7 @@ fn convert_unknown_throws() {
113113
new_test_ext().execute_with(|| {
114114
let conversion = <AssetRate as ConversionFromAssetBalance<
115115
BalanceOf<Test>,
116-
<Test as pallet_asset_rate::Config>::AssetId,
116+
<Test as pallet_asset_rate::Config>::AssetKind,
117117
BalanceOf<Test>,
118118
>>::from_asset_balance(10, ASSET_ID);
119119
assert!(conversion.is_err());

0 commit comments

Comments
 (0)