diff --git a/pallets/duniter-wot/src/lib.rs b/pallets/duniter-wot/src/lib.rs index 0c5e8087cf5ceaef01a92a4a570a6897a4d5d0c3..8088bae9187232f8d4b5cd9bdeff38b61f3874b2 100644 --- a/pallets/duniter-wot/src/lib.rs +++ b/pallets/duniter-wot/src/lib.rs @@ -36,6 +36,7 @@ use frame_support::pallet_prelude::*; use frame_system::RawOrigin; use pallet_certification::traits::SetNextIssuableOn; use pallet_identity::{IdtyEvent, IdtyStatus}; +use sp_membership::traits::IsInPendingMemberships; use sp_runtime::traits::IsMember; type IdtyIndex = u32; @@ -107,11 +108,15 @@ where } } fn can_confirm_identity(idty_index: IdtyIndex) -> bool { - pallet_membership::Pallet::<T, I>::request_membership(RawOrigin::Root.into(), idty_index) - .is_ok() + pallet_membership::Pallet::<T, I>::request_membership( + RawOrigin::Root.into(), + idty_index, + (), + ) + .is_ok() } fn can_validate_identity(idty_index: IdtyIndex) -> bool { - pallet_membership::Pallet::<T, I>::claim_membership(RawOrigin::Root.into(), idty_index, ()) + pallet_membership::Pallet::<T, I>::claim_membership(RawOrigin::Root.into(), idty_index) .is_ok() } } @@ -261,7 +266,7 @@ impl<T: Config<I>, I: 'static> pallet_certification::traits::OnNewcert<IdtyIndex if receiver_received_count == T::MinReceivedCertToBeAbleToIssueCert::get() { Self::do_apply_first_issuable_on(receiver); } - } else if pallet_membership::Pallet::<T, I>::pending_membership(receiver).is_some() + } else if pallet_membership::Pallet::<T, I>::is_in_pending_memberships(receiver) && receiver_received_count >= T::MinCertForMembership::get() { // TODO insert `receiver` in distance queue diff --git a/pallets/duniter-wot/src/tests.rs b/pallets/duniter-wot/src/tests.rs index d87f3bb9f8722e65469b79b59cb147a77f75d1b6..a688a06d7dc80edce5e06ea0ba285b2c7f94b78c 100644 --- a/pallets/duniter-wot/src/tests.rs +++ b/pallets/duniter-wot/src/tests.rs @@ -237,7 +237,7 @@ fn test_idty_membership_expire_them_requested() { // Charlie should be able to request membership run_to_block(6); - assert_ok!(Membership::request_membership(Origin::signed(3), 3)); + assert_ok!(Membership::request_membership(Origin::signed(3), 3, ())); // Charlie should re-enter in the wot immediatly let events = System::events(); diff --git a/pallets/duniter-wot/src/types.rs b/pallets/duniter-wot/src/types.rs index ffac045f867eeffe428a71745ea0a40e4533572d..b6b0675ae5c2e52b83a2923f8ad8f138dc796119 100644 --- a/pallets/duniter-wot/src/types.rs +++ b/pallets/duniter-wot/src/types.rs @@ -14,10 +14,10 @@ // 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 pallet_identity::IdtyStatus; - use crate::{Config, IdtyIndex}; use frame_support::pallet_prelude::*; +use pallet_identity::IdtyStatus; +use sp_membership::traits::IsInPendingMemberships; use sp_runtime::traits::IsMember; pub struct AddCertOrigin<T, I>(core::marker::PhantomData<(T, I)>); @@ -39,8 +39,7 @@ impl<T: Config<I>, I: 'static> EnsureOrigin<(T::Origin, IdtyIndex, IdtyIndex)> IdtyStatus::ConfirmedByOwner => Ok(()), IdtyStatus::Created => Err(o), IdtyStatus::Disabled => { - if pallet_membership::Pallet::<T, I>::pending_membership(&o.2) - .is_some() + if pallet_membership::Pallet::<T, I>::is_in_pending_memberships(o.2) { Ok(()) } else { @@ -49,10 +48,9 @@ impl<T: Config<I>, I: 'static> EnsureOrigin<(T::Origin, IdtyIndex, IdtyIndex)> } IdtyStatus::Validated => { if pallet_membership::Pallet::<T, I>::is_member(&o.2) - || pallet_membership::Pallet::<T, I>::pending_membership( - &o.2, + || pallet_membership::Pallet::<T, I>::is_in_pending_memberships( + o.2, ) - .is_some() { Ok(()) } else { diff --git a/pallets/membership/src/lib.rs b/pallets/membership/src/lib.rs index 14d5f189fee3572930082c5369082a87e7a50f02..37470047fb55aeccdf364b5053c14a2f622633cc 100644 --- a/pallets/membership/src/lib.rs +++ b/pallets/membership/src/lib.rs @@ -135,7 +135,7 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn pending_membership)] pub type PendingMembership<T: Config<I>, I: 'static = ()> = - StorageMap<_, Blake2_128Concat, T::IdtyId, T::BlockNumber, OptionQuery>; + StorageMap<_, Blake2_128Concat, T::IdtyId, T::MetaData, OptionQuery>; #[pallet::storage] #[pallet::getter(fn pending_memberships_expire_on)] @@ -226,6 +226,7 @@ pub mod pallet { pub fn request_membership( origin: OriginFor<T>, idty_id: T::IdtyId, + metadata: T::MetaData, ) -> DispatchResultWithPostInfo { let allowed = match T::IsOriginAllowedToUseIdty::is_origin_allowed_to_use_idty(&origin, &idty_id) @@ -256,7 +257,7 @@ pub mod pallet { let block_number = frame_system::pallet::Pallet::<T>::block_number(); let expire_on = block_number + T::PendingMembershipPeriod::get(); - PendingMembership::<T, I>::insert(idty_id, expire_on); + PendingMembership::<T, I>::insert(idty_id, metadata); PendingMembershipsExpireOn::<T, I>::append(expire_on, idty_id); Self::deposit_event(Event::MembershipRequested(idty_id)); T::OnEvent::on_event(&sp_membership::Event::MembershipRequested(idty_id)); @@ -268,8 +269,8 @@ pub mod pallet { pub fn claim_membership( origin: OriginFor<T>, idty_id: T::IdtyId, - metadata: T::MetaData, ) -> DispatchResultWithPostInfo { + // Verify phase if Membership::<T, I>::contains_key(&idty_id) { return Err(Error::<T, I>::MembershipAlreadyAcquired.into()); } @@ -290,11 +291,13 @@ pub mod pallet { return Err(Error::<T, I>::IdtyNotAllowedToClaimMembership.into()); } - if !PendingMembership::<T, I>::contains_key(&idty_id) { - return Err(Error::<T, I>::MembershipRequestNotFound.into()); - } + let metadata = PendingMembership::<T, I>::take(&idty_id) + .ok_or(Error::<T, I>::MembershipRequestNotFound)?; - let _ = Self::do_claim_membership(idty_id, metadata); + // Apply phase + Self::do_renew_membership_inner(idty_id); + Self::deposit_event(Event::MembershipAcquired(idty_id)); + T::OnEvent::on_event(&sp_membership::Event::MembershipAcquired(idty_id, metadata)); Ok(().into()) } @@ -355,14 +358,6 @@ pub mod pallet { // INTERNAL FUNCTIONS // impl<T: Config<I>, I: 'static> Pallet<T, I> { - pub(super) fn do_claim_membership(idty_id: T::IdtyId, metadata: T::MetaData) -> Weight { - let mut total_weight = 1; - PendingMembership::<T, I>::remove(&idty_id); - total_weight += Self::do_renew_membership_inner(idty_id); - Self::deposit_event(Event::MembershipAcquired(idty_id)); - T::OnEvent::on_event(&sp_membership::Event::MembershipAcquired(idty_id, metadata)); - total_weight - } pub(super) fn do_renew_membership(idty_id: T::IdtyId) -> Weight { let total_weight = Self::do_renew_membership_inner(idty_id); Self::deposit_event(Event::MembershipRenewed(idty_id)); diff --git a/pallets/membership/src/tests.rs b/pallets/membership/src/tests.rs index 5e28a39e647ab7d9c14476186a50e79a6d6fa40c..183a0d1f862f6e34b59c82985d51e32d34ae6f4f 100644 --- a/pallets/membership/src/tests.rs +++ b/pallets/membership/src/tests.rs @@ -67,7 +67,7 @@ fn test_membership_already_acquired() { run_to_block(1); // Merbership 0 cannot be reclaimed assert_eq!( - DefaultMembership::claim_membership(Origin::signed(0), 0, ()), + DefaultMembership::claim_membership(Origin::signed(0), 0), Err(Error::<Test, _>::MembershipAlreadyAcquired.into()) ); }); @@ -79,7 +79,7 @@ fn test_membership_request_not_found() { run_to_block(1); // Merbership 0 cannot be reclaimed assert_eq!( - DefaultMembership::claim_membership(Origin::signed(1), 1, ()), + DefaultMembership::claim_membership(Origin::signed(1), 1), Err(Error::<Test, _>::MembershipRequestNotFound.into()) ); }); @@ -128,13 +128,17 @@ fn test_membership_revocation() { // Membership 0 can't request membership before the end of RevokePeriod (1 + 4 = 5) run_to_block(2); assert_eq!( - DefaultMembership::request_membership(Origin::signed(0), 0), + DefaultMembership::request_membership(Origin::signed(0), 0, ()), Err(Error::<Test, _>::MembershipRevokedRecently.into()) ); // Membership 0 can request membership after the end of RevokePeriod (1 + 4 = 5) run_to_block(5); - assert_ok!(DefaultMembership::request_membership(Origin::signed(0), 0,),); + assert_ok!(DefaultMembership::request_membership( + Origin::signed(0), + 0, + () + ),); assert_eq!( System::events()[0].event, RuntimeEvent::DefaultMembership(Event::MembershipRequested(0)) @@ -147,7 +151,11 @@ fn test_pending_membership_expiration() { new_test_ext(Default::default()).execute_with(|| { // Idty 0 request membership run_to_block(1); - assert_ok!(DefaultMembership::request_membership(Origin::signed(0), 0,),); + assert_ok!(DefaultMembership::request_membership( + Origin::signed(0), + 0, + () + ),); assert_eq!( System::events()[0].event, RuntimeEvent::DefaultMembership(Event::MembershipRequested(0)) @@ -172,7 +180,11 @@ fn test_membership_workflow() { new_test_ext(Default::default()).execute_with(|| { // Idty 0 request membership run_to_block(1); - assert_ok!(DefaultMembership::request_membership(Origin::signed(0), 0,),); + assert_ok!(DefaultMembership::request_membership( + Origin::signed(0), + 0, + () + ),); assert_eq!( System::events()[0].event, RuntimeEvent::DefaultMembership(Event::MembershipRequested(0)) @@ -180,11 +192,7 @@ fn test_membership_workflow() { // Then, idty 0 claim membership run_to_block(2); - assert_ok!(DefaultMembership::claim_membership( - Origin::signed(0), - 0, - () - ),); + assert_ok!(DefaultMembership::claim_membership(Origin::signed(0), 0,),); assert_eq!( System::events()[0].event, RuntimeEvent::DefaultMembership(Event::MembershipAcquired(0)) diff --git a/runtime/common/src/entities.rs b/runtime/common/src/entities.rs index 068fd129ee6ac4c0dd1824322164d85c29de6930..7f676a3b0eb27cf9dba90c63edee3a79ccec8414 100644 --- a/runtime/common/src/entities.rs +++ b/runtime/common/src/entities.rs @@ -21,6 +21,13 @@ use scale_info::TypeInfo; #[cfg(feature = "std")] use serde::{Deserialize, Serialize}; +#[cfg_attr(feature = "std", derive(Deserialize, Serialize))] +#[derive(Clone, Encode, Decode, Default, Eq, PartialEq, RuntimeDebug, TypeInfo)] +pub struct SmithsMembershipMetaData<SessionKeys> { + pub peer_id: [u8; 32], + pub session_keys: SessionKeys, +} + #[cfg_attr(feature = "std", derive(Deserialize, Serialize))] #[derive( Encode, Decode, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, RuntimeDebug, TypeInfo, diff --git a/runtime/common/src/handlers.rs b/runtime/common/src/handlers.rs index 401fba2d5ca438b361c5596eacf0edccde0893a4..37afe7192df9a31472ea8179946688c783a3b9d7 100644 --- a/runtime/common/src/handlers.rs +++ b/runtime/common/src/handlers.rs @@ -14,6 +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 super::entities::SmithsMembershipMetaData; use super::IdtyIndex; use frame_support::dispatch::UnfilteredDispatchable; use frame_support::instances::Instance2; @@ -62,19 +63,21 @@ pub struct OnSmithMembershipEventHandler<Inner, Runtime>( impl< IdtyIndex: Copy + Parameter, SessionKeys: Clone, - Inner: sp_membership::traits::OnEvent<IdtyIndex, SessionKeys>, + Inner: sp_membership::traits::OnEvent<IdtyIndex, SmithsMembershipMetaData<SessionKeys>>, Runtime: pallet_identity::Config<IdtyIndex = IdtyIndex> + pallet_authority_members::Config<MemberId = IdtyIndex> - + pallet_membership::Config<Instance2, MetaData = SessionKeys> + + pallet_membership::Config<Instance2, MetaData = SmithsMembershipMetaData<SessionKeys>> + pallet_session::Config<Keys = SessionKeys>, - > sp_membership::traits::OnEvent<IdtyIndex, SessionKeys> + > sp_membership::traits::OnEvent<IdtyIndex, SmithsMembershipMetaData<SessionKeys>> for OnSmithMembershipEventHandler<Inner, Runtime> { - fn on_event(membership_event: &sp_membership::Event<IdtyIndex, SessionKeys>) -> Weight { + fn on_event( + membership_event: &sp_membership::Event<IdtyIndex, SmithsMembershipMetaData<SessionKeys>>, + ) -> Weight { (match membership_event { - sp_membership::Event::<IdtyIndex, SessionKeys>::MembershipAcquired( + sp_membership::Event::MembershipAcquired( idty_index, - session_keys, + SmithsMembershipMetaData { session_keys, .. }, ) => { if let Some(idty_value) = pallet_identity::Pallet::<Runtime>::identity(idty_index) { let call = pallet_authority_members::Call::<Runtime>::set_session_keys { diff --git a/runtime/common/src/pallets_config.rs b/runtime/common/src/pallets_config.rs index 2b151ea5010662d36675151340d54e8f969f3593..95a72d14e8d14dea0ab7ff9090a0462d2471e5ce 100644 --- a/runtime/common/src/pallets_config.rs +++ b/runtime/common/src/pallets_config.rs @@ -350,7 +350,7 @@ macro_rules! pallets_config { type IdtyId = IdtyIndex; type MembershipExternalStorage = sp_membership::traits::NoExternalStorage; type MembershipPeriod = SmithMembershipPeriod; - type MetaData = opaque::SessionKeys; + type MetaData = SmithsMembershipMetaData<opaque::SessionKeys>; type OnEvent = OnSmithMembershipEventHandler<SmithsSubWot, Runtime>; type PendingMembershipPeriod = SmithPendingMembershipPeriod; type RenewablePeriod = SmithRenewablePeriod; diff --git a/runtime/g1/src/lib.rs b/runtime/g1/src/lib.rs index 39889d67925c742d1d3784bedbb106abb041b7a0..3881473fb57fed0fa480e7198797e9cb4ac7263e 100644 --- a/runtime/g1/src/lib.rs +++ b/runtime/g1/src/lib.rs @@ -26,8 +26,8 @@ pub mod parameters; pub use self::parameters::*; pub use common_runtime::{ - constants::*, entities::ValidatorFullIdentification, handlers::*, AccountId, Address, Balance, - BlockNumber, FullIdentificationOfImpl, Hash, Header, IdtyIndex, Index, Signature, + constants::*, entities::*, handlers::*, AccountId, Address, Balance, BlockNumber, + FullIdentificationOfImpl, Hash, Header, IdtyIndex, Index, Signature, }; pub use pallet_balances::Call as BalancesCall; pub use pallet_identity::{IdtyStatus, IdtyValue}; diff --git a/runtime/gdev/src/lib.rs b/runtime/gdev/src/lib.rs index a26e98bc75baa8ccb289faff677f901182cb78f7..7e4b1d26b935b9eea7110a66b4ff7d8872d1f38c 100644 --- a/runtime/gdev/src/lib.rs +++ b/runtime/gdev/src/lib.rs @@ -26,8 +26,8 @@ pub mod parameters; pub use self::parameters::*; pub use common_runtime::{ - constants::*, entities::ValidatorFullIdentification, handlers::*, AccountId, Address, Balance, - BlockNumber, FullIdentificationOfImpl, Hash, Header, IdtyIndex, Index, Signature, + constants::*, entities::*, handlers::*, AccountId, Address, Balance, BlockNumber, + FullIdentificationOfImpl, Hash, Header, IdtyIndex, Index, Signature, }; pub use pallet_balances::Call as BalancesCall; pub use pallet_duniter_test_parameters::Parameters as GenesisParameters; diff --git a/runtime/gtest/src/lib.rs b/runtime/gtest/src/lib.rs index 96b1c9416a332ef2a03fb6eeb6751f131b986fe1..3048fd5075f86cae2000b9984a4822066b8c9286 100644 --- a/runtime/gtest/src/lib.rs +++ b/runtime/gtest/src/lib.rs @@ -26,8 +26,8 @@ pub mod parameters; pub use self::parameters::*; pub use common_runtime::{ - constants::*, entities::ValidatorFullIdentification, handlers::*, AccountId, Address, Balance, - BlockNumber, FullIdentificationOfImpl, Hash, Header, IdtyIndex, Index, Signature, + constants::*, entities::*, handlers::*, AccountId, Address, Balance, BlockNumber, + FullIdentificationOfImpl, Hash, Header, IdtyIndex, Index, Signature, }; pub use pallet_balances::Call as BalancesCall; pub use pallet_identity::{IdtyStatus, IdtyValue};