diff --git a/pallets/smith-members/src/lib.rs b/pallets/smith-members/src/lib.rs index 3a7cd8bec2a500b36218c3d1f008d96a10d45d3a..1245ea28e247dfc297a2a2ac17013b7f41ac5a4c 100644 --- a/pallets/smith-members/src/lib.rs +++ b/pallets/smith-members/src/lib.rs @@ -245,6 +245,8 @@ pub mod pallet { ReceiverHasNotBeenInvited, /// Smith must be a member of the main WoT NotAMember, + /// A smith has a limited stock of certifications + TooMuchCertificationsIssued, } #[pallet::call] @@ -357,13 +359,16 @@ impl<T: Config> Pallet<T> { receiver: T::IdtyIndex, ) -> DispatchResultWithPostInfo { ensure!(issuer != receiver, Error::<T>::CannotCertifySelf); - let issuer_status = Smiths::<T>::get(issuer) - .ok_or(Error::<T>::IssuerHasNoSmithStatus)? - .status; + let issuer = Smiths::<T>::get(issuer).ok_or(Error::<T>::IssuerHasNoSmithStatus)?; ensure!( - issuer_status == SmithStatus::Smith, + issuer.status == SmithStatus::Smith, Error::<T>::IssuerIsNotASmith ); + let issued_certs = issuer.issued_certs.len() as u32; + ensure!( + issued_certs < T::MaxByIssuer::get(), + Error::<T>::TooMuchCertificationsIssued + ); let receiver_status = Smiths::<T>::get(receiver) .ok_or(Error::<T>::ReceiverHasNotBeenInvited)? .status; diff --git a/pallets/smith-members/src/mock.rs b/pallets/smith-members/src/mock.rs index b32cf9b0ffc4999c9d63d9cad0eb8ff3120afc41..d68d9782e63fc642d50b70c34e58c43f700f7676 100644 --- a/pallets/smith-members/src/mock.rs +++ b/pallets/smith-members/src/mock.rs @@ -95,7 +95,7 @@ impl pallet_smith_members::Config for Runtime { type IdtyIdOf = ConvertInto; type MinCertForMembership = ConstU32<2>; type MinCertForCreateIdtyRight = ConstU32<3>; - type MaxByIssuer = ConstU32<5>; + type MaxByIssuer = ConstU32<3>; type InactivityMaxDuration = ConstU32<5>; type OnSmithDelete = (); type IdtyIdOfAuthorityId = ConvertInto; diff --git a/pallets/smith-members/src/tests.rs b/pallets/smith-members/src/tests.rs index 42b417077e495fa4336e1bde88813ba80e50695f..54c4652bfdd83b7210c1f9e68f9a6df75972798c 100644 --- a/pallets/smith-members/src/tests.rs +++ b/pallets/smith-members/src/tests.rs @@ -387,5 +387,19 @@ fn smith_coming_back_recovers_its_issued_certs() { received_certs: vec![1, 3] }) ); + // We can verify it with the stock rule + assert_ok!(Pallet::<Runtime>::certify_smith( + RuntimeOrigin::signed(2), + 3 + )); + assert_ok!(Pallet::<Runtime>::certify_smith( + RuntimeOrigin::signed(2), + 4 + )); + // Max stock is reached (3 = 1 recovered + 2 new) + assert_err!( + Pallet::<Runtime>::certify_smith(RuntimeOrigin::signed(2), 5), + Error::<Runtime>::TooMuchCertificationsIssued + ); }); }