diff --git a/currencies/src/lib.rs b/currencies/src/lib.rs index 29159df0d2ab8facc6c662c20817a1499813a2ea..db2fd9d440d58cb05cd92e9841ea0df26dbbf6a5 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 4cb1f8a027e4d4b5c72e87953ce30fc69f86a05a..f29e336b58a8ba04da9cd98ed18c822cdf11b4d4 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 1b2f040213fd44c8e4d106fc1eaf6b6a08dcc2fa..ff2c5cf020a4cd3f98ca5906dd4db82f3c347b1d 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 f3c74c66d7657813d15edb7ecb8bc96d585d86f4..0000000000000000000000000000000000000000 --- 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 a7034d58661de3072a51d3ca26f293085a72028e..c104368ffe115fedd3559863f9aebe99b4f14726 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 a8962dbcf946c3d010e195b4b1bfb56e0acae0ea..7ec0efb4aba61a07e86bbd07c36abde0cd4c23d5 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;