From b1e4260eeefcf066685d35d5e1634556f671babe Mon Sep 17 00:00:00 2001 From: librelois <c@elo.tf> Date: Tue, 15 Feb 2022 19:15:50 +0100 Subject: [PATCH] =?UTF-8?q?feat(idty):=C2=A0add=20a=20way=20to=20remove=20?= =?UTF-8?q?idty=20consumers=20when=20an=20idty=20is=20removed?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 + pallets/authority-members/Cargo.toml | 7 +++- pallets/authority-members/src/lib.rs | 49 +++++++++++----------- pallets/authority-members/src/tests.rs | 11 +++++ pallets/authority-members/src/types.rs | 8 ++-- pallets/duniter-wot/src/mock.rs | 4 +- pallets/identity/src/lib.rs | 8 +++- pallets/identity/src/mock.rs | 1 + pallets/identity/src/traits.rs | 9 ++++ pallets/membership/src/lib.rs | 58 +++++++------------------- pallets/membership/src/mock.rs | 3 -- primitives/membership/src/traits.rs | 33 +-------------- runtime/common/Cargo.toml | 2 + runtime/common/src/handlers.rs | 50 ++++++++++++++++++++++ runtime/common/src/pallets_config.rs | 5 +-- 15 files changed, 134 insertions(+), 116 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 14dbd84cc..e847b8931 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -829,6 +829,7 @@ version = "0.8.0-dev" dependencies = [ "frame-support", "frame-system", + "log", "pallet-authority-members", "pallet-balances", "pallet-certification", @@ -4312,6 +4313,7 @@ dependencies = [ "frame-benchmarking", "frame-support", "frame-system", + "log", "maplit", "pallet-session", "parity-scale-codec", diff --git a/pallets/authority-members/Cargo.toml b/pallets/authority-members/Cargo.toml index 7bf31c0ce..a3bd2700f 100644 --- a/pallets/authority-members/Cargo.toml +++ b/pallets/authority-members/Cargo.toml @@ -17,6 +17,7 @@ std = [ 'frame-support/std', 'frame-system/std', 'frame-benchmarking/std', + 'log/std', 'pallet-session/std', 'serde', 'sp-core/std', @@ -28,17 +29,19 @@ std = [ try-runtime = ['frame-support/try-runtime'] [dependencies] +# local sp-membership = { path = "../../primitives/membership", default-features = false } -# substrate +# crates.io +log = { version = "0.4.14", default-features = false } scale-info = { version = "1.0", default-features = false, features = ["derive"] } - [dependencies.codec] default-features = false features = ['derive'] package = 'parity-scale-codec' version = '2.3.1' +# substrate [dependencies.frame-benchmarking] default-features = false git = 'https://github.com/librelois/substrate.git' diff --git a/pallets/authority-members/src/lib.rs b/pallets/authority-members/src/lib.rs index 9a115df46..cb0d6dbbb 100644 --- a/pallets/authority-members/src/lib.rs +++ b/pallets/authority-members/src/lib.rs @@ -100,7 +100,10 @@ pub mod pallet { fn build(&self) { for (member_id, (account_id, _is_online)) in &self.initial_authorities { AccountIdOf::<T>::insert(member_id, account_id); - Members::<T>::insert(member_id, MemberData::new_genesis(T::MaxKeysLife::get())); + Members::<T>::insert( + member_id, + MemberData::new_genesis(T::MaxKeysLife::get(), account_id.to_owned()), + ); } let mut members_ids = self .initial_authorities @@ -148,7 +151,8 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn member)] - pub type Members<T: Config> = StorageMap<_, Twox64Concat, T::MemberId, MemberData, OptionQuery>; + pub type Members<T: Config> = + StorageMap<_, Twox64Concat, T::MemberId, MemberData<T::AccountId>, OptionQuery>; #[pallet::storage] #[pallet::getter(fn members_expire_on)] @@ -301,6 +305,7 @@ pub mod pallet { let mut member_data = member_data_opt.get_or_insert(MemberData { expire_on_session, must_rotate_keys_before, + owner_key: who, }); member_data.must_rotate_keys_before = must_rotate_keys_before; }); @@ -324,25 +329,6 @@ pub mod pallet { Ok(().into()) } #[pallet::weight(0)] - pub fn purge_old_session_keys( - origin: OriginFor<T>, - accounts_ids: Vec<T::AccountId>, - ) -> DispatchResultWithPostInfo { - let who = ensure_signed(origin)?; - let member_id = Self::verify_ownership_and_membership(&who)?; - - for account_id in accounts_ids { - if !T::IsMember::is_member(&member_id) { - let _post_info = pallet_session::Call::<T>::purge_keys {} - .dispatch_bypass_filter( - frame_system::Origin::<T>::Signed(account_id).into(), - )?; - } - } - - Ok(().into()) - } - #[pallet::weight(0)] pub fn remove_member( origin: OriginFor<T>, member_id: T::MemberId, @@ -353,7 +339,8 @@ pub mod pallet { return Err(Error::<T>::NotMember.into()); } - Self::do_remove_member(member_id); + let member_data = Members::<T>::get(member_id).ok_or(Error::<T>::NotMember)?; + Self::do_remove_member(member_id, member_data.owner_key); Ok(().into()) } @@ -362,7 +349,7 @@ pub mod pallet { // INTERNAL FUNCTIONS // impl<T: Config> Pallet<T> { - fn do_remove_member(member_id: T::MemberId) -> Weight { + fn do_remove_member(member_id: T::MemberId, owner_key: T::AccountId) -> Weight { if Self::is_online(member_id) { // Trigger the member deletion for next session Self::insert_out(member_id); @@ -373,6 +360,18 @@ pub mod pallet { Self::remove_online(member_id); Members::<T>::remove(member_id); + // Purge session keys + if let Err(e) = pallet_session::Pallet::<T>::purge_keys( + frame_system::Origin::<T>::Signed(owner_key).into(), + ) { + log::error!( + target: "runtime::authority_members", + "Logic error: fail to purge session keys in do_remove_member(): {:?}", + e + ); + } + + // Emit event Self::deposit_event(Event::MemberRemoved(member_id)); let _ = T::OnRemovedMember::on_removed_member(member_id); @@ -382,14 +381,14 @@ pub mod pallet { for member_id in MembersExpireOn::<T>::take(current_session_index) { if let Some(member_data) = Members::<T>::get(member_id) { if member_data.expire_on_session == current_session_index { - Self::do_remove_member(member_id); + Self::do_remove_member(member_id, member_data.owner_key); } } } for member_id in MustRotateKeysBefore::<T>::take(current_session_index) { if let Some(member_data) = Members::<T>::get(member_id) { if member_data.must_rotate_keys_before == current_session_index { - Self::do_remove_member(member_id); + Self::do_remove_member(member_id, member_data.owner_key); } } } diff --git a/pallets/authority-members/src/tests.rs b/pallets/authority-members/src/tests.rs index 94cfd0a19..480ecdb40 100644 --- a/pallets/authority-members/src/tests.rs +++ b/pallets/authority-members/src/tests.rs @@ -35,6 +35,7 @@ fn test_genesis_build() { Some(MemberData { expire_on_session: 0, must_rotate_keys_before: 5, + owner_key: 3, }) ); assert_eq!( @@ -42,6 +43,7 @@ fn test_genesis_build() { Some(MemberData { expire_on_session: 0, must_rotate_keys_before: 5, + owner_key: 6, }) ); assert_eq!( @@ -49,6 +51,7 @@ fn test_genesis_build() { Some(MemberData { expire_on_session: 0, must_rotate_keys_before: 5, + owner_key: 9, }) ); @@ -92,6 +95,7 @@ fn test_max_keys_life_rule() { Some(MemberData { expire_on_session: 0, must_rotate_keys_before: 7, + owner_key: 3, }) ); assert_eq!( @@ -99,6 +103,7 @@ fn test_max_keys_life_rule() { Some(MemberData { expire_on_session: 0, must_rotate_keys_before: 7, + owner_key: 6, }) ); @@ -138,6 +143,7 @@ fn test_go_offline() { Some(MemberData { expire_on_session: 0, must_rotate_keys_before: 5, + owner_key: 9, }) ); @@ -148,6 +154,7 @@ fn test_go_offline() { Some(MemberData { expire_on_session: 4, must_rotate_keys_before: 5, + owner_key: 9, }) ); assert_eq!(AuthorityMembers::members_expire_on(4), vec![9],); @@ -186,6 +193,7 @@ fn test_go_online() { Some(MemberData { expire_on_session: 2, must_rotate_keys_before: 5, + owner_key: 12, }) ); @@ -201,6 +209,7 @@ fn test_go_online() { Some(MemberData { expire_on_session: 2, must_rotate_keys_before: 5, + owner_key: 12, }) ); @@ -280,6 +289,7 @@ fn test_go_online_then_go_offline_in_same_session() { Some(MemberData { expire_on_session: 2, must_rotate_keys_before: 5, + owner_key: 12, }) ); }); @@ -307,6 +317,7 @@ fn test_go_offline_then_go_online_in_same_session() { Some(MemberData { expire_on_session: 0, must_rotate_keys_before: 5, + owner_key: 9, }) ); }); diff --git a/pallets/authority-members/src/types.rs b/pallets/authority-members/src/types.rs index fb3c0746e..b9e4bb87e 100644 --- a/pallets/authority-members/src/types.rs +++ b/pallets/authority-members/src/types.rs @@ -24,16 +24,18 @@ use sp_staking::SessionIndex; #[cfg_attr(feature = "std", derive(Debug, Deserialize, Serialize))] #[derive(Encode, Decode, Clone, PartialEq, Eq, TypeInfo)] -pub struct MemberData { +pub struct MemberData<AccountId> { pub expire_on_session: SessionIndex, pub must_rotate_keys_before: SessionIndex, + pub owner_key: AccountId, } -impl MemberData { - pub fn new_genesis(must_rotate_keys_before: SessionIndex) -> Self { +impl<AccountId> MemberData<AccountId> { + pub fn new_genesis(must_rotate_keys_before: SessionIndex, owner_key: AccountId) -> Self { MemberData { expire_on_session: 0, must_rotate_keys_before, + owner_key, } } } diff --git a/pallets/duniter-wot/src/mock.rs b/pallets/duniter-wot/src/mock.rs index 08dc319fb..da821daa4 100644 --- a/pallets/duniter-wot/src/mock.rs +++ b/pallets/duniter-wot/src/mock.rs @@ -118,11 +118,11 @@ impl pallet_identity::Config for Test { type IsMember = Membership; type OnIdtyChange = DuniterWot; type MaxDisabledPeriod = MaxDisabledPeriod; + type RemoveIdentityConsumers = (); } // Membership parameter_types! { - pub const ExternalizeMembershipStorage: bool = false; pub const MembershipPeriod: u64 = 5; pub const PendingMembershipPeriod: u64 = 3; pub const RenewablePeriod: u64 = 2; @@ -133,10 +133,8 @@ impl pallet_membership::Config<Instance1> for Test { type IsIdtyAllowedToRenewMembership = DuniterWot; type IsIdtyAllowedToRequestMembership = DuniterWot; type Event = Event; - type ExternalizeMembershipStorage = ExternalizeMembershipStorage; type IdtyId = IdtyIndex; type IdtyIdOf = Identity; - type MembershipExternalStorage = sp_membership::traits::NoExternalStorage; type MembershipPeriod = MembershipPeriod; type MetaData = crate::MembershipMetaData<u64>; type OnEvent = DuniterWot; diff --git a/pallets/identity/src/lib.rs b/pallets/identity/src/lib.rs index 6dd73b244..9602885ba 100644 --- a/pallets/identity/src/lib.rs +++ b/pallets/identity/src/lib.rs @@ -90,6 +90,9 @@ pub mod pallet { /// Maximum period with disabled status, after this period, the identity is permanently /// deleted type MaxDisabledPeriod: Get<Self::BlockNumber>; + /// Handle the logic that remove all identity consumers. + /// "identity consumers" mean all things that rely on the existence of the identity. + type RemoveIdentityConsumers: RemoveIdentityConsumers<Self::IdtyIndex>; } // GENESIS STUFFĂ‚ // @@ -464,10 +467,11 @@ pub mod pallet { impl<T: Config> Pallet<T> { pub(super) fn do_remove_identity(idty_index: T::IdtyIndex) -> Weight { if let Some(idty_val) = Identities::<T>::take(idty_index) { + T::RemoveIdentityConsumers::remove_idty_consumers(idty_index); frame_system::Pallet::<T>::dec_sufficients(&idty_val.owner_key); + Self::deposit_event(Event::IdtyRemoved { idty_index }); + T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Removed); } - Self::deposit_event(Event::IdtyRemoved { idty_index }); - T::OnIdtyChange::on_idty_change(idty_index, IdtyEvent::Removed); 0 } fn get_next_idty_index() -> T::IdtyIndex { diff --git a/pallets/identity/src/mock.rs b/pallets/identity/src/mock.rs index 1cea91aa9..3d5103e1d 100644 --- a/pallets/identity/src/mock.rs +++ b/pallets/identity/src/mock.rs @@ -110,6 +110,7 @@ impl pallet_identity::Config for Test { type IsMember = IsMemberTestImpl; type OnIdtyChange = (); type MaxDisabledPeriod = MaxDisabledPeriod; + type RemoveIdentityConsumers = (); } // Build genesis storage according to the mock runtime. diff --git a/pallets/identity/src/traits.rs b/pallets/identity/src/traits.rs index 9163e2f17..d7db3cbe9 100644 --- a/pallets/identity/src/traits.rs +++ b/pallets/identity/src/traits.rs @@ -47,3 +47,12 @@ impl<T: Config> OnIdtyChange<T> for () { 0 } } + +pub trait RemoveIdentityConsumers<IndtyIndex> { + fn remove_idty_consumers(idty_index: IndtyIndex) -> Weight; +} +impl<IndtyIndex> RemoveIdentityConsumers<IndtyIndex> for () { + fn remove_idty_consumers(_: IndtyIndex) -> Weight { + 0 + } +} diff --git a/pallets/membership/src/lib.rs b/pallets/membership/src/lib.rs index c543a17d0..2886888b9 100644 --- a/pallets/membership/src/lib.rs +++ b/pallets/membership/src/lib.rs @@ -44,7 +44,7 @@ pub mod pallet { use super::*; use frame_support::traits::StorageVersion; use frame_system::pallet_prelude::*; - use sp_runtime::traits::{Convert, IsMember}; + use sp_runtime::traits::Convert; /// The current storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); @@ -63,19 +63,12 @@ pub mod pallet { type IsIdtyAllowedToRequestMembership: IsIdtyAllowedToRequestMembership<Self::IdtyId>; /// Because this pallet emits events, it depends on the runtime's definition of an event. type Event: From<Event<Self, I>> + IsType<<Self as frame_system::Config>::Event>; - /// Specify true if you want to externalize the storage of memberships, but in this case - /// you must provide an implementation of `MembershipExternalStorage` - type ExternalizeMembershipStorage: Get<bool>; /// Something that identifies an identity type IdtyId: Copy + MaybeSerializeDeserialize + Parameter + Ord; /// Something that give the IdtyId on an account id type IdtyIdOf: Convert<Self::AccountId, Option<Self::IdtyId>>; /// Optional metadata type MetaData: Parameter + Validate<Self::AccountId>; - /// Provide your implementation of membership storage here, if you want the pallet to - /// handle the storage for you, specify `()` and set `ExternalizeMembershipStorage` to - /// `false`. - type MembershipExternalStorage: MembershipExternalStorage<Self::BlockNumber, Self::IdtyId>; #[pallet::constant] /// Maximum life span of a non-renewable membership (in number of blocks) type MembershipPeriod: Get<Self::BlockNumber>; @@ -113,11 +106,7 @@ pub mod pallet { fn build(&self) { for (idty_id, membership_data) in &self.memberships { MembershipsExpireOn::<T, I>::append(membership_data.expire_on, idty_id); - if T::ExternalizeMembershipStorage::get() { - T::MembershipExternalStorage::insert(*idty_id, *membership_data); - } else { - Membership::<T, I>::insert(idty_id, membership_data); - } + Membership::<T, I>::insert(idty_id, membership_data); } } } @@ -369,16 +358,17 @@ pub mod pallet { Ok(().into()) } pub(super) fn do_revoke_membership(idty_id: T::IdtyId) -> Weight { - Self::remove_membership(&idty_id); - if T::RevocationPeriod::get() > Zero::zero() { - let block_number = frame_system::pallet::Pallet::<T>::block_number(); - let pruned_on = block_number + T::RevocationPeriod::get(); + if Self::remove_membership(&idty_id) { + if T::RevocationPeriod::get() > Zero::zero() { + let block_number = frame_system::pallet::Pallet::<T>::block_number(); + let pruned_on = block_number + T::RevocationPeriod::get(); - RevokedMembership::<T, I>::insert(idty_id, ()); - RevokedMembershipsPrunedOn::<T, I>::append(pruned_on, idty_id); + RevokedMembership::<T, I>::insert(idty_id, ()); + RevokedMembershipsPrunedOn::<T, I>::append(pruned_on, idty_id); + } + Self::deposit_event(Event::MembershipRevoked(idty_id)); + T::OnEvent::on_event(&sp_membership::Event::MembershipRevoked(idty_id)); } - Self::deposit_event(Event::MembershipRevoked(idty_id)); - T::OnEvent::on_event(&sp_membership::Event::MembershipRevoked(idty_id)); 0 } @@ -436,32 +426,16 @@ pub mod pallet { } pub(super) fn is_member_inner(idty_id: &T::IdtyId) -> bool { - if T::ExternalizeMembershipStorage::get() { - T::MembershipExternalStorage::is_member(idty_id) - } else { - Membership::<T, I>::contains_key(idty_id) - } + Membership::<T, I>::contains_key(idty_id) } fn insert_membership(idty_id: T::IdtyId, membership_data: MembershipData<T::BlockNumber>) { - if T::ExternalizeMembershipStorage::get() { - T::MembershipExternalStorage::insert(idty_id, membership_data); - } else { - Membership::<T, I>::insert(idty_id, membership_data); - } + Membership::<T, I>::insert(idty_id, membership_data); } fn get_membership(idty_id: &T::IdtyId) -> Option<MembershipData<T::BlockNumber>> { - if T::ExternalizeMembershipStorage::get() { - T::MembershipExternalStorage::get(idty_id) - } else { - Membership::<T, I>::try_get(idty_id).ok() - } + Membership::<T, I>::try_get(idty_id).ok() } - fn remove_membership(idty_id: &T::IdtyId) { - if T::ExternalizeMembershipStorage::get() { - T::MembershipExternalStorage::remove(idty_id); - } else { - Membership::<T, I>::remove(idty_id); - } + fn remove_membership(idty_id: &T::IdtyId) -> bool { + Membership::<T, I>::take(idty_id).is_some() } } } diff --git a/pallets/membership/src/mock.rs b/pallets/membership/src/mock.rs index 507443161..e21a41537 100644 --- a/pallets/membership/src/mock.rs +++ b/pallets/membership/src/mock.rs @@ -78,7 +78,6 @@ impl system::Config for Test { } parameter_types! { - pub const ExternalizeMembershipStorage: bool = false; pub const MembershipPeriod: BlockNumber = 5; pub const PendingMembershipPeriod: BlockNumber = 3; pub const RenewablePeriod: BlockNumber = 2; @@ -89,10 +88,8 @@ impl pallet_membership::Config for Test { type IsIdtyAllowedToRenewMembership = (); type IsIdtyAllowedToRequestMembership = (); type Event = Event; - type ExternalizeMembershipStorage = ExternalizeMembershipStorage; type IdtyId = IdtyId; type IdtyIdOf = ConvertInto; - type MembershipExternalStorage = crate::NoExternalStorage; type MembershipPeriod = MembershipPeriod; type MetaData = (); type OnEvent = (); diff --git a/primitives/membership/src/traits.rs b/primitives/membership/src/traits.rs index f437cfa0a..2690cb58e 100644 --- a/primitives/membership/src/traits.rs +++ b/primitives/membership/src/traits.rs @@ -14,8 +14,7 @@ // You should have received a copy of the GNU Affero General Public License // along with Substrate-Libre-Currency. If not, see <https://www.gnu.org/licenses/>. -use crate::*; -use frame_support::pallet_prelude::{TypeInfo, Weight}; +use frame_support::pallet_prelude::Weight; pub trait IsIdtyAllowedToRenewMembership<IdtyId> { fn is_idty_allowed_to_renew_membership(idty_id: &IdtyId) -> bool; @@ -55,36 +54,6 @@ pub trait MembersCount { fn members_count() -> u32; } -pub trait MembershipExternalStorage<BlockNumber: Decode + Encode + TypeInfo, IdtyId>: - sp_runtime::traits::IsMember<IdtyId> -{ - fn insert(idty_id: IdtyId, membership_data: MembershipData<BlockNumber>); - fn get(idty_id: &IdtyId) -> Option<MembershipData<BlockNumber>>; - fn remove(idty_id: &IdtyId); -} - -static INVALID_CONF_MSG: &str = "invalid pallet configuration: if `MembershipExternalStorage` = (), you must set `ExternalizeMembershipStorage` to `false`."; - -pub struct NoExternalStorage; -impl<IdtyId> sp_runtime::traits::IsMember<IdtyId> for NoExternalStorage { - fn is_member(_: &IdtyId) -> bool { - panic!("{}", INVALID_CONF_MSG) - } -} -impl<BlockNumber: Decode + Encode + TypeInfo, IdtyId> MembershipExternalStorage<BlockNumber, IdtyId> - for NoExternalStorage -{ - fn insert(_: IdtyId, _: MembershipData<BlockNumber>) { - panic!("{}", INVALID_CONF_MSG) - } - fn get(_: &IdtyId) -> Option<MembershipData<BlockNumber>> { - panic!("{}", INVALID_CONF_MSG) - } - fn remove(_: &IdtyId) { - panic!("{}", INVALID_CONF_MSG) - } -} - pub trait Validate<AccountId> { fn validate(&self, account_id: &AccountId) -> bool; } diff --git a/runtime/common/Cargo.toml b/runtime/common/Cargo.toml index 9a4aa1328..d664f6723 100644 --- a/runtime/common/Cargo.toml +++ b/runtime/common/Cargo.toml @@ -21,6 +21,7 @@ std = [ 'codec/std', 'frame-support/std', 'frame-system/std', + 'log/std', 'pallet-authority-members/std', 'pallet-balances/std', 'pallet-certification/std', @@ -46,6 +47,7 @@ pallet-ud-accounts-storage = { path = '../../pallets/ud-accounts-storage', defau sp-membership = { path = '../../primitives/membership', default-features = false } # Crates.io +log = { version = "0.4.14", default-features = false } smallvec = "1.6.1" # Substrate diff --git a/runtime/common/src/handlers.rs b/runtime/common/src/handlers.rs index cfffc01cd..f601b2dc5 100644 --- a/runtime/common/src/handlers.rs +++ b/runtime/common/src/handlers.rs @@ -20,6 +20,7 @@ use frame_support::dispatch::UnfilteredDispatchable; use frame_support::instances::{Instance1, Instance2}; use frame_support::pallet_prelude::Weight; use frame_support::Parameter; +use sp_runtime::traits::IsMember; pub struct OnMembershipEventHandler<Inner, Runtime>(core::marker::PhantomData<(Inner, Runtime)>); @@ -132,3 +133,52 @@ where 0 } } + +pub struct RemoveIdentityConsumersImpl<Runtime>(core::marker::PhantomData<Runtime>); +impl<Runtime> pallet_identity::traits::RemoveIdentityConsumers<IdtyIndex> + for RemoveIdentityConsumersImpl<Runtime> +where + Runtime: pallet_identity::Config<IdtyIndex = IdtyIndex> + + pallet_authority_members::Config<MemberId = IdtyIndex> + + pallet_membership::Config<Instance1, IdtyId = IdtyIndex> + + pallet_membership::Config<Instance2, IdtyId = IdtyIndex>, +{ + fn remove_idty_consumers(idty_index: IdtyIndex) -> Weight { + // Remove smith member + if pallet_membership::Pallet::<Runtime, Instance2>::is_member(&idty_index) { + if let Err(e) = pallet_authority_members::Pallet::<Runtime>::remove_member( + frame_system::RawOrigin::Root.into(), + idty_index, + ) { + log::error!( + target: "runtime::common", + "Logic error: fail to remove authority member in remove_idty_consumers(): {:?}", + e + ); + } + if let Err(e) = pallet_membership::Pallet::<Runtime, Instance2>::revoke_membership( + frame_system::RawOrigin::Root.into(), + Some(idty_index), + ) { + log::error!( + target: "runtime::common", + "Logic error: fail to revoke smith membership in remove_idty_consumers(): {:?}", + e + ); + } + } + // Remove "classic" member + if let Err(e) = pallet_membership::Pallet::<Runtime, Instance1>::revoke_membership( + frame_system::RawOrigin::Root.into(), + Some(idty_index), + ) { + log::error!( + target: "runtime::common", + "Logic error: fail to revoke membership in remove_idty_consumers(): {:?}", + e + ); + } + + 0 + } +} diff --git a/runtime/common/src/pallets_config.rs b/runtime/common/src/pallets_config.rs index bc7ebed3c..4a9ae0417 100644 --- a/runtime/common/src/pallets_config.rs +++ b/runtime/common/src/pallets_config.rs @@ -344,16 +344,15 @@ macro_rules! pallets_config { type IsMember = Membership; type OnIdtyChange = Wot; type MaxDisabledPeriod = MaxDisabledPeriod; + type RemoveIdentityConsumers = RemoveIdentityConsumersImpl<Self>; } impl pallet_membership::Config<frame_support::instances::Instance1> for Runtime { type IsIdtyAllowedToRenewMembership = Wot; type IsIdtyAllowedToRequestMembership = Wot; type Event = Event; - type ExternalizeMembershipStorage = frame_support::traits::ConstBool<false>; type IdtyId = IdtyIndex; type IdtyIdOf = Identity; - type MembershipExternalStorage = sp_membership::traits::NoExternalStorage; type MembershipPeriod = MembershipPeriod; type MetaData = pallet_duniter_wot::MembershipMetaData<AccountId>; type OnEvent = OnMembershipEventHandler<Wot, Runtime>; @@ -390,10 +389,8 @@ macro_rules! pallets_config { type IsIdtyAllowedToRenewMembership = (); type IsIdtyAllowedToRequestMembership = (); type Event = Event; - type ExternalizeMembershipStorage = frame_support::traits::ConstBool<false>; type IdtyId = IdtyIndex; type IdtyIdOf = Identity; - type MembershipExternalStorage = sp_membership::traits::NoExternalStorage; type MembershipPeriod = SmithMembershipPeriod; type MetaData = SmithsMembershipMetaData<opaque::SessionKeysWrapper>; type OnEvent = OnSmithMembershipEventHandler<SmithsSubWot, Runtime>; -- GitLab