From 5efdab3b01affdf259f67661de71462ec7a3a143 Mon Sep 17 00:00:00 2001 From: Striker Date: Thu, 20 May 2021 15:56:03 +0530 Subject: [PATCH 1/3] wrapped LiquidityAssets and LiquidityPools in Options --- pallets/xyk/src/lib.rs | 22 +++++++++++----------- runtime/src/lib.rs | 13 +++++++++---- 2 files changed, 20 insertions(+), 15 deletions(-) diff --git a/pallets/xyk/src/lib.rs b/pallets/xyk/src/lib.rs index 23a5b5bfc0d38..28c45fddec67d 100644 --- a/pallets/xyk/src/lib.rs +++ b/pallets/xyk/src/lib.rs @@ -307,8 +307,8 @@ decl_storage! { Pools get(fn asset_pool): map hasher(opaque_blake2_256) (TokenId, TokenId) => Balance; - LiquidityAssets get(fn liquidity_asset): map hasher(opaque_blake2_256) (TokenId, TokenId) => TokenId; - LiquidityPools get(fn liquidity_pool): map hasher(opaque_blake2_256) TokenId => (TokenId, TokenId); + LiquidityAssets get(fn liquidity_asset): map hasher(opaque_blake2_256) (TokenId, TokenId) => Option; + LiquidityPools get(fn liquidity_pool): map hasher(opaque_blake2_256) TokenId => Option<(TokenId, TokenId)>; Treasury get(fn treasury): map hasher(opaque_blake2_256) TokenId => Balance; TreasuryBurn get(fn treasury_burn): map hasher(opaque_blake2_256) TokenId => Balance; @@ -624,7 +624,7 @@ decl_module! { let liquidity_asset_id = Self::get_liquidity_asset( first_asset_id, second_asset_id - ); + )?; // Ensure pool exists ensure!( @@ -725,7 +725,7 @@ decl_module! { // Get token reserves and liquidity asset id let first_asset_reserve = Pools::get((first_asset_id, second_asset_id)); let second_asset_reserve = Pools::get((second_asset_id, first_asset_id)); - let liquidity_asset_id = Self::get_liquidity_asset(first_asset_id, second_asset_id); + let liquidity_asset_id = Self::get_liquidity_asset(first_asset_id, second_asset_id)?; // Ensure user has enought liquidity tokens to burn ensure!( @@ -742,7 +742,7 @@ decl_module! { new_balance.into()).or(Err(Error::::NotEnoughAssets))?; // Calculate first and second token amounts depending on liquidity amount to burn - let (first_asset_amount, second_asset_amount) = Self::get_burn_amount(first_asset_id, second_asset_id, liquidity_asset_amount); + let (first_asset_amount, second_asset_amount) = Self::get_burn_amount(first_asset_id, second_asset_id, liquidity_asset_amount)?; let total_liquidity_assets: Balance = T::Currency::total_issuance(liquidity_asset_id.into()).into(); // If all liquidity assets are being burned then @@ -868,11 +868,11 @@ impl Module { result.saturated_into::().saturated_into::() } - pub fn get_liquidity_asset(first_asset_id: TokenId, second_asset_id: TokenId) -> TokenId { + pub fn get_liquidity_asset(first_asset_id: TokenId, second_asset_id: TokenId) -> Result { if LiquidityAssets::contains_key((first_asset_id, second_asset_id)) { - LiquidityAssets::get((first_asset_id, second_asset_id)) + LiquidityAssets::get((first_asset_id, second_asset_id)).ok_or_else(|| Error::::UnexpectedFailure.into()) } else { - LiquidityAssets::get((second_asset_id, first_asset_id)) + LiquidityAssets::get((second_asset_id, first_asset_id)).ok_or_else(|| Error::::NoSuchPool.into()) } } @@ -881,9 +881,9 @@ impl Module { first_asset_id: TokenId, second_asset_id: TokenId, liquidity_asset_amount: Balance, - ) -> (Balance, Balance) { + ) -> Result<(Balance, Balance), DispatchError> { // Get token reserves and liquidity asset id - let liquidity_asset_id = Self::get_liquidity_asset(first_asset_id, second_asset_id); + let liquidity_asset_id = Self::get_liquidity_asset(first_asset_id, second_asset_id)?; let first_asset_reserve_u256: U256 = Pools::get((first_asset_id, second_asset_id)) .saturated_into::() .into(); @@ -911,7 +911,7 @@ impl Module { .saturated_into::() .saturated_into::(); - (first_asset_amount, second_asset_amount) + Ok((first_asset_amount, second_asset_amount)) } //TODO U256? diff --git a/runtime/src/lib.rs b/runtime/src/lib.rs index 97620426341a5..9a1b2e5f599b1 100644 --- a/runtime/src/lib.rs +++ b/runtime/src/lib.rs @@ -742,10 +742,15 @@ impl_runtime_apis! { second_asset_id: TokenId, liquidity_asset_amount: Balance ) -> RpcAmountsResult { - let (first_asset_amount, second_asset_amount) = Xyk::get_burn_amount(first_asset_id, second_asset_id, liquidity_asset_amount); - RpcAmountsResult{ - first_asset_amount, - second_asset_amount + match Xyk::get_burn_amount(first_asset_id, second_asset_id, liquidity_asset_amount){ + Ok((first_asset_amount, second_asset_amount)) => RpcAmountsResult{ + first_asset_amount, + second_asset_amount + }, + Err(_) => RpcAmountsResult{ + first_asset_amount: 0u32.into(), + second_asset_amount: 0u32.into() + }, } } } From 022a10dab760672bc8411b467f58bf3516d8d3a9 Mon Sep 17 00:00:00 2001 From: Striker Date: Fri, 28 May 2021 19:37:43 +0530 Subject: [PATCH 2/3] updated --- pallets/staking/src/testing_utils.rs | 1 + pallets/xyk/src/lib.rs | 51 +++++++++++++++++----------- 2 files changed, 33 insertions(+), 19 deletions(-) diff --git a/pallets/staking/src/testing_utils.rs b/pallets/staking/src/testing_utils.rs index b933fb8920505..8d0bc7dd485f4 100644 --- a/pallets/staking/src/testing_utils.rs +++ b/pallets/staking/src/testing_utils.rs @@ -56,6 +56,7 @@ pub fn create_funded_user( liquidity_token_id.into(), balance.into(), ) + .unwrap() .into(); let first_asset_id: u32 = first_asset_id.into(); diff --git a/pallets/xyk/src/lib.rs b/pallets/xyk/src/lib.rs index 7820ee8882269..68aafc55dc042 100644 --- a/pallets/xyk/src/lib.rs +++ b/pallets/xyk/src/lib.rs @@ -475,11 +475,16 @@ impl Module { result.saturated_into::().saturated_into::() } - pub fn get_liquidity_asset(first_asset_id: TokenId, second_asset_id: TokenId) -> Result { + pub fn get_liquidity_asset( + first_asset_id: TokenId, + second_asset_id: TokenId, + ) -> Result { if LiquidityAssets::contains_key((first_asset_id, second_asset_id)) { - LiquidityAssets::get((first_asset_id, second_asset_id)).ok_or_else(|| Error::::UnexpectedFailure.into()) + LiquidityAssets::get((first_asset_id, second_asset_id)) + .ok_or_else(|| Error::::UnexpectedFailure.into()) } else { - LiquidityAssets::get((second_asset_id, first_asset_id)).ok_or_else(|| Error::::NoSuchPool.into()) + LiquidityAssets::get((second_asset_id, first_asset_id)) + .ok_or_else(|| Error::::NoSuchPool.into()) } } @@ -692,12 +697,15 @@ pub trait XykFunctionsTrait { fn get_tokens_required_for_minting( liquidity_asset_id: Self::CurrencyId, liquidity_token_amount: Self::Balance, - ) -> ( - Self::CurrencyId, - Self::Balance, - Self::CurrencyId, - Self::Balance, - ); + ) -> Result< + ( + Self::CurrencyId, + Self::Balance, + Self::CurrencyId, + Self::Balance, + ), + DispatchError, + >; } impl XykFunctionsTrait for Module { @@ -1220,13 +1228,17 @@ impl XykFunctionsTrait for Module { fn get_tokens_required_for_minting( liquidity_asset_id: Self::CurrencyId, liquidity_token_amount: Self::Balance, - ) -> ( - Self::CurrencyId, - Self::Balance, - Self::CurrencyId, - Self::Balance, - ) { - let (first_asset_id, second_asset_id) = LiquidityPools::get(liquidity_asset_id); + ) -> Result< + ( + Self::CurrencyId, + Self::Balance, + Self::CurrencyId, + Self::Balance, + ), + DispatchError, + > { + let (first_asset_id, second_asset_id) = LiquidityPools::get(liquidity_asset_id) + .ok_or_else(|| Error::::NoSuchLiquidityAsset)?; let first_asset_reserve = Pools::get((first_asset_id, second_asset_id)); let second_asset_reserve = Pools::get((second_asset_id, first_asset_id)); let total_liquidity_assets: Balance = @@ -1253,12 +1265,12 @@ impl XykFunctionsTrait for Module { .saturated_into::() .saturated_into::(); - ( + Ok(( first_asset_id, first_asset_amount, second_asset_id, second_asset_amount, - ) + )) } } @@ -1307,7 +1319,8 @@ impl Valuate for Module { fn get_liquidity_token_mng_pool( liquidity_token_id: Self::CurrencyId, ) -> Result<(Self::CurrencyId, Self::CurrencyId), DispatchError> { - let (first_token_id, second_token_id) = LiquidityPools::get(liquidity_token_id); + let (first_token_id, second_token_id) = LiquidityPools::get(liquidity_token_id) + .ok_or_else(|| Error::::NoSuchLiquidityAsset)?; let native_currency_id = T::NativeCurrencyId::get(); match native_currency_id { _ if native_currency_id == first_token_id => Ok((first_token_id, second_token_id)), From 097bdd851c4199abca8e85453db220348106c2ed Mon Sep 17 00:00:00 2001 From: Striker Date: Mon, 31 May 2021 18:20:51 +0530 Subject: [PATCH 3/3] xyk tests multi and create_pool_W fixed --- pallets/xyk/src/tests.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pallets/xyk/src/tests.rs b/pallets/xyk/src/tests.rs index a09c90361c64c..a065eac4f874a 100644 --- a/pallets/xyk/src/tests.rs +++ b/pallets/xyk/src/tests.rs @@ -287,8 +287,8 @@ fn multi() { .unwrap(); assert_eq!(XykStorage::asset_pool((0, 1)), 1000000000000000000000000); // amount of asset 0 in pool map assert_eq!(XykStorage::asset_pool((1, 0)), 500000000000000000000000); // amount of asset 1 in pool map - assert_eq!(XykStorage::liquidity_asset((0, 1)), 2); // liquidity assetId corresponding to newly created pool - assert_eq!(XykStorage::liquidity_pool(2), (0, 1)); // liquidity assetId corresponding to newly created pool + assert_eq!(XykStorage::liquidity_asset((0, 1)), Some(2)); // liquidity assetId corresponding to newly created pool + assert_eq!(XykStorage::liquidity_pool(2), Some((0, 1))); // liquidity assetId corresponding to newly created pool assert_eq!(XykStorage::total_supply(2), 1500000000000000000000000); // total liquidity assets assert_eq!(XykStorage::balance(2, 2), 1500000000000000000000000); // amount of liquidity assets owned by user by creating pool / initial minting assert_eq!(XykStorage::balance(0, 2), 1000000000000000000000000); // amount of asset 0 in user acc after creating pool / initial minting @@ -378,8 +378,8 @@ fn create_pool_W() { initialize(); assert_eq!(XykStorage::asset_pool((0, 1)), 40000000000000000000); // amount of asset 0 in pool map assert_eq!(XykStorage::asset_pool((1, 0)), 60000000000000000000); // amount of asset 1 in pool map - assert_eq!(XykStorage::liquidity_asset((0, 1)), 2); // liquidity assetId corresponding to newly created pool - assert_eq!(XykStorage::liquidity_pool(2), (0, 1)); // liquidity assetId corresponding to newly created pool + assert_eq!(XykStorage::liquidity_asset((0, 1)), Some(2)); // liquidity assetId corresponding to newly created pool + assert_eq!(XykStorage::liquidity_pool(2), Some((0, 1))); // liquidity assetId corresponding to newly created pool assert_eq!(XykStorage::total_supply(2), 100000000000000000000); // total liquidity assets assert_eq!(XykStorage::balance(2, 2), 100000000000000000000); // amount of liquidity assets owned by user by creating pool / initial minting assert_eq!(XykStorage::balance(0, 2), 960000000000000000000); // amount of asset 0 in user acc after creating pool / initial minting