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