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