From 78c6c744f1e1e1902b79184ddd17856b575dec40 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pascal=20Eng=C3=A9libert?= <tuxmain@zettascript.org>
Date: Sat, 7 Sep 2024 14:58:31 +0200
Subject: [PATCH] distance: handle slash unbalance

---
 pallets/distance/src/lib.rs          | 10 +++++++---
 pallets/distance/src/mock.rs         |  1 +
 runtime/common/src/pallets_config.rs |  1 +
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/pallets/distance/src/lib.rs b/pallets/distance/src/lib.rs
index b965d0fc8..ba5e80086 100644
--- a/pallets/distance/src/lib.rs
+++ b/pallets/distance/src/lib.rs
@@ -82,9 +82,9 @@ pub use types::*;
 pub use weights::WeightInfo;
 
 use frame_support::traits::{
-    fungible::{self, hold, Mutate, MutateHold},
+    fungible::{self, hold, Credit, Mutate, MutateHold},
     tokens::Precision,
-    StorageVersion,
+    OnUnbalanced, StorageVersion,
 };
 use sp_distance::{InherentError, INHERENT_IDENTIFIER};
 use sp_inherents::{InherentData, InherentIdentifier};
@@ -155,6 +155,9 @@ pub mod pallet {
         #[pallet::constant]
         type MinAccessibleReferees: Get<Perbill>;
 
+        /// Handler for unbalanced reduction when invalid distance causes a slash.
+        type OnUnbalanced: OnUnbalanced<Credit<Self::AccountId, Self::Currency>>;
+
         /// The overarching event type.
         type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>;
 
@@ -668,11 +671,12 @@ pub mod pallet {
                             );
                         } else {
                             // Negative result, slash and deposit event
-                            let _ = <T::Currency as hold::Balanced<_>>::slash(
+                            let (imbalance, _) = <T::Currency as hold::Balanced<_>>::slash(
                                 &HoldReason::DistanceHold.into(),
                                 &requester,
                                 <T as Config>::EvaluationPrice::get(),
                             );
+                            T::OnUnbalanced::on_unbalanced(imbalance);
                             Self::deposit_event(Event::EvaluatedInvalid {
                                 idty_index: idty,
                                 distance,
diff --git a/pallets/distance/src/mock.rs b/pallets/distance/src/mock.rs
index f837bac85..fa963500b 100644
--- a/pallets/distance/src/mock.rs
+++ b/pallets/distance/src/mock.rs
@@ -261,6 +261,7 @@ impl pallet_distance::Config for Test {
     type EvaluationPrice = frame_support::traits::ConstU64<1000>;
     type MaxRefereeDistance = frame_support::traits::ConstU32<5>;
     type MinAccessibleReferees = MinAccessibleReferees;
+    type OnUnbalanced = ();
     type OnValidDistanceStatus = ();
     type RuntimeEvent = RuntimeEvent;
     type RuntimeHoldReason = RuntimeHoldReason;
diff --git a/runtime/common/src/pallets_config.rs b/runtime/common/src/pallets_config.rs
index e82397cd9..3b5ae90ba 100644
--- a/runtime/common/src/pallets_config.rs
+++ b/runtime/common/src/pallets_config.rs
@@ -519,6 +519,7 @@ macro_rules! pallets_config {
             type EvaluationPrice = frame_support::traits::ConstU64<1000>;
             type MaxRefereeDistance = MaxRefereeDistance;
             type MinAccessibleReferees = MinAccessibleReferees;
+            type OnUnbalanced = HandleFees;
             type OnValidDistanceStatus = Wot;
             type RuntimeEvent = RuntimeEvent;
             type RuntimeHoldReason = RuntimeHoldReason;
-- 
GitLab