From 8c44de5297059fb91f1725a0396a89b1f5258d4f Mon Sep 17 00:00:00 2001 From: Adam Reif Date: Thu, 30 Mar 2023 23:55:43 -0500 Subject: [PATCH] Fix: `update_asset_metadata` must also update `min_balance` and `is_sufficient` Signed-off-by: Adam Reif --- pallets/asset-manager/src/lib.rs | 2 ++ primitives/manta/src/assets.rs | 11 +++++++++++ runtime/calamari/src/assets_config.rs | 13 +++++++++++++ runtime/dolphin/src/assets_config.rs | 13 +++++++++++++ 4 files changed, 39 insertions(+) diff --git a/pallets/asset-manager/src/lib.rs b/pallets/asset-manager/src/lib.rs index 51af3f703..26749a5ae 100644 --- a/pallets/asset-manager/src/lib.rs +++ b/pallets/asset-manager/src/lib.rs @@ -463,6 +463,8 @@ pub mod pallet { >::AssetRegistry::update_asset_metadata( &asset_id, metadata.clone().into(), + metadata.min_balance().to_owned(), + metadata.is_sufficient() )?; AssetIdMetadata::::insert(asset_id, &metadata); Self::deposit_event(Event::::AssetMetadataUpdated { asset_id, metadata }); diff --git a/primitives/manta/src/assets.rs b/primitives/manta/src/assets.rs index f202120e6..c7200dea8 100644 --- a/primitives/manta/src/assets.rs +++ b/primitives/manta/src/assets.rs @@ -108,9 +108,20 @@ pub trait AssetRegistry: AssetIdType + BalanceType { /// /// * `asset_id`: the asset id to be created. /// * `metadata`: the metadata that the implementation layer stores. + /// * `min_balance`: the minimum balance to hold this asset + /// * `is_sufficient`: whether this asset can be used as reserve asset, + /// to the first approximation. More specifically, Whether a non-zero balance of this asset + /// is deposit of sufficient value to account for the state bloat associated with its + /// balance storage. If set to `true`, then non-zero balances may be stored without a + /// `consumer` reference (and thus an ED in the Balances pallet or whatever else is used to + /// control user-account state growth). + /// WARNING: Exercise extreme caution when changing `min_balance` or `is_sufficient`, + /// ** these can put user's accounts into an invalid existing-but-below-ED state ** fn update_asset_metadata( asset_id: &Self::AssetId, metadata: Self::Metadata, + min_balance: Self::Balance, + is_sufficient: bool, ) -> Result<(), Self::Error>; } diff --git a/runtime/calamari/src/assets_config.rs b/runtime/calamari/src/assets_config.rs index 9faf92738..094727101 100644 --- a/runtime/calamari/src/assets_config.rs +++ b/runtime/calamari/src/assets_config.rs @@ -105,6 +105,8 @@ impl AssetRegistry for CalamariAssetRegistry { fn update_asset_metadata( asset_id: &CalamariAssetId, metadata: AssetStorageMetadata, + min_balance: Self::Balance, + is_sufficient: bool, ) -> DispatchResult { Assets::force_set_metadata( Origin::root(), @@ -113,6 +115,17 @@ impl AssetRegistry for CalamariAssetRegistry { metadata.symbol, metadata.decimals, metadata.is_frozen, + )?; + Assets::force_asset_status( + Origin::root(), + *asset_id, + sp_runtime::MultiAddress::Id(AssetManager::account_id()), + sp_runtime::MultiAddress::Id(AssetManager::account_id()), + sp_runtime::MultiAddress::Id(AssetManager::account_id()), + sp_runtime::MultiAddress::Id(AssetManager::account_id()), + min_balance, + is_sufficient, + metadata.is_frozen, ) } } diff --git a/runtime/dolphin/src/assets_config.rs b/runtime/dolphin/src/assets_config.rs index ed8bcff57..96298700f 100644 --- a/runtime/dolphin/src/assets_config.rs +++ b/runtime/dolphin/src/assets_config.rs @@ -108,6 +108,8 @@ impl AssetRegistry for MantaAssetRegistry { fn update_asset_metadata( asset_id: &DolphinAssetId, metadata: AssetStorageMetadata, + min_balance: Self::Balance, + is_sufficient: bool, ) -> DispatchResult { Assets::force_set_metadata( Origin::root(), @@ -116,6 +118,17 @@ impl AssetRegistry for MantaAssetRegistry { metadata.symbol, metadata.decimals, metadata.is_frozen, + )?; + Assets::force_asset_status( + Origin::root(), + *asset_id, + sp_runtime::MultiAddress::Id(AssetManager::account_id()), + sp_runtime::MultiAddress::Id(AssetManager::account_id()), + sp_runtime::MultiAddress::Id(AssetManager::account_id()), + sp_runtime::MultiAddress::Id(AssetManager::account_id()), + min_balance, + is_sufficient, + metadata.is_frozen, ) } }