From 53c2df8cf13ae18fc3bdb81d5d8bed00f3728a28 Mon Sep 17 00:00:00 2001
From: cgeek <cem.moreau@gmail.com>
Date: Thu, 14 Dec 2023 16:09:21 +0100
Subject: [PATCH] feat(smith-members): blacklisting stub

---
 pallets/authority-members/src/impls.rs | 11 ++++++-----
 pallets/authority-members/src/lib.rs   |  1 +
 pallets/smith-members/src/impls.rs     |  8 +++++---
 pallets/smith-members/src/lib.rs       |  9 +++++++++
 4 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/pallets/authority-members/src/impls.rs b/pallets/authority-members/src/impls.rs
index ade9f7437..bdea383ae 100644
--- a/pallets/authority-members/src/impls.rs
+++ b/pallets/authority-members/src/impls.rs
@@ -24,6 +24,7 @@
 #![allow(clippy::type_complexity)]
 
 use super::pallet::*;
+use crate::OnBlacklistedMember;
 use frame_support::pallet_prelude::Weight;
 use frame_support::traits::Get;
 use pallet_offences::traits::OnOffenceHandler;
@@ -54,9 +55,9 @@ where
         match strategy {
             SlashStrategy::Blacklist => {
                 for offender in offenders {
-                    Blacklist::<T>::mutate(|blacklist| {
-                        if let Some(member_id) = T::MemberIdOf::convert(offender.offender.0.clone())
-                        {
+                    if let Some(member_id) = T::MemberIdOf::convert(offender.offender.0.clone()) {
+                        T::OnBlacklistedMember::on_blacklisted_member(member_id.clone());
+                        Blacklist::<T>::mutate(|blacklist| {
                             if !blacklist.contains(&member_id) {
                                 blacklist.push(member_id);
                                 Self::deposit_event(Event::MemberAddedToBlacklist {
@@ -66,8 +67,8 @@ where
                             }
                             Self::insert_out(member_id);
                             add_db_reads_writes(2, 1);
-                        }
-                    })
+                        });
+                    }
                 }
             }
             SlashStrategy::Disconnect => {
diff --git a/pallets/authority-members/src/lib.rs b/pallets/authority-members/src/lib.rs
index 9284bb25c..78be54ef2 100644
--- a/pallets/authority-members/src/lib.rs
+++ b/pallets/authority-members/src/lib.rs
@@ -71,6 +71,7 @@ pub mod pallet {
         type OnRemovedMember: OnRemovedMember<Self::MemberId>;
         type OnOutgoingMember: OnOutgoingMember<Self::MemberId>;
         type OnIncomingMember: OnIncomingMember<Self::MemberId>;
+        type OnBlacklistedMember: OnBlacklistedMember<Self::MemberId>;
         /// Max number of authorities allowed
         #[pallet::constant]
         type MaxAuthorities: Get<u32>;
diff --git a/pallets/smith-members/src/impls.rs b/pallets/smith-members/src/impls.rs
index be6180f05..12b7c9077 100644
--- a/pallets/smith-members/src/impls.rs
+++ b/pallets/smith-members/src/impls.rs
@@ -15,9 +15,11 @@ impl<T: Config> pallet_authority_members::OnRemovedMember<T> for Pallet<T> {
 /// We want to remove a Smith when he is removed (blacklisted) from the higher level set of "authorities".
 /// A blacklisting means the user does not respect the operational conditions for an authority, so
 /// he does not deserve the Smith role.
-impl<T: Config> pallet_authority_members::OnBlacklistedMember<T> for Pallet<T> {
-    fn on_blacklisted_member(member_id: T) {
-        todo!("Remove smith, he is dangereous")
+impl<T: Config> pallet_authority_members::OnBlacklistedMember<T::MemberId> for Pallet<T> {
+    fn on_blacklisted_member(member_id: T::MemberId) {
+        Pallet::<T>::smith_goes_blacklisted(
+            T::IdtyIdOfAuthorityId::convert(member_id).expect("convertion should be ok"),
+        );
     }
 }
 
diff --git a/pallets/smith-members/src/lib.rs b/pallets/smith-members/src/lib.rs
index 040e4fb03..2a33e783b 100644
--- a/pallets/smith-members/src/lib.rs
+++ b/pallets/smith-members/src/lib.rs
@@ -392,6 +392,15 @@ impl<T: Config> Pallet<T> {
             }
         }
     }
+
+    // TODO: return what?
+    fn smith_goes_blacklisted(idty_index: T::IdtyIndex) {
+        // TODO: for now, just let smith_goes_offline do the job
+        // if let Some(_) = Smiths::<T>::get(idty_index) {
+        //     Smiths::<T>::remove(idty_index);
+        //     T::OnSmithDelete::on_smith_delete(idty_index, SmithRemovalReason::Blacklisted);
+        // }
+    }
 }
 
 impl<T: Config> Pallet<T> {
-- 
GitLab