From 86dd76c441b2db6549cfb8ddf26842d73f4d9cc3 Mon Sep 17 00:00:00 2001 From: SunTiebing <1045060705@qq.com> Date: Wed, 5 Jun 2024 17:48:06 +0800 Subject: [PATCH 1/2] add update_currency_metadata function --- pallets/asset-registry/src/benchmarking.rs | 34 +++++ pallets/asset-registry/src/lib.rs | 40 ++++++ pallets/asset-registry/src/tests.rs | 120 ++++++++++++++++++ pallets/asset-registry/src/weights.rs | 12 ++ .../src/weights/bifrost_asset_registry.rs | 11 ++ .../src/weights/bifrost_asset_registry.rs | 11 ++ 6 files changed, 228 insertions(+) diff --git a/pallets/asset-registry/src/benchmarking.rs b/pallets/asset-registry/src/benchmarking.rs index 2bc375dd5..468aa3af2 100644 --- a/pallets/asset-registry/src/benchmarking.rs +++ b/pallets/asset-registry/src/benchmarking.rs @@ -275,6 +275,40 @@ benchmarks! { }; }: {call.dispatch_bypass_filter(origin)?} + update_currency_metadata { + let origin = T::RegisterOrigin::try_successful_origin().map_err(|_| BenchmarkError::Weightless)?; + + assert_ok!(AssetRegistry::::register_token_metadata( + origin.clone(), + Box::new(AssetMetadata { + name: b"Old Token Name".to_vec(), + symbol: b"OTN".to_vec(), + decimals: 10, + minimal_balance: BalanceOf::::unique_saturated_from(1u128), + }) + )); + + let call = Call::::update_currency_metadata { + currency_id: CurrencyId::Token2(0), + asset_name: Some(b"Token Name".to_vec()), + asset_symbol: Some(b"TN".to_vec()), + asset_decimals : Some(12), + asset_minimal_balance : Some(BalanceOf::::unique_saturated_from(1000u128)), + }; + + }: {call.dispatch_bypass_filter(origin)?} + verify { + assert_eq!( + CurrencyMetadatas::::get(CurrencyId::Token2(0)), + Some(AssetMetadata { + name: b"Token Name".to_vec(), + symbol: b"TN".to_vec(), + decimals: 12, + minimal_balance: BalanceOf::::unique_saturated_from(1000u128), + }) + ); + } + impl_benchmark_test_suite!( AssetRegistry, crate::mock::ExtBuilder::default().build(), diff --git a/pallets/asset-registry/src/lib.rs b/pallets/asset-registry/src/lib.rs index 8ab32138f..ff916c370 100644 --- a/pallets/asset-registry/src/lib.rs +++ b/pallets/asset-registry/src/lib.rs @@ -121,6 +121,8 @@ pub mod pallet { AssetUpdated { asset_id: AssetIds, metadata: AssetMetadata> }, /// The CurrencyId registered. CurrencyIdRegistered { currency_id: CurrencyId, metadata: AssetMetadata> }, + /// The CurrencyId updated. + CurrencyIdUpdated { currency_id: CurrencyId, metadata: AssetMetadata> }, /// MultiLocation Force set. MultiLocationSet { currency_id: CurrencyId, location: MultiLocation, weight: Weight }, } @@ -444,6 +446,44 @@ pub mod pallet { Ok(()) } + + #[pallet::call_index(8)] + #[pallet::weight(T::WeightInfo::force_set_multilocation())] + // #[pallet::weight(T::WeightInfo::update_currency_metadata())] + pub fn update_currency_metadata( + origin: OriginFor, + currency_id: CurrencyId, + asset_name: Option>, + asset_symbol: Option>, + asset_decimals: Option, + asset_minimal_balance: Option>, + ) -> DispatchResult { + T::RegisterOrigin::ensure_origin(origin)?; + + // Check if the currency metadata exists + let mut metadata = + CurrencyMetadatas::::get(currency_id).ok_or(Error::::CurrencyIdNotExists)?; + + // Update the metadata fields based on the provided options + if let Some(name) = asset_name { + metadata.name = name; + } + if let Some(symbol) = asset_symbol { + metadata.symbol = symbol; + } + if let Some(decimals) = asset_decimals { + metadata.decimals = decimals; + } + if let Some(minimal_balance) = asset_minimal_balance { + metadata.minimal_balance = minimal_balance; + } + + // Store the updated metadata + CurrencyMetadatas::::insert(currency_id, metadata.clone()); + Self::deposit_event(Event::::CurrencyIdUpdated { currency_id, metadata }); + + Ok(()) + } } } diff --git a/pallets/asset-registry/src/tests.rs b/pallets/asset-registry/src/tests.rs index cfae30dd6..d35dcf8a7 100644 --- a/pallets/asset-registry/src/tests.rs +++ b/pallets/asset-registry/src/tests.rs @@ -445,3 +445,123 @@ fn force_set_multilocation_should_work() { ); }) } + +#[test] +fn update_currency_metadata_should_work() { + ExtBuilder::default().build().execute_with(|| { + let caller = CouncilAccount::get(); + let currency_id = CurrencyId::Token2(0); + let name = b"Updated Name".to_vec(); + let symbol = b"UN".to_vec(); + let decimals: u8 = 10; + let minimal_balance = 1000u32.into(); + + // Pre-insert a currency_metadata to update + CurrencyMetadatas::::insert( + currency_id, + AssetMetadata { + name: b"Old Name".to_vec(), + symbol: b"ON".to_vec(), + decimals: 8, + minimal_balance: 1u32.into(), + }, + ); + + // Ensure the origin has the required permissions + let origin = RuntimeOrigin::signed(caller); + assert_ok!(AssetRegistry::update_currency_metadata( + origin, + currency_id, + Some(name.clone()), + Some(symbol.clone()), + Some(decimals), + Some(minimal_balance) + )); + + System::assert_last_event(RuntimeEvent::AssetRegistry(crate::Event::CurrencyIdUpdated { + currency_id, + metadata: AssetMetadata { + name: name.clone(), + symbol: symbol.clone(), + decimals, + minimal_balance, + }, + })); + + // Verify the updated metadata + let updated_metadata = CurrencyMetadatas::::get(currency_id).unwrap(); + assert_eq!(updated_metadata.name, name); + assert_eq!(updated_metadata.symbol, symbol); + assert_eq!(updated_metadata.decimals, decimals); + assert_eq!(updated_metadata.minimal_balance, minimal_balance); + }) +} + +#[test] +fn update_currency_metadata_should_work_no_change() { + ExtBuilder::default().build().execute_with(|| { + let caller = CouncilAccount::get(); + let currency_id = CurrencyId::Token2(0); + let name = None; + let symbol = None; + let decimals = None; + let minimal_balance = None; + + let old_metadata = AssetMetadata { + name: b"Old Name".to_vec(), + symbol: b"ON".to_vec(), + decimals: 8, + minimal_balance: 1u32.into(), + }; + + // Pre-insert a currency_metadata to update + CurrencyMetadatas::::insert(currency_id, old_metadata.clone()); + + // Ensure the origin has the required permissions + let origin = RuntimeOrigin::signed(caller); + assert_ok!(AssetRegistry::update_currency_metadata( + origin, + currency_id, + name, + symbol, + decimals, + minimal_balance + )); + + // Verify the event + System::assert_last_event(RuntimeEvent::AssetRegistry(crate::Event::CurrencyIdUpdated { + currency_id, + metadata: old_metadata.clone(), + })); + + // Verify the updated metadata + let updated_metadata = CurrencyMetadatas::::get(currency_id).unwrap(); + assert_eq!(updated_metadata, old_metadata); + }); +} + +#[test] +fn update_currency_metadata_nonexistent_currency_id() { + ExtBuilder::default().build().execute_with(|| { + let caller = CouncilAccount::get(); + let currency_id = CurrencyId::Token2(1); // Non-existent currency ID + let name = Some(b"Updated Name".to_vec()); + let symbol = Some(b"UN".to_vec()); + let decimals = Some(10); + let minimal_balance = Some(1000u32.into()); + + // Ensure the origin has the required permissions + let origin = RuntimeOrigin::signed(caller); + assert_noop!( + AssetRegistry::update_currency_metadata( + origin, + currency_id, + name, + symbol, + decimals, + minimal_balance + ), + Error::::CurrencyIdNotExists + ); + }); +} diff --git a/pallets/asset-registry/src/weights.rs b/pallets/asset-registry/src/weights.rs index de8544355..7f63d304b 100644 --- a/pallets/asset-registry/src/weights.rs +++ b/pallets/asset-registry/src/weights.rs @@ -61,6 +61,7 @@ pub trait WeightInfo { fn register_vsbond_metadata() -> Weight; fn register_multilocation() -> Weight; fn force_set_multilocation() -> Weight; + fn update_currency_metadata() -> Weight; } // For backwards compatibility and tests @@ -175,4 +176,15 @@ impl WeightInfo for () { .saturating_add(RocksDbWeight::get().reads(1_u64)) .saturating_add(RocksDbWeight::get().writes(3_u64)) } + /// Storage: `AssetRegistry::CurrencyMetadatas` (r:1 w:1) + /// Proof: `AssetRegistry::CurrencyMetadatas` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn update_currency_metadata() -> Weight { + // Proof Size summary in bytes: + // Measured: `409` + // Estimated: `3874` + // Minimum execution time: 12_000_000 picoseconds. + Weight::from_parts(13_000_000, 3874) + .saturating_add(RocksDbWeight::get().reads(1_u64)) + .saturating_add(RocksDbWeight::get().writes(1_u64)) + } } diff --git a/runtime/bifrost-kusama/src/weights/bifrost_asset_registry.rs b/runtime/bifrost-kusama/src/weights/bifrost_asset_registry.rs index 2ebcdcc3a..178916670 100644 --- a/runtime/bifrost-kusama/src/weights/bifrost_asset_registry.rs +++ b/runtime/bifrost-kusama/src/weights/bifrost_asset_registry.rs @@ -164,4 +164,15 @@ impl bifrost_asset_registry::WeightInfo for BifrostWeig .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) } + // Storage: `AssetRegistry::CurrencyMetadatas` (r:1 w:1) + // Proof: `AssetRegistry::CurrencyMetadatas` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn update_currency_metadata() -> Weight { + // Proof Size summary in bytes: + // Measured: `409` + // Estimated: `3874` + // Minimum execution time: 12_000 nanoseconds. + Weight::from_parts(13_000_000, 3874) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } diff --git a/runtime/bifrost-polkadot/src/weights/bifrost_asset_registry.rs b/runtime/bifrost-polkadot/src/weights/bifrost_asset_registry.rs index 2ebcdcc3a..178916670 100644 --- a/runtime/bifrost-polkadot/src/weights/bifrost_asset_registry.rs +++ b/runtime/bifrost-polkadot/src/weights/bifrost_asset_registry.rs @@ -164,4 +164,15 @@ impl bifrost_asset_registry::WeightInfo for BifrostWeig .saturating_add(T::DbWeight::get().reads(1)) .saturating_add(T::DbWeight::get().writes(3)) } + // Storage: `AssetRegistry::CurrencyMetadatas` (r:1 w:1) + // Proof: `AssetRegistry::CurrencyMetadatas` (`max_values`: None, `max_size`: None, mode: `Measured`) + fn update_currency_metadata() -> Weight { + // Proof Size summary in bytes: + // Measured: `409` + // Estimated: `3874` + // Minimum execution time: 12_000 nanoseconds. + Weight::from_parts(13_000_000, 3874) + .saturating_add(T::DbWeight::get().reads(1)) + .saturating_add(T::DbWeight::get().writes(1)) + } } From bdf76c33ac942026979e94f38d9a1fe6021d2f79 Mon Sep 17 00:00:00 2001 From: SunTiebing <1045060705@qq.com> Date: Tue, 11 Jun 2024 21:10:17 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=F0=9F=90=9B=20correct=20update=5Fcu?= =?UTF-8?q?rrency=5Fmetadata=20weight?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pallets/asset-registry/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pallets/asset-registry/src/lib.rs b/pallets/asset-registry/src/lib.rs index ff916c370..1feb68ad9 100644 --- a/pallets/asset-registry/src/lib.rs +++ b/pallets/asset-registry/src/lib.rs @@ -448,8 +448,7 @@ pub mod pallet { } #[pallet::call_index(8)] - #[pallet::weight(T::WeightInfo::force_set_multilocation())] - // #[pallet::weight(T::WeightInfo::update_currency_metadata())] + #[pallet::weight(T::WeightInfo::update_currency_metadata())] pub fn update_currency_metadata( origin: OriginFor, currency_id: CurrencyId,