From 9f43dbf672b08625b0ea2fb6174dfa0661f8072d Mon Sep 17 00:00:00 2001
From: Xiliang Chen <xlchen1291@gmail.com>
Date: Sun, 2 May 2021 16:59:15 +1200
Subject: [PATCH] rename MergeAccount to TransferAll (#472)

* rename MergeAccount to TransferAll

* fix
---
 currencies/src/lib.rs  | 13 +++++--------
 tokens/src/lib.rs      | 15 ++++-----------
 tokens/src/tests.rs    | 18 +++++++++---------
 traits/src/account.rs  | 19 -------------------
 traits/src/currency.rs | 20 +++++++++++++++++++-
 traits/src/lib.rs      |  1 -
 6 files changed, 37 insertions(+), 49 deletions(-)
 delete mode 100644 traits/src/account.rs

diff --git a/currencies/src/lib.rs b/currencies/src/lib.rs
index 29159df..db2fd9d 100644
--- a/currencies/src/lib.rs
+++ b/currencies/src/lib.rs
@@ -49,8 +49,8 @@ use frame_support::{
 };
 use frame_system::{ensure_root, ensure_signed, pallet_prelude::*};
 use orml_traits::{
-	account::MergeAccount,
 	arithmetic::{Signed, SimpleArithmetic},
+	currency::TransferAll,
 	BalanceStatus, BasicCurrency, BasicCurrencyExtended, BasicLockableCurrency, BasicReservableCurrency,
 	LockIdentifier, MultiCurrency, MultiCurrencyExtended, MultiLockableCurrency, MultiReservableCurrency,
 };
@@ -94,7 +94,7 @@ pub mod module {
 	pub trait Config: frame_system::Config {
 		type Event: From<Event<Self>> + IsType<<Self as frame_system::Config>::Event>;
 
-		type MultiCurrency: MergeAccount<Self::AccountId>
+		type MultiCurrency: TransferAll<Self::AccountId>
 			+ MultiCurrencyExtended<Self::AccountId>
 			+ MultiLockableCurrency<Self::AccountId>
 			+ MultiReservableCurrency<Self::AccountId>;
@@ -685,14 +685,11 @@ where
 	}
 }
 
-impl<T: Config> MergeAccount<T::AccountId> for Pallet<T> {
-	fn merge_account(source: &T::AccountId, dest: &T::AccountId) -> DispatchResult {
+impl<T: Config> TransferAll<T::AccountId> for Pallet<T> {
+	fn transfer_all(source: &T::AccountId, dest: &T::AccountId) -> DispatchResult {
 		with_transaction_result(|| {
 			// transfer non-native free to dest
-			T::MultiCurrency::merge_account(source, dest)?;
-
-			// unreserve all reserved currency
-			T::NativeCurrency::unreserve(source, T::NativeCurrency::reserved_balance(source));
+			T::MultiCurrency::transfer_all(source, dest)?;
 
 			// transfer all free to dest
 			T::NativeCurrency::transfer(source, dest, T::NativeCurrency::free_balance(source))
diff --git a/tokens/src/lib.rs b/tokens/src/lib.rs
index 4cb1f8a..f29e336 100644
--- a/tokens/src/lib.rs
+++ b/tokens/src/lib.rs
@@ -51,8 +51,8 @@ use frame_support::{
 };
 use frame_system::{ensure_signed, pallet_prelude::*};
 use orml_traits::{
-	account::MergeAccount,
 	arithmetic::{self, Signed},
+	currency::TransferAll,
 	BalanceStatus, GetByKey, LockIdentifier, MultiCurrency, MultiCurrencyExtended, MultiLockableCurrency,
 	MultiReservableCurrency, OnDust,
 };
@@ -198,8 +198,6 @@ pub mod module {
 		AmountIntoBalanceFailed,
 		/// Failed because liquidity restrictions due to locking
 		LiquidityRestrictions,
-		/// Account still has active reserved
-		StillHasActiveReserved,
 	}
 
 	#[pallet::event]
@@ -1042,16 +1040,11 @@ where
 	}
 }
 
-impl<T: Config> MergeAccount<T::AccountId> for Pallet<T> {
+impl<T: Config> TransferAll<T::AccountId> for Pallet<T> {
 	#[transactional]
-	fn merge_account(source: &T::AccountId, dest: &T::AccountId) -> DispatchResult {
+	fn transfer_all(source: &T::AccountId, dest: &T::AccountId) -> DispatchResult {
 		Accounts::<T>::iter_prefix(source).try_for_each(|(currency_id, account_data)| -> DispatchResult {
-			// ensure the account has no active reserved of non-native token
-			ensure!(account_data.reserved.is_zero(), Error::<T>::StillHasActiveReserved);
-
-			// transfer all free to recipient
-			<Self as MultiCurrency<T::AccountId>>::transfer(currency_id, source, dest, account_data.free)?;
-			Ok(())
+			<Self as MultiCurrency<T::AccountId>>::transfer(currency_id, source, dest, account_data.free)
 		})
 	}
 }
diff --git a/tokens/src/tests.rs b/tokens/src/tests.rs
index 1b2f040..ff2c5cf 100644
--- a/tokens/src/tests.rs
+++ b/tokens/src/tests.rs
@@ -431,7 +431,7 @@ fn no_op_if_amount_is_zero() {
 }
 
 #[test]
-fn merge_account_should_work() {
+fn transfer_all_trait_should_work() {
 	ExtBuilder::default()
 		.balances(vec![(ALICE, DOT, 100), (ALICE, BTC, 200)])
 		.build()
@@ -440,18 +440,18 @@ fn merge_account_should_work() {
 			assert_eq!(Tokens::free_balance(BTC, &ALICE), 200);
 			assert_eq!(Tokens::free_balance(DOT, &BOB), 0);
 
-			assert_ok!(Tokens::reserve(DOT, &ALICE, 1));
-			assert_noop!(
-				Tokens::merge_account(&ALICE, &BOB),
-				Error::<Runtime>::StillHasActiveReserved
-			);
-			Tokens::unreserve(DOT, &ALICE, 1);
-
-			assert_ok!(Tokens::merge_account(&ALICE, &BOB));
+			assert_ok!(<Tokens as TransferAll<AccountId>>::transfer_all(&ALICE, &BOB));
 			assert_eq!(Tokens::free_balance(DOT, &ALICE), 0);
 			assert_eq!(Tokens::free_balance(BTC, &ALICE), 0);
 			assert_eq!(Tokens::free_balance(DOT, &BOB), 100);
 			assert_eq!(Tokens::free_balance(BTC, &BOB), 200);
+
+			assert_ok!(Tokens::reserve(DOT, &BOB, 1));
+			assert_ok!(<Tokens as TransferAll<AccountId>>::transfer_all(&BOB, &ALICE));
+			assert_eq!(Tokens::free_balance(DOT, &ALICE), 99);
+			assert_eq!(Tokens::free_balance(BTC, &ALICE), 200);
+			assert_eq!(Tokens::free_balance(DOT, &BOB), 0);
+			assert_eq!(Tokens::free_balance(BTC, &BOB), 0);
 		});
 }
 
diff --git a/traits/src/account.rs b/traits/src/account.rs
deleted file mode 100644
index f3c74c6..0000000
--- a/traits/src/account.rs
+++ /dev/null
@@ -1,19 +0,0 @@
-use impl_trait_for_tuples::impl_for_tuples;
-use orml_utilities::with_transaction_result;
-use sp_runtime::DispatchResult;
-
-pub trait MergeAccount<AccountId> {
-	fn merge_account(source: &AccountId, dest: &AccountId) -> DispatchResult;
-}
-
-#[impl_for_tuples(5)]
-impl<AccountId> MergeAccount<AccountId> for Tuple {
-	fn merge_account(source: &AccountId, dest: &AccountId) -> DispatchResult {
-		with_transaction_result(|| {
-			for_tuples!( #( {
-                Tuple::merge_account(source, dest)?;
-            } )* );
-			Ok(())
-		})
-	}
-}
diff --git a/traits/src/currency.rs b/traits/src/currency.rs
index a7034d5..c104368 100644
--- a/traits/src/currency.rs
+++ b/traits/src/currency.rs
@@ -1,6 +1,9 @@
 use crate::arithmetic;
 use codec::{Codec, FullCodec};
-pub use frame_support::traits::{BalanceStatus, LockIdentifier};
+pub use frame_support::{
+	traits::{BalanceStatus, LockIdentifier},
+	transactional,
+};
 use sp_runtime::{
 	traits::{AtLeast32BitUnsigned, MaybeSerializeDeserialize},
 	DispatchError, DispatchResult,
@@ -341,3 +344,18 @@ pub trait OnDust<AccountId, CurrencyId, Balance> {
 impl<AccountId, CurrencyId, Balance> OnDust<AccountId, CurrencyId, Balance> for () {
 	fn on_dust(_: &AccountId, _: CurrencyId, _: Balance) {}
 }
+
+pub trait TransferAll<AccountId> {
+	fn transfer_all(source: &AccountId, dest: &AccountId) -> DispatchResult;
+}
+
+#[impl_trait_for_tuples::impl_for_tuples(5)]
+impl<AccountId> TransferAll<AccountId> for Tuple {
+	#[transactional]
+	fn transfer_all(source: &AccountId, dest: &AccountId) -> DispatchResult {
+		for_tuples!( #( {
+			Tuple::transfer_all(source, dest)?;
+		} )* );
+		Ok(())
+	}
+}
diff --git a/traits/src/lib.rs b/traits/src/lib.rs
index a8962db..7ec0efb 100644
--- a/traits/src/lib.rs
+++ b/traits/src/lib.rs
@@ -22,7 +22,6 @@ pub use nft::NFT;
 pub use price::{DefaultPriceProvider, PriceProvider};
 pub use rewards::RewardHandler;
 
-pub mod account;
 pub mod arithmetic;
 pub mod auction;
 pub mod currency;
-- 
GitLab