Browse Source

runtime: membership: Add check for double staking account confirmation.

Shamil Gadelshin 4 years ago
parent
commit
6079ff5cf4
2 changed files with 21 additions and 0 deletions
  1. 8 0
      runtime-modules/membership/src/lib.rs
  2. 13 0
      runtime-modules/membership/src/tests/mod.rs

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

@@ -277,6 +277,9 @@ decl_error! {
         /// Staking account for membership doesn't exist.
         StakingAccountDoesntExist,
 
+        /// Staking account has already been confirmed.
+        StakingAccountAlreadyConfirmed,
+
         /// Cannot add more staking account id.
         MaximumStakingAccountNumberExceeded,
     }
@@ -813,6 +816,11 @@ decl_module! {
                 Error::<T>::StakingAccountDoesntExist
             );
 
+            ensure!(
+                !membership.staking_account_confirmed(&staking_account_id),
+                Error::<T>::StakingAccountAlreadyConfirmed
+            );
+
             //
             // == MUTATION SAFE ==
             //

+ 13 - 0
runtime-modules/membership/src/tests/mod.rs

@@ -879,6 +879,19 @@ fn confirm_staking_account_succeeds() {
     });
 }
 
+#[test]
+fn confirm_staking_account_fails_on_double_confirmation() {
+    let initial_members = [(ALICE_MEMBER_ID, ALICE_ACCOUNT_ID)];
+
+    build_test_externalities_with_initial_members(initial_members.to_vec()).execute_with(|| {
+        AddStakingAccountFixture::default().call_and_assert(Ok(()));
+
+        ConfirmStakingAccountFixture::default().call_and_assert(Ok(()));
+        ConfirmStakingAccountFixture::default()
+            .call_and_assert(Err(Error::<Test>::StakingAccountAlreadyConfirmed.into()));
+    });
+}
+
 #[test]
 fn confirm_staking_account_fails_with_bad_origin() {
     build_test_externalities().execute_with(|| {