From 6304a459435cb47b81920100119b1eb6ac0737c4 Mon Sep 17 00:00:00 2001
From: bgallois <benjamin@gallois.cc>
Date: Fri, 16 Feb 2024 17:01:13 +0100
Subject: [PATCH] fix weight for tuple handler

---
 pallets/certification/src/benchmarking.rs     |  23 ++-
 pallets/certification/src/lib.rs              |  45 ++++--
 pallets/certification/src/weights.rs          |   8 +
 pallets/duniter-wot/src/lib.rs                |  47 +++---
 pallets/identity/src/benchmarking.rs          |  80 ++++++++++
 pallets/identity/src/lib.rs                   |  50 +++---
 pallets/identity/src/traits.rs                |   9 +-
 pallets/identity/src/weights.rs               |  35 +++++
 pallets/membership/src/lib.rs                 |  14 +-
 pallets/quota/src/lib.rs                      |  10 +-
 pallets/smith-members/src/lib.rs              |   2 +-
 primitives/membership/src/lib.rs              |   8 +-
 primitives/membership/src/traits.rs           |   2 +-
 runtime/common/src/handlers.rs                |  17 ++-
 .../src/weights/pallet_certification.rs       |  44 ++++--
 runtime/common/src/weights/pallet_identity.rs | 144 +++++++++++++-----
 .../common/src/weights/pallet_membership.rs   |  18 +--
 runtime/common/src/weights/pallet_quota.rs    |  34 ++---
 18 files changed, 438 insertions(+), 152 deletions(-)

diff --git a/pallets/certification/src/benchmarking.rs b/pallets/certification/src/benchmarking.rs
index 7fa0534d5..1109f97a3 100644
--- a/pallets/certification/src/benchmarking.rs
+++ b/pallets/certification/src/benchmarking.rs
@@ -38,7 +38,7 @@ mod benchmarks {
     fn add_certs<T: Config>(i: u32, receiver: T::IdtyIndex) -> Result<(), &'static str> {
         Pallet::<T>::remove_all_certs_received_by(RawOrigin::Root.into(), receiver)?;
         for j in 1..i {
-            Pallet::<T>::do_add_cert_checked(j.into(), receiver, false)?;
+            let _ = Pallet::<T>::do_add_cert_checked(j.into(), receiver, false);
         }
         assert!(
             CertsByReceiver::<T>::get(receiver).len() as u32 == i - 1,
@@ -47,6 +47,22 @@ mod benchmarks {
         Ok(())
     }
 
+    #[benchmark]
+    fn do_add_cert_checked() -> Result<(), BenchmarkError> {
+        let issuer: T::IdtyIndex = 1.into();
+        let receiver: T::IdtyIndex = 2.into();
+        Pallet::<T>::del_cert(RawOrigin::Root.into(), issuer, receiver)?;
+        frame_system::pallet::Pallet::<T>::set_block_number(T::CertPeriod::get());
+
+        #[block]
+        {
+            Pallet::<T>::do_add_cert_checked(issuer, receiver, true);
+        }
+
+        assert_has_event::<T>(Event::<T>::CertAdded { issuer, receiver }.into());
+        Ok(())
+    }
+
     #[benchmark]
     fn add_cert() -> Result<(), BenchmarkError> {
         let issuer: T::IdtyIndex = 1.into();
@@ -134,11 +150,11 @@ mod benchmarks {
     }
 
     #[benchmark]
-    fn do_remove_cert() -> Result<(), BenchmarkError> {
+    fn do_remove_cert() {
         let issuer: T::IdtyIndex = 1.into();
         let receiver: T::IdtyIndex = 0.into();
         Pallet::<T>::do_remove_cert(issuer, receiver, None);
-        Pallet::<T>::do_add_cert_checked(issuer, receiver, false)?;
+        let _ = Pallet::<T>::do_add_cert_checked(issuer, receiver, false);
         let block_number = T::ValidityPeriod::get();
         frame_system::pallet::Pallet::<T>::set_block_number(block_number);
 
@@ -155,7 +171,6 @@ mod benchmarks {
             }
             .into(),
         );
-        Ok(())
     }
 
     impl_benchmark_test_suite!(
diff --git a/pallets/certification/src/lib.rs b/pallets/certification/src/lib.rs
index 88cdf0c29..2b59b0277 100644
--- a/pallets/certification/src/lib.rs
+++ b/pallets/certification/src/lib.rs
@@ -331,9 +331,7 @@ pub mod pallet {
             idty_index: T::IdtyIndex,
         ) -> DispatchResultWithPostInfo {
             ensure_root(origin)?;
-            for (issuer, _) in CertsByReceiver::<T>::get(idty_index) {
-                Self::do_remove_cert(issuer, idty_index, None);
-            }
+            let _ = Self::do_remove_all_certs_received_by(idty_index);
             Ok(().into())
         }
     }
@@ -341,6 +339,14 @@ pub mod pallet {
     // INTERNAL FUNCTIONS //
 
     impl<T: Config> Pallet<T> {
+        pub fn do_remove_all_certs_received_by(idty_index: T::IdtyIndex) -> Weight {
+            let mut weight = T::DbWeight::get().reads_writes(1, 0);
+            for (issuer, _) in CertsByReceiver::<T>::get(idty_index) {
+                weight = weight.saturating_add(Self::do_remove_cert(issuer, idty_index, None));
+            }
+            weight
+        }
+
         /// get issuer index from origin
         pub fn origin_to_index(origin: OriginFor<T>) -> Result<T::IdtyIndex, DispatchError> {
             let who = ensure_signed(origin)?;
@@ -349,21 +355,30 @@ pub mod pallet {
 
         /// add a certification without checks
         // this is used on identity creation to add the first certification
+        // The weight is approximated on the worst path.
         pub fn do_add_cert_checked(
             issuer: T::IdtyIndex,
             receiver: T::IdtyIndex,
             verify_rules: bool,
-        ) -> DispatchResultWithPostInfo {
+        ) -> Weight {
             let block_number = frame_system::pallet::Pallet::<T>::block_number();
 
             if verify_rules {
                 // only verify internal rules if asked
-                Self::check_add_cert_internal(issuer, receiver, block_number)?;
-            };
-
-            Self::try_add_cert(block_number, issuer, receiver)?;
+                if let Err(e) = Self::check_add_cert_internal(issuer, receiver, block_number) {
+                    sp_std::if_std! {
+                        println!("fail to force add cert: {:?}", e)
+                    }
+                    return T::WeightInfo::do_add_cert_checked();
+                }
+            }
 
-            Ok(().into())
+            if let Err(e) = Self::try_add_cert(block_number, issuer, receiver) {
+                sp_std::if_std! {
+                            println!("fail to force add cert: {:?}", e)
+                }
+            }
+            T::WeightInfo::do_add_cert_checked()
         }
 
         /// perform cert addition if not existing, else CertAlreadyExists
@@ -454,15 +469,18 @@ pub mod pallet {
         // (run at on_initialize step)
         fn prune_certifications(block_number: BlockNumberFor<T>) -> Weight {
             // See on initialize for the overhead weight accounting
-            let mut total_weight = Weight::zero();
+            let mut weight = Weight::zero();
 
             if let Some(certs) = CertsRemovableOn::<T>::take(block_number) {
                 for (issuer, receiver) in certs {
-                    total_weight += Self::do_remove_cert(issuer, receiver, Some(block_number));
+                    weight = weight.saturating_add(Self::do_remove_cert(
+                        issuer,
+                        receiver,
+                        Some(block_number),
+                    ));
                 }
             }
-
-            total_weight
+            weight
         }
 
         /// perform the certification removal
@@ -512,7 +530,6 @@ pub mod pallet {
                     receiver,
                     expiration: block_number_opt.is_some(),
                 });
-                // Should always return Weight::zero
                 T::OnRemovedCert::on_removed_cert(
                     issuer,
                     issuer_issued_count,
diff --git a/pallets/certification/src/weights.rs b/pallets/certification/src/weights.rs
index e58c33831..736d3c366 100644
--- a/pallets/certification/src/weights.rs
+++ b/pallets/certification/src/weights.rs
@@ -27,6 +27,7 @@ pub trait WeightInfo {
     fn on_initialize() -> Weight;
     fn do_remove_cert_noop() -> Weight;
     fn do_remove_cert() -> Weight;
+    fn do_add_cert_checked() -> Weight;
 }
 
 // Insecure weights implementation, use it for tests only!
@@ -102,4 +103,11 @@ impl WeightInfo for () {
             .saturating_add(RocksDbWeight::get().reads(7 as u64))
             .saturating_add(RocksDbWeight::get().writes(4 as u64))
     }
+
+    fn do_add_cert_checked() -> Weight {
+        // Minimum execution time: 259_247 nanoseconds.
+        Weight::from_parts(269_348_000 as u64, 0)
+            .saturating_add(RocksDbWeight::get().reads(7 as u64))
+            .saturating_add(RocksDbWeight::get().writes(4 as u64))
+    }
 }
diff --git a/pallets/duniter-wot/src/lib.rs b/pallets/duniter-wot/src/lib.rs
index 9985c6822..6d0f288e5 100644
--- a/pallets/duniter-wot/src/lib.rs
+++ b/pallets/duniter-wot/src/lib.rs
@@ -200,59 +200,53 @@ impl<T: Config> sp_membership::traits::OnEvent<IdtyIndex> for Pallet<T>
 where
     T: pallet_membership::Config,
 {
-    fn on_event(membership_event: &sp_membership::Event<IdtyIndex>) {
+    fn on_event(membership_event: &sp_membership::Event<IdtyIndex>) -> Weight {
         match membership_event {
             sp_membership::Event::<IdtyIndex>::MembershipAdded(idty_index) => {
                 // when main membership is acquired, tell identity
                 // (only used on first membership acquiry)
-                pallet_identity::Pallet::<T>::membership_added(*idty_index);
+                pallet_identity::Pallet::<T>::membership_added(*idty_index)
             }
             sp_membership::Event::<IdtyIndex>::MembershipRemoved(idty_index) => {
                 // when main membership is lost, tell identity
-                pallet_identity::Pallet::<T>::membership_removed(*idty_index);
+                pallet_identity::Pallet::<T>::membership_removed(*idty_index)
             }
-            sp_membership::Event::<IdtyIndex>::MembershipRenewed(_) => {}
+            sp_membership::Event::<IdtyIndex>::MembershipRenewed(_) => Weight::zero(),
         }
     }
 }
 
 // implement identity event handler
 impl<T: Config> pallet_identity::traits::OnIdtyChange<T> for Pallet<T> {
-    fn on_idty_change(idty_index: IdtyIndex, idty_event: &IdtyEvent<T>) {
+    fn on_idty_change(idty_index: IdtyIndex, idty_event: &IdtyEvent<T>) -> Weight {
+        let mut weight = Weight::zero();
         match idty_event {
             // identity just has been created, a cert must be added
             IdtyEvent::Created { creator, .. } => {
-                if let Err(e) = <pallet_certification::Pallet<T>>::do_add_cert_checked(
-                    *creator, idty_index, true,
-                ) {
-                    sp_std::if_std! {
-                        println!("fail to force add cert: {:?}", e)
-                    }
-                }
+                weight =
+                    weight.saturating_add(<pallet_certification::Pallet<T>>::do_add_cert_checked(
+                        *creator, idty_index, true,
+                    ));
             }
             // we could split this event in removed / revoked:
             // if identity is revoked keep it
             // if identity is removed also remove certs
             IdtyEvent::Removed { status } => {
                 // try remove membership in any case
-                <pallet_membership::Pallet<T>>::do_remove_membership(
-                    idty_index,
-                    MembershipRemovalReason::Revoked,
-                );
+                weight =
+                    weight.saturating_add(<pallet_membership::Pallet<T>>::do_remove_membership(
+                        idty_index,
+                        MembershipRemovalReason::Revoked,
+                    ));
 
                 // only remove certs if identity is unvalidated
                 match status {
                     IdtyStatus::Unconfirmed | IdtyStatus::Unvalidated => {
-                        if let Err(e) =
-                            <pallet_certification::Pallet<T>>::remove_all_certs_received_by(
-                                frame_system::Origin::<T>::Root.into(),
+                        weight = weight.saturating_add(
+                            <pallet_certification::Pallet<T>>::do_remove_all_certs_received_by(
                                 idty_index,
-                            )
-                        {
-                            sp_std::if_std! {
-                                println!("fail to remove certs received by some idty: {:?}", e)
-                            }
-                        }
+                            ),
+                        );
                     }
                     IdtyStatus::Revoked => {}
                     IdtyStatus::Member | IdtyStatus::NotMember => {
@@ -263,6 +257,7 @@ impl<T: Config> pallet_identity::traits::OnIdtyChange<T> for Pallet<T> {
                 }
             }
         }
+        weight
     }
 }
 
@@ -297,7 +292,7 @@ impl<T: Config> pallet_certification::traits::OnRemovedCert<IdtyIndex> for Palle
             <pallet_membership::Pallet<T>>::do_remove_membership(
                 receiver,
                 MembershipRemovalReason::NotEnoughCerts,
-            )
+            );
         }
     }
 }
diff --git a/pallets/identity/src/benchmarking.rs b/pallets/identity/src/benchmarking.rs
index e013a2ac4..fc311a0e9 100644
--- a/pallets/identity/src/benchmarking.rs
+++ b/pallets/identity/src/benchmarking.rs
@@ -429,6 +429,86 @@ mod benchmarks {
         );
     }
 
+    #[benchmark]
+    fn do_remove_identity_handler() {
+        let idty_index: T::IdtyIndex = 1u32.into();
+        let new_identity: T::AccountId = account("Bob", 2, 1);
+        assert!(Identities::<T>::get(idty_index).is_some());
+        frame_system::Pallet::<T>::inc_sufficients(&new_identity);
+        Identities::<T>::mutate(idty_index, |id| {
+            if let Some(id) = id {
+                id.old_owner_key = Some((new_identity, BlockNumberFor::<T>::zero()));
+            }
+        });
+        assert!(Identities::<T>::get(idty_index)
+            .unwrap()
+            .old_owner_key
+            .is_some());
+
+        #[block]
+        {
+            T::OnIdtyChange::on_idty_change(
+                idty_index,
+                &IdtyEvent::Removed {
+                    status: IdtyStatus::Member,
+                },
+            );
+        }
+    }
+
+    #[benchmark]
+    fn membership_added() -> Result<(), BenchmarkError> {
+        let caller: T::AccountId = Identities::<T>::get(T::IdtyIndex::from(1u32))
+            .unwrap()
+            .owner_key;
+        let caller_origin: <T as frame_system::Config>::RuntimeOrigin =
+            RawOrigin::Signed(caller.clone()).into();
+        let owner_key: T::AccountId = account("new_identity", 2, 1);
+        let owner_key_origin: <T as frame_system::Config>::RuntimeOrigin =
+            RawOrigin::Signed(owner_key.clone()).into();
+        Pallet::<T>::create_identity(caller_origin.clone(), owner_key.clone())?;
+        let name = IdtyName("new_identity".into());
+        Pallet::<T>::confirm_identity(owner_key_origin.clone(), name.clone())?;
+        let idty_index = IdentityIndexOf::<T>::get(&owner_key).unwrap();
+        assert_ne!(
+            Identities::<T>::get(idty_index).unwrap().status,
+            IdtyStatus::Member
+        );
+
+        #[block]
+        {
+            Pallet::<T>::membership_added(idty_index);
+        }
+
+        assert_has_event::<T>(Event::<T>::IdtyValidated { idty_index }.into());
+        assert_eq!(
+            Identities::<T>::get(idty_index).unwrap().status,
+            IdtyStatus::Member
+        );
+        Ok(())
+    }
+
+    #[benchmark]
+    fn membership_removed() -> Result<(), BenchmarkError> {
+        let key: T::AccountId = account("new_identity", 2, 1);
+        let account: Account<T> = create_one_identity(key)?;
+        assert_eq!(
+            Identities::<T>::get(account.index).unwrap().status,
+            IdtyStatus::Member
+        );
+
+        #[block]
+        {
+            Pallet::<T>::membership_removed(account.index);
+        }
+
+        assert_eq!(
+            Identities::<T>::get(account.index).unwrap().status,
+            IdtyStatus::NotMember
+        );
+        Ok(())
+    }
+
     #[benchmark]
     fn prune_identities_noop() {
         assert!(IdentityChangeSchedule::<T>::try_get(BlockNumberFor::<T>::zero()).is_err());
diff --git a/pallets/identity/src/lib.rs b/pallets/identity/src/lib.rs
index eac91bda1..aa6a6c5a8 100644
--- a/pallets/identity/src/lib.rs
+++ b/pallets/identity/src/lib.rs
@@ -638,7 +638,7 @@ pub mod pallet {
         // when an identity becomes member, update its status
         // unschedule identity action, this falls back to membership scheduling
         // no identity schedule while membership is active
-        pub fn membership_added(idty_index: T::IdtyIndex) {
+        pub fn membership_added(idty_index: T::IdtyIndex) -> Weight {
             if let Some(mut idty_value) = Identities::<T>::get(idty_index) {
                 Self::unschedule_identity_change(idty_index, idty_value.next_scheduled);
                 idty_value.next_scheduled = BlockNumberFor::<T>::zero();
@@ -649,6 +649,7 @@ pub mod pallet {
                 idty_value.status = IdtyStatus::Member;
                 <Identities<T>>::insert(idty_index, idty_value);
             }
+            T::WeightInfo::membership_added()
             // else should not happen
         }
 
@@ -656,7 +657,7 @@ pub mod pallet {
         // only does something if identity is actually member
         // a membership can be removed when the identity is revoked
         // in this case, this does nothing
-        pub fn membership_removed(idty_index: T::IdtyIndex) {
+        pub fn membership_removed(idty_index: T::IdtyIndex) -> Weight {
             if let Some(idty_value) = Identities::<T>::get(idty_index) {
                 if idty_value.status == IdtyStatus::Member {
                     Self::update_identity_status(
@@ -667,6 +668,7 @@ pub mod pallet {
                     );
                 }
             }
+            T::WeightInfo::membership_removed()
             // else should not happen
         }
 
@@ -685,13 +687,16 @@ pub mod pallet {
                     frame_system::Pallet::<T>::dec_sufficients(&old_owner_key);
                 }
                 Self::deposit_event(Event::IdtyRemoved { idty_index, reason });
-                T::OnIdtyChange::on_idty_change(
+                let weight = T::OnIdtyChange::on_idty_change(
                     idty_index,
                     &IdtyEvent::Removed {
                         status: idty_value.status,
                     },
                 );
-                return T::WeightInfo::do_remove_identity();
+                return weight.saturating_add(
+                    T::WeightInfo::do_remove_identity()
+                        .saturating_sub(T::WeightInfo::do_remove_identity_handler()),
+                );
             }
             T::WeightInfo::do_remove_identity_noop()
         }
@@ -738,35 +743,46 @@ pub mod pallet {
                     if idty_val.next_scheduled == block_number {
                         match idty_val.status {
                             IdtyStatus::Unconfirmed => {
-                                total_weight +=
-                                    Self::do_remove_identity(idty_index, RemovalReason::Unconfirmed)
+                                total_weight =
+                                    total_weight.saturating_add(Self::do_remove_identity(
+                                        idty_index,
+                                        RemovalReason::Unconfirmed,
+                                    ));
                             }
                             IdtyStatus::Unvalidated => {
-                                total_weight +=
-                                    Self::do_remove_identity(idty_index, RemovalReason::Unvalidated)
+                                total_weight =
+                                    total_weight.saturating_add(Self::do_remove_identity(
+                                        idty_index,
+                                        RemovalReason::Unvalidated,
+                                    ));
                             }
                             IdtyStatus::Revoked => {
-                                total_weight +=
-                                    Self::do_remove_identity(idty_index, RemovalReason::Revoked)
+                                total_weight = total_weight.saturating_add(
+                                    Self::do_remove_identity(idty_index, RemovalReason::Revoked),
+                                );
                             }
                             IdtyStatus::NotMember => {
-                                total_weight +=
-                                    Self::do_revoke_identity(idty_index, RevocationReason::Expired)
+                                total_weight = total_weight.saturating_add(
+                                    Self::do_revoke_identity(idty_index, RevocationReason::Expired),
+                                );
                             }
                             IdtyStatus::Member => { // do not touch identities of member accounts
                                  // this should not happen
                             }
                         }
                     } else {
-                        total_weight += T::WeightInfo::prune_identities_err()
-                            .saturating_sub(T::WeightInfo::prune_identities_none())
+                        total_weight = total_weight.saturating_add(
+                            T::WeightInfo::prune_identities_err()
+                                .saturating_sub(T::WeightInfo::prune_identities_none()),
+                        );
                     }
                 } else {
-                    total_weight += T::WeightInfo::prune_identities_none()
-                        .saturating_sub(T::WeightInfo::prune_identities_noop())
+                    total_weight = total_weight.saturating_add(
+                        T::WeightInfo::prune_identities_none()
+                            .saturating_sub(T::WeightInfo::prune_identities_noop()),
+                    );
                 }
             }
-
             total_weight.saturating_add(T::WeightInfo::prune_identities_noop())
         }
 
diff --git a/pallets/identity/src/traits.rs b/pallets/identity/src/traits.rs
index 6a1b457c1..ced84de96 100644
--- a/pallets/identity/src/traits.rs
+++ b/pallets/identity/src/traits.rs
@@ -16,6 +16,7 @@
 
 use crate::*;
 use frame_support::pallet_prelude::*;
+use frame_support::weights::Weight;
 use impl_trait_for_tuples::impl_for_tuples;
 
 pub trait CheckIdtyCallAllowed<T: Config> {
@@ -35,14 +36,16 @@ pub trait IdtyNameValidator {
 }
 
 pub trait OnIdtyChange<T: Config> {
-    fn on_idty_change(idty_index: T::IdtyIndex, idty_event: &IdtyEvent<T>);
+    fn on_idty_change(idty_index: T::IdtyIndex, idty_event: &IdtyEvent<T>) -> Weight;
 }
 
 #[impl_for_tuples(5)]
 #[allow(clippy::let_and_return)]
 impl<T: Config> OnIdtyChange<T> for Tuple {
-    fn on_idty_change(idty_index: T::IdtyIndex, idty_event: &IdtyEvent<T>) {
-        for_tuples!( #( Tuple::on_idty_change(idty_index, idty_event); )* );
+    fn on_idty_change(idty_index: T::IdtyIndex, idty_event: &IdtyEvent<T>) -> Weight {
+        let mut weight = Weight::zero();
+        for_tuples!( #( weight = weight.saturating_add(Tuple::on_idty_change(idty_index, idty_event)); )* );
+        weight
     }
 }
 
diff --git a/pallets/identity/src/weights.rs b/pallets/identity/src/weights.rs
index 879cbe3f4..aa07cb254 100644
--- a/pallets/identity/src/weights.rs
+++ b/pallets/identity/src/weights.rs
@@ -30,10 +30,13 @@ pub trait WeightInfo {
     fn do_revoke_identity_noop() -> Weight;
     fn do_revoke_identity() -> Weight;
     fn do_remove_identity_noop() -> Weight;
+    fn do_remove_identity_handler() -> Weight;
     fn do_remove_identity() -> Weight;
     fn prune_identities_noop() -> Weight;
     fn prune_identities_none() -> Weight;
     fn prune_identities_err() -> Weight;
+    fn membership_added() -> Weight;
+    fn membership_removed() -> Weight;
 }
 
 // Insecure weights implementation, use it for tests only!
@@ -155,6 +158,16 @@ impl WeightInfo for () {
             .saturating_add(RocksDbWeight::get().reads(1))
     }
 
+    fn do_remove_identity_handler() -> Weight {
+        // Proof Size summary in bytes:
+        //  Measured:  `269`
+        //  Estimated: `3734`
+        // Minimum execution time: 104_296_000 picoseconds.
+        Weight::from_parts(115_316_000, 0)
+            .saturating_add(Weight::from_parts(0, 3734))
+            .saturating_add(RocksDbWeight::get().reads(1))
+    }
+
     fn do_remove_identity() -> Weight {
         // Proof Size summary in bytes:
         //  Measured:  `1432`
@@ -197,4 +210,26 @@ impl WeightInfo for () {
             .saturating_add(RocksDbWeight::get().reads(8))
             .saturating_add(RocksDbWeight::get().writes(8))
     }
+
+    fn membership_added() -> Weight {
+        // Proof Size summary in bytes:
+        //  Measured:  `1177`
+        //  Estimated: `4642`
+        // Minimum execution time: 1_427_848_000 picoseconds.
+        Weight::from_parts(2_637_229_000, 0)
+            .saturating_add(Weight::from_parts(0, 4642))
+            .saturating_add(RocksDbWeight::get().reads(8))
+            .saturating_add(RocksDbWeight::get().writes(8))
+    }
+
+    fn membership_removed() -> Weight {
+        // Proof Size summary in bytes:
+        //  Measured:  `1177`
+        //  Estimated: `4642`
+        // Minimum execution time: 1_427_848_000 picoseconds.
+        Weight::from_parts(2_637_229_000, 0)
+            .saturating_add(Weight::from_parts(0, 4642))
+            .saturating_add(RocksDbWeight::get().reads(8))
+            .saturating_add(RocksDbWeight::get().writes(8))
+    }
 }
diff --git a/pallets/membership/src/lib.rs b/pallets/membership/src/lib.rs
index d1fb52e35..4217893cc 100644
--- a/pallets/membership/src/lib.rs
+++ b/pallets/membership/src/lib.rs
@@ -290,15 +290,25 @@ pub mod pallet {
         }
 
         /// perform membership removal
-        pub fn do_remove_membership(idty_id: T::IdtyId, reason: MembershipRemovalReason) {
+        pub fn do_remove_membership(idty_id: T::IdtyId, reason: MembershipRemovalReason) -> Weight {
+            let mut weight = Weight::zero();
+            let mut add_db_reads_writes = |reads, writes| {
+                weight = weight.saturating_add(T::DbWeight::get().reads_writes(reads, writes));
+            };
+
             if let Some(membership_data) = Membership::<T>::take(idty_id) {
+                add_db_reads_writes(1, 1);
                 Self::unschedule_membership_expiry(idty_id, membership_data.expire_on);
+                add_db_reads_writes(1, 2);
                 Self::deposit_event(Event::MembershipRemoved {
                     member: idty_id,
                     reason,
                 });
-                T::OnEvent::on_event(&sp_membership::Event::MembershipRemoved(idty_id));
+                weight = weight.saturating_add(T::OnEvent::on_event(
+                    &sp_membership::Event::MembershipRemoved(idty_id),
+                ));
             }
+            weight
         }
 
         /// perform the membership expiry scheduled at given block
diff --git a/pallets/quota/src/lib.rs b/pallets/quota/src/lib.rs
index 8a063dcb1..83a28c67d 100644
--- a/pallets/quota/src/lib.rs
+++ b/pallets/quota/src/lib.rs
@@ -340,7 +340,12 @@ fn is_eligible_for_refund<T: pallet_identity::Config>(_identity: IdtyId<T>) -> b
 
 // implement identity event handler
 impl<T: Config> pallet_identity::traits::OnIdtyChange<T> for Pallet<T> {
-    fn on_idty_change(idty_id: IdtyId<T>, idty_event: &IdtyEvent<T>) {
+    fn on_idty_change(idty_id: IdtyId<T>, idty_event: &IdtyEvent<T>) -> Weight {
+        let mut weight = Weight::zero();
+        let mut add_db_reads_writes = |reads, writes| {
+            weight = weight.saturating_add(T::DbWeight::get().reads_writes(reads, writes));
+        };
+
         match idty_event {
             // initialize quota on identity creation
             IdtyEvent::Created { .. } => {
@@ -351,10 +356,13 @@ impl<T: Config> pallet_identity::traits::OnIdtyChange<T> for Pallet<T> {
                         amount: BalanceOf::<T>::zero(),
                     },
                 );
+                add_db_reads_writes(0, 1);
             }
             IdtyEvent::Removed { .. } => {
                 IdtyQuota::<T>::remove(idty_id);
+                add_db_reads_writes(1, 1);
             }
         }
+        weight
     }
 }
diff --git a/pallets/smith-members/src/lib.rs b/pallets/smith-members/src/lib.rs
index 28deb237f..b62b99ccc 100644
--- a/pallets/smith-members/src/lib.rs
+++ b/pallets/smith-members/src/lib.rs
@@ -496,7 +496,7 @@ impl<T: Config> Pallet<T> {
         let mut weight = T::WeightInfo::on_removed_wot_member_empty();
         if Smiths::<T>::get(idty_index).is_some() {
             Self::_do_exclude_smith(idty_index, SmithRemovalReason::LostMembership);
-            weight += T::WeightInfo::on_removed_wot_member();
+            weight = weight.saturating_add(T::WeightInfo::on_removed_wot_member());
         }
         weight
     }
diff --git a/primitives/membership/src/lib.rs b/primitives/membership/src/lib.rs
index 64f7f821f..d2ef9952a 100644
--- a/primitives/membership/src/lib.rs
+++ b/primitives/membership/src/lib.rs
@@ -23,6 +23,7 @@ pub mod traits;
 
 use codec::{Decode, Encode};
 use frame_support::pallet_prelude::RuntimeDebug;
+use frame_support::pallet_prelude::Weight;
 
 use scale_info::TypeInfo;
 use serde::{Deserialize, Serialize};
@@ -60,8 +61,11 @@ use impl_trait_for_tuples::impl_for_tuples;
 // use frame_system::pallet_prelude::*;
 
 #[impl_for_tuples(5)]
+#[allow(clippy::let_and_return)]
 impl<IdtyId> traits::OnEvent<IdtyId> for Tuple {
-    fn on_event(event: &Event<IdtyId>) {
-        for_tuples!( #( Tuple::on_event(event); )* );
+    fn on_event(event: &Event<IdtyId>) -> Weight {
+        let mut weight = Weight::zero();
+        for_tuples!( #( weight = weight.saturating_add(Tuple::on_event(event)); )* );
+        weight
     }
 }
diff --git a/primitives/membership/src/traits.rs b/primitives/membership/src/traits.rs
index a877fa9fb..633acfdad 100644
--- a/primitives/membership/src/traits.rs
+++ b/primitives/membership/src/traits.rs
@@ -32,7 +32,7 @@ impl<IdtyId> CheckMembershipOpAllowed<IdtyId> for () {
 }
 
 pub trait OnEvent<IdtyId> {
-    fn on_event(event: &crate::Event<IdtyId>);
+    fn on_event(event: &crate::Event<IdtyId>) -> Weight;
 }
 
 // impl<IdtyId> OnEvent<IdtyId> for () {
diff --git a/runtime/common/src/handlers.rs b/runtime/common/src/handlers.rs
index 35d8b8712..e02d2870a 100644
--- a/runtime/common/src/handlers.rs
+++ b/runtime/common/src/handlers.rs
@@ -43,19 +43,27 @@ impl<
             + pallet_universal_dividend::Config,
     > sp_membership::traits::OnEvent<IdtyIndex> for OnMembershipEventHandler<Inner, Runtime>
 {
-    fn on_event(membership_event: &sp_membership::Event<IdtyIndex>) {
+    fn on_event(membership_event: &sp_membership::Event<IdtyIndex>) -> Weight {
+        let mut weight = Weight::zero();
+        let mut add_db_reads_writes = |reads, writes| {
+            weight += crate::constants::DbWeight::get().reads_writes(reads, writes);
+        };
+
         (match membership_event {
             // when membership is removed, call on_removed_member handler which auto claims UD
             sp_membership::Event::MembershipRemoved(idty_index) => {
                 if let Some(idty_value) = pallet_identity::Identities::<Runtime>::get(idty_index) {
+                    add_db_reads_writes(1, 0);
                     if let Some(first_ud_index) = idty_value.data.first_eligible_ud.into() {
-                        pallet_universal_dividend::Pallet::<Runtime>::on_removed_member(
+                        add_db_reads_writes(1, 0);
+                        weight += pallet_universal_dividend::Pallet::<Runtime>::on_removed_member(
                             first_ud_index,
                             &idty_value.owner_key,
                         );
                     }
                 }
-                pallet_smith_members::Pallet::<Runtime>::on_removed_wot_member(*idty_index);
+                weight +=
+                    pallet_smith_members::Pallet::<Runtime>::on_removed_wot_member(*idty_index);
             }
             // when main membership is acquired, it starts getting right to UD
             sp_membership::Event::MembershipAdded(idty_index) => {
@@ -68,11 +76,12 @@ impl<
                         };
                     }
                 });
+                add_db_reads_writes(1, 1);
             }
             // in other case, ther is nothing to do
             sp_membership::Event::MembershipRenewed(_) => (),
         });
-        Inner::on_event(membership_event)
+        weight.saturating_add(Inner::on_event(membership_event))
     }
 }
 
diff --git a/runtime/common/src/weights/pallet_certification.rs b/runtime/common/src/weights/pallet_certification.rs
index dffd67cdb..041c2a01f 100644
--- a/runtime/common/src/weights/pallet_certification.rs
+++ b/runtime/common/src/weights/pallet_certification.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_certification`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
-//! DATE: 2024-02-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
+//! DATE: 2024-02-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -29,7 +29,7 @@
 // --chain=dev
 // --steps=50
 // --repeat=20
-// --pallet=*
+// --pallet=pallet-certification
 // --extrinsic=*
 // --wasm-execution=compiled
 // --heap-pages=4096
@@ -47,6 +47,24 @@ use core::marker::PhantomData;
 /// Weight functions for `pallet_certification`.
 pub struct WeightInfo<T>(PhantomData<T>);
 impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T> {
+	/// Storage: `Certification::StorageIdtyCertMeta` (r:2 w:2)
+	/// Proof: `Certification::StorageIdtyCertMeta` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Parameters::ParametersStorage` (r:1 w:0)
+	/// Proof: `Parameters::ParametersStorage` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsRemovableOn` (r:1 w:1)
+	/// Proof: `Certification::CertsRemovableOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Certification::CertsByReceiver` (r:1 w:1)
+	/// Proof: `Certification::CertsByReceiver` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_add_cert_checked() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `465`
+		//  Estimated: `6405`
+		// Minimum execution time: 18_540_000 picoseconds.
+		Weight::from_parts(19_162_000, 0)
+			.saturating_add(Weight::from_parts(0, 6405))
+			.saturating_add(T::DbWeight::get().reads(5))
+			.saturating_add(T::DbWeight::get().writes(4))
+	}
 	/// Storage: `Identity::IdentityIndexOf` (r:1 w:0)
 	/// Proof: `Identity::IdentityIndexOf` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	/// Storage: `Certification::StorageIdtyCertMeta` (r:2 w:2)
@@ -63,8 +81,8 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 		// Proof Size summary in bytes:
 		//  Measured:  `956`
 		//  Estimated: `6896`
-		// Minimum execution time: 30_204_000 picoseconds.
-		Weight::from_parts(31_317_000, 0)
+		// Minimum execution time: 29_895_000 picoseconds.
+		Weight::from_parts(30_571_000, 0)
 			.saturating_add(Weight::from_parts(0, 6896))
 			.saturating_add(T::DbWeight::get().reads(8))
 			.saturating_add(T::DbWeight::get().writes(4))
@@ -101,8 +119,8 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 		// Proof Size summary in bytes:
 		//  Measured:  `444`
 		//  Estimated: `6384`
-		// Minimum execution time: 15_623_000 picoseconds.
-		Weight::from_parts(16_484_000, 0)
+		// Minimum execution time: 16_843_000 picoseconds.
+		Weight::from_parts(17_387_000, 0)
 			.saturating_add(Weight::from_parts(0, 6384))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(3))
@@ -137,8 +155,8 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 		// Proof Size summary in bytes:
 		//  Measured:  `139`
 		//  Estimated: `3604`
-		// Minimum execution time: 2_480_000 picoseconds.
-		Weight::from_parts(2_752_000, 0)
+		// Minimum execution time: 2_669_000 picoseconds.
+		Weight::from_parts(2_838_000, 0)
 			.saturating_add(Weight::from_parts(0, 3604))
 			.saturating_add(T::DbWeight::get().reads(1))
 	}
@@ -148,8 +166,8 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 		// Proof Size summary in bytes:
 		//  Measured:  `237`
 		//  Estimated: `3702`
-		// Minimum execution time: 3_452_000 picoseconds.
-		Weight::from_parts(3_742_000, 0)
+		// Minimum execution time: 3_558_000 picoseconds.
+		Weight::from_parts(3_872_000, 0)
 			.saturating_add(Weight::from_parts(0, 3702))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -166,8 +184,8 @@ impl<T: frame_system::Config> pallet_certification::WeightInfo for WeightInfo<T>
 		// Proof Size summary in bytes:
 		//  Measured:  `660`
 		//  Estimated: `6600`
-		// Minimum execution time: 19_068_000 picoseconds.
-		Weight::from_parts(19_557_000, 0)
+		// Minimum execution time: 20_414_000 picoseconds.
+		Weight::from_parts(21_397_000, 0)
 			.saturating_add(Weight::from_parts(0, 6600))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(3))
diff --git a/runtime/common/src/weights/pallet_identity.rs b/runtime/common/src/weights/pallet_identity.rs
index 0c345bffd..83dbd55fb 100644
--- a/runtime/common/src/weights/pallet_identity.rs
+++ b/runtime/common/src/weights/pallet_identity.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_identity`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
-//! DATE: 2024-02-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
+//! DATE: 2024-02-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -29,7 +29,7 @@
 // --chain=dev
 // --steps=50
 // --repeat=20
-// --pallet=*
+// --pallet=pallet-identity
 // --extrinsic=*
 // --wasm-execution=compiled
 // --heap-pages=4096
@@ -73,8 +73,8 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `1022`
 		//  Estimated: `6962`
-		// Minimum execution time: 58_840_000 picoseconds.
-		Weight::from_parts(60_990_000, 0)
+		// Minimum execution time: 60_564_000 picoseconds.
+		Weight::from_parts(63_308_000, 0)
 			.saturating_add(Weight::from_parts(0, 6962))
 			.saturating_add(T::DbWeight::get().reads(13))
 			.saturating_add(T::DbWeight::get().writes(12))
@@ -91,8 +91,8 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `698`
 		//  Estimated: `6638`
-		// Minimum execution time: 26_487_000 picoseconds.
-		Weight::from_parts(27_976_000, 0)
+		// Minimum execution time: 26_793_000 picoseconds.
+		Weight::from_parts(27_936_000, 0)
 			.saturating_add(Weight::from_parts(0, 6638))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(4))
@@ -107,11 +107,11 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
 	fn change_owner_key() -> Weight {
 		// Proof Size summary in bytes:
-		//  Measured:  `723`
-		//  Estimated: `6663`
-		// Minimum execution time: 75_613_000 picoseconds.
-		Weight::from_parts(78_595_000, 0)
-			.saturating_add(Weight::from_parts(0, 6663))
+		//  Measured:  `727`
+		//  Estimated: `6667`
+		// Minimum execution time: 75_909_000 picoseconds.
+		Weight::from_parts(78_625_000, 0)
+			.saturating_add(Weight::from_parts(0, 6667))
 			.saturating_add(T::DbWeight::get().reads(6))
 			.saturating_add(T::DbWeight::get().writes(5))
 	}
@@ -129,8 +129,8 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `664`
 		//  Estimated: `6604`
-		// Minimum execution time: 64_212_000 picoseconds.
-		Weight::from_parts(65_561_000, 0)
+		// Minimum execution time: 64_106_000 picoseconds.
+		Weight::from_parts(65_803_000, 0)
 			.saturating_add(Weight::from_parts(0, 6604))
 			.saturating_add(T::DbWeight::get().reads(5))
 			.saturating_add(T::DbWeight::get().writes(5))
@@ -142,11 +142,11 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 3_575_000 picoseconds.
-		Weight::from_parts(3_800_000, 0)
+		// Minimum execution time: 3_638_000 picoseconds.
+		Weight::from_parts(3_905_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
-			// Standard Error: 2_731
-			.saturating_add(Weight::from_parts(1_232_005, 0).saturating_mul(i.into()))
+			// Standard Error: 2_068
+			.saturating_add(Weight::from_parts(1_242_357, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().writes(1))
 			.saturating_add(T::DbWeight::get().writes((1_u64).saturating_mul(i.into())))
 	}
@@ -156,8 +156,8 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `104`
 		//  Estimated: `3558`
-		// Minimum execution time: 6_056_000 picoseconds.
-		Weight::from_parts(6_534_000, 0)
+		// Minimum execution time: 5_947_000 picoseconds.
+		Weight::from_parts(6_461_000, 0)
 			.saturating_add(Weight::from_parts(0, 3558))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -172,8 +172,8 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `403`
 		//  Estimated: `3868`
-		// Minimum execution time: 52_131_000 picoseconds.
-		Weight::from_parts(53_597_000, 0)
+		// Minimum execution time: 50_624_000 picoseconds.
+		Weight::from_parts(51_865_000, 0)
 			.saturating_add(Weight::from_parts(0, 3868))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -182,8 +182,8 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 133_000 picoseconds.
-		Weight::from_parts(160_000, 0)
+		// Minimum execution time: 141_000 picoseconds.
+		Weight::from_parts(171_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	/// Storage: `Identity::Identities` (r:1 w:0)
@@ -192,8 +192,8 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `302`
 		//  Estimated: `3767`
-		// Minimum execution time: 3_647_000 picoseconds.
-		Weight::from_parts(3_826_000, 0)
+		// Minimum execution time: 3_472_000 picoseconds.
+		Weight::from_parts(3_637_000, 0)
 			.saturating_add(Weight::from_parts(0, 3767))
 			.saturating_add(T::DbWeight::get().reads(1))
 	}
@@ -231,8 +231,8 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `1555`
 		//  Estimated: `9970`
-		// Minimum execution time: 85_114_000 picoseconds.
-		Weight::from_parts(87_552_000, 0)
+		// Minimum execution time: 81_665_000 picoseconds.
+		Weight::from_parts(83_645_000, 0)
 			.saturating_add(Weight::from_parts(0, 9970))
 			.saturating_add(T::DbWeight::get().reads(16))
 			.saturating_add(T::DbWeight::get().writes(20))
@@ -243,8 +243,8 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `302`
 		//  Estimated: `3767`
-		// Minimum execution time: 3_615_000 picoseconds.
-		Weight::from_parts(3_858_000, 0)
+		// Minimum execution time: 3_547_000 picoseconds.
+		Weight::from_parts(4_975_000, 0)
 			.saturating_add(Weight::from_parts(0, 3767))
 			.saturating_add(T::DbWeight::get().reads(1))
 	}
@@ -282,20 +282,88 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `1546`
 		//  Estimated: `9961`
-		// Minimum execution time: 84_736_000 picoseconds.
-		Weight::from_parts(87_557_000, 0)
+		// Minimum execution time: 82_057_000 picoseconds.
+		Weight::from_parts(84_512_000, 0)
 			.saturating_add(Weight::from_parts(0, 9961))
 			.saturating_add(T::DbWeight::get().reads(15))
 			.saturating_add(T::DbWeight::get().writes(21))
 	}
+	/// Storage: `Membership::Membership` (r:1 w:1)
+	/// Proof: `Membership::Membership` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Membership::CounterForMembership` (r:1 w:1)
+	/// Proof: `Membership::CounterForMembership` (`max_values`: Some(1), `max_size`: Some(4), added: 499, mode: `MaxEncodedLen`)
+	/// Storage: `Membership::MembershipsExpireOn` (r:1 w:1)
+	/// Proof: `Membership::MembershipsExpireOn` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `UniversalDividend::CurrentUdIndex` (r:1 w:0)
+	/// Proof: `UniversalDividend::CurrentUdIndex` (`max_values`: Some(1), `max_size`: Some(2), added: 497, mode: `MaxEncodedLen`)
+	/// Storage: `SmithMembers::Smiths` (r:3 w:3)
+	/// Proof: `SmithMembers::Smiths` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::Members` (r:1 w:1)
+	/// Proof: `AuthorityMembers::Members` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OnlineAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OnlineAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::OutgoingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::OutgoingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `AuthorityMembers::IncomingAuthorities` (r:1 w:1)
+	/// Proof: `AuthorityMembers::IncomingAuthorities` (`max_values`: Some(1), `max_size`: None, mode: `Measured`)
+	/// Storage: `Session::NextKeys` (r:1 w:1)
+	/// Proof: `Session::NextKeys` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `System::Account` (r:1 w:1)
+	/// Proof: `System::Account` (`max_values`: None, `max_size`: Some(93), added: 2568, mode: `MaxEncodedLen`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Quota::IdtyQuota` (r:0 w:1)
+	/// Proof: `Quota::IdtyQuota` (`max_values`: None, `max_size`: Some(24), added: 2499, mode: `MaxEncodedLen`)
+	/// Storage: `Session::KeyOwner` (r:0 w:4)
+	/// Proof: `Session::KeyOwner` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn do_remove_identity_handler() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `1555`
+		//  Estimated: `9970`
+		// Minimum execution time: 79_199_000 picoseconds.
+		Weight::from_parts(81_944_000, 0)
+			.saturating_add(Weight::from_parts(0, 9970))
+			.saturating_add(T::DbWeight::get().reads(16))
+			.saturating_add(T::DbWeight::get().writes(20))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:1 w:1)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn membership_added() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `407`
+		//  Estimated: `3872`
+		// Minimum execution time: 13_864_000 picoseconds.
+		Weight::from_parts(14_389_000, 0)
+			.saturating_add(Weight::from_parts(0, 3872))
+			.saturating_add(T::DbWeight::get().reads(2))
+			.saturating_add(T::DbWeight::get().writes(2))
+	}
+	/// Storage: `Identity::Identities` (r:1 w:1)
+	/// Proof: `Identity::Identities` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	/// Storage: `Identity::IdentityChangeSchedule` (r:2 w:2)
+	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
+	fn membership_removed() -> Weight {
+		// Proof Size summary in bytes:
+		//  Measured:  `407`
+		//  Estimated: `6347`
+		// Minimum execution time: 13_506_000 picoseconds.
+		Weight::from_parts(14_328_000, 0)
+			.saturating_add(Weight::from_parts(0, 6347))
+			.saturating_add(T::DbWeight::get().reads(3))
+			.saturating_add(T::DbWeight::get().writes(3))
+	}
 	/// Storage: `Identity::IdentityChangeSchedule` (r:1 w:0)
 	/// Proof: `Identity::IdentityChangeSchedule` (`max_values`: None, `max_size`: None, mode: `Measured`)
 	fn prune_identities_noop() -> Weight {
 		// Proof Size summary in bytes:
 		//  Measured:  `157`
 		//  Estimated: `3622`
-		// Minimum execution time: 2_703_000 picoseconds.
-		Weight::from_parts(2_940_000, 0)
+		// Minimum execution time: 2_524_000 picoseconds.
+		Weight::from_parts(2_749_000, 0)
 			.saturating_add(Weight::from_parts(0, 3622))
 			.saturating_add(T::DbWeight::get().reads(1))
 	}
@@ -307,8 +375,8 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `327`
 		//  Estimated: `3792`
-		// Minimum execution time: 6_174_000 picoseconds.
-		Weight::from_parts(6_412_000, 0)
+		// Minimum execution time: 5_950_000 picoseconds.
+		Weight::from_parts(6_153_000, 0)
 			.saturating_add(Weight::from_parts(0, 3792))
 			.saturating_add(T::DbWeight::get().reads(2))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -333,8 +401,8 @@ impl<T: frame_system::Config> pallet_identity::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `851`
 		//  Estimated: `4316`
-		// Minimum execution time: 32_152_000 picoseconds.
-		Weight::from_parts(33_452_000, 0)
+		// Minimum execution time: 29_158_000 picoseconds.
+		Weight::from_parts(30_471_000, 0)
 			.saturating_add(Weight::from_parts(0, 4316))
 			.saturating_add(T::DbWeight::get().reads(6))
 			.saturating_add(T::DbWeight::get().writes(7))
diff --git a/runtime/common/src/weights/pallet_membership.rs b/runtime/common/src/weights/pallet_membership.rs
index 25af52d5d..b9484eb15 100644
--- a/runtime/common/src/weights/pallet_membership.rs
+++ b/runtime/common/src/weights/pallet_membership.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_membership`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
-//! DATE: 2024-02-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
+//! DATE: 2024-02-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -29,7 +29,7 @@
 // --chain=dev
 // --steps=50
 // --repeat=20
-// --pallet=*
+// --pallet=pallet-membership
 // --extrinsic=*
 // --wasm-execution=compiled
 // --heap-pages=4096
@@ -51,8 +51,8 @@ impl<T: frame_system::Config> pallet_membership::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `0`
 		//  Estimated: `0`
-		// Minimum execution time: 132_000 picoseconds.
-		Weight::from_parts(164_000, 0)
+		// Minimum execution time: 126_000 picoseconds.
+		Weight::from_parts(156_000, 0)
 			.saturating_add(Weight::from_parts(0, 0))
 	}
 	/// Storage: `Membership::MembershipsExpireOn` (r:2 w:2)
@@ -88,11 +88,11 @@ impl<T: frame_system::Config> pallet_membership::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `138 + i * (804 ±0)`
 		//  Estimated: `9744 + i * (2687 ±0)`
-		// Minimum execution time: 4_240_000 picoseconds.
-		Weight::from_parts(10_575_563, 0)
+		// Minimum execution time: 4_057_000 picoseconds.
+		Weight::from_parts(10_233_129, 0)
 			.saturating_add(Weight::from_parts(0, 9744))
-			// Standard Error: 426_375
-			.saturating_add(Weight::from_parts(64_303_590, 0).saturating_mul(i.into()))
+			// Standard Error: 414_723
+			.saturating_add(Weight::from_parts(61_067_665, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().reads((10_u64).saturating_mul(i.into())))
 			.saturating_add(T::DbWeight::get().writes(3))
diff --git a/runtime/common/src/weights/pallet_quota.rs b/runtime/common/src/weights/pallet_quota.rs
index 49d61431f..68297e793 100644
--- a/runtime/common/src/weights/pallet_quota.rs
+++ b/runtime/common/src/weights/pallet_quota.rs
@@ -16,8 +16,8 @@
 
 //! Autogenerated weights for `pallet_quota`
 //!
-//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 32.0.0
-//! DATE: 2024-02-19, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
+//! THIS FILE WAS AUTO-GENERATED USING THE SUBSTRATE BENCHMARK CLI VERSION 4.0.0-dev
+//! DATE: 2024-02-17, STEPS: `50`, REPEAT: `20`, LOW RANGE: `[]`, HIGH RANGE: `[]`
 //! WORST CASE MAP SIZE: `1000000`
 //! HOSTNAME: `bgallois-ms7d43`, CPU: `12th Gen Intel(R) Core(TM) i3-12100F`
 //! WASM-EXECUTION: `Compiled`, CHAIN: `Some("dev")`, DB CACHE: 1024
@@ -29,7 +29,7 @@
 // --chain=dev
 // --steps=50
 // --repeat=20
-// --pallet=*
+// --pallet=pallet-quota
 // --extrinsic=*
 // --wasm-execution=compiled
 // --heap-pages=4096
@@ -53,8 +53,8 @@ impl<T: frame_system::Config> pallet_quota::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `11288`
 		//  Estimated: `12751`
-		// Minimum execution time: 7_369_000 picoseconds.
-		Weight::from_parts(7_578_000, 0)
+		// Minimum execution time: 7_540_000 picoseconds.
+		Weight::from_parts(7_831_000, 0)
 			.saturating_add(Weight::from_parts(0, 12751))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -65,8 +65,8 @@ impl<T: frame_system::Config> pallet_quota::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `139`
 		//  Estimated: `3489`
-		// Minimum execution time: 4_456_000 picoseconds.
-		Weight::from_parts(4_698_000, 0)
+		// Minimum execution time: 4_478_000 picoseconds.
+		Weight::from_parts(4_833_000, 0)
 			.saturating_add(Weight::from_parts(0, 3489))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -79,8 +79,8 @@ impl<T: frame_system::Config> pallet_quota::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `202`
 		//  Estimated: `6126`
-		// Minimum execution time: 21_527_000 picoseconds.
-		Weight::from_parts(22_247_000, 0)
+		// Minimum execution time: 22_559_000 picoseconds.
+		Weight::from_parts(23_138_000, 0)
 			.saturating_add(Weight::from_parts(0, 6126))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -93,8 +93,8 @@ impl<T: frame_system::Config> pallet_quota::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `202`
 		//  Estimated: `6126`
-		// Minimum execution time: 21_246_000 picoseconds.
-		Weight::from_parts(21_948_000, 0)
+		// Minimum execution time: 23_276_000 picoseconds.
+		Weight::from_parts(24_055_000, 0)
 			.saturating_add(Weight::from_parts(0, 6126))
 			.saturating_add(T::DbWeight::get().reads(3))
 			.saturating_add(T::DbWeight::get().writes(2))
@@ -105,8 +105,8 @@ impl<T: frame_system::Config> pallet_quota::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `43`
 		//  Estimated: `12751`
-		// Minimum execution time: 1_784_000 picoseconds.
-		Weight::from_parts(1_869_000, 0)
+		// Minimum execution time: 1_807_000 picoseconds.
+		Weight::from_parts(1_955_000, 0)
 			.saturating_add(Weight::from_parts(0, 12751))
 			.saturating_add(T::DbWeight::get().reads(1))
 			.saturating_add(T::DbWeight::get().writes(1))
@@ -122,11 +122,11 @@ impl<T: frame_system::Config> pallet_quota::WeightInfo for WeightInfo<T> {
 		// Proof Size summary in bytes:
 		//  Measured:  `227 + i * (44 ±0)`
 		//  Estimated: `12751`
-		// Minimum execution time: 24_268_000 picoseconds.
-		Weight::from_parts(37_335_245, 0)
+		// Minimum execution time: 27_258_000 picoseconds.
+		Weight::from_parts(41_619_960, 0)
 			.saturating_add(Weight::from_parts(0, 12751))
-			// Standard Error: 1_626
-			.saturating_add(Weight::from_parts(1_197_308, 0).saturating_mul(i.into()))
+			// Standard Error: 1_921
+			.saturating_add(Weight::from_parts(1_259_242, 0).saturating_mul(i.into()))
 			.saturating_add(T::DbWeight::get().reads(4))
 			.saturating_add(T::DbWeight::get().writes(3))
 	}
-- 
GitLab