Skip to content

Commit e2cead8

Browse files
raycar5Centril
andauthored
MESH-1759 Remove porfolio name to number mapping after deletion (#1200)
* Remove porfolio name to number mapping after deletion * Create migration * Apply suggestions from code review Co-authored-by: Mazdak Farrokhzad <[email protected]> * Drop unused var Co-authored-by: Mazdak Farrokhzad <[email protected]>
1 parent 1fde1c9 commit e2cead8

File tree

2 files changed

+42
-3
lines changed

2 files changed

+42
-3
lines changed

pallets/portfolio/src/lib.rs

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,11 @@ pub mod benchmarking;
4848

4949
use codec::{Decode, Encode};
5050
use core::{iter, mem};
51-
use frame_support::{decl_error, decl_module, decl_storage, dispatch::DispatchResult, ensure};
51+
use frame_support::{
52+
decl_error, decl_module, decl_storage,
53+
dispatch::{DispatchResult, Weight},
54+
ensure,
55+
};
5256
use pallet_identity::{self as identity, PermissionedCallOriginData};
5357
use polymesh_common_utilities::traits::balances::Memo;
5458
use polymesh_common_utilities::traits::portfolio::PortfolioSubTrait;
@@ -117,11 +121,11 @@ decl_storage! {
117121
double_map hasher(identity) IdentityId, hasher(twox_64_concat) PortfolioId => bool;
118122

119123
/// Storage version.
120-
StorageVersion get(fn storage_version) build(|_| Version::new(0).unwrap()): Version;
124+
StorageVersion get(fn storage_version) build(|_| Version::new(1).unwrap()): Version;
121125
}
122126
}
123127

124-
storage_migration_ver!(0);
128+
storage_migration_ver!(1);
125129

126130
decl_error! {
127131
pub enum Error for Module<T: Config> {
@@ -191,7 +195,9 @@ decl_module! {
191195
Self::ensure_portfolio_custody_and_permission(pid, primary_did, secondary_key.as_ref())?;
192196

193197
// Delete from storage.
198+
let portfolio = Portfolios::get(&primary_did, &num);
194199
Portfolios::remove(&primary_did, &num);
200+
NameToNumber::remove(&primary_did, &portfolio);
195201
PortfolioAssetCount::remove(&pid);
196202
PortfolioAssetBalances::remove_prefix(&pid);
197203
PortfolioLockedAssets::remove_prefix(&pid);
@@ -330,6 +336,23 @@ decl_module! {
330336
pub fn accept_portfolio_custody(origin, auth_id: u64) -> DispatchResult {
331337
Self::base_accept_portfolio_custody(origin, auth_id)
332338
}
339+
340+
fn on_runtime_upgrade() -> Weight {
341+
use polymesh_primitives::storage_migrate_on;
342+
343+
// Remove old name to number mappings.
344+
// In version 4.0.0 (first mainnet deployment) when a portfolio was removed
345+
// the NameToNumber mapping was left out of date, this upgrade removes dangling
346+
// NameToNumber mappings.
347+
// https://github.com/PolymathNetwork/Polymesh/pull/1200
348+
storage_migrate_on!(StorageVersion::get(), 1, {
349+
NameToNumber::iter()
350+
.filter(|(identity, _, number)| !Portfolios::contains_key(identity, number))
351+
.for_each(|(identity, name, _)| NameToNumber::remove(identity, name));
352+
});
353+
354+
0
355+
}
333356
}
334357
}
335358

pallets/runtime/tests/src/portfolio.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,22 @@ fn can_create_rename_delete_portfolio() {
112112
});
113113
}
114114

115+
#[test]
116+
fn can_delete_recreate_portfolio() {
117+
ExtBuilder::default().build().execute_with(|| {
118+
let (owner, num) = create_portfolio();
119+
120+
let name = || Portfolio::portfolios(owner.did, num);
121+
let num_of = |name| Portfolio::name_to_number(owner.did, name);
122+
123+
let first_name = name();
124+
assert_eq!(num_of(&first_name), num);
125+
126+
assert_ok!(Portfolio::delete_portfolio(owner.origin(), num));
127+
assert_ok!(Portfolio::create_portfolio(owner.origin(), first_name));
128+
});
129+
}
130+
115131
#[test]
116132
fn cannot_delete_portfolio_with_asset() {
117133
ExtBuilder::default().build().execute_with(|| {

0 commit comments

Comments
 (0)