From d52d182c3ccd7b86a3441a27a2f345d888ce5fe4 Mon Sep 17 00:00:00 2001
From: librelois <c@elo.tf>
Date: Sun, 3 Jul 2022 02:33:22 +0200
Subject: [PATCH] auto claim uds at member removal

---
 pallets/universal-dividend/src/lib.rs | 32 +++++++++++++++++++++++----
 runtime/common/src/handlers.rs        | 14 ++++++++++++
 2 files changed, 42 insertions(+), 4 deletions(-)

diff --git a/pallets/universal-dividend/src/lib.rs b/pallets/universal-dividend/src/lib.rs
index 78b4e87d9..b81811449 100644
--- a/pallets/universal-dividend/src/lib.rs
+++ b/pallets/universal-dividend/src/lib.rs
@@ -213,21 +213,26 @@ pub mod pallet {
     #[pallet::event]
     #[pallet::generate_deposit(pub(super) fn deposit_event)]
     pub enum Event<T: Config> {
-        /// A new universal dividend is created
-        /// [amout, members_count]
+        /// A new universal dividend is created.
         NewUdCreated {
             amount: BalanceOf<T>,
             index: UdIndex,
             monetary_mass: BalanceOf<T>,
             members_count: BalanceOf<T>,
         },
-        /// The universal dividend has been re-evaluated
-        /// [new_ud_amount, monetary_mass, members_count]
+        /// The universal dividend has been re-evaluated.
         UdReevalued {
             new_ud_amount: BalanceOf<T>,
             monetary_mass: BalanceOf<T>,
             members_count: BalanceOf<T>,
         },
+        /// DUs were automatically transferred as part of a member removal.
+        UdsAutoPaidAtRemoval {
+            count: UdIndex,
+            total: BalanceOf<T>,
+            who: T::AccountId,
+        },
+        /// A member claimed his UDs.
         UdsClaimed {
             count: UdIndex,
             total: BalanceOf<T>,
@@ -409,5 +414,24 @@ pub mod pallet {
         pub fn init_first_eligible_ud() -> FirstEligibleUd {
             CurrentUdIndex::<T>::get().into()
         }
+        pub fn on_removed_member(first_ud_index: UdIndex, who: &T::AccountId) -> Weight {
+            let current_ud_index = CurrentUdIndex::<T>::get();
+            if first_ud_index < current_ud_index {
+                let (uds_count, uds_total) = compute_claim_uds::compute_claim_uds(
+                    current_ud_index,
+                    first_ud_index,
+                    PastReevals::<T>::get().into_iter(),
+                );
+                T::Currency::deposit_creating(who, uds_total);
+                Self::deposit_event(Event::UdsAutoPaidAtRemoval {
+                    count: uds_count,
+                    total: uds_total,
+                    who: who.clone(),
+                });
+                T::DbWeight::get().reads_writes(2, 1)
+            } else {
+                T::DbWeight::get().reads(1)
+            }
+        }
     }
 }
diff --git a/runtime/common/src/handlers.rs b/runtime/common/src/handlers.rs
index 3b81d4cee..b5f407057 100644
--- a/runtime/common/src/handlers.rs
+++ b/runtime/common/src/handlers.rs
@@ -58,6 +58,20 @@ impl<
                 });
                 Runtime::DbWeight::get().reads_writes(1, 1)
             }
+            sp_membership::Event::MembershipRevoked(idty_index) => {
+                if let Some(idty_value) = pallet_identity::Identities::<Runtime>::get(idty_index) {
+                    if let Some(first_ud_index) = idty_value.data.into() {
+                        pallet_universal_dividend::Pallet::<Runtime>::on_removed_member(
+                            first_ud_index,
+                            &idty_value.owner_key,
+                        )
+                    } else {
+                        Runtime::DbWeight::get().reads(1)
+                    }
+                } else {
+                    Runtime::DbWeight::get().reads(1)
+                }
+            }
             _ => 0,
         }) + Inner::on_event(membership_event)
     }
-- 
GitLab