From 48783313309ca2cefd4735fcfd000732214ed439 Mon Sep 17 00:00:00 2001 From: kenta-elys Date: Sat, 16 Dec 2023 13:12:13 +0000 Subject: [PATCH] chore: apply denom transfermation in stake, unstake, join and exit --- Cargo.lock | 4 ++-- Cargo.toml | 6 +++--- src/action/execute/exit_amm_pool_request.rs | 21 +++++++++++++++++--- src/action/execute/join_amm_pool_request.rs | 22 ++++++++++++++++++--- src/action/execute/stake_request.rs | 8 +++++--- src/action/execute/unstake_request.rs | 9 ++++++--- 6 files changed, 53 insertions(+), 17 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7a384dc..6e55eac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -372,7 +372,7 @@ dependencies = [ [[package]] name = "elys-bindings" version = "0.9.0" -source = "git+https://github.com/elys-network/bindings?tag=v0.9.0#7665defad591d08530b4a247dcb6cbb3d66584c9" +source = "git+https://github.com/elys-network/bindings?branch=feat/asset-profile#533f679f53cba072ad7d525be5d2cf2f22ddabb7" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -382,7 +382,7 @@ dependencies = [ [[package]] name = "elys-bindings-test" version = "0.9.0" -source = "git+https://github.com/elys-network/bindings?tag=v0.9.0#7665defad591d08530b4a247dcb6cbb3d66584c9" +source = "git+https://github.com/elys-network/bindings?branch=feat/asset-profile#533f679f53cba072ad7d525be5d2cf2f22ddabb7" dependencies = [ "anyhow", "cosmwasm-schema", diff --git a/Cargo.toml b/Cargo.toml index ba2a952..2f17645 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,13 +14,13 @@ thiserror = "1" schemars = "0.8.1" cosmwasm-schema = "1.1.4" cw-utils = "0.13" -elys-bindings = { version = "0.9.0", git = "https://github.com/elys-network/bindings", tag = "v0.9.0" } +elys-bindings = { version = "0.9.0", git = "https://github.com/elys-network/bindings", branch = "feat/asset-profile" } [dev-dependencies] cw-multi-test = "0.13.4" serde_json = "1.0.107" -elys-bindings = { version = "0.9.0", git = "https://github.com/elys-network/bindings", tag = "v0.9.0", features = [ +elys-bindings = { version = "0.9.0", git = "https://github.com/elys-network/bindings", branch = "feat/asset-profile", features = [ "testing", ] } -elys-bindings-test = { version = "0.9.0", git = "https://github.com/elys-network/bindings", tag = "v0.9.0" } +elys-bindings-test = { version = "0.9.0", git = "https://github.com/elys-network/bindings", branch = "feat/asset-profile" } diff --git a/src/action/execute/exit_amm_pool_request.rs b/src/action/execute/exit_amm_pool_request.rs index 6b3787f..8fb829f 100644 --- a/src/action/execute/exit_amm_pool_request.rs +++ b/src/action/execute/exit_amm_pool_request.rs @@ -3,21 +3,36 @@ use cosmwasm_std::{Uint128, Coin}; pub fn exit_amm_pool_request( info: MessageInfo, - _deps: DepsMut, + deps: DepsMut, pool_id: u64, min_amounts_out: Vec, share_amount_in: Uint128, token_out_denom: String, ) -> Result, ContractError> { + let querier = ElysQuerier::new(&deps.querier); + let mut min_amounts_out_real_denom = vec![]; + + // Re-initiate the coin input with the real denom + for coin in min_amounts_out { + let denom_entry = querier.get_asset_profile(coin.denom.clone())?; + let real_denom = denom_entry.entry.denom; + + let real_coin = Coin { + denom: real_denom.clone(), + amount: coin.amount, + }; + + min_amounts_out_real_denom.push(real_coin.clone()); + } + let msg: ElysMsg = ElysMsg::amm_exit_pool( info.sender.into_string(), pool_id, - min_amounts_out, + min_amounts_out_real_denom, share_amount_in, token_out_denom, ); let resp = Response::new().add_message(msg); - Ok(resp) } diff --git a/src/action/execute/join_amm_pool_request.rs b/src/action/execute/join_amm_pool_request.rs index 7e14b94..67fd36e 100644 --- a/src/action/execute/join_amm_pool_request.rs +++ b/src/action/execute/join_amm_pool_request.rs @@ -3,21 +3,37 @@ use cosmwasm_std::{Uint128, Coin}; pub fn join_amm_pool_request( info: MessageInfo, - _deps: DepsMut, + deps: DepsMut, pool_id: u64, max_amounts_in: Vec, share_amount_out: Uint128, no_remaining: bool, ) -> Result, ContractError> { + let querier = ElysQuerier::new(&deps.querier); + let mut max_amounts_in_real_denom = vec![]; + + // Re-initiate the coin input with the real denom + for coin in max_amounts_in { + let denom_entry = querier.get_asset_profile(coin.denom.clone())?; + let real_denom = denom_entry.entry.denom; + + let real_coin = Coin { + denom: real_denom.clone(), + amount: coin.amount, + }; + + max_amounts_in_real_denom.push(real_coin.clone()); + } + + // Construct amm join pool message. let msg: ElysMsg = ElysMsg::amm_join_pool( info.sender.into_string(), pool_id, - max_amounts_in, + max_amounts_in_real_denom, share_amount_out, no_remaining, ); let resp = Response::new().add_message(msg); - Ok(resp) } diff --git a/src/action/execute/stake_request.rs b/src/action/execute/stake_request.rs index 1fdf30e..3e22175 100644 --- a/src/action/execute/stake_request.rs +++ b/src/action/execute/stake_request.rs @@ -14,7 +14,11 @@ pub fn stake_request( ) -> Result, ContractError> { let querier = ElysQuerier::new(&deps.querier); let address = info.sender.into_string(); - let balance = querier.get_balance(address.to_owned(), asset.to_owned())?; + + let denom_entry = querier.get_asset_profile(asset.clone())?; + let real_denom = denom_entry.entry.denom; + + let balance = querier.get_balance(address.to_owned(), real_denom.clone())?; let token_amount: u128 = balance.amount.into(); if token_amount < amount as u128 { return Err(ContractError::InsufficientBalanceError { @@ -24,8 +28,6 @@ pub fn stake_request( } let msg = ElysMsg::stake_token(address, Int128::from(amount), asset, validator_address); - let resp = Response::new().add_message(msg); - Ok(resp) } diff --git a/src/action/execute/unstake_request.rs b/src/action/execute/unstake_request.rs index de03b63..4852dd3 100644 --- a/src/action/execute/unstake_request.rs +++ b/src/action/execute/unstake_request.rs @@ -3,7 +3,7 @@ use cosmwasm_std::Int128; pub fn unstake_request( info: MessageInfo, - _deps: DepsMut, + deps: DepsMut, // the amount to be staked in base denomination. amount: u64, // The asset to be staked @@ -12,14 +12,17 @@ pub fn unstake_request( // uelys. validator_address: Option, ) -> Result, ContractError> { + let querier = ElysQuerier::new(&deps.querier); + let denom_entry = querier.get_asset_profile(asset.clone())?; + let real_denom = denom_entry.entry.denom; + let msg = ElysMsg::unstake_token( info.sender.into_string(), Int128::from(amount), - asset, + real_denom, validator_address, ); let resp = Response::new().add_message(msg); - Ok(resp) }