diff --git a/pallets/identity/src/lib.rs b/pallets/identity/src/lib.rs index 3870558f985b1e90f4e2950e79292b4f1f22b67f..6fc18fa720d419b3c12e00671a94f253e37f7cf8 100644 --- a/pallets/identity/src/lib.rs +++ b/pallets/identity/src/lib.rs @@ -134,7 +134,6 @@ pub mod pallet { let mut identities = self.identities.clone(); identities.sort_unstable_by(|a, b| a.index.cmp(&b.index)); - <IdentitiesCount<T>>::put(identities.len() as u64); for idty in identities.into_iter() { let idty_index = Pallet::<T>::get_next_idty_index(); if idty.value.removable_on > T::BlockNumber::zero() { @@ -155,7 +154,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn identity)] pub type Identities<T: Config> = - StorageMap<_, Twox64Concat, T::IdtyIndex, IdtyValue<T::BlockNumber>, OptionQuery>; + CountedStorageMap<_, Twox64Concat, T::IdtyIndex, IdtyValue<T::BlockNumber>, OptionQuery>; #[pallet::storage] #[pallet::getter(fn identity_index_of)] @@ -169,10 +168,6 @@ pub mod pallet { #[pallet::storage] pub(super) type NextIdtyIndex<T: Config> = StorageValue<_, T::IdtyIndex, ValueQuery>; - #[pallet::storage] - #[pallet::getter(fn identities_count)] - pub(super) type IdentitiesCount<T: Config> = StorageValue<_, u64, ValueQuery>; - /// Identities by removed block #[pallet::storage] #[pallet::getter(fn removable_on)] @@ -266,7 +261,6 @@ pub mod pallet { ); IdentitiesRemovableOn::<T>::append(removable_on, (idty_index, IdtyStatus::Created)); IdentityIndexOf::<T>::insert(owner_key.clone(), idty_index); - Self::inc_identities_counter(); Self::deposit_event(Event::IdtyCreated(idty_index, owner_key)); T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Created { creator }); Ok(().into()) @@ -459,19 +453,19 @@ pub mod pallet { NotRespectIdtyCreationPeriod, } - // INTERNAL FUNCTIONS // + // PUBLIC FUNCTIONS // impl<T: Config> Pallet<T> { - fn dec_identities_counter() { - if let Ok(counter) = <IdentitiesCount<T>>::try_get() { - <IdentitiesCount<T>>::put(counter.saturating_sub(1)); - } else { - panic!("storage corrupted") - } + pub fn identities_count() -> u32 { + Identities::<T>::count() } + } + + // INTERNAL FUNCTIONS // + + impl<T: Config> Pallet<T> { pub(super) fn do_remove_identity(idty_index: T::IdtyIndex) -> Weight { <Identities<T>>::remove(idty_index); - Self::dec_identities_counter(); T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Removed); 0 @@ -485,13 +479,6 @@ pub mod pallet { T::IdtyIndex::one() } } - fn inc_identities_counter() { - if let Ok(counter) = <IdentitiesCount<T>>::try_get() { - <IdentitiesCount<T>>::put(counter.saturating_add(1)); - } else { - <IdentitiesCount<T>>::put(1); - } - } fn prune_identities(block_number: T::BlockNumber) -> Weight { let mut total_weight: Weight = 0; diff --git a/pallets/membership/src/lib.rs b/pallets/membership/src/lib.rs index 6bbd93241ad734a22e7cc3cb4e83090dc4562716..c543a17d0b2c2c5e2ecb62fafe3d3f8f100008e9 100644 --- a/pallets/membership/src/lib.rs +++ b/pallets/membership/src/lib.rs @@ -127,7 +127,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn membership)] pub type Membership<T: Config<I>, I: 'static = ()> = - StorageMap<_, Twox64Concat, T::IdtyId, MembershipData<T::BlockNumber>, OptionQuery>; + CountedStorageMap<_, Twox64Concat, T::IdtyId, MembershipData<T::BlockNumber>, OptionQuery>; #[pallet::storage] #[pallet::getter(fn memberships_expire_on)] @@ -477,3 +477,9 @@ impl<T: Config<I>, I: 'static> sp_runtime::traits::IsMember<T::IdtyId> for Palle Self::is_member_inner(idty_id) } } + +impl<T: Config<I>, I: 'static> MembersCount for Pallet<T, I> { + fn members_count() -> u32 { + Membership::<T, I>::count() + } +} diff --git a/pallets/membership/src/tests.rs b/pallets/membership/src/tests.rs index 89b015fc7739e56cdb875d20fe81b4cec85d689b..8e96355971ddae717c856294587b7bd061873f30 100644 --- a/pallets/membership/src/tests.rs +++ b/pallets/membership/src/tests.rs @@ -19,7 +19,7 @@ use crate::mock::*; use crate::{Error, Event}; use frame_support::assert_ok; use maplit::btreemap; -use sp_membership::traits::IsInPendingMemberships; +use sp_membership::traits::*; use sp_membership::MembershipData; use sp_runtime::traits::IsMember; @@ -46,6 +46,7 @@ fn test_genesis_build() { renewable_on: 2 }) ); + assert_eq!(DefaultMembership::members_count(), 1); }); } diff --git a/primitives/membership/src/traits.rs b/primitives/membership/src/traits.rs index bf596fd07dcdae8e6335db83693676611444df51..f437cfa0a2f330500e7c62a46bec185ff0ac67d9 100644 --- a/primitives/membership/src/traits.rs +++ b/primitives/membership/src/traits.rs @@ -51,6 +51,10 @@ impl<IdtyId, MetaData> OnEvent<IdtyId, MetaData> for () { } } +pub trait MembersCount { + fn members_count() -> u32; +} + pub trait MembershipExternalStorage<BlockNumber: Decode + Encode + TypeInfo, IdtyId>: sp_runtime::traits::IsMember<IdtyId> {