From 9d5621303de5b9035bee18992fed2aa61eed40ef Mon Sep 17 00:00:00 2001 From: Bryan Chen Date: Sun, 2 May 2021 16:37:09 +1200 Subject: [PATCH 1/2] rename MergeAccount to TransferAll --- currencies/src/lib.rs | 13 +++++-------- tokens/src/lib.rs | 13 ++++--------- tokens/src/tests.rs | 6 +++--- traits/src/account.rs | 19 ------------------- traits/src/currency.rs | 20 +++++++++++++++++++- traits/src/lib.rs | 1 - 6 files changed, 31 insertions(+), 41 deletions(-) delete mode 100644 traits/src/account.rs diff --git a/currencies/src/lib.rs b/currencies/src/lib.rs index 29159df0d..db2fd9d44 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> + IsType<::Event>; - type MultiCurrency: MergeAccount + type MultiCurrency: TransferAll + MultiCurrencyExtended + MultiLockableCurrency + MultiReservableCurrency; @@ -685,14 +685,11 @@ where } } -impl MergeAccount for Pallet { - fn merge_account(source: &T::AccountId, dest: &T::AccountId) -> DispatchResult { +impl TransferAll for Pallet { + 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 4cb1f8a02..315a6d7ab 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, }; @@ -1042,16 +1042,11 @@ where } } -impl MergeAccount for Pallet { +impl TransferAll for Pallet { #[transactional] - fn merge_account(source: &T::AccountId, dest: &T::AccountId) -> DispatchResult { + fn transfer_all(source: &T::AccountId, dest: &T::AccountId) -> DispatchResult { Accounts::::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::::StillHasActiveReserved); - - // transfer all free to recipient - >::transfer(currency_id, source, dest, account_data.free)?; - Ok(()) + >::transfer(currency_id, source, dest, account_data.free) }) } } diff --git a/tokens/src/tests.rs b/tokens/src/tests.rs index 1b2f04021..cea52d312 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_should_work() { ExtBuilder::default() .balances(vec![(ALICE, DOT, 100), (ALICE, BTC, 200)]) .build() @@ -442,12 +442,12 @@ fn merge_account_should_work() { assert_ok!(Tokens::reserve(DOT, &ALICE, 1)); assert_noop!( - Tokens::merge_account(&ALICE, &BOB), + Tokens::transfer_all(&ALICE, &BOB), Error::::StillHasActiveReserved ); Tokens::unreserve(DOT, &ALICE, 1); - assert_ok!(Tokens::merge_account(&ALICE, &BOB)); + assert_ok!(Tokens::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); diff --git a/traits/src/account.rs b/traits/src/account.rs deleted file mode 100644 index f3c74c66d..000000000 --- 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 { - fn merge_account(source: &AccountId, dest: &AccountId) -> DispatchResult; -} - -#[impl_for_tuples(5)] -impl MergeAccount 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 a7034d586..c104368ff 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 { impl OnDust for () { fn on_dust(_: &AccountId, _: CurrencyId, _: Balance) {} } + +pub trait TransferAll { + fn transfer_all(source: &AccountId, dest: &AccountId) -> DispatchResult; +} + +#[impl_trait_for_tuples::impl_for_tuples(5)] +impl TransferAll 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 a8962dbcf..7ec0efb4a 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; From d90a60c60a1df0a0881813b15e0f620b996c6b6c Mon Sep 17 00:00:00 2001 From: Bryan Chen Date: Sun, 2 May 2021 16:55:21 +1200 Subject: [PATCH 2/2] fix --- tokens/src/lib.rs | 2 -- tokens/src/tests.rs | 18 +++++++++--------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/tokens/src/lib.rs b/tokens/src/lib.rs index 315a6d7ab..f29e336b5 100644 --- a/tokens/src/lib.rs +++ b/tokens/src/lib.rs @@ -198,8 +198,6 @@ pub mod module { AmountIntoBalanceFailed, /// Failed because liquidity restrictions due to locking LiquidityRestrictions, - /// Account still has active reserved - StillHasActiveReserved, } #[pallet::event] diff --git a/tokens/src/tests.rs b/tokens/src/tests.rs index cea52d312..ff2c5cf02 100644 --- a/tokens/src/tests.rs +++ b/tokens/src/tests.rs @@ -431,7 +431,7 @@ fn no_op_if_amount_is_zero() { } #[test] -fn transfer_all_should_work() { +fn transfer_all_trait_should_work() { ExtBuilder::default() .balances(vec![(ALICE, DOT, 100), (ALICE, BTC, 200)]) .build() @@ -440,18 +440,18 @@ fn transfer_all_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::transfer_all(&ALICE, &BOB), - Error::::StillHasActiveReserved - ); - Tokens::unreserve(DOT, &ALICE, 1); - - assert_ok!(Tokens::transfer_all(&ALICE, &BOB)); + assert_ok!(>::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!(>::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); }); }