From 6e963dfdf3afe96dbc453812931010e4a42c414e Mon Sep 17 00:00:00 2001 From: clearloop Date: Tue, 14 Sep 2021 20:55:45 +0800 Subject: [PATCH 01/11] feat(asset-index): remove register logic in add asset --- pallets/asset-index/src/lib.rs | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/pallets/asset-index/src/lib.rs b/pallets/asset-index/src/lib.rs index 4b08cbc846..d411dc370c 100644 --- a/pallets/asset-index/src/lib.rs +++ b/pallets/asset-index/src/lib.rs @@ -352,10 +352,9 @@ pub mod pallet { origin: OriginFor, asset_id: T::AssetId, units: T::Balance, - location: MultiLocation, amount: T::Balance, ) -> DispatchResultWithPostInfo { - Self::do_add_asset(T::AdminOrigin::ensure_origin(origin)?, asset_id, units, location, amount) + Self::do_add_asset(T::AdminOrigin::ensure_origin(origin)?, asset_id, units, amount) } /// Add liquid asset with root origin, see `add_asset` @@ -364,12 +363,11 @@ pub mod pallet { origin: OriginFor, asset_id: T::AssetId, units: T::Balance, - location: MultiLocation, amount: T::Balance, recipient: T::AccountId, ) -> DispatchResultWithPostInfo { ensure_root(origin)?; - Self::do_add_asset(recipient, asset_id, units, location, amount) + Self::do_add_asset(recipient, asset_id, units, amount) } /// Dispatches transfer to move assets out of the index’s account, @@ -647,8 +645,8 @@ pub mod pallet { .into_iter() .filter_map(|mut redemption| { // only try to close if the lockup period is over - if redemption.end_block >= current_block && - Self::do_complete_redemption(&caller, &mut redemption.assets) + if redemption.end_block >= current_block + && Self::do_complete_redemption(&caller, &mut redemption.assets) { // all individual redemptions withdrawn, can remove them from storage Self::deposit_event(Event::WithdrawalCompleted(caller.clone(), redemption.assets)); @@ -754,32 +752,15 @@ pub mod pallet { recipient: T::AccountId, asset_id: T::AssetId, units: T::Balance, - location: MultiLocation, amount: T::Balance, ) -> DispatchResultWithPostInfo { if units.is_zero() { return Ok(().into()); } - let availability = AssetAvailability::Liquid(location); - - // check whether this is a new asset and make sure locations match otherwise - let is_new_asset = if let Some(asset) = Assets::::get(&asset_id) { - ensure!(asset == availability, Error::::AssetAlreadyExists); - false - } else { - true - }; - // transfer the caller's fund into the treasury account Self::add_liquid(&recipient, asset_id, units, amount)?; - // register asset if not yet known - if is_new_asset { - Assets::::insert(asset_id, availability.clone()); - Self::deposit_event(Event::AssetRegistered(asset_id, availability)); - } - Self::deposit_event(Event::AssetAdded(asset_id, units, recipient, amount)); Ok(().into()) } From 6326e38e481217f2f639d84661dacbc63f4aa0d6 Mon Sep 17 00:00:00 2001 From: clearloop Date: Tue, 14 Sep 2021 21:03:19 +0800 Subject: [PATCH 02/11] feat(asset-index): prevent add non-registered assets --- pallets/asset-index/src/lib.rs | 8 ++++++++ pallets/asset-index/src/tests.rs | 7 +++++++ 2 files changed, 15 insertions(+) diff --git a/pallets/asset-index/src/lib.rs b/pallets/asset-index/src/lib.rs index d411dc370c..716cd1ed7d 100644 --- a/pallets/asset-index/src/lib.rs +++ b/pallets/asset-index/src/lib.rs @@ -319,6 +319,8 @@ pub mod pallet { NoPendingWithdrawals, /// Thrown if the asset that should be added is already registered AssetAlreadyExists, + /// Thrown if the asset that should be added has not been registered. + AssetNotExists, /// This gets thrown if the total supply of index tokens is 0 so no NAV can be calculated to /// determine the Asset/Index Token rate. InsufficientIndexTokens, @@ -415,6 +417,9 @@ pub mod pallet { ) -> DispatchResult { T::AdminOrigin::ensure_origin(origin)?; + // native asset can't be added + Self::ensure_not_native_asset(&asset_id)?; + Assets::::try_mutate(asset_id, |maybe_available| -> DispatchResult { // allow new assets only ensure!(maybe_available.replace(availability.clone()).is_none(), Error::::AssetAlreadyExists); @@ -754,6 +759,8 @@ pub mod pallet { units: T::Balance, amount: T::Balance, ) -> DispatchResultWithPostInfo { + >::get(&asset_id).ok_or(>::AssetNotExists)?; + if units.is_zero() { return Ok(().into()); } @@ -1136,6 +1143,7 @@ pub mod pallet { let origin = T::AdminOrigin::successful_origin(); let origin_account_id = T::AdminOrigin::ensure_origin(origin.clone()).unwrap(); T::PriceFeedBenchmarks::create_feed(origin_account_id, asset_id)?; + Self::register_asset(T::AdminOrigin::successful_origin(), asset_id, location)?; Self::add_asset(T::AdminOrigin::successful_origin(), asset_id, units, location, amount) } } diff --git a/pallets/asset-index/src/tests.rs b/pallets/asset-index/src/tests.rs index d0f0264baf..b63dcfbc16 100644 --- a/pallets/asset-index/src/tests.rs +++ b/pallets/asset-index/src/tests.rs @@ -16,9 +16,16 @@ use primitives::{ use crate as pallet; use crate::{mock::*, types::DepositRange}; +#[test] +fn can_register_asset() { + assert_ok!(AssetIndex::register_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, MultiLocation::Null)); + assert_eq!(>::get(ASSET_A_ID), MultiLocation::Null); +} + #[test] fn can_add_asset() { new_test_ext().execute_with(|| { + assert_ok!(AssetIndex::register_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, MultiLocation::Null)); assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, MultiLocation::Null, 5)); assert_eq!(pallet::Assets::::get(ASSET_A_ID), Some(AssetAvailability::Liquid(MultiLocation::Null))); assert_eq!(AssetIndex::index_total_asset_balance(ASSET_A_ID), 100); From 3514e5cff72dbff650b9613e626979441e8ec28c Mon Sep 17 00:00:00 2001 From: clearloop Date: Wed, 15 Sep 2021 11:44:09 +0800 Subject: [PATCH 03/11] feat(e2e): updates register_asset in benchmarks --- pallets/asset-index/src/benchmarking.rs | 34 +++++++++++++++++++++---- pallets/asset-index/src/lib.rs | 8 +++--- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/pallets/asset-index/src/benchmarking.rs b/pallets/asset-index/src/benchmarking.rs index ac6804b2bd..4a46010713 100644 --- a/pallets/asset-index/src/benchmarking.rs +++ b/pallets/asset-index/src/benchmarking.rs @@ -29,10 +29,17 @@ benchmarks! { let origin = T::AdminOrigin::successful_origin(); let million = 1_000_000u32.into(); let location = MultiLocation::Null; + + assert_ok!( + >::register_asset( + origin.clone(), + asset_id, + AssetAvailability::Liquid(MultiLocation::Null) + ) + ); let call = Call::::add_asset( asset_id, million, - location.clone(), million ); @@ -56,11 +63,15 @@ benchmarks! { let deposit_units = 1000_u32.into(); // create liquid assets + assert_ok!(>::register_asset( + origin.clone(), + asset_id, + AssetAvailability::Liquid(MultiLocation::Null) + )); assert_ok!(>::add_asset( origin.clone(), asset_id, units, - MultiLocation::Null, tokens )); @@ -95,11 +106,15 @@ benchmarks! { let admin_deposit = 1_000_000u32; let units = 1_000u32.into(); + assert_ok!(>::register_asset( + origin.clone(), + asset_id, + AssetAvailability::Liquid(MultiLocation::Null) + )); assert_ok!(AssetIndex::::add_asset( origin.clone(), asset_id, 100u32.into(), - MultiLocation::Null, admin_deposit.into(), )); @@ -208,11 +223,15 @@ benchmarks! { let deposit_units = 1_000_u32.into(); // create liquid assets + assert_ok!(>::register_asset( + origin.clone(), + asset_id, + AssetAvailability::Liquid(MultiLocation::Null) + )); assert_ok!(>::add_asset( origin.clone(), asset_id, units, - MultiLocation::Null, tokens )); @@ -245,7 +264,12 @@ benchmarks! { // create price feed T::PriceFeedBenchmarks::create_feed(origin_account_id.clone(), asset_id).unwrap(); - assert_ok!(AssetIndex::::add_asset(origin.clone(), asset_id, units, MultiLocation::Null, amount)); + assert_ok!(>::register_asset( + origin.clone(), + asset_id, + AssetAvailability::Liquid(MultiLocation::Null) + )); + assert_ok!(AssetIndex::::add_asset(origin.clone(), asset_id, units, amount)); assert_ok!(T::Currency::deposit(asset_id, &origin_account_id, units)); assert_ok!(>::deposit(origin.clone(), asset_id, units)); diff --git a/pallets/asset-index/src/lib.rs b/pallets/asset-index/src/lib.rs index 716cd1ed7d..07f3612749 100644 --- a/pallets/asset-index/src/lib.rs +++ b/pallets/asset-index/src/lib.rs @@ -650,8 +650,8 @@ pub mod pallet { .into_iter() .filter_map(|mut redemption| { // only try to close if the lockup period is over - if redemption.end_block >= current_block - && Self::do_complete_redemption(&caller, &mut redemption.assets) + if redemption.end_block >= current_block && + Self::do_complete_redemption(&caller, &mut redemption.assets) { // all individual redemptions withdrawn, can remove them from storage Self::deposit_event(Event::WithdrawalCompleted(caller.clone(), redemption.assets)); @@ -1143,8 +1143,8 @@ pub mod pallet { let origin = T::AdminOrigin::successful_origin(); let origin_account_id = T::AdminOrigin::ensure_origin(origin.clone()).unwrap(); T::PriceFeedBenchmarks::create_feed(origin_account_id, asset_id)?; - Self::register_asset(T::AdminOrigin::successful_origin(), asset_id, location)?; - Self::add_asset(T::AdminOrigin::successful_origin(), asset_id, units, location, amount) + Self::register_asset(T::AdminOrigin::successful_origin(), asset_id, AssetAvailability::Liquid(location))?; + Self::add_asset(T::AdminOrigin::successful_origin(), asset_id, units, amount) } } From 23fa019e184dba755cfec6ded9759fe82559c639 Mon Sep 17 00:00:00 2001 From: clearloop Date: Wed, 15 Sep 2021 12:43:06 +0800 Subject: [PATCH 04/11] feat(e2e): updates the e2e tests about the register call --- js/e2e/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/js/e2e/index.ts b/js/e2e/index.ts index fc42a8c1dd..e9bece4ab6 100644 --- a/js/e2e/index.ts +++ b/js/e2e/index.ts @@ -326,7 +326,6 @@ const TESTS = (api: ApiPromise, config: ExtrinsicConfig): Extrinsic[] => { args: [ ASSET_ID_A, PINT.mul(ASSET_ID_A_UNITS), - PARENT_LOCATION, PINT.mul(ASSET_ID_A_AMOUNT), ], verify: async (before: Balance) => { From 837495946e24d449fd7f4673142645a249826845 Mon Sep 17 00:00:00 2001 From: clearloop Date: Wed, 15 Sep 2021 13:38:13 +0800 Subject: [PATCH 05/11] feat(e2e): fix related tests about the register call --- pallets/asset-index/src/lib.rs | 10 +- pallets/asset-index/src/tests.rs | 141 +++++++++++++++------- pallets/remote-asset-manager/src/tests.rs | 8 +- pallets/saft-registry/src/mock.rs | 7 +- 4 files changed, 116 insertions(+), 50 deletions(-) diff --git a/pallets/asset-index/src/lib.rs b/pallets/asset-index/src/lib.rs index 1289e61b17..67e1a486c6 100644 --- a/pallets/asset-index/src/lib.rs +++ b/pallets/asset-index/src/lib.rs @@ -1145,7 +1145,15 @@ pub mod pallet { let origin_account_id = T::AdminOrigin::ensure_origin(origin.clone()).unwrap(); T::PriceFeedBenchmarks::create_feed(origin_account_id, asset_id)?; - Self::register_asset(T::AdminOrigin::successful_origin(), asset_id, AssetAvailability::Liquid(location))?; + + // the tests of benchmarks register assets by default + if >::get(asset_id).is_none() { + Self::register_asset( + T::AdminOrigin::successful_origin(), + asset_id, + AssetAvailability::Liquid(location), + )?; + } Self::add_asset(T::AdminOrigin::successful_origin(), asset_id, units, amount) } diff --git a/pallets/asset-index/src/tests.rs b/pallets/asset-index/src/tests.rs index b63dcfbc16..1443c05b55 100644 --- a/pallets/asset-index/src/tests.rs +++ b/pallets/asset-index/src/tests.rs @@ -18,15 +18,35 @@ use crate::{mock::*, types::DepositRange}; #[test] fn can_register_asset() { - assert_ok!(AssetIndex::register_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, MultiLocation::Null)); - assert_eq!(>::get(ASSET_A_ID), MultiLocation::Null); + new_test_ext().execute_with(|| { + assert_ok!(AssetIndex::register_asset( + Origin::signed(ACCOUNT_ID), + ASSET_A_ID, + AssetAvailability::Liquid(MultiLocation::Null) + )); + assert_eq!(>::get(ASSET_A_ID), Some(AssetAvailability::Liquid(MultiLocation::Null))); + }) +} + +#[test] +fn cannot_add_asset_before_register() { + new_test_ext().execute_with(|| { + assert_noop!( + AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, 5), + pallet::Error::::AssetNotExists, + ); + }) } #[test] fn can_add_asset() { new_test_ext().execute_with(|| { - assert_ok!(AssetIndex::register_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, MultiLocation::Null)); - assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, MultiLocation::Null, 5)); + assert_ok!(AssetIndex::register_asset( + Origin::signed(ACCOUNT_ID), + ASSET_A_ID, + AssetAvailability::Liquid(MultiLocation::Null) + )); + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, 5)); assert_eq!(pallet::Assets::::get(ASSET_A_ID), Some(AssetAvailability::Liquid(MultiLocation::Null))); assert_eq!(AssetIndex::index_total_asset_balance(ASSET_A_ID), 100); @@ -41,7 +61,11 @@ fn can_add_asset() { fn native_asset_disallowed() { new_test_ext().execute_with(|| { assert_noop!( - AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), PINT_ASSET_ID, 100, MultiLocation::Null, 5), + AssetIndex::register_asset( + Origin::signed(ACCOUNT_ID), + PINT_ASSET_ID, + AssetAvailability::Liquid(MultiLocation::Null) + ), pallet::Error::::NativeAssetDisallowed ); }); @@ -50,8 +74,13 @@ fn native_asset_disallowed() { #[test] fn can_add_asset_twice_and_units_accumulate() { new_test_ext().execute_with(|| { - assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, MultiLocation::Null, 5)); - assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, MultiLocation::Null, 5)); + assert_ok!(AssetIndex::register_asset( + Origin::signed(ACCOUNT_ID), + ASSET_A_ID, + AssetAvailability::Liquid(MultiLocation::Null) + )); + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, 5)); + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, 5)); assert_eq!(pallet::Assets::::get(ASSET_A_ID), Some(AssetAvailability::Liquid(MultiLocation::Null))); assert_eq!(AssetIndex::index_total_asset_balance(ASSET_A_ID), 200); assert_eq!(Balances::free_balance(ACCOUNT_ID), 10); @@ -114,11 +143,15 @@ fn can_add_saft() { // we first need to contribute some assets in order to mint an intial supply of pint let initial_liquid_supply = 1_000; let initial_tokens = 2_0000; + assert_ok!(AssetIndex::register_asset( + Origin::signed(ACCOUNT_ID), + ASSET_A_ID, + AssetAvailability::Liquid(MultiLocation::Null) + )); assert_ok!(AssetIndex::add_asset( Origin::signed(ACCOUNT_ID), ASSET_A_ID, initial_liquid_supply, - MultiLocation::Null, initial_tokens )); let index_token_supply = AssetIndex::index_token_issuance(); @@ -146,7 +179,12 @@ fn can_add_saft() { fn add_saft_fails_on_liquid_already_registered() { let balance = vec![(ACCOUNT_ID, UNKNOWN_ASSET_ID, 1000)]; new_test_ext_with_balance(balance).execute_with(|| { - assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), UNKNOWN_ASSET_ID, 100, MultiLocation::Null, 5)); + assert_ok!(AssetIndex::register_asset( + Origin::signed(ACCOUNT_ID), + UNKNOWN_ASSET_ID, + AssetAvailability::Liquid(MultiLocation::Null) + )); + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), UNKNOWN_ASSET_ID, 100, 5)); assert_noop!(AssetIndex::add_saft(&ACCOUNT_ID, UNKNOWN_ASSET_ID, 100, 5), pallet::Error::::ExpectedSAFT); }) } @@ -162,11 +200,15 @@ fn deposit_only_works_for_added_liquid_assets() { // mint and intial supply of pint let initial_liquid_supply = 1_000; let initial_tokens = 2_0000; + assert_ok!(AssetIndex::register_asset( + Origin::signed(ACCOUNT_ID), + ASSET_A_ID, + AssetAvailability::Liquid(MultiLocation::Null) + )); assert_ok!(AssetIndex::add_asset( Origin::signed(ACCOUNT_ID), ASSET_A_ID, initial_liquid_supply, - MultiLocation::Null, initial_tokens )); @@ -192,7 +234,12 @@ fn deposit_fail_for_native_asset() { #[test] fn deposit_fails_for_unknown_assets() { new_test_ext().execute_with(|| { - assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, MultiLocation::Null, 5)); + assert_ok!(AssetIndex::register_asset( + Origin::signed(ACCOUNT_ID), + ASSET_A_ID, + AssetAvailability::Liquid(MultiLocation::Null) + )); + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, 5)); assert_noop!( AssetIndex::deposit(Origin::signed(ASHLEY), UNKNOWN_ASSET_ID, 1_000), pallet::Error::::UnsupportedAsset @@ -212,13 +259,12 @@ fn can_calculate_nav_upon_deposit() { let index_token_units = 5; let asset_amount = 100; let asset_price = MockPriceFeed::get_price(ASSET_A_ID).unwrap(); - assert_ok!(AssetIndex::add_asset( + assert_ok!(AssetIndex::register_asset( Origin::signed(ACCOUNT_ID), ASSET_A_ID, - asset_amount, - MultiLocation::Null, - index_token_units + AssetAvailability::Liquid(MultiLocation::Null) )); + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, asset_amount, index_token_units)); // per token value (NAV) is now the value of all deposited assets over index token supply let nav = AssetIndex::nav().unwrap(); @@ -313,13 +359,12 @@ fn can_calculate_random_nav() { fn deposit_works_with_user_balance() { new_test_ext().execute_with(|| { let initial_units = 1_000; - assert_ok!(AssetIndex::add_asset( + assert_ok!(AssetIndex::register_asset( Origin::signed(ACCOUNT_ID), ASSET_A_ID, - 100, - MultiLocation::Null, - initial_units + AssetAvailability::Liquid(MultiLocation::Null) )); + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, initial_units)); let nav = AssetIndex::nav().unwrap(); let deposit = 1_000; @@ -345,7 +390,12 @@ fn deposit_works_with_user_balance() { fn deposit_fail_for_unsupported_assets() { let balance = vec![(ACCOUNT_ID, UNKNOWN_ASSET_ID, 1000)]; new_test_ext_with_balance(balance).execute_with(|| { - assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), UNKNOWN_ASSET_ID, 100, MultiLocation::Null, 5)); + assert_ok!(AssetIndex::register_asset( + Origin::signed(ACCOUNT_ID), + UNKNOWN_ASSET_ID, + AssetAvailability::Liquid(MultiLocation::Null) + )); + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), UNKNOWN_ASSET_ID, 100, 5)); assert_ok!(Currency::deposit(UNKNOWN_ASSET_ID, &ASHLEY, 1_000)); assert_noop!( AssetIndex::deposit(Origin::signed(ASHLEY), UNKNOWN_ASSET_ID, 100), @@ -357,7 +407,12 @@ fn deposit_fail_for_unsupported_assets() { #[test] fn deposit_fails_on_missing_assets() { new_test_ext().execute_with(|| { - assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, MultiLocation::Null, 5)); + assert_ok!(AssetIndex::register_asset( + Origin::signed(ACCOUNT_ID), + ASSET_A_ID, + AssetAvailability::Liquid(MultiLocation::Null) + )); + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, 5)); assert_noop!( AssetIndex::deposit(Origin::signed(ASHLEY), ASSET_A_ID, Balance::MAX), @@ -406,14 +461,12 @@ fn deposit_fails_on_invalid_deposit_range() { let initial_units = 1_000; new_test_ext().execute_with(|| { - assert_ok!(AssetIndex::add_asset( + assert_ok!(AssetIndex::register_asset( Origin::signed(ACCOUNT_ID), ASSET_A_ID, - 100, - MultiLocation::Null, - initial_units + AssetAvailability::Liquid(MultiLocation::Null) )); - + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, initial_units)); assert_ok!(Currency::deposit(ASSET_A_ID, &ASHLEY, 100_000)); // fund account to cover index deposits @@ -444,13 +497,12 @@ fn deposit_fails_on_exceeding_limit() { let initial_units = 1_000; new_test_ext().execute_with(|| { - assert_ok!(AssetIndex::add_asset( + assert_ok!(AssetIndex::register_asset( Origin::signed(ACCOUNT_ID), ASSET_A_ID, - 100, - MultiLocation::Null, - initial_units + AssetAvailability::Liquid(MultiLocation::Null) )); + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, initial_units)); // fund account to cover index deposits assert_ok!(Currency::deposit(ASSET_A_ID, &ASHLEY, deposit)); @@ -472,13 +524,12 @@ fn redemption_fee_works_on_completing_withdraw() { let initial_units = 1_000; new_test_ext().execute_with(|| { - assert_ok!(AssetIndex::add_asset( + assert_ok!(AssetIndex::register_asset( Origin::signed(ACCOUNT_ID), ASSET_A_ID, - 100, - MultiLocation::Null, - initial_units + AssetAvailability::Liquid(MultiLocation::Null) )); + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, 100, initial_units)); assert_ok!(Currency::deposit(ASSET_A_ID, &ASHLEY, deposit)); for _ in 0..50 { assert_ok!(AssetIndex::deposit(Origin::signed(ASHLEY), ASSET_A_ID, initial_units / 50)); @@ -518,13 +569,12 @@ fn can_calculate_nav() { let index_token_units = 5; let saft_units = 50; - assert_ok!(AssetIndex::add_asset( + assert_ok!(AssetIndex::register_asset( Origin::signed(ACCOUNT_ID), ASSET_A_ID, - a_units, - MultiLocation::Null, - index_token_units + AssetAvailability::Liquid(MultiLocation::Null) )); + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, a_units, index_token_units)); assert_ok!(AssetIndex::add_saft(&ACCOUNT_ID, ASSET_B_ID, b_units, saft_units)); let total_supply = AssetIndex::index_token_issuance(); @@ -549,20 +599,19 @@ fn can_withdraw() { let b_tokens = 100; // create liquid assets - assert_ok!(AssetIndex::add_asset( + + assert_ok!(AssetIndex::register_asset( Origin::signed(ACCOUNT_ID), ASSET_A_ID, - a_units, - MultiLocation::Null, - a_tokens + AssetAvailability::Liquid(MultiLocation::Null) )); - assert_ok!(AssetIndex::add_asset( + assert_ok!(AssetIndex::register_asset( Origin::signed(ACCOUNT_ID), ASSET_B_ID, - b_units, - MultiLocation::Null, - b_tokens + AssetAvailability::Liquid(MultiLocation::Null) )); + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_A_ID, a_units, a_tokens)); + assert_ok!(AssetIndex::add_asset(Origin::signed(ACCOUNT_ID), ASSET_B_ID, b_units, b_tokens)); // deposit some funds into the index from an user account assert_ok!(Currency::deposit(ASSET_A_ID, &ASHLEY, 1_000)); diff --git a/pallets/remote-asset-manager/src/tests.rs b/pallets/remote-asset-manager/src/tests.rs index 192c0352d8..57c8db204a 100644 --- a/pallets/remote-asset-manager/src/tests.rs +++ b/pallets/remote-asset-manager/src/tests.rs @@ -21,7 +21,7 @@ use crate::{ }; use frame_support::traits::Hooks; use pallet_price_feed::PriceFeed; -use primitives::traits::NavProvider; +use primitives::{traits::NavProvider, AssetAvailability}; #[allow(unused)] fn print_events(context: &str) { @@ -50,11 +50,15 @@ fn register_relay() { // prepare index fund so NAV is available let deposit = 1_000; assert_ok!(orml_tokens::Pallet::::deposit(RELAY_CHAIN_ASSET, &ADMIN_ACCOUNT, 1_000)); + assert_ok!(pallet_asset_index::Pallet::::register_asset( + para::Origin::signed(ADMIN_ACCOUNT), + RELAY_CHAIN_ASSET, + AssetAvailability::Liquid(X1(Parent)), + )); assert_ok!(pallet_asset_index::Pallet::::add_asset( para::Origin::signed(ADMIN_ACCOUNT), RELAY_CHAIN_ASSET, deposit, - X1(Parent), deposit )); assert!(pallet_asset_index::Pallet::::is_liquid_asset(&RELAY_CHAIN_ASSET)); diff --git a/pallets/saft-registry/src/mock.rs b/pallets/saft-registry/src/mock.rs index da9c353b73..47924ea314 100644 --- a/pallets/saft-registry/src/mock.rs +++ b/pallets/saft-registry/src/mock.rs @@ -22,6 +22,7 @@ use pallet_price_feed::{AssetPricePair, Price, PriceFeed}; use xcm::v0::MultiLocation; use frame_support::traits::Everything; +use primitives::AssetAvailability; use sp_core::H256; use sp_runtime::{ testing::Header, @@ -226,11 +227,15 @@ pub fn new_test_ext() -> sp_io::TestExternalities { t.execute_with(|| { // mint and intial supply of pint let initial_liquid_supply = 1_000; + assert_ok!(AssetIndex::register_asset( + Origin::signed(ADMIN_ACCOUNT_ID), + LIQUID_ASSET_ID, + AssetAvailability::Liquid(MultiLocation::Null) + )); assert_ok!(AssetIndex::add_asset( Origin::signed(ADMIN_ACCOUNT_ID), LIQUID_ASSET_ID, initial_liquid_supply, - MultiLocation::Null, INDEX_TOKEN_SUPPLY, )); From 73a870359cc8ad8ed36e39351a88c24e94f4105f Mon Sep 17 00:00:00 2001 From: clearloop Date: Wed, 15 Sep 2021 16:44:18 +0800 Subject: [PATCH 06/11] chore(asset-index): updates docs in register_asset call --- pallets/asset-index/src/lib.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/asset-index/src/lib.rs b/pallets/asset-index/src/lib.rs index 67e1a486c6..2548c9ad83 100644 --- a/pallets/asset-index/src/lib.rs +++ b/pallets/asset-index/src/lib.rs @@ -417,7 +417,7 @@ pub mod pallet { ) -> DispatchResult { T::AdminOrigin::ensure_origin(origin)?; - // native asset can't be added + // native asset can't be registered Self::ensure_not_native_asset(&asset_id)?; Assets::::try_mutate(asset_id, |maybe_available| -> DispatchResult { From 1296ea790dff7573c01a46462265e08c9b9cdb85 Mon Sep 17 00:00:00 2001 From: clearloop Date: Fri, 17 Sep 2021 19:51:42 +0800 Subject: [PATCH 07/11] chore(asset-index): turbofish --- pallets/asset-index/src/benchmarking.rs | 4 ++-- pallets/asset-index/src/lib.rs | 4 ++-- pallets/asset-index/src/tests.rs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pallets/asset-index/src/benchmarking.rs b/pallets/asset-index/src/benchmarking.rs index a4bc40c1bf..88cce93b0d 100644 --- a/pallets/asset-index/src/benchmarking.rs +++ b/pallets/asset-index/src/benchmarking.rs @@ -31,7 +31,7 @@ benchmarks! { let location = MultiLocation::Null; assert_ok!( - >::register_asset( + AssetIndex::::register_asset( origin.clone(), asset_id, AssetAvailability::Liquid(MultiLocation::Null) @@ -63,7 +63,7 @@ benchmarks! { let deposit_units = 1000_u32.into(); // create liquid assets - assert_ok!(>::register_asset( + assert_ok!(AssetIndex::::register_asset( origin.clone(), asset_id, AssetAvailability::Liquid(MultiLocation::Null) diff --git a/pallets/asset-index/src/lib.rs b/pallets/asset-index/src/lib.rs index 2548c9ad83..c6392da357 100644 --- a/pallets/asset-index/src/lib.rs +++ b/pallets/asset-index/src/lib.rs @@ -759,7 +759,7 @@ pub mod pallet { units: T::Balance, amount: T::Balance, ) -> DispatchResultWithPostInfo { - >::get(&asset_id).ok_or(>::AssetNotExists)?; + >::get(&asset_id).ok_or(Error::::AssetNotExists)?; if units.is_zero() { return Ok(().into()); @@ -1147,7 +1147,7 @@ pub mod pallet { T::PriceFeedBenchmarks::create_feed(origin_account_id, asset_id)?; // the tests of benchmarks register assets by default - if >::get(asset_id).is_none() { + if Assets::::get(asset_id).is_none() { Self::register_asset( T::AdminOrigin::successful_origin(), asset_id, diff --git a/pallets/asset-index/src/tests.rs b/pallets/asset-index/src/tests.rs index 1443c05b55..196412fa4a 100644 --- a/pallets/asset-index/src/tests.rs +++ b/pallets/asset-index/src/tests.rs @@ -24,7 +24,7 @@ fn can_register_asset() { ASSET_A_ID, AssetAvailability::Liquid(MultiLocation::Null) )); - assert_eq!(>::get(ASSET_A_ID), Some(AssetAvailability::Liquid(MultiLocation::Null))); + assert_eq!(::get(ASSET_A_ID), Some(AssetAvailability::Liquid(MultiLocation::Null))); }) } From 026d2fd7333233a22f0266d1c3f096a2cb4e7a27 Mon Sep 17 00:00:00 2001 From: clearloop Date: Fri, 17 Sep 2021 21:53:10 +0800 Subject: [PATCH 08/11] chore(asset-index): fix typo --- pallets/asset-index/src/tests.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pallets/asset-index/src/tests.rs b/pallets/asset-index/src/tests.rs index 196412fa4a..24bce05865 100644 --- a/pallets/asset-index/src/tests.rs +++ b/pallets/asset-index/src/tests.rs @@ -24,7 +24,7 @@ fn can_register_asset() { ASSET_A_ID, AssetAvailability::Liquid(MultiLocation::Null) )); - assert_eq!(::get(ASSET_A_ID), Some(AssetAvailability::Liquid(MultiLocation::Null))); + assert_eq!(pallet::Assets::::get(ASSET_A_ID), Some(AssetAvailability::Liquid(MultiLocation::Null))); }) } From 489aeefd83067e93563f9ec7797daa6f49fec93d Mon Sep 17 00:00:00 2001 From: clearloop Date: Mon, 20 Sep 2021 17:01:43 +0800 Subject: [PATCH 09/11] chore(asset-index): turbo fish --- pallets/asset-index/src/benchmarking.rs | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/pallets/asset-index/src/benchmarking.rs b/pallets/asset-index/src/benchmarking.rs index 88cce93b0d..86de8da873 100644 --- a/pallets/asset-index/src/benchmarking.rs +++ b/pallets/asset-index/src/benchmarking.rs @@ -68,7 +68,7 @@ benchmarks! { asset_id, AssetAvailability::Liquid(MultiLocation::Null) )); - assert_ok!(>::add_asset( + assert_ok!(AssetIndex::::add_asset( origin.clone(), asset_id, units, @@ -80,7 +80,7 @@ benchmarks! { // deposit some funds into the index from an user account assert_ok!(T::Currency::deposit(asset_id, &origin_account_id, deposit_units)); - assert_ok!(>::deposit(origin.clone(), asset_id, deposit_units)); + assert_ok!(AssetIndex::::deposit(origin.clone(), asset_id, deposit_units)); // advance the block number so that the lock expires >::set_block_number( @@ -90,7 +90,7 @@ benchmarks! { ); // start withdraw - assert_ok!(>::withdraw( + assert_ok!(AssetIndex::::withdraw( origin.clone(), 42_u32.into(), )); @@ -106,7 +106,7 @@ benchmarks! { let admin_deposit = 1_000_000u32; let units = 1_000u32.into(); - assert_ok!(>::register_asset( + assert_ok!(AssetIndex::::register_asset( origin.clone(), asset_id, AssetAvailability::Liquid(MultiLocation::Null) @@ -223,12 +223,12 @@ benchmarks! { let deposit_units = 1_000_u32.into(); // create liquid assets - assert_ok!(>::register_asset( + assert_ok!(AssetIndex::::register_asset( origin.clone(), asset_id, AssetAvailability::Liquid(MultiLocation::Null) )); - assert_ok!(>::add_asset( + assert_ok!(AssetIndex::::add_asset( origin.clone(), asset_id, units, @@ -240,7 +240,7 @@ benchmarks! { // deposit some funds into the index from an user account assert_ok!(T::Currency::deposit(asset_id, &origin_account_id, deposit_units)); - assert_ok!(>::deposit(origin.clone(), asset_id, deposit_units)); + assert_ok!(AssetIndex::::deposit(origin.clone(), asset_id, deposit_units)); // advance the block number so that the lock expires >::set_block_number( @@ -264,20 +264,20 @@ benchmarks! { // create price feed T::PriceFeedBenchmarks::create_feed(origin_account_id.clone(), asset_id).unwrap(); - assert_ok!(>::register_asset( + assert_ok!(AssetIndex::::register_asset( origin.clone(), asset_id, AssetAvailability::Liquid(MultiLocation::Null) )); assert_ok!(AssetIndex::::add_asset(origin.clone(), asset_id, units, amount)); assert_ok!(T::Currency::deposit(asset_id, &origin_account_id, units)); - assert_ok!(>::deposit(origin.clone(), asset_id, units)); + assert_ok!(AssetIndex::::deposit(origin.clone(), asset_id, units)); let call = Call::::unlock(); }: { call.dispatch_bypass_filter(origin)? } verify { - assert_eq!(>::get(&origin_account_id), vec![types::IndexTokenLock{ - locked: >::index_token_equivalent(asset_id, units).unwrap(), - end_block: >::block_number() + T::LockupPeriod::get() - 1u32.into() + assert_eq!(pallet::IndexTokenLocks::::get(&origin_account_id), vec![types::IndexTokenLock{ + locked: AssetIndex::::index_token_equivalent(asset_id, units).unwrap(), + end_block: frame_system::Pallet::::block_number() + T::LockupPeriod::get() - 1u32.into() }]); } } From 86743a7e4906b2b8e315f04ff1787f1b6bdcfde1 Mon Sep 17 00:00:00 2001 From: clearloop Date: Mon, 20 Sep 2021 17:05:21 +0800 Subject: [PATCH 10/11] turbofish --- pallets/asset-index/src/lib.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pallets/asset-index/src/lib.rs b/pallets/asset-index/src/lib.rs index c6392da357..31d30a752e 100644 --- a/pallets/asset-index/src/lib.rs +++ b/pallets/asset-index/src/lib.rs @@ -650,8 +650,8 @@ pub mod pallet { .into_iter() .filter_map(|mut redemption| { // only try to close if the lockup period is over - if redemption.end_block >= current_block && - Self::do_complete_redemption(&caller, &mut redemption.assets) + if redemption.end_block >= current_block + && Self::do_complete_redemption(&caller, &mut redemption.assets) { // all individual redemptions withdrawn, can remove them from storage Self::deposit_event(Event::WithdrawalCompleted(caller.clone(), redemption.assets)); @@ -759,7 +759,7 @@ pub mod pallet { units: T::Balance, amount: T::Balance, ) -> DispatchResultWithPostInfo { - >::get(&asset_id).ok_or(Error::::AssetNotExists)?; + Assets::::get(&asset_id).ok_or(Error::::AssetNotExists)?; if units.is_zero() { return Ok(().into()); From a9b21337045229b9ede1f367322e7d46d65b769d Mon Sep 17 00:00:00 2001 From: clearloop Date: Mon, 20 Sep 2021 17:28:38 +0800 Subject: [PATCH 11/11] make clippy happy --- pallets/asset-index/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pallets/asset-index/src/lib.rs b/pallets/asset-index/src/lib.rs index 31d30a752e..1ab151c19b 100644 --- a/pallets/asset-index/src/lib.rs +++ b/pallets/asset-index/src/lib.rs @@ -650,8 +650,8 @@ pub mod pallet { .into_iter() .filter_map(|mut redemption| { // only try to close if the lockup period is over - if redemption.end_block >= current_block - && Self::do_complete_redemption(&caller, &mut redemption.assets) + if redemption.end_block >= current_block && + Self::do_complete_redemption(&caller, &mut redemption.assets) { // all individual redemptions withdrawn, can remove them from storage Self::deposit_event(Event::WithdrawalCompleted(caller.clone(), redemption.assets));