Skip to content
Snippets Groups Projects
Commit 431ff35b authored by Benjamin Gallois's avatar Benjamin Gallois Committed by Hugo Trentesaux
Browse files

Fix #196 forbid empty linked account (!253)

* test refund behavior on reaped account

* Revert "complete the test with refund check"

This reverts commit edb68138.

* complete the test with refund check

* add test empty linked account
parent d7cefb59
No related branches found
No related tags found
1 merge request!253Fix #196 forbid empty linked account
Pipeline #36422 passed
...@@ -19,9 +19,12 @@ ...@@ -19,9 +19,12 @@
mod common; mod common;
use common::*; use common::*;
use frame_support::traits::StoredMap;
use frame_support::{assert_noop, assert_ok}; use frame_support::{assert_noop, assert_ok};
use gdev_runtime::*; use gdev_runtime::*;
use sp_core::Encode;
use sp_keyring::AccountKeyring; use sp_keyring::AccountKeyring;
use sp_runtime::MultiAddress;
/// test currency transfer /// test currency transfer
/// (does not take fees into account because it's only calls, not extrinsics) /// (does not take fees into account because it's only calls, not extrinsics)
...@@ -115,3 +118,46 @@ fn test_transfer_funds_unavailable() { ...@@ -115,3 +118,46 @@ fn test_transfer_funds_unavailable() {
); );
}) })
} }
/// test balance transfer all with linked account not member
#[test]
fn test_transfer_all_linked_no_member() {
ExtBuilder::new(1, 3, 4)
.with_initial_balances(vec![(AccountKeyring::Alice.to_account_id(), 5_000)])
.build()
.execute_with(|| {
run_to_block(1);
let genesis_hash = System::block_hash(0);
let alice = AccountKeyring::Alice.to_account_id();
let ferdie = AccountKeyring::Ferdie.to_account_id();
let payload = (b"link", genesis_hash, 1u32, ferdie.clone()).encode();
let signature = AccountKeyring::Ferdie.sign(&payload);
assert_ok!(Balances::transfer_allow_death(
frame_system::RawOrigin::Signed(alice.clone()).into(),
MultiAddress::Id(ferdie.clone()),
1_000
));
// Ferdie's account can be linked to Alice identity
assert_ok!(Identity::link_account(
frame_system::RawOrigin::Signed(alice).into(),
ferdie.clone(),
signature.into()
));
assert_eq!(
frame_system::Pallet::<Runtime>::get(&ferdie).linked_idty,
Some(1)
);
assert_ok!(Balances::transfer_all(
frame_system::RawOrigin::Signed(ferdie.clone()).into(),
AccountKeyring::Bob.to_account_id().into(),
false
),);
assert_eq!(Balances::free_balance(ferdie.clone()), 0);
// During reaping the account is unlinked
assert!(frame_system::Pallet::<Runtime>::get(&ferdie)
.linked_idty
.is_none());
})
}
...@@ -22,6 +22,7 @@ mod common; ...@@ -22,6 +22,7 @@ mod common;
use common::*; use common::*;
use frame_support::assert_ok; use frame_support::assert_ok;
use frame_support::traits::OnIdle; use frame_support::traits::OnIdle;
use frame_support::traits::StoredMap;
use gdev_runtime::*; use gdev_runtime::*;
use sp_core::Encode; use sp_core::Encode;
use sp_core::Pair; use sp_core::Pair;
...@@ -191,3 +192,49 @@ fn test_no_refund() { ...@@ -191,3 +192,49 @@ fn test_no_refund() {
assert_eq!(Balances::free_balance(Treasury::account_id()), 100 + 3); assert_eq!(Balances::free_balance(Treasury::account_id()), 100 + 3);
}) })
} }
/// test refund on_idle when linked account is reaped
#[test]
fn test_refund_reaped_linked_account() {
ExtBuilder::new(1, 3, 4)
.with_initial_balances(vec![
(AccountKeyring::Alice.to_account_id(), 10_000),
(AccountKeyring::Ferdie.to_account_id(), 10_000),
])
.build()
.execute_with(|| {
let genesis_hash = System::block_hash(0);
let alice = AccountKeyring::Alice.to_account_id();
let ferdie = AccountKeyring::Ferdie.to_account_id();
let payload = (b"link", genesis_hash, 1u32, ferdie.clone()).encode();
let signature = AccountKeyring::Ferdie.sign(&payload);
// Ferdie's account can be linked to Alice identity
assert_ok!(Identity::link_account(
frame_system::RawOrigin::Signed(alice.clone()).into(),
ferdie.clone(),
signature.into()
));
assert_eq!(
frame_system::Pallet::<Runtime>::get(&ferdie).linked_idty,
Some(1)
);
// transfer_all call to extrinsic
let call = RuntimeCall::Balances(BalancesCall::transfer_all {
dest: AccountKeyring::Alice.to_account_id().into(),
keep_alive: false,
});
let xt = get_unchecked_extrinsic(call, 4u64, 8u64, AccountKeyring::Ferdie, 0u64);
assert_ok!(Executive::apply_extrinsic(xt));
assert_eq!(Balances::free_balance(ferdie.clone()), 0);
// During reaping the account is unlinked
assert!(frame_system::Pallet::<Runtime>::get(&ferdie)
.linked_idty
.is_none());
// since the account is reaped, it is not linked anymore and no refund is added to queue
assert!(pallet_quota::RefundQueue::<Runtime>::get().is_empty());
})
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment