Selaa lähdekoodia

runtime: membership: Fix review comments.

Change slashing balance from free balance to usable balance in order to disable slashing locked funds.
Shamil Gadelshin 4 vuotta sitten
vanhempi
commit
a46fa4b0fb

+ 1 - 1
runtime-modules/membership/src/genesis.rs

@@ -1,7 +1,7 @@
 #![cfg(feature = "std")]
 
+use crate::BalanceOf;
 use crate::{GenesisConfig, Trait};
-use common::currency::BalanceOf;
 use serde::{Deserialize, Serialize};
 
 #[derive(Clone, Serialize, Deserialize)]

+ 8 - 4
runtime-modules/membership/src/lib.rs

@@ -14,13 +14,14 @@ use sp_runtime::traits::{MaybeSerialize, Member};
 use sp_std::borrow::ToOwned;
 use sp_std::vec::Vec;
 
-use common::currency::{BalanceOf, GovernanceCurrency};
+// Balance type alias
+type BalanceOf<T> = <T as balances::Trait>::Balance;
 
 //TODO: Convert errors to the Substrate decl_error! macro.
 /// Result with string error message. This exists for backward compatibility purpose.
 pub type DispatchResult = Result<(), &'static str>;
 
-pub trait Trait: frame_system::Trait + GovernanceCurrency + pallet_timestamp::Trait {
+pub trait Trait: frame_system::Trait + balances::Trait + pallet_timestamp::Trait {
     type Event: From<Event<Self>> + Into<<Self as frame_system::Trait>::Event>;
 
     type MemberId: Parameter
@@ -212,7 +213,10 @@ decl_module! {
             let fee = T::MembershipFee::get();
 
             // ensure enough free balance to cover terms fees
-            ensure!(T::Currency::can_slash(&who, fee), "not enough balance to buy membership");
+            ensure!(
+                balances::Module::<T>::usable_balance(&who) >= fee,
+                "not enough balance to buy membership"
+            );
 
             let user_info = Self::check_user_registration_info(handle, avatar_uri, about)?;
 
@@ -225,7 +229,7 @@ decl_module! {
                 <pallet_timestamp::Module<T>>::now()
             )?;
 
-            let _ = T::Currency::slash(&who, fee);
+            let _ = balances::Module::<T>::slash(&who, fee);
 
             Self::deposit_event(RawEvent::MemberRegistered(member_id, who));
         }

+ 23 - 0
runtime-modules/membership/src/tests.rs

@@ -3,6 +3,7 @@
 use super::genesis;
 use super::mock::*;
 
+use frame_support::traits::{LockIdentifier, LockableCurrency, WithdrawReasons};
 use frame_support::*;
 
 fn get_membership_by_id(member_id: u64) -> crate::Membership<Test> {
@@ -126,6 +127,28 @@ fn buy_membership_fails_without_enough_balance() {
         });
 }
 
+#[test]
+fn buy_membership_fails_without_enough_balance_with_locked_balance() {
+    TestExternalitiesBuilder::<Test>::default()
+        .set_membership_config(
+            genesis::GenesisConfigBuilder::default()
+                .default_paid_membership_fee(MembershipFee::get())
+                .build(),
+        )
+        .build()
+        .execute_with(|| {
+            let initial_balance = MembershipFee::get();
+            let lock_id = LockIdentifier::default();
+            Balances::set_lock(lock_id, &ALICE_ACCOUNT_ID, 1, WithdrawReasons::all());
+            set_alice_free_balance(initial_balance);
+
+            assert_dispatch_error_message(
+                buy_default_membership_as_alice(),
+                "not enough balance to buy membership",
+            );
+        });
+}
+
 #[test]
 fn new_memberships_allowed_flag() {
     TestExternalitiesBuilder::<Test>::default()

+ 1 - 1
runtime-modules/staking-handler/src/lib.rs

@@ -80,7 +80,7 @@ impl<
     }
 
     fn unlock(account_id: &T::AccountId) {
-        T::Currency::remove_lock(LockId::get(), &account_id);
+        <pallet_balances::Module<T>>::remove_lock(LockId::get(), &account_id);
     }
 
     fn slash(account_id: &T::AccountId, amount: Option<BalanceOf<T>>) -> BalanceOf<T> {