Browse Source

Merge pull request #3363 from shamil-gadelshin/olympia-fix-invitation-balance

Olympia. Runtime. Fix default invitation balance bug in the membership pallet.
Mokhtar Naamani 3 years ago
parent
commit
ad29ede9dc

+ 5 - 5
runtime-modules/membership/src/lib.rs

@@ -711,10 +711,10 @@ decl_module! {
             )?;
 
             let current_wg_budget = T::WorkingGroup::get_budget();
-            let default_invitation_balance = T::DefaultInitialInvitationBalance::get();
+            let invitation_balance = Self::initial_invitation_balance();
 
             ensure!(
-                default_invitation_balance <= current_wg_budget,
+                invitation_balance <= current_wg_budget,
                 Error::<T>::WorkingGroupBudgetIsNotSufficientForInviting
             );
 
@@ -743,19 +743,19 @@ decl_module! {
             });
 
             // Decrease the working group balance.
-            let new_wg_budget = current_wg_budget.saturating_sub(default_invitation_balance);
+            let new_wg_budget = current_wg_budget.saturating_sub(invitation_balance);
             T::WorkingGroup::set_budget(new_wg_budget);
 
             // Create default balance for the invited member.
             let _ = balances::Module::<T>::deposit_creating(
                 &params.controller_account,
-                default_invitation_balance
+                invitation_balance
             );
 
             // Lock invitation balance. Allow only transaction payments.
             T::InvitedMemberStakingHandler::lock_with_reasons(
                 &params.controller_account,
-                default_invitation_balance,
+                invitation_balance,
                 WithdrawReasons::except(WithdrawReason::TransactionPayment)
             );
 

+ 7 - 0
runtime-modules/membership/src/tests/fixtures.rs

@@ -495,6 +495,13 @@ impl Default for SetInitialInvitationBalanceFixture {
 }
 
 impl SetInitialInvitationBalanceFixture {
+    pub fn with_initial_balance(self, new_initial_balance: u64) -> Self {
+        Self {
+            new_initial_balance,
+            ..self
+        }
+    }
+
     pub fn call_and_assert(&self, expected_result: DispatchResult) {
         let actual_result = Membership::set_initial_invitation_balance(
             self.origin.clone().into(),

+ 69 - 2
runtime-modules/membership/src/tests/mod.rs

@@ -527,6 +527,69 @@ fn invite_member_succeeds() {
     });
 }
 
+#[test]
+fn invite_member_succeeds_with_additional_checks() {
+    build_test_externalities().execute_with(|| {
+        let starting_block = 1;
+        run_to_block(starting_block);
+
+        let initial_balance = DefaultMembershipPrice::get();
+        set_alice_free_balance(initial_balance);
+
+        let new_initial_balance = 50;
+        SetInitialInvitationBalanceFixture::default()
+            .with_initial_balance(new_initial_balance)
+            .call_and_assert(Ok(()));
+
+        assert_ok!(buy_default_membership_as_alice());
+        let invitee_member_id = Membership::members_created();
+
+        let fixture = InviteMembershipFixture::default();
+        fixture.call_and_assert(Ok(()));
+
+        // Invitations count for inviter member reduced
+        let inviter_member_id = fixture.member_id;
+        let inviter_profile = get_membership_by_id(inviter_member_id);
+        assert_eq!(
+            inviter_profile.invites,
+            crate::DEFAULT_MEMBER_INVITES_COUNT - 1
+        );
+
+        // Invited member created with correct handle and 0 invites
+        let invitee_profile = get_membership_by_id(invitee_member_id);
+        let bob = get_bob_info();
+        assert_eq!(Some(invitee_profile.handle_hash), bob.handle_hash);
+        assert_eq!(invitee_profile.invites, 0);
+
+        // controller account initially set to primary account
+        assert_eq!(invitee_profile.controller_account, BOB_ACCOUNT_ID);
+
+        let initial_invitation_balance = Membership::initial_invitation_balance();
+        // Working group budget reduced.
+        assert_eq!(
+            WORKING_GROUP_BUDGET - initial_invitation_balance,
+            <Test as Trait>::WorkingGroup::get_budget()
+        );
+
+        // Invited member account filled.
+        assert_eq!(
+            initial_invitation_balance,
+            Balances::free_balance(&invitee_profile.controller_account)
+        );
+
+        // Invited member balance locked.
+        assert_eq!(
+            0,
+            Balances::usable_balance(&invitee_profile.controller_account)
+        );
+
+        EventFixture::assert_last_crate_event(Event::<Test>::MemberInvited(
+            invitee_member_id,
+            fixture.get_invite_membership_parameters(),
+        ));
+    });
+}
+
 #[test]
 fn invite_member_fails_with_existing_invitation_lock() {
     build_test_externalities().execute_with(|| {
@@ -724,10 +787,14 @@ fn set_initial_invitation_balance_succeeds() {
         let starting_block = 1;
         run_to_block(starting_block);
 
-        SetInitialInvitationBalanceFixture::default().call_and_assert(Ok(()));
+        let new_initial_balance = 500;
+
+        SetInitialInvitationBalanceFixture::default()
+            .with_initial_balance(new_initial_balance)
+            .call_and_assert(Ok(()));
 
         EventFixture::assert_last_crate_event(Event::<Test>::InitialInvitationBalanceUpdated(
-            DEFAULT_INITIAL_INVITATION_BALANCE,
+            new_initial_balance,
         ));
     });
 }