From 071e39360806678a6e0403ccda6c53947957d4bd Mon Sep 17 00:00:00 2001 From: politeWall <138504353+politeWall@users.noreply.github.com> Date: Wed, 6 Dec 2023 01:14:03 +0100 Subject: [PATCH 1/6] feat: map error --- Cargo.lock | 8 +- Cargo.toml | 6 +- front_end_script/README.md | 11 +- src/action/execute/cancel_margin_order.rs | 6 +- src/action/execute/cancel_margin_orders.rs | 8 +- src/action/execute/cancel_spot_order.rs | 9 +- src/action/execute/cancel_spot_orders.rs | 8 +- src/action/execute/claim_rewards_request.rs | 8 +- .../claim_validator_commission_request.rs | 8 +- src/action/execute/close_margin_position.rs | 5 +- src/action/execute/create_margin_order.rs | 90 +++++++-------- src/action/execute/create_spot_order.rs | 43 +++----- .../execute/eden_cancel_vest_request.rs | 3 +- src/action/execute/eden_vest_request.rs | 3 +- .../execute/elys_cancel_unstake_request.rs | 3 +- .../execute/elys_redelegation_request.rs | 5 +- src/action/execute/stake_request.rs | 17 ++- src/action/execute/unstake_request.rs | 5 +- src/action/mod.rs | 8 +- src/action/query/get_all_price.rs | 7 +- src/action/query/get_margin_order.rs | 4 +- src/action/query/get_margin_orders.rs | 5 +- src/action/query/get_spot_order.rs | 5 +- src/action/query/get_spot_orders.rs | 5 +- src/action/reply/close_margin_position.rs | 16 +-- .../reply/create_margin_order_market_close.rs | 18 ++- .../reply/create_margin_order_market_open.rs | 14 ++- src/action/reply/open_margin_position.rs | 13 +-- src/action/reply/spot_order.rs | 11 +- src/action/reply/spot_order_market.rs | 8 +- src/action/sudo/process_orders.rs | 104 +++++++++--------- src/entry_point/execute.rs | 51 +++++++-- src/entry_point/instantiate.rs | 5 +- src/entry_point/query.rs | 2 +- src/entry_point/reply.rs | 20 +--- src/msg/execute_msg.rs | 13 ++- src/msg/query_msg.rs | 2 +- src/states/margin_order.rs | 4 +- src/states/mod.rs | 2 +- src/states/reply_info.rs | 6 +- src/states/spot_order.rs | 4 +- .../closing_a_margin_position.rs | 7 +- src/tests/create_margin_order/coin_number.rs | 2 +- .../successful_create_margin_market_order.rs | 2 +- .../successful_create_margin_order.rs | 2 +- .../successful_create_nargin_market_close.rs | 2 +- src/tests/mock/instantiate.rs | 14 ++- src/types/margin_order.rs | 22 ++-- src/types/spot_order/impls/new.rs | 6 +- src/types/status.rs | 1 - 50 files changed, 305 insertions(+), 326 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b4135bd..0384b99 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -371,8 +371,8 @@ dependencies = [ [[package]] name = "elys-bindings" -version = "0.6.0" -source = "git+https://github.com/elys-network/bindings?tag=v0.6.0#6540c0037ad36175e7a77fdfd05b60586480218e" +version = "0.7.0" +source = "git+https://github.com/elys-network/bindings?tag=v0.7.0#1fd2d8733894e6f2a5f943cc7a072d665803f378" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -381,8 +381,8 @@ dependencies = [ [[package]] name = "elys-bindings-test" -version = "0.6.0" -source = "git+https://github.com/elys-network/bindings?tag=v0.6.0#6540c0037ad36175e7a77fdfd05b60586480218e" +version = "0.7.0" +source = "git+https://github.com/elys-network/bindings?tag=v0.7.0#1fd2d8733894e6f2a5f943cc7a072d665803f378" dependencies = [ "anyhow", "cosmwasm-schema", diff --git a/Cargo.toml b/Cargo.toml index d544fa3..edfbd80 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.6.0", git = "https://github.com/elys-network/bindings", tag = "v0.6.0" } +elys-bindings = { version = "0.7.0", git = "https://github.com/elys-network/bindings", tag = "v0.7.0" } [dev-dependencies] cw-multi-test = "0.13.4" serde_json = "1.0.107" -elys-bindings = { version = "0.6.0", git = "https://github.com/elys-network/bindings", tag = "v0.6.0", features = [ +elys-bindings = { version = "0.7.0", git = "https://github.com/elys-network/bindings", tag = "v0.7.0", features = [ "testing", ] } -elys-bindings-test = { version = "0.6.0", git = "https://github.com/elys-network/bindings", tag = "v0.6.0" } +elys-bindings-test = { version = "0.7.0", git = "https://github.com/elys-network/bindings", tag = "v0.7.0" } diff --git a/front_end_script/README.md b/front_end_script/README.md index 916f6ef..5443898 100644 --- a/front_end_script/README.md +++ b/front_end_script/README.md @@ -40,7 +40,6 @@ createSpotOrder( ```js createSpotOrder( - [{ pool_id: 4, token_out_denom: "BTC" }, "AMM_Route_2"], { base_denom: "BTC", quote_denom: "ETH", rate: "0.035" }, "limit_buy", "2.5", @@ -49,7 +48,6 @@ createSpotOrder( ); createSpotOrder( - null, { base_denom: "BTC", quote_denom: "ETH", rate: "0.035" }, "limit_buy", "2.5", @@ -78,28 +76,29 @@ cancelSpotOrder("your_order_id_here"); cancelSpotOrder("8"); ``` -### 3. cancelSpotOrders(pagination, order_type, owner_address) +### 3. cancelSpotOrders(order_ids, order_type, owner_address) This function retrieves information about multiple order by querying a CosmWasm contract on the blockchain. #### Parameters +- `order_ids` ([u64] or null): list of order ids that should be canceled - `order_type` (OrderType or null): select the order type that should be canceled - `owner_address` (String): select the owner of the order that should be canceled #### Usage ```javascript -cancelSpotOrders("order_type", "owner_address", order_ids); +cancelSpotOrders("order_ids", "order_type", "owner_address"); ``` #### Exemple ```js cancelSpotOrders( + [5, 4, 6], "limit_sell", - "elys1x5fehwug2vtkyn4vpunwkfn9zxkpxl8jg0lwuu", - [5, 4, 6] + "elys1x5fehwug2vtkyn4vpunwkfn9zxkpxl8jg0lwuu" ); ``` diff --git a/src/action/execute/cancel_margin_order.rs b/src/action/execute/cancel_margin_order.rs index d49c3dc..a6de82d 100644 --- a/src/action/execute/cancel_margin_order.rs +++ b/src/action/execute/cancel_margin_order.rs @@ -5,9 +5,7 @@ pub fn cancel_margin_order( deps: DepsMut, order_id: u64, ) -> Result, ContractError> { - let mut orders = MARGIN_ORDER.load(deps.storage)?; - - let order = match orders.iter_mut().find(|order| order.order_id == order_id) { + let mut order = match MARGIN_ORDER.may_load(deps.storage, order_id)? { Some(order) => order, None => return Err(ContractError::OrderNotFound { order_id }), }; @@ -39,7 +37,7 @@ pub fn cancel_margin_order( .add_attribute("margin_order_id", order.order_id.to_string()), ); - MARGIN_ORDER.save(deps.storage, &orders)?; + MARGIN_ORDER.save(deps.storage, order_id, &order)?; if order_type == MarginOrderType::LimitOpen { Ok(resp.add_message(CosmosMsg::Bank(refund_msg))) diff --git a/src/action/execute/cancel_margin_orders.rs b/src/action/execute/cancel_margin_orders.rs index b2d5eeb..c1df434 100644 --- a/src/action/execute/cancel_margin_orders.rs +++ b/src/action/execute/cancel_margin_orders.rs @@ -15,7 +15,10 @@ pub fn cancel_margin_orders( }); } - let mut orders: Vec = MARGIN_ORDER.load(deps.storage)?; + let mut orders: Vec = MARGIN_ORDER + .prefix_range(deps.storage, None, None, Order::Ascending) + .filter_map(|res| res.ok().map(|r| r.1)) + .collect(); let user_orders: Vec = orders .iter() @@ -51,11 +54,10 @@ pub fn cancel_margin_orders( for order in orders.iter_mut() { if order_ids.contains(&order.order_id) { order.status = Status::Canceled; + MARGIN_ORDER.save(deps.storage, order.order_id, order)?; } } - MARGIN_ORDER.save(deps.storage, &orders)?; - let refund_msg = make_refund_msg(filtered_order, owner_address); Ok(Response::new() diff --git a/src/action/execute/cancel_spot_order.rs b/src/action/execute/cancel_spot_order.rs index aae5e44..093b4c2 100644 --- a/src/action/execute/cancel_spot_order.rs +++ b/src/action/execute/cancel_spot_order.rs @@ -5,12 +5,7 @@ pub fn cancel_spot_order( deps: DepsMut, order_id: u64, ) -> Result, ContractError> { - let mut orders_list: Vec = SPOT_ORDER.load(deps.storage)?; - - let order: &mut SpotOrder = match orders_list - .iter_mut() - .find(|order| order.order_id == order_id) - { + let mut order: SpotOrder = match SPOT_ORDER.may_load(deps.storage, order_id)? { Some(order) => order, None => return Err(ContractError::OrderNotFound { order_id }), }; @@ -38,7 +33,7 @@ pub fn cancel_spot_order( .add_message(CosmosMsg::Bank(refund_msg)) .add_event(Event::new("cancel_spot_order").add_attribute("order_id", order_id.to_string())); - SPOT_ORDER.save(deps.storage, &orders_list)?; + SPOT_ORDER.save(deps.storage, order_id, &order)?; Ok(resp) } diff --git a/src/action/execute/cancel_spot_orders.rs b/src/action/execute/cancel_spot_orders.rs index 5952c2d..daf16d5 100644 --- a/src/action/execute/cancel_spot_orders.rs +++ b/src/action/execute/cancel_spot_orders.rs @@ -15,7 +15,10 @@ pub fn cancel_spot_orders( }); } - let mut orders: Vec = SPOT_ORDER.load(deps.storage)?; + let mut orders: Vec = SPOT_ORDER + .prefix_range(deps.storage, None, None, Order::Ascending) + .filter_map(|res| res.ok().map(|r| r.1)) + .collect(); let user_orders: Vec = orders .iter() @@ -51,11 +54,10 @@ pub fn cancel_spot_orders( for order in orders.iter_mut() { if order_ids.contains(&order.order_id) { order.status = Status::Canceled; + SPOT_ORDER.save(deps.storage, order.order_id, &order)?; } } - SPOT_ORDER.save(deps.storage, &orders)?; - let refund_msg = make_refund_msg(filtered_order, owner_address); Ok(Response::new() diff --git a/src/action/execute/claim_rewards_request.rs b/src/action/execute/claim_rewards_request.rs index 578214b..cfe260c 100644 --- a/src/action/execute/claim_rewards_request.rs +++ b/src/action/execute/claim_rewards_request.rs @@ -7,13 +7,9 @@ pub fn claim_rewards_request( _deps: DepsMut, withdraw_type: EarnType, ) -> Result, ContractError> { - let msg = ElysMsg::withdraw_rewards( - env.contract.address.into_string(), - info.sender.into_string(), - withdraw_type, - ); + let msg = ElysMsg::withdraw_rewards(info.sender.into_string(), withdraw_type); let resp = Response::new().add_message(msg); Ok(resp) -} \ No newline at end of file +} diff --git a/src/action/execute/claim_validator_commission_request.rs b/src/action/execute/claim_validator_commission_request.rs index 0a9ba57..ee05d0f 100644 --- a/src/action/execute/claim_validator_commission_request.rs +++ b/src/action/execute/claim_validator_commission_request.rs @@ -6,13 +6,9 @@ pub fn claim_validator_commission_request( _deps: DepsMut, validator_address: String, ) -> Result, ContractError> { - let msg = ElysMsg::withdraw_validator_commissions( - env.contract.address.into_string(), - info.sender.into_string(), - validator_address, - ); + let msg = ElysMsg::withdraw_validator_commissions(info.sender.into_string(), validator_address); let resp = Response::new().add_message(msg); Ok(resp) -} \ No newline at end of file +} diff --git a/src/action/execute/close_margin_position.rs b/src/action/execute/close_margin_position.rs index b1692b0..7a801ac 100644 --- a/src/action/execute/close_margin_position.rs +++ b/src/action/execute/close_margin_position.rs @@ -1,11 +1,14 @@ +use cosmwasm_std::Int128; + use super::*; pub fn close_margin_position( info: MessageInfo, env: Env, id: u64, + amount: Int128, ) -> Result, ContractError> { - let msg = ElysMsg::margin_broker_close_position(env.contract.address, id, info.sender); + let msg = ElysMsg::margin_close_position(info.sender, id, amount.i128()); let resp = Response::new().add_message(CosmosMsg::Custom(msg)); diff --git a/src/action/execute/create_margin_order.rs b/src/action/execute/create_margin_order.rs index 4de2213..faafe98 100644 --- a/src/action/execute/create_margin_order.rs +++ b/src/action/execute/create_margin_order.rs @@ -1,7 +1,7 @@ use crate::msg::ReplyType; use super::*; -use cosmwasm_std::{to_json_binary, Decimal, Int128, StdError, StdResult, SubMsg}; +use cosmwasm_std::{to_json_binary, Decimal, StdError, StdResult, SubMsg}; use cw_utils; use MarginOrderType::*; @@ -11,7 +11,7 @@ pub fn create_margin_order( env: Env, position: Option, leverage: Option, - borrow_asset: Option, + trading_asset: Option, take_profit_price: Option, order_type: MarginOrderType, trigger_price: Option, @@ -20,7 +20,7 @@ pub fn create_margin_order( check_order_type( &position, &leverage, - &borrow_asset, + &trading_asset, &take_profit_price, &order_type, &trigger_price, @@ -34,7 +34,7 @@ pub fn create_margin_order( env, order_type, position.unwrap(), - borrow_asset.unwrap(), + trading_asset.unwrap(), leverage.unwrap(), take_profit_price.unwrap(), trigger_price, @@ -54,7 +54,7 @@ pub fn create_margin_order( fn check_order_type( position: &Option, leverage: &Option, - borrow_asset: &Option, + trading_asset: &Option, take_profit_price: &Option, order_type: &MarginOrderType, trigger_price: &Option, @@ -79,7 +79,7 @@ fn check_order_type( if leverage.is_none() { not_found.push("leverage"); } - if borrow_asset.is_none() { + if trading_asset.is_none() { not_found.push("borrow asset"); } if take_profit_price.is_none() { @@ -104,13 +104,17 @@ fn create_margin_open_order( env: Env, order_type: MarginOrderType, position: MarginPosition, - borrow_asset: String, + trading_asset: String, leverage: Decimal, take_profit_price: Decimal, trigger_price: Option, ) -> Result, ContractError> { let collateral = cw_utils::one_coin(&info)?; - let mut orders = MARGIN_ORDER.load(deps.storage)?; + + let orders: Vec = MARGIN_ORDER + .prefix_range(deps.storage, None, None, Order::Ascending) + .filter_map(|res| res.ok().map(|r| r.1)) + .collect(); if position == MarginPosition::Unspecified { return Err(StdError::generic_err("margin position cannot be set at: Unspecified").into()); @@ -123,7 +127,7 @@ fn create_margin_open_order( &position, &order_type, &collateral, - &borrow_asset, + &trading_asset, &leverage, &take_profit_price, &trigger_price, @@ -132,9 +136,7 @@ fn create_margin_open_order( let order_id = order.order_id; - orders.push(order); - - MARGIN_ORDER.save(deps.storage, &orders)?; + MARGIN_ORDER.save(deps.storage, order_id, &order)?; let resp = Response::new().add_event( Event::new("create_margin_open_order") @@ -145,34 +147,27 @@ fn create_margin_open_order( return Ok(resp); } - let msg = ElysMsg::margin_broker_open_position( - env.contract.address, - collateral.denom, - Int128::new(collateral.amount.u128() as i128), - borrow_asset, - position as i32, + let msg = ElysMsg::margin_open_position( + info.sender, + collateral, + trading_asset, + position, leverage, take_profit_price, - info.sender, ); - let mut reply_infos = REPLY_INFO.load(deps.storage)?; - - let info_id = if let Some(max_info) = reply_infos.iter().max_by_key(|info| info.id) { - max_info.id + 1 - } else { - 0 - }; + let reply_id = MAX_REPLY_ID.load(deps.storage)? + 1; + MAX_REPLY_ID.save(deps.storage, &reply_id)?; - reply_infos.push(ReplyInfo { - id: info_id, + let reply_info = ReplyInfo { + id: reply_id, reply_type: ReplyType::MarginBrokerMarketOpen, data: Some(to_json_binary(&order_id)?), - }); + }; - REPLY_INFO.save(deps.storage, &reply_infos)?; + REPLY_INFO.save(deps.storage, reply_id, &reply_info)?; - let sub_msg = SubMsg::reply_always(msg, info_id); + let sub_msg = SubMsg::reply_always(msg, reply_id); Ok(resp.add_submessage(sub_msg)) } @@ -197,7 +192,10 @@ fn create_margin_close_order( return Err(StdError::not_found("margin trading position").into()); }; - let mut orders = MARGIN_ORDER.load(deps.storage)?; + let orders: Vec = MARGIN_ORDER + .prefix_range(deps.storage, None, None, Order::Ascending) + .filter_map(|res| res.ok().map(|r| r.1)) + .collect(); if orders .iter() @@ -222,9 +220,7 @@ fn create_margin_close_order( let order_id = order.order_id; - orders.push(order); - - MARGIN_ORDER.save(deps.storage, &orders)?; + MARGIN_ORDER.save(deps.storage, order_id, &order)?; let resp = Response::new().add_event( Event::new("create_margin_close_order") @@ -235,26 +231,20 @@ fn create_margin_close_order( return Ok(resp); } - let mut reply_infos = REPLY_INFO.load(deps.storage)?; + let msg = ElysMsg::margin_close_position(&info.sender, position_id, 0 /*AMOUNT */); - let msg = - ElysMsg::margin_broker_close_position(env.contract.address, position_id, &info.sender); + let reply_id = MAX_REPLY_ID.load(deps.storage)? + 1; + MAX_REPLY_ID.save(deps.storage, &reply_id)?; - let info_id = if let Some(max_info) = reply_infos.iter().max_by_key(|info| info.id) { - max_info.id + 1 - } else { - 0 - }; - - reply_infos.push(ReplyInfo { - id: info_id, - reply_type: ReplyType::MarginBrokerMarketClose, + let reply_info = ReplyInfo { + id: reply_id, + reply_type: ReplyType::MarginBrokerMarketOpen, data: Some(to_json_binary(&order_id)?), - }); + }; - REPLY_INFO.save(deps.storage, &reply_infos)?; + REPLY_INFO.save(deps.storage, reply_id, &reply_info)?; - let sub_msg = SubMsg::reply_always(msg, info_id); + let sub_msg = SubMsg::reply_always(msg, reply_id); Ok(resp.add_submessage(sub_msg)) } diff --git a/src/action/execute/create_spot_order.rs b/src/action/execute/create_spot_order.rs index b28179b..db1e5a1 100644 --- a/src/action/execute/create_spot_order.rs +++ b/src/action/execute/create_spot_order.rs @@ -1,4 +1,4 @@ -use cosmwasm_std::{to_json_binary, Decimal, Int128, StdError, StdResult, Storage, SubMsg}; +use cosmwasm_std::{to_json_binary, Decimal, Int128, Order, StdError, StdResult, Storage, SubMsg}; use elys_bindings::query_resp::AmmSwapEstimationByDenomResponse; use crate::msg::ReplyType; @@ -14,9 +14,7 @@ pub fn create_spot_order( order_target_denom: String, order_price: Option, ) -> Result, ContractError> { - if info.funds.len() != 1 { - return Err(ContractError::CoinNumber); - }; + cw_utils::one_coin(&info)?; let querier = ElysQuerier::new(&deps.querier); @@ -39,7 +37,10 @@ pub fn create_spot_order( &Decimal::zero(), )?; - let mut order_vec = SPOT_ORDER.load(deps.storage)?; + let order_vec: Vec = SPOT_ORDER + .prefix_range(deps.storage, None, None, Order::Ascending) + .filter_map(|res| res.ok().map(|r| r.1)) + .collect(); let new_order: SpotOrder = SpotOrder::new( order_type.clone(), @@ -56,8 +57,6 @@ pub fn create_spot_order( amount: info.funds.clone(), }; - cw_utils::must_pay(&info, &info.funds[0].denom)?; - let resp = create_resp( env.contract.address.as_str(), &new_order, @@ -66,8 +65,7 @@ pub fn create_spot_order( in_route.unwrap(), )?; - order_vec.push(new_order); - SPOT_ORDER.save(deps.storage, &order_vec)?; + SPOT_ORDER.save(deps.storage, new_order.order_id, &new_order)?; Ok(resp) } @@ -93,10 +91,10 @@ fn check_denom_error( let order_price = order_price.clone().unwrap(); - if (order_price.base_denom != order_source_denom - && order_price.base_denom != order_target_denom) - || (order_price.quote_denom != order_source_denom - && order_price.quote_denom != order_target_denom) + if !(order_price.base_denom == order_source_denom + && order_price.quote_denom == order_target_denom) + && !(order_price.quote_denom == order_source_denom + && order_price.base_denom == order_target_denom) { return Err(ContractError::OrderPriceDenom); } @@ -122,7 +120,8 @@ fn create_resp( return Ok(resp); } - let mut reply_infos = REPLY_INFO.load(storage)?; + let reply_id = MAX_REPLY_ID.load(storage)? + 1; + MAX_REPLY_ID.save(storage, &reply_id)?; let swap_msg = ElysMsg::amm_swap_exact_amount_in( sender, @@ -133,21 +132,15 @@ fn create_resp( &new_order.owner_address, ); - let info_id = if let Some(max_info) = reply_infos.iter().max_by_key(|info| info.id) { - max_info.id + 1 - } else { - 0 - }; - - reply_infos.push(ReplyInfo { - id: info_id, + let reply_info = ReplyInfo { + id: reply_id, reply_type: ReplyType::SpotOrderMarketBuy, data: Some(to_json_binary(&new_order.order_id)?), - }); + }; - REPLY_INFO.save(storage, &reply_infos)?; + REPLY_INFO.save(storage, reply_id, &reply_info)?; - let sub_msg = SubMsg::reply_always(swap_msg, info_id); + let sub_msg = SubMsg::reply_always(swap_msg, reply_id); Ok(resp.add_submessage(sub_msg)) } diff --git a/src/action/execute/eden_cancel_vest_request.rs b/src/action/execute/eden_cancel_vest_request.rs index 8abdbaa..273033b 100644 --- a/src/action/execute/eden_cancel_vest_request.rs +++ b/src/action/execute/eden_cancel_vest_request.rs @@ -8,7 +8,6 @@ pub fn eden_cancel_vest_request( amount: u64, ) -> Result, ContractError> { let msg = ElysMsg::eden_cancel_vesting( - env.contract.address.into_string(), info.sender.into_string(), Int128::from(amount), "ueden".to_string(), @@ -17,4 +16,4 @@ pub fn eden_cancel_vest_request( let resp = Response::new().add_message(msg); Ok(resp) -} \ No newline at end of file +} diff --git a/src/action/execute/eden_vest_request.rs b/src/action/execute/eden_vest_request.rs index a76190c..43aab79 100644 --- a/src/action/execute/eden_vest_request.rs +++ b/src/action/execute/eden_vest_request.rs @@ -8,7 +8,6 @@ pub fn eden_vest_request( amount: u64, ) -> Result, ContractError> { let msg: ElysMsg = ElysMsg::eden_vesting( - env.contract.address.into_string(), info.sender.into_string(), Int128::from(amount), "ueden".to_string(), @@ -17,4 +16,4 @@ pub fn eden_vest_request( let resp = Response::new().add_message(msg); Ok(resp) -} \ No newline at end of file +} diff --git a/src/action/execute/elys_cancel_unstake_request.rs b/src/action/execute/elys_cancel_unstake_request.rs index 7281c95..f43618c 100644 --- a/src/action/execute/elys_cancel_unstake_request.rs +++ b/src/action/execute/elys_cancel_unstake_request.rs @@ -10,7 +10,6 @@ pub fn elys_cancel_unstake_request( creation_height: i64, ) -> Result, ContractError> { let msg = ElysMsg::cancel_unbonding( - env.contract.address.into_string(), info.sender.into_string(), validator_address, amount, @@ -20,4 +19,4 @@ pub fn elys_cancel_unstake_request( let resp = Response::new().add_message(msg); Ok(resp) -} \ No newline at end of file +} diff --git a/src/action/execute/elys_redelegation_request.rs b/src/action/execute/elys_redelegation_request.rs index 36e980d..958395c 100644 --- a/src/action/execute/elys_redelegation_request.rs +++ b/src/action/execute/elys_redelegation_request.rs @@ -11,10 +11,9 @@ pub fn elys_redelegation_request( validator_dst_address: String, // The validator Address is required only if the staked asset is // uelys. - amount: Coin + amount: Coin, ) -> Result, ContractError> { let msg = ElysMsg::begin_redelegate( - env.contract.address.into_string(), info.sender.into_string(), validator_src_address, validator_dst_address, @@ -24,4 +23,4 @@ pub fn elys_redelegation_request( let resp = Response::new().add_message(msg); Ok(resp) -} \ No newline at end of file +} diff --git a/src/action/execute/stake_request.rs b/src/action/execute/stake_request.rs index e4472bb..a5433c2 100644 --- a/src/action/execute/stake_request.rs +++ b/src/action/execute/stake_request.rs @@ -11,25 +11,22 @@ pub fn stake_request( asset: String, // The validator Address is required only if the staked asset is // uelys. - validator_address: Option + validator_address: Option, ) -> 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 token_amount: u128 = balance.amount.into(); if token_amount < amount as u128 { - return Err(ContractError::InsufficientBalanceError { balance: balance.amount.into(), amount: amount }); + return Err(ContractError::InsufficientBalanceError { + balance: balance.amount.into(), + amount: amount, + }); } - let msg = ElysMsg::stake_token( - env.contract.address.into_string(), - address, - Int128::from(amount), - asset, - validator_address, - ); + let msg = ElysMsg::stake_token(address, Int128::from(amount), asset, validator_address); let resp = Response::new().add_message(msg); Ok(resp) -} \ No newline at end of file +} diff --git a/src/action/execute/unstake_request.rs b/src/action/execute/unstake_request.rs index f2d1589..2d0f857 100644 --- a/src/action/execute/unstake_request.rs +++ b/src/action/execute/unstake_request.rs @@ -11,10 +11,9 @@ pub fn unstake_request( asset: String, // The validator Address is required only if the staked asset is // uelys. - validator_address: Option + validator_address: Option, ) -> Result, ContractError> { let msg = ElysMsg::unstake_token( - env.contract.address.into_string(), info.sender.into_string(), Int128::from(amount), asset, @@ -24,4 +23,4 @@ pub fn unstake_request( let resp = Response::new().add_message(msg); Ok(resp) -} \ No newline at end of file +} diff --git a/src/action/mod.rs b/src/action/mod.rs index e428304..4dfc035 100644 --- a/src/action/mod.rs +++ b/src/action/mod.rs @@ -1,6 +1,6 @@ use crate::{states::*, types::*, ContractError}; use cosmwasm_std::Event; -use cosmwasm_std::{BankMsg, CosmosMsg, DepsMut, Env, MessageInfo, Response}; +use cosmwasm_std::{BankMsg, CosmosMsg, DepsMut, Env, MessageInfo, Order, Response}; use elys_bindings::*; pub mod query { @@ -39,7 +39,7 @@ pub mod execute { mod close_margin_position; mod create_margin_order; mod create_spot_order; - + mod stake_request; mod unstake_request; @@ -60,14 +60,14 @@ pub mod execute { pub use create_margin_order::create_margin_order; pub use create_spot_order::create_spot_order; - pub use stake_request::stake_request; - pub use unstake_request::unstake_request; pub use claim_rewards_request::claim_rewards_request; pub use claim_validator_commission_request::claim_validator_commission_request; pub use eden_cancel_vest_request::eden_cancel_vest_request; pub use eden_vest_request::eden_vest_request; pub use elys_cancel_unstake_request::elys_cancel_unstake_request; pub use elys_redelegation_request::elys_redelegation_request; + pub use stake_request::stake_request; + pub use unstake_request::unstake_request; } pub mod reply { diff --git a/src/action/query/get_all_price.rs b/src/action/query/get_all_price.rs index 90de742..32295f5 100644 --- a/src/action/query/get_all_price.rs +++ b/src/action/query/get_all_price.rs @@ -1,10 +1,13 @@ use super::*; use crate::msg::query_resp::GetAllPricesResponse; -pub fn get_all_prices(deps: Deps) -> Result { +pub fn get_all_prices( + deps: Deps, + limit: u64, +) -> Result { let querier = ElysQuerier::new(&deps.querier); - let mut pagination = PageRequest::new(20); + let mut pagination = PageRequest::new(limit); let prices: Vec = querier.oracle_get_all_prices(&mut pagination)?; let resp: GetAllPricesResponse = GetAllPricesResponse { prices }; diff --git a/src/action/query/get_margin_order.rs b/src/action/query/get_margin_order.rs index db6a091..8226bee 100644 --- a/src/action/query/get_margin_order.rs +++ b/src/action/query/get_margin_order.rs @@ -4,9 +4,9 @@ pub fn get_margin_order( deps: Deps, id: u64, ) -> Result { - let orders = MARGIN_ORDER.load(deps.storage)?; + let order = MARGIN_ORDER.may_load(deps.storage, id)?; - match orders.iter().find(|order| order.order_id == id).cloned() { + match order { Some(order) => Ok(GetMarginOrderResp { order }), None => Err(ContractError::OrderNotFound { order_id: id }), } diff --git a/src/action/query/get_margin_orders.rs b/src/action/query/get_margin_orders.rs index 649c7c9..15d5187 100644 --- a/src/action/query/get_margin_orders.rs +++ b/src/action/query/get_margin_orders.rs @@ -6,7 +6,10 @@ pub fn get_margin_orders( order_owner: Option, order_type: Option, ) -> Result { - let orders = MARGIN_ORDER.load(deps.storage)?; + let orders: Vec = MARGIN_ORDER + .prefix_range(deps.storage, None, None, Order::Ascending) + .filter_map(|res| res.ok().map(|r| r.1)) + .collect(); let (orders, page_response) = pagination.filter(orders)?; diff --git a/src/action/query/get_spot_order.rs b/src/action/query/get_spot_order.rs index 674e4de..9271a82 100644 --- a/src/action/query/get_spot_order.rs +++ b/src/action/query/get_spot_order.rs @@ -4,11 +4,10 @@ pub fn get_spot_order( deps: Deps, order_id: u64, ) -> Result { - let orders_list: Vec = SPOT_ORDER.load(deps.storage)?; - let have_order = orders_list.iter().find(|order| order.order_id == order_id); + let order = SPOT_ORDER.may_load(deps.storage, order_id)?; let resp = GetSpotOrderResp { - order: match have_order { + order: match order { Some(order) => order.to_owned(), None => return Err(ContractError::OrderNotFound { order_id }), }, diff --git a/src/action/query/get_spot_orders.rs b/src/action/query/get_spot_orders.rs index 8d832c4..d6ebbc3 100644 --- a/src/action/query/get_spot_orders.rs +++ b/src/action/query/get_spot_orders.rs @@ -6,7 +6,10 @@ pub fn get_spot_orders( order_owner: Option, order_type: Option, ) -> Result { - let orders = SPOT_ORDER.load(deps.storage)?; + let orders: Vec = SPOT_ORDER + .prefix_range(deps.storage, None, None, Order::Ascending) + .filter_map(|res| res.ok().map(|r| r.1)) + .collect(); let (orders, page_response) = pagination.filter(orders)?; diff --git a/src/action/reply/close_margin_position.rs b/src/action/reply/close_margin_position.rs index 0acddd2..c4fc896 100644 --- a/src/action/reply/close_margin_position.rs +++ b/src/action/reply/close_margin_position.rs @@ -11,30 +11,26 @@ pub fn reply_to_close_margin_order( ) -> Result, ContractError> { let order_id: u64 = from_json(&data.unwrap()).unwrap(); - let mut orders: Vec = MARGIN_ORDER.load(deps.storage)?; + let mut order: MarginOrder = MARGIN_ORDER.load(deps.storage, order_id)?; - let order: &mut MarginOrder = orders - .iter_mut() - .find(|order| order.order_id == order_id) - .unwrap(); - - let res: MarginBrokerCloseResResponse = match get_response_from_reply(module_resp) { + let res: MarginCloseResponse = match get_response_from_reply(module_resp) { Ok(expr) => expr, Err(err) => { order.status = Status::NotProcessed; - MARGIN_ORDER.save(deps.storage, &orders)?; + MARGIN_ORDER.save(deps.storage, order_id, &order)?; return Ok(err); } }; order.status = Status::Processed; - MARGIN_ORDER.save(deps.storage, &orders)?; + MARGIN_ORDER.save(deps.storage, order_id, &order)?; let resp: Response = Response::new().add_event( Event::new("reply_to_close_margin_order") .add_attribute("margin_order_id", order_id.to_string()) - .add_attribute("margin_trading_position_closed_id", res.id.to_string()), + .add_attribute("margin_trading_position_closed_id", res.id.to_string()) + .add_attribute("margin_amount_closed", res.amount.i128().to_string()), ); Ok(resp) diff --git a/src/action/reply/create_margin_order_market_close.rs b/src/action/reply/create_margin_order_market_close.rs index 3dcd716..d98f4c4 100644 --- a/src/action/reply/create_margin_order_market_close.rs +++ b/src/action/reply/create_margin_order_market_close.rs @@ -11,8 +11,6 @@ pub fn reply_to_create_margin_market_close( Err(err) => return Err(StdError::generic_err(err).into()), }; - let mut orders: Vec = MARGIN_ORDER.load(deps.storage)?; - let order_id: u64 = match data { Some(order_id) => from_json(&order_id)?, None => return Err(StdError::generic_err("no meta_data").into()), @@ -22,12 +20,12 @@ pub fn reply_to_create_margin_market_close( return Err(StdError::generic_err("no data from response").into()); } - let order: &mut MarginOrder = match orders.iter_mut().find(|order| order.order_id == order_id) { + let mut order: MarginOrder = match MARGIN_ORDER.may_load(deps.storage, order_id)? { Some(order) => order, None => return Err(ContractError::OrderNotFound { order_id }), }; - let margin_resp: MarginBrokerCloseResResponse = match from_json(&resp_data.unwrap()) { + let margin_resp: MarginCloseResponse = match from_json(&resp_data.unwrap()) { Ok(resp) => resp, Err(err) => return Err(err.into()), }; @@ -36,8 +34,18 @@ pub fn reply_to_create_margin_market_close( let resp = Response::new().add_event( Event::new("reply_to_create_margin_market_close") - .add_attribute("margin_trading_position_id", margin_resp.id.to_string()), + .add_attribute("margin_order_id", order_id.to_string()) + .add_attribute( + "margin_trading_position_closed_id", + margin_resp.id.to_string(), + ) + .add_attribute( + "margin_amount_closed", + margin_resp.amount.i128().to_string(), + ), ); + MARGIN_ORDER.save(deps.storage, order_id, &order)?; + Ok(resp) } diff --git a/src/action/reply/create_margin_order_market_open.rs b/src/action/reply/create_margin_order_market_open.rs index 7dfae2b..5ba30bd 100644 --- a/src/action/reply/create_margin_order_market_open.rs +++ b/src/action/reply/create_margin_order_market_open.rs @@ -11,8 +11,6 @@ pub fn reply_to_create_margin_market_open( Err(err) => return Err(StdError::generic_err(err).into()), }; - let mut orders: Vec = MARGIN_ORDER.load(deps.storage)?; - let order_id: u64 = match data { Some(order_id) => from_json(&order_id)?, None => return Err(StdError::generic_err("no meta_data").into()), @@ -22,12 +20,12 @@ pub fn reply_to_create_margin_market_open( return Err(StdError::generic_err("no data from response").into()); } - let order: &mut MarginOrder = match orders.iter_mut().find(|order| order.order_id == order_id) { + let mut order: MarginOrder = match MARGIN_ORDER.may_load(deps.storage, order_id)? { Some(order) => order, None => return Err(ContractError::OrderNotFound { order_id }), }; - let margin_resp: MarginBrokerOpenResResponse = match from_json(&resp_data.unwrap()) { + let margin_resp: MarginOpenResponse = match from_json(&resp_data.unwrap()) { Ok(resp) => resp, Err(err) => return Err(err.into()), }; @@ -35,9 +33,15 @@ pub fn reply_to_create_margin_market_open( order.status = Status::Processed; order.position_id = Some(margin_resp.id); + MARGIN_ORDER.save(deps.storage, order_id, &order)?; + let resp = Response::new().add_event( Event::new("reply_to_create_margin_market_open") - .add_attribute("margin_trading_position_id", margin_resp.id.to_string()), + .add_attribute("margin_order_id", order_id.to_string()) + .add_attribute( + "margin_trading_position_opened_id", + margin_resp.id.to_string(), + ), ); Ok(resp) diff --git a/src/action/reply/open_margin_position.rs b/src/action/reply/open_margin_position.rs index 65efc28..76d329e 100644 --- a/src/action/reply/open_margin_position.rs +++ b/src/action/reply/open_margin_position.rs @@ -11,25 +11,20 @@ pub fn reply_to_open_margin_position( ) -> Result, ContractError> { let order_id: u64 = from_json(&data.unwrap()).unwrap(); - let mut orders: Vec = MARGIN_ORDER.load(deps.storage)?; + let mut order: MarginOrder = MARGIN_ORDER.load(deps.storage, order_id)?; - let order: &mut MarginOrder = orders - .iter_mut() - .find(|order| order.order_id == order_id) - .unwrap(); - - let res: MarginBrokerOpenResResponse = match get_response_from_reply(module_resp) { + let res: MarginOpenResponse = match get_response_from_reply(module_resp) { Ok(expr) => expr, Err(err) => { order.status = Status::NotProcessed; - MARGIN_ORDER.save(deps.storage, &orders)?; + MARGIN_ORDER.save(deps.storage, order_id, &order)?; return Ok(err); } }; order.status = Status::Processed; - MARGIN_ORDER.save(deps.storage, &orders)?; + MARGIN_ORDER.save(deps.storage, order_id, &order)?; let resp: Response = Response::new().add_event( Event::new("reply_to_open_margin_position") diff --git a/src/action/reply/spot_order.rs b/src/action/reply/spot_order.rs index 9281514..76ce1d8 100644 --- a/src/action/reply/spot_order.rs +++ b/src/action/reply/spot_order.rs @@ -11,25 +11,18 @@ pub fn reply_to_spot_order( ) -> Result, ContractError> { let order_id: u64 = from_json(&data.unwrap()).unwrap(); - let mut orders: Vec = SPOT_ORDER.load(deps.storage)?; - - let order: &mut SpotOrder = orders - .iter_mut() - .find(|order| order.order_id == order_id) - .unwrap(); + let mut order = SPOT_ORDER.load(deps.storage, order_id)?; let _: AmmSwapExactAmountInResp = match get_response_from_reply(module_resp) { Ok(expr) => expr, Err(err) => { - order.status = Status::NotProcessed; - SPOT_ORDER.save(deps.storage, &orders)?; return Ok(err); } }; order.status = Status::Processed; - SPOT_ORDER.save(deps.storage, &orders)?; + SPOT_ORDER.save(deps.storage, order_id, &order)?; let resp: Response = Response::new().add_event( Event::new("reply_to_spot_order").add_attribute("order_id", order_id.to_string()), diff --git a/src/action/reply/spot_order_market.rs b/src/action/reply/spot_order_market.rs index a7fcf16..88499ee 100644 --- a/src/action/reply/spot_order_market.rs +++ b/src/action/reply/spot_order_market.rs @@ -10,21 +10,17 @@ pub fn reply_to_spot_order_market( if let Err(err) = module_resp.into_result() { return Err(StdError::generic_err(err).into()); }; - let mut orders: Vec = SPOT_ORDER.load(deps.storage)?; let order_id: u64 = match data { Some(order_id) => from_json(&order_id)?, None => return Err(StdError::generic_err("no meta_data".to_string()).into()), }; - let order: &mut SpotOrder = match orders.iter_mut().find(|order| order.order_id == order_id) { - Some(order) => order, - None => return Err(ContractError::OrderNotFound { order_id }), - }; + let mut order = SPOT_ORDER.load(deps.storage, order_id)?; order.status = Status::Processed; - SPOT_ORDER.save(deps.storage, &orders)?; + SPOT_ORDER.save(deps.storage, order_id, &order)?; let resp: Response = Response::new().add_event( Event::new("reply_to_spot_order_market").add_attribute("order_id", order_id.to_string()), diff --git a/src/action/sudo/process_orders.rs b/src/action/sudo/process_orders.rs index 8841ef2..20cb821 100644 --- a/src/action/sudo/process_orders.rs +++ b/src/action/sudo/process_orders.rs @@ -1,5 +1,5 @@ use crate::msg::ReplyType; -use cosmwasm_std::{to_json_binary, Decimal, Int128, StdResult, SubMsg}; +use cosmwasm_std::{to_json_binary, Decimal, Int128, StdResult, Storage, SubMsg}; use elys_bindings::query_resp::AmmSwapEstimationByDenomResponse; use std::ops::Div; @@ -9,14 +9,21 @@ pub fn process_orders( deps: DepsMut, env: Env, ) -> Result, ContractError> { - let mut spot_orders = SPOT_ORDER.load(deps.storage)?; - let mut margin_orders = MARGIN_ORDER.load(deps.storage)?; - let mut reply_info = REPLY_INFO.load(deps.storage)?; + let spot_orders: Vec = SPOT_ORDER + .prefix_range(deps.storage, None, None, Order::Ascending) + .filter_map(|res| res.ok().map(|r| r.1)) + .collect(); + + let margin_orders: Vec = MARGIN_ORDER + .prefix_range(deps.storage, None, None, Order::Ascending) + .filter_map(|res| res.ok().map(|r| r.1)) + .collect(); + let mut reply_info_id = MAX_REPLY_ID.load(deps.storage)?; let querier = ElysQuerier::new(&deps.querier); let mut submsgs: Vec> = vec![]; - for spot_order in spot_orders.iter_mut() { + for spot_order in spot_orders.iter() { let amm_swap_estimation = querier.amm_swap_estimation_by_denom( &spot_order.order_amount, &spot_order.order_amount.denom, @@ -29,31 +36,27 @@ pub fn process_orders( spot_order, &mut submsgs, env.contract.address.as_str(), - &mut reply_info, + &mut reply_info_id, amm_swap_estimation, + deps.storage, )?; } } - for margin_order in margin_orders.iter_mut() { + for margin_order in margin_orders.iter() { let amm_swap_estimation = querier.amm_swap_estimation_by_denom( &margin_order.collateral, &margin_order.collateral.denom, - &margin_order.borrow_asset, + &margin_order.trading_asset, &Decimal::zero(), )?; if check_margin_order(&margin_order, amm_swap_estimation) { - process_margin_order( - margin_order, - &mut submsgs, - env.contract.address.as_str(), - &mut reply_info, - )?; + process_margin_order(margin_order, &mut submsgs, &mut reply_info_id, deps.storage)?; } } - REPLY_INFO.save(deps.storage, &reply_info)?; + MAX_REPLY_ID.save(deps.storage, &reply_info_id)?; let resp = Response::new().add_submessages(submsgs); @@ -61,49 +64,44 @@ pub fn process_orders( } fn process_margin_order( - order: &mut MarginOrder, + order: &MarginOrder, submsgs: &mut Vec>, - contract_address: &str, - reply_infos: &mut Vec, + reply_info_id: &mut u64, + storage: &mut dyn Storage, ) -> StdResult<()> { let (msg, reply_type) = if order.order_type == MarginOrderType::LimitOpen { ( - ElysMsg::margin_broker_open_position( - contract_address, - &order.collateral.denom, - Int128::new(order.collateral.amount.u128() as i128), - &order.borrow_asset, - order.position.clone() as i32, + ElysMsg::margin_open_position( + &order.owner, + order.collateral.clone(), + &order.trading_asset, + order.position.clone(), order.leverage.clone(), order.take_profit_price.clone(), - &order.owner, ), ReplyType::MarginBrokerOpen, ) } else { ( - ElysMsg::margin_broker_close_position( - contract_address, - order.position_id.unwrap(), + ElysMsg::margin_close_position( &order.owner, + order.position_id.unwrap(), + 0, //AMOUNT ), ReplyType::MarginBrokerClose, ) }; - let info_id = if let Some(max_info) = reply_infos.iter().max_by_key(|info| info.id) { - max_info.id + 1 - } else { - 0 - }; - - reply_infos.push(ReplyInfo { - id: info_id, + let reply_info = ReplyInfo { + id: *reply_info_id, reply_type, data: Some(to_json_binary(&order.order_id)?), - }); + }; + submsgs.push(SubMsg::reply_on_success(msg, *reply_info_id)); + + REPLY_INFO.save(storage, *reply_info_id, &reply_info)?; - submsgs.push(SubMsg::reply_on_success(msg, info_id)); + *reply_info_id += 1; Ok(()) } @@ -180,17 +178,18 @@ fn check_spot_order( } fn process_spot_order( - order: &mut SpotOrder, + order: &SpotOrder, submsgs: &mut Vec>, sender: &str, - reply_infos: &mut Vec, + reply_info_id: &mut u64, amm_swap_estimation: AmmSwapEstimationByDenomResponse, + storage: &mut dyn Storage, ) -> StdResult<()> { let token_out_min_amount: Int128 = match order.order_type { SpotOrderType::LimitBuy => calculate_token_out_min_amount(order), SpotOrderType::LimitSell => calculate_token_out_min_amount(order), SpotOrderType::StopLoss => Int128::zero(), - SpotOrderType::MarketBuy => Int128::zero(), + _ => Int128::zero(), }; let msg = ElysMsg::amm_swap_exact_amount_in( @@ -202,19 +201,18 @@ fn process_spot_order( &order.owner_address, ); - order.status = Status::Processing; - - let info_id = if let Some(max_info) = reply_infos.iter().max_by_key(|info| info.id) { - max_info.id + 1 - } else { - 0 - }; - reply_infos.push(ReplyInfo { - id: info_id, + let reply_info = ReplyInfo { + id: *reply_info_id, reply_type: ReplyType::SpotOrder, data: Some(to_json_binary(&order.order_id)?), - }); - submsgs.push(SubMsg::reply_on_success(msg, info_id)); + }; + + submsgs.push(SubMsg::reply_on_success(msg, *reply_info_id)); + + REPLY_INFO.save(storage, *reply_info_id, &reply_info)?; + + *reply_info_id += 1; + Ok(()) } @@ -231,5 +229,5 @@ fn calculate_token_out_min_amount(order: &SpotOrder) -> Int128 { order_amount.amount * Decimal::one().div(order_price.rate) }; - Int128::new((amount.u128() - 1) as i128) //slippage integration + Int128::new((amount.u128()) as i128) } diff --git a/src/entry_point/execute.rs b/src/entry_point/execute.rs index d86b95c..7c03c1e 100644 --- a/src/entry_point/execute.rs +++ b/src/entry_point/execute.rs @@ -36,7 +36,7 @@ pub fn execute( CreateMarginOrder { position, leverage, - borrow_asset, + trading_asset, take_profit_price, order_type, trigger_price, @@ -47,7 +47,7 @@ pub fn execute( env, position, leverage, - borrow_asset, + trading_asset, take_profit_price, order_type, trigger_price, @@ -59,15 +59,44 @@ pub fn execute( owner_address, order_type, } => cancel_margin_orders(info, deps, order_ids, owner_address, order_type), - CloseMarginPosition { id } => close_margin_position(info, env, id), + CloseMarginPosition { id, amount } => close_margin_position(info, env, id, amount), - StakeRequest { amount, asset, validator_address } => stake_request(env, info, deps, amount, asset, validator_address), - UnstakeRequest { amount, asset, validator_address } => unstake_request(env, info, deps, amount, asset, validator_address), - ElysRedelegateRequest { validator_src_address, validator_dst_address, amount} => elys_redelegation_request(env, info, deps, validator_src_address, validator_dst_address, amount), - ElysCancelUnstakeRequest { validator_address, amount, creation_height } => elys_cancel_unstake_request(env, info, deps, validator_address, amount, creation_height), - EdenVestRequest { amount} => eden_vest_request(env, info, deps, amount), - EdenCancelVestRequest { amount } => eden_cancel_vest_request(env, info, deps, amount), - ClaimRewardsRequest { withdraw_type } => claim_rewards_request(env, info, deps, withdraw_type), - ClaimValidatorCommissionRequest { validator_address } => claim_validator_commission_request(env, info, deps, validator_address), + StakeRequest { + amount, + asset, + validator_address, + } => stake_request(env, info, deps, amount, asset, validator_address), + UnstakeRequest { + amount, + asset, + validator_address, + } => unstake_request(env, info, deps, amount, asset, validator_address), + ElysRedelegateRequest { + validator_src_address, + validator_dst_address, + amount, + } => elys_redelegation_request( + env, + info, + deps, + validator_src_address, + validator_dst_address, + amount, + ), + ElysCancelUnstakeRequest { + validator_address, + amount, + creation_height, + } => { + elys_cancel_unstake_request(env, info, deps, validator_address, amount, creation_height) + } + EdenVestRequest { amount } => eden_vest_request(env, info, deps, amount), + EdenCancelVestRequest { amount } => eden_cancel_vest_request(env, info, deps, amount), + ClaimRewardsRequest { withdraw_type } => { + claim_rewards_request(env, info, deps, withdraw_type) + } + ClaimValidatorCommissionRequest { validator_address } => { + claim_validator_commission_request(env, info, deps, validator_address) + } } } diff --git a/src/entry_point/instantiate.rs b/src/entry_point/instantiate.rs index c6c3b72..703050a 100644 --- a/src/entry_point/instantiate.rs +++ b/src/entry_point/instantiate.rs @@ -9,9 +9,6 @@ pub fn instantiate( _info: MessageInfo, _msg: InstantiateMsg, ) -> StdResult> { - SPOT_ORDER.save(deps.storage, &vec![])?; - MARGIN_ORDER.save(deps.storage, &vec![])?; - REPLY_INFO.save(deps.storage, &vec![])?; - + MAX_REPLY_ID.save(deps.storage, &0)?; Ok(Response::new()) } diff --git a/src/entry_point/query.rs b/src/entry_point/query.rs index 254a440..fecec44 100644 --- a/src/entry_point/query.rs +++ b/src/entry_point/query.rs @@ -8,7 +8,7 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result Ok(to_json_binary(&query::get_spot_order(deps, order_id)?)?), - GetAllPrices {} => Ok(to_json_binary(&query::get_all_prices(deps)?)?), + GetAllPrices { limit } => Ok(to_json_binary(&query::get_all_prices(deps, limit)?)?), AssetInfo { denom } => Ok(to_json_binary(&query::asset_info(deps, denom)?)?), GetMarginPosition { address, id } => Ok(to_json_binary(&query::get_margin_position( deps, address, id, diff --git a/src/entry_point/reply.rs b/src/entry_point/reply.rs index c16f33a..d825361 100644 --- a/src/entry_point/reply.rs +++ b/src/entry_point/reply.rs @@ -1,5 +1,5 @@ use super::*; -use crate::{action::reply::*, states::REPLY_INFO, types::ReplyInfo}; +use crate::{action::reply::*, states::REPLY_INFO}; use cosmwasm_std::Reply; use msg::ReplyType; @@ -10,23 +10,9 @@ pub fn reply( msg: Reply, ) -> Result, ContractError> { let module_resp = msg.result; - let infos = REPLY_INFO.load(deps.storage)?; - let info = match infos.iter().find(|info| info.id == msg.id) { - Some(info) => info.to_owned(), - None => { - return Ok( - Response::new().add_attribute("error", format!("{}: reply info not fount", msg.id)) - ); - } - }; - - let new_infos: Vec = infos - .iter() - .filter(|info| info.id != msg.id) - .cloned() - .collect(); + let info = REPLY_INFO.load(deps.storage, msg.id)?; - REPLY_INFO.save(deps.storage, &new_infos)?; + REPLY_INFO.remove(deps.storage, msg.id); match info.reply_type { ReplyType::SpotOrder => reply_to_spot_order(deps, info.data, module_resp), diff --git a/src/msg/execute_msg.rs b/src/msg/execute_msg.rs index 3482a80..80ef0c3 100644 --- a/src/msg/execute_msg.rs +++ b/src/msg/execute_msg.rs @@ -1,6 +1,6 @@ use crate::types::{MarginOrderType, MarginPosition, OrderPrice, SpotOrderType}; use cosmwasm_schema::cw_serde; -use cosmwasm_std::{Decimal, Coin}; +use cosmwasm_std::{Coin, Decimal, Int128}; use elys_bindings::types::EarnType; #[cw_serde] @@ -23,7 +23,7 @@ pub enum ExecuteMsg { CreateMarginOrder { position: Option, // Can be null if it's not a LimitOpen or MarketOpen type leverage: Option, // Can be null if it's not a LimitOpen or MarketOpen type - borrow_asset: Option, // Can be null if it's not a LimitOpen or MarketOpen type + trading_asset: Option, // Can be null if it's not a LimitOpen or MarketOpen type take_profit_price: Option, // Can be null if it's not a LimitOpen or MarketOpen type order_type: MarginOrderType, trigger_price: Option, // Can be null if it's a MarketOpen or MarketClose type @@ -40,6 +40,7 @@ pub enum ExecuteMsg { }, CloseMarginPosition { id: u64, + amount: Int128, }, StakeRequest { amount: u64, @@ -54,7 +55,7 @@ pub enum ExecuteMsg { ElysRedelegateRequest { validator_src_address: String, validator_dst_address: String, - amount: Coin, + amount: Coin, }, ElysCancelUnstakeRequest { validator_address: String, @@ -64,15 +65,15 @@ pub enum ExecuteMsg { creation_height: i64, }, EdenVestRequest { - amount: u64, + amount: u64, }, EdenCancelVestRequest { - amount: u64, + amount: u64, }, ClaimRewardsRequest { withdraw_type: EarnType, }, ClaimValidatorCommissionRequest { validator_address: String, - } + }, } diff --git a/src/msg/query_msg.rs b/src/msg/query_msg.rs index 8b3f53f..1f0e8cd 100644 --- a/src/msg/query_msg.rs +++ b/src/msg/query_msg.rs @@ -13,7 +13,7 @@ pub enum QueryMsg { #[returns(GetSpotOrderResp)] GetSpotOrder { order_id: u64 }, #[returns(GetAllPricesResponse)] - GetAllPrices {}, + GetAllPrices { limit: u64 }, #[returns(OracleAssetInfoResponse)] AssetInfo { denom: String }, #[returns(GetMarginOrderResp)] diff --git a/src/states/margin_order.rs b/src/states/margin_order.rs index 0224351..f970542 100644 --- a/src/states/margin_order.rs +++ b/src/states/margin_order.rs @@ -1,4 +1,4 @@ use crate::types::MarginOrder; -use cw_storage_plus::Item; +use cw_storage_plus::Map; -pub const MARGIN_ORDER: Item> = Item::new("order"); +pub const MARGIN_ORDER: Map = Map::new("margin order"); diff --git a/src/states/mod.rs b/src/states/mod.rs index 9ce5f97..5b051d3 100644 --- a/src/states/mod.rs +++ b/src/states/mod.rs @@ -3,5 +3,5 @@ mod reply_info; mod spot_order; pub use margin_order::MARGIN_ORDER; -pub use reply_info::REPLY_INFO; +pub use reply_info::{MAX_REPLY_ID, REPLY_INFO}; pub use spot_order::SPOT_ORDER; diff --git a/src/states/reply_info.rs b/src/states/reply_info.rs index 6af4d9d..324b0c5 100644 --- a/src/states/reply_info.rs +++ b/src/states/reply_info.rs @@ -1,4 +1,6 @@ use crate::types::ReplyInfo; -use cw_storage_plus::Item; +use cw_storage_plus::{Item, Map}; -pub const REPLY_INFO: Item> = Item::new("reply_info"); +pub const REPLY_INFO: Map = Map::new("reply_info"); + +pub const MAX_REPLY_ID: Item = Item::new("reply_info_id"); diff --git a/src/states/spot_order.rs b/src/states/spot_order.rs index 9757f10..d464d5b 100644 --- a/src/states/spot_order.rs +++ b/src/states/spot_order.rs @@ -1,4 +1,4 @@ use crate::types::SpotOrder; -use cw_storage_plus::Item; +use cw_storage_plus::Map; -pub const SPOT_ORDER: Item> = Item::new("spot order"); +pub const SPOT_ORDER: Map = Map::new("spot order"); diff --git a/src/tests/close_margin_position/closing_a_margin_position.rs b/src/tests/close_margin_position/closing_a_margin_position.rs index 204b159..bbde65a 100644 --- a/src/tests/close_margin_position/closing_a_margin_position.rs +++ b/src/tests/close_margin_position/closing_a_margin_position.rs @@ -1,3 +1,5 @@ +use cosmwasm_std::Int128; + use super::*; #[test] @@ -30,7 +32,10 @@ fn closing_marging_position() { app.execute_contract( Addr::unchecked("user"), addr, - &ExecuteMsg::CloseMarginPosition { id: 2 }, + &ExecuteMsg::CloseMarginPosition { + id: 2, + amount: Int128::new(300), + }, &[], ) .unwrap(); diff --git a/src/tests/create_margin_order/coin_number.rs b/src/tests/create_margin_order/coin_number.rs index 572c5cd..0917e57 100644 --- a/src/tests/create_margin_order/coin_number.rs +++ b/src/tests/create_margin_order/coin_number.rs @@ -35,7 +35,7 @@ fn coin_number() { &ExecuteMsg::CreateMarginOrder { position: Some(MarginPosition::Short), leverage: Some(Decimal::from_atomics(Uint128::new(500), 2).unwrap()), - borrow_asset: Some("uatom".to_string()), + trading_asset: Some("uatom".to_string()), take_profit_price: Some(Decimal::from_atomics(Uint128::new(500), 2).unwrap()), order_type: MarginOrderType::LimitOpen, trigger_price: Some(OrderPrice { diff --git a/src/tests/create_margin_order/successful_create_margin_market_order.rs b/src/tests/create_margin_order/successful_create_margin_market_order.rs index f86cee7..f50766a 100644 --- a/src/tests/create_margin_order/successful_create_margin_market_order.rs +++ b/src/tests/create_margin_order/successful_create_margin_market_order.rs @@ -39,7 +39,7 @@ fn successful_create_margin_market_open_order() { &ExecuteMsg::CreateMarginOrder { position: Some(MarginPosition::Long), leverage: Some(Decimal::from_atomics(Uint128::new(215), 2).unwrap()), - borrow_asset: Some("btc".to_string()), + trading_asset: Some("btc".to_string()), take_profit_price: Some(Decimal::from_atomics(Uint128::new(200), 2).unwrap()), order_type: MarginOrderType::MarketOpen, trigger_price: Some(OrderPrice { diff --git a/src/tests/create_margin_order/successful_create_margin_order.rs b/src/tests/create_margin_order/successful_create_margin_order.rs index 6ffbd0e..ff53e00 100644 --- a/src/tests/create_margin_order/successful_create_margin_order.rs +++ b/src/tests/create_margin_order/successful_create_margin_order.rs @@ -42,7 +42,7 @@ fn successful_create_margin_order() { &ExecuteMsg::CreateMarginOrder { position: Some(MarginPosition::Long), leverage: Some(Decimal::from_atomics(Uint128::new(215), 2).unwrap()), - borrow_asset: Some("btc".to_string()), + trading_asset: Some("btc".to_string()), take_profit_price: Some(Decimal::from_atomics(Uint128::new(200), 2).unwrap()), order_type: MarginOrderType::LimitOpen, trigger_price: Some(OrderPrice { diff --git a/src/tests/create_margin_order/successful_create_nargin_market_close.rs b/src/tests/create_margin_order/successful_create_nargin_market_close.rs index 0047ac0..1268590 100644 --- a/src/tests/create_margin_order/successful_create_nargin_market_close.rs +++ b/src/tests/create_margin_order/successful_create_nargin_market_close.rs @@ -68,7 +68,7 @@ fn successful_create_margin_market_open_order() { position_id: Some(1), position: None, leverage: None, - borrow_asset: None, + trading_asset: None, take_profit_price: None, order_type: MarginOrderType::MarketClose, trigger_price: None, diff --git a/src/tests/mock/instantiate.rs b/src/tests/mock/instantiate.rs index 8ce9878..ddbca1f 100644 --- a/src/tests/mock/instantiate.rs +++ b/src/tests/mock/instantiate.rs @@ -18,8 +18,16 @@ pub fn instantiate( _info: MessageInfo, msg: InstantiateMockMsg, ) -> StdResult> { - SPOT_ORDER.save(deps.storage, &msg.spot_orders)?; - MARGIN_ORDER.save(deps.storage, &msg.margin_orders)?; - REPLY_INFO.save(deps.storage, &vec![])?; + if !msg.spot_orders.is_empty() { + for order in msg.spot_orders.iter() { + SPOT_ORDER.save(deps.storage, order.order_id, order)?; + } + } + if !msg.margin_orders.is_empty() { + for order in msg.margin_orders.iter() { + MARGIN_ORDER.save(deps.storage, order.order_id, order)?; + } + } + MAX_REPLY_ID.load(deps.storage)?; Ok(Response::new()) } diff --git a/src/types/margin_order.rs b/src/types/margin_order.rs index 2357aaa..b9811ec 100644 --- a/src/types/margin_order.rs +++ b/src/types/margin_order.rs @@ -12,7 +12,7 @@ pub struct MarginOrder { pub position: MarginPosition, pub trigger_price: Option, pub collateral: Coin, - pub borrow_asset: String, + pub trading_asset: String, pub leverage: Decimal, pub take_profit_price: Decimal, pub position_id: Option, @@ -25,7 +25,7 @@ impl MarginOrder { position: &MarginPosition, order_type: &MarginOrderType, collateral: &Coin, - borrow_asset: impl Into, + trading_asset: impl Into, leverage: &Decimal, take_profit_price: &Decimal, trigger_price: &Option, @@ -36,18 +36,14 @@ impl MarginOrder { None => 0, }; - let status = if order_type == &MarginOrderType::MarketOpen { - Status::Processing - } else { - Status::NotProcessed - }; + let status = Status::NotProcessed; Self { order_id, owner: owner.into(), position: position.to_owned(), collateral: collateral.to_owned(), - borrow_asset: borrow_asset.into(), + trading_asset: trading_asset.into(), leverage: leverage.to_owned(), take_profit_price: take_profit_price.to_owned(), order_type: order_type.to_owned(), @@ -61,7 +57,7 @@ impl MarginOrder { position: i32, order_type: &MarginOrderType, collateral: &Coin, - borrow_asset: impl Into, + trading_asset: impl Into, leverage: &Decimal, position_id: u64, trigger_price: &Option, @@ -73,11 +69,7 @@ impl MarginOrder { None => 0, }; - let status = if order_type == &MarginOrderType::MarketClose { - Status::Processing - } else { - Status::NotProcessed - }; + let status = Status::NotProcessed; let position = MarginPosition::try_from_i32(position)?; @@ -89,7 +81,7 @@ impl MarginOrder { owner: owner.into(), trigger_price: trigger_price.to_owned(), collateral: collateral.to_owned(), - borrow_asset: borrow_asset.into(), + trading_asset: trading_asset.into(), position_id: Some(position_id), leverage: leverage.to_owned(), take_profit_price: take_profit_price.to_owned(), diff --git a/src/types/spot_order/impls/new.rs b/src/types/spot_order/impls/new.rs index 5eecdbb..9e43aee 100644 --- a/src/types/spot_order/impls/new.rs +++ b/src/types/spot_order/impls/new.rs @@ -25,11 +25,7 @@ impl SpotOrder { }, }; - let status = if order_type == SpotOrderType::MarketBuy { - Status::Processing - } else { - Status::NotProcessed - }; + let status = Status::NotProcessed; SpotOrder { order_type, diff --git a/src/types/status.rs b/src/types/status.rs index 1307471..0b2f375 100644 --- a/src/types/status.rs +++ b/src/types/status.rs @@ -3,7 +3,6 @@ use cosmwasm_schema::cw_serde; #[cw_serde] pub enum Status { NotProcessed, - Processing, Processed, Canceled, } From 6c9386824bb441b633a503274562ff4d2d458b2f Mon Sep 17 00:00:00 2001 From: politeWall <138504353+politeWall@users.noreply.github.com> Date: Wed, 6 Dec 2023 03:00:20 +0100 Subject: [PATCH 2/6] docs: create margin order update --- front_end_script/README.md | 16 +++++++++------- front_end_script/upload.js | 11 +++++------ 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/front_end_script/README.md b/front_end_script/README.md index 5443898..12f9700 100644 --- a/front_end_script/README.md +++ b/front_end_script/README.md @@ -148,19 +148,20 @@ getSpotOrders( ); ``` -### 6. createMarginOrder(position, collateral, leverage, borrow_asset, take_profit_price, order_type, trigger_price) +### 6. createMarginOrder(position, collateral, leverage, trading_asset, take_profit_price, order_type, trigger_price) This function allows you to create a margin order by sending a transaction to the CosmWasm contract. #### Parameters -- `position` (String): The type of position for the margin order (e.g., "long", "short"). - `collateral` (Coin {demom: String , amount : String}): The amount of collateral for the margin order. -- `leverage` (String): The leverage for the margin order. -- `borrow_asset` (String): The asset to borrow for the margin order. -- `take_profit_price` (String): The price at which the order will take profit. +- `position` (String): The type of position for the margin order (e.g., "long", "short"). Can be null if it's not a LimitOpen or MarketOpen type +- `leverage` (String): The leverage for the margin order.Can be null if it's not a LimitOpen or MarketOpen type +- `trading_asset` (String): The asset to borrow for the margin order. Can be null if it's not a LimitOpen or MarketOpen type +- `take_profit_price` (String): The price at which the order will take profit. Can be null if it's not a LimitOpen or MarketOpen type - `order_type` (String): The type of the order (e.g., "stop_loss", "limit_sell", "limit_buy"). - `trigger_price` ({`base_denom`:String, `quote_denom`:String, `rate` :String} or null): Price relates two assets exchange rate that the user should define, can only be null if the order type is "market_type" +- `position_id` (u64) Can be null if it's not a LimitClose, MarketClose or StopLoss type #### Usage @@ -169,10 +170,11 @@ createMarginOrder( "position_type", "collateral", "leverage_value", - "borrow_asset", + "trading_asset", "take_profit_price", "order_type", "trigger_price" + "position_id" ); ``` @@ -187,6 +189,7 @@ createMarginOrder( "2.2" "limit_buy", { base_denom: "ueth", quote_denom: "uusdc", rate: "2076.5" } + null ); ``` @@ -216,7 +219,6 @@ This function retrieves information about a specific margin order by querying a #### Parameters -- `address` (String): The address associated with the margin order. - `order_id` (String): The unique identifier for the order you want to retrieve. #### Usage diff --git a/front_end_script/upload.js b/front_end_script/upload.js index cf5a51c..34fea81 100644 --- a/front_end_script/upload.js +++ b/front_end_script/upload.js @@ -43,7 +43,6 @@ async function getSpotOrder(order_id) { } async function createSpotOrder( - order_amm_routes, order_price, order_type, amount_send, @@ -62,7 +61,6 @@ async function createSpotOrder( const executeFee = calculateFee(300_000, gasPrice); const msg = { create_spot_order: { - order_amm_routes: order_amm_routes, order_price: order_price, order_type: order_type, order_source_denom: denom_send, @@ -185,10 +183,11 @@ async function createMarginOrder( position_type, collateral, leverage_value, - borrow_asset, + trading_asset, take_profit_price, order_type, - trigger_price + trigger_price, + position_id ) { const gasPrice = GasPrice.fromString(GASPRICE); const sender_wallet = await DirectSecp256k1HdWallet.fromMnemonic( @@ -203,9 +202,9 @@ async function createMarginOrder( const msg = { create_margin_order: { position_type: position_type, - collateral: collateral, leverage_value: leverage_value, - borrow_asset: borrow_asset, + trading_asset: trading_asset, + position_id: position_id, take_profit_price: take_profit_price, order_type: order_type, trigger_price: trigger_price, From 3919bf4f581f2f5880e946d321d36543d6b67d9b Mon Sep 17 00:00:00 2001 From: politeWall <138504353+politeWall@users.noreply.github.com> Date: Wed, 6 Dec 2023 11:37:00 +0100 Subject: [PATCH 3/6] fix: fix mocking of the instantiate --- src/tests/mock/instantiate.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/mock/instantiate.rs b/src/tests/mock/instantiate.rs index ddbca1f..a074e08 100644 --- a/src/tests/mock/instantiate.rs +++ b/src/tests/mock/instantiate.rs @@ -28,6 +28,6 @@ pub fn instantiate( MARGIN_ORDER.save(deps.storage, order.order_id, order)?; } } - MAX_REPLY_ID.load(deps.storage)?; + MAX_REPLY_ID.save(deps.storage, &0)?; Ok(Response::new()) } From 94d4f12fb468a670382691fd7ca5ae91c520aa84 Mon Sep 17 00:00:00 2001 From: politeWall <138504353+politeWall@users.noreply.github.com> Date: Wed, 6 Dec 2023 15:22:25 +0100 Subject: [PATCH 4/6] feat: fix test, add map handling for order and reply, change status , updated doc --- Cargo.lock | 10 ++--- Cargo.toml | 8 ++-- front_end_script/README.md | 40 ++++++++++++++++--- front_end_script/upload.js | 38 +++++++++++++++++- src/action/execute/cancel_margin_order.rs | 2 +- src/action/execute/cancel_margin_orders.rs | 2 +- src/action/execute/cancel_spot_order.rs | 2 +- src/action/execute/cancel_spot_orders.rs | 2 +- src/action/execute/claim_rewards_request.rs | 1 - .../claim_validator_commission_request.rs | 1 - src/action/execute/close_margin_position.rs | 2 +- src/action/execute/create_margin_order.rs | 38 +++++++++++------- .../execute/eden_cancel_vest_request.rs | 1 - src/action/execute/eden_vest_request.rs | 1 - .../execute/elys_cancel_unstake_request.rs | 1 - .../execute/elys_redelegation_request.rs | 1 - src/action/execute/stake_request.rs | 1 - src/action/execute/unstake_request.rs | 1 - src/action/query/get_margin_orders.rs | 34 ++++++++-------- src/action/query/get_spot_orders.rs | 34 ++++++++-------- src/action/reply/close_margin_position.rs | 4 +- .../reply/create_margin_order_market_close.rs | 2 +- .../reply/create_margin_order_market_open.rs | 2 +- src/action/reply/open_margin_position.rs | 4 +- src/action/reply/spot_order.rs | 2 +- src/action/reply/spot_order_market.rs | 2 +- src/action/sudo/process_orders.rs | 25 +++++++----- src/entry_point/execute.rs | 22 ++++------ src/entry_point/query.rs | 4 ++ src/msg/query_msg.rs | 4 +- .../process_spot_order_processing.rs | 4 +- .../successfully_cancel_orders.rs | 8 ++-- .../successfully_cancel_orders_id.rs | 8 ++-- .../successfully_cancel_orders_type.rs | 8 ++-- .../closing_a_margin_position.rs | 2 +- .../successful_create_margin_market_order.rs | 2 +- .../successful_create_nargin_market_close.rs | 2 +- src/tests/create_spot_order/coin_number.rs | 6 ++- .../successful_create_market_order.rs | 3 +- src/tests/get_spot_orders/get_spot_orders.rs | 13 +++--- .../process_limit_open.rs | 2 +- .../process_order_close.rs | 34 +++++++++++++++- .../successful_process_5_of_10_orders.rs | 20 +++++----- src/types/margin_order.rs | 4 +- src/types/spot_order/impls/new.rs | 2 +- src/types/spot_order/impls/new_dummy.rs | 2 +- src/types/status.rs | 4 +- 47 files changed, 259 insertions(+), 156 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0384b99..de6a767 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -371,8 +371,8 @@ dependencies = [ [[package]] name = "elys-bindings" -version = "0.7.0" -source = "git+https://github.com/elys-network/bindings?tag=v0.7.0#1fd2d8733894e6f2a5f943cc7a072d665803f378" +version = "0.8.0" +source = "git+https://github.com/elys-network/bindings?tag=v0.8.0#6e3eba16496f7ea9ded374099c6ad6e51331708f" dependencies = [ "cosmwasm-schema", "cosmwasm-std", @@ -381,8 +381,8 @@ dependencies = [ [[package]] name = "elys-bindings-test" -version = "0.7.0" -source = "git+https://github.com/elys-network/bindings?tag=v0.7.0#1fd2d8733894e6f2a5f943cc7a072d665803f378" +version = "0.8.0" +source = "git+https://github.com/elys-network/bindings?tag=v0.8.0#6e3eba16496f7ea9ded374099c6ad6e51331708f" dependencies = [ "anyhow", "cosmwasm-schema", @@ -787,7 +787,7 @@ dependencies = [ [[package]] name = "trade_shield_contract" -version = "0.9.0" +version = "0.10.0" dependencies = [ "cosmwasm-schema", "cosmwasm-std", diff --git a/Cargo.toml b/Cargo.toml index edfbd80..7e3ad1e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "trade_shield_contract" -version = "0.9.0" +version = "0.10.0" edition = "2021" [lib] @@ -14,13 +14,13 @@ thiserror = "1" schemars = "0.8.1" cosmwasm-schema = "1.1.4" cw-utils = "0.13" -elys-bindings = { version = "0.7.0", git = "https://github.com/elys-network/bindings", tag = "v0.7.0" } +elys-bindings = { version = "0.8.0", git = "https://github.com/elys-network/bindings", tag = "v0.8.0" } [dev-dependencies] cw-multi-test = "0.13.4" serde_json = "1.0.107" -elys-bindings = { version = "0.7.0", git = "https://github.com/elys-network/bindings", tag = "v0.7.0", features = [ +elys-bindings = { version = "0.8.0", git = "https://github.com/elys-network/bindings", tag = "v0.8.0", features = [ "testing", ] } -elys-bindings-test = { version = "0.7.0", git = "https://github.com/elys-network/bindings", tag = "v0.7.0" } +elys-bindings-test = { version = "0.8.0", git = "https://github.com/elys-network/bindings", tag = "v0.8.0" } diff --git a/front_end_script/README.md b/front_end_script/README.md index 12f9700..5473bce 100644 --- a/front_end_script/README.md +++ b/front_end_script/README.md @@ -89,7 +89,7 @@ This function retrieves information about multiple order by querying a CosmWasm #### Usage ```javascript -cancelSpotOrders("order_ids", "order_type", "owner_address"); +cancelSpotOrders("order_ids", "order_type", "order_owner"); ``` #### Exemple @@ -122,7 +122,7 @@ getSpotOrder("your_order_id_here"); getSpotOrder("1"); ``` -### 5. getSpotOrders(pagination, order_type, owner_address) +### 5. getSpotOrders(pagination, order_type, order_owner, order_status) This function retrieves information about multiple order by querying a CosmWasm contract on the blockchain. @@ -130,12 +130,13 @@ This function retrieves information about multiple order by querying a CosmWasm - `pagination` {PageRequest} : - `order_type` (OrderType or null): select the order type that should be querried -- `owner_address` (String or null): select the owner of the order that should be querried +- `order_owner` (String or null): select the owner of the order that should be querried +- `order_status` (String or null) : select the order staus that should be querried (Pending,Executed,Canceled) #### Usage ```javascript -getSpotOrders({"count_total", "limit", "reverse", "key"}, "order_type", "owner_address") +getSpotOrders({"count_total", "limit", "reverse", "key"}, "order_type", "order_owner", "status") ``` #### @@ -144,7 +145,8 @@ getSpotOrders({"count_total", "limit", "reverse", "key"}, "order_type", "owner_a getSpotOrders( { count_total: true, limit: 10, reverse: false, key: null }, "stop_loss", - "elys12tzylat4udvjj56uuhu3vj2n4vgp7cf9fwna9w" + "elys12tzylat4udvjj56uuhu3vj2n4vgp7cf9fwna9w", + null ); ``` @@ -300,6 +302,34 @@ SwapEstimationByDenom({ }); ``` +### 12. getMarginOrders(pagination, order_type, order_owner, order_status) + +This function retrieves information about multiple order by querying a CosmWasm contract on the blockchain. + +#### Parameters + +- `pagination` {PageRequest} : +- `order_type` (OrderType or null): select the order type that should be querried +- `order_owner` (String or null): select the owner of the order that should be querried +- `order_status` (String or null) : select the order staus that should be querried (pending,executed,canceled) + +#### Usage + +```javascript +getMarginOrders({"count_total", "limit", "reverse", "key"}, "order_type", "order_owner", status) +``` + +#### + +```js +getMarginOrders( + { count_total: true, limit: 10, reverse: false, key: null }, + "stop_loss", + "elys12tzylat4udvjj56uuhu3vj2n4vgp7cf9fwna9w", + "pending" +); +``` + ## Configuration Before using these functions, you need to configure the following parameters in the script: diff --git a/front_end_script/upload.js b/front_end_script/upload.js index 34fea81..26178eb 100644 --- a/front_end_script/upload.js +++ b/front_end_script/upload.js @@ -135,7 +135,40 @@ async function cancelSpotOrders(order_type, owner_address, order_ids) { console.log("create_spot_orders_res:", create_spot_orders_res); } -async function getSpotOrders(pagination, order_type, owner_address) { +async function getSpotOrders( + pagination, + order_type, + order_owner, + order_status +) { + const sender_wallet = await DirectSecp256k1HdWallet.fromMnemonic( + sender.mnemonic, + { prefix: "elys" } + ); + const sender_client = await SigningCosmWasmClient.connectWithSigner( + rpcEndpoint, + sender_wallet + ); + const result = await sender_client.queryContractSmart( + trade_shield_contract_addr, + { + get_spot_orders: { + pagination: pagination, + order_type: order_type, + order_owner: order_owner, + order_status: order_status, + }, + } + ); + console.log(`Result: `, result); +} + +async function getSpotOrders( + pagination, + order_type, + order_owner, + order_status +) { const sender_wallet = await DirectSecp256k1HdWallet.fromMnemonic( sender.mnemonic, { prefix: "elys" } @@ -150,7 +183,8 @@ async function getSpotOrders(pagination, order_type, owner_address) { get_spot_orders: { pagination: pagination, order_type: order_type, - owner_address: owner_address, + order_owner: order_owner, + order_status: order_status, }, } ); diff --git a/src/action/execute/cancel_margin_order.rs b/src/action/execute/cancel_margin_order.rs index a6de82d..bea1411 100644 --- a/src/action/execute/cancel_margin_order.rs +++ b/src/action/execute/cancel_margin_order.rs @@ -18,7 +18,7 @@ pub fn cancel_margin_order( }); } - if order.status != Status::NotProcessed { + if order.status != Status::Pending { return Err(ContractError::CancelStatusError { order_id, status: order.status.clone(), diff --git a/src/action/execute/cancel_margin_orders.rs b/src/action/execute/cancel_margin_orders.rs index c1df434..e1b6a9e 100644 --- a/src/action/execute/cancel_margin_orders.rs +++ b/src/action/execute/cancel_margin_orders.rs @@ -38,7 +38,7 @@ pub fn cancel_margin_orders( if let Some(order) = filtered_order .iter() - .find(|order| order.status != Status::NotProcessed) + .find(|order| order.status != Status::Pending) { return Err(ContractError::CancelStatusError { order_id: order.order_id, diff --git a/src/action/execute/cancel_spot_order.rs b/src/action/execute/cancel_spot_order.rs index 093b4c2..01639f4 100644 --- a/src/action/execute/cancel_spot_order.rs +++ b/src/action/execute/cancel_spot_order.rs @@ -16,7 +16,7 @@ pub fn cancel_spot_order( }); } - if order.status != Status::NotProcessed { + if order.status != Status::Pending { return Err(ContractError::CancelStatusError { order_id, status: order.status.clone(), diff --git a/src/action/execute/cancel_spot_orders.rs b/src/action/execute/cancel_spot_orders.rs index daf16d5..32323a1 100644 --- a/src/action/execute/cancel_spot_orders.rs +++ b/src/action/execute/cancel_spot_orders.rs @@ -38,7 +38,7 @@ pub fn cancel_spot_orders( if let Some(order) = filtered_order .iter() - .find(|order| order.status != Status::NotProcessed) + .find(|order| order.status != Status::Pending) { return Err(ContractError::CancelStatusError { order_id: order.order_id, diff --git a/src/action/execute/claim_rewards_request.rs b/src/action/execute/claim_rewards_request.rs index cfe260c..fccfeaf 100644 --- a/src/action/execute/claim_rewards_request.rs +++ b/src/action/execute/claim_rewards_request.rs @@ -2,7 +2,6 @@ use super::*; use elys_bindings::types::EarnType; pub fn claim_rewards_request( - env: Env, info: MessageInfo, _deps: DepsMut, withdraw_type: EarnType, diff --git a/src/action/execute/claim_validator_commission_request.rs b/src/action/execute/claim_validator_commission_request.rs index ee05d0f..62d47a8 100644 --- a/src/action/execute/claim_validator_commission_request.rs +++ b/src/action/execute/claim_validator_commission_request.rs @@ -1,7 +1,6 @@ use super::*; // delegator_address, validator_address, denom pub fn claim_validator_commission_request( - env: Env, info: MessageInfo, _deps: DepsMut, validator_address: String, diff --git a/src/action/execute/close_margin_position.rs b/src/action/execute/close_margin_position.rs index 7a801ac..a3d7160 100644 --- a/src/action/execute/close_margin_position.rs +++ b/src/action/execute/close_margin_position.rs @@ -4,7 +4,7 @@ use super::*; pub fn close_margin_position( info: MessageInfo, - env: Env, + id: u64, amount: Int128, ) -> Result, ContractError> { diff --git a/src/action/execute/create_margin_order.rs b/src/action/execute/create_margin_order.rs index faafe98..f1c9525 100644 --- a/src/action/execute/create_margin_order.rs +++ b/src/action/execute/create_margin_order.rs @@ -8,7 +8,6 @@ use MarginOrderType::*; pub fn create_margin_order( info: MessageInfo, deps: DepsMut, - env: Env, position: Option, leverage: Option, trading_asset: Option, @@ -31,7 +30,6 @@ pub fn create_margin_order( create_margin_open_order( info, deps, - env, order_type, position.unwrap(), trading_asset.unwrap(), @@ -40,14 +38,7 @@ pub fn create_margin_order( trigger_price, ) } else { - create_margin_close_order( - info, - deps, - env, - order_type, - position_id.unwrap(), - trigger_price, - ) + create_margin_close_order(info, deps, order_type, position_id.unwrap(), trigger_price) } } @@ -101,7 +92,7 @@ fn check_order_type( fn create_margin_open_order( info: MessageInfo, deps: DepsMut, - env: Env, + order_type: MarginOrderType, position: MarginPosition, trading_asset: String, @@ -120,7 +111,20 @@ fn create_margin_open_order( return Err(StdError::generic_err("margin position cannot be set at: Unspecified").into()); } - //TODO: include query to test if the collateral is valid + let querrier = ElysQuerier::new(&deps.querier); + + let open_estimation = querrier.margin_open_estimation( + position.clone(), + leverage.clone(), + &trading_asset, + collateral.clone(), + take_profit_price.clone(), + Decimal::zero(), + )?; + + if !open_estimation.valid_collateral { + return Err(StdError::generic_err("not valid collateral").into()); + } let order = MarginOrder::new_open( &info.sender, @@ -175,7 +179,7 @@ fn create_margin_open_order( fn create_margin_close_order( info: MessageInfo, deps: DepsMut, - env: Env, + order_type: MarginOrderType, position_id: u64, trigger_price: Option, @@ -231,14 +235,18 @@ fn create_margin_close_order( return Ok(resp); } - let msg = ElysMsg::margin_close_position(&info.sender, position_id, 0 /*AMOUNT */); + let msg = ElysMsg::margin_close_position( + &info.sender, + position_id, + mtp.custodies[0].amount.u128() as i128, + ); let reply_id = MAX_REPLY_ID.load(deps.storage)? + 1; MAX_REPLY_ID.save(deps.storage, &reply_id)?; let reply_info = ReplyInfo { id: reply_id, - reply_type: ReplyType::MarginBrokerMarketOpen, + reply_type: ReplyType::MarginBrokerMarketClose, data: Some(to_json_binary(&order_id)?), }; diff --git a/src/action/execute/eden_cancel_vest_request.rs b/src/action/execute/eden_cancel_vest_request.rs index 273033b..ec8cc1a 100644 --- a/src/action/execute/eden_cancel_vest_request.rs +++ b/src/action/execute/eden_cancel_vest_request.rs @@ -2,7 +2,6 @@ use super::*; use cosmwasm_std::Int128; pub fn eden_cancel_vest_request( - env: Env, info: MessageInfo, _deps: DepsMut, amount: u64, diff --git a/src/action/execute/eden_vest_request.rs b/src/action/execute/eden_vest_request.rs index 43aab79..121dd75 100644 --- a/src/action/execute/eden_vest_request.rs +++ b/src/action/execute/eden_vest_request.rs @@ -2,7 +2,6 @@ use super::*; use cosmwasm_std::Int128; pub fn eden_vest_request( - env: Env, info: MessageInfo, _deps: DepsMut, amount: u64, diff --git a/src/action/execute/elys_cancel_unstake_request.rs b/src/action/execute/elys_cancel_unstake_request.rs index f43618c..c42962c 100644 --- a/src/action/execute/elys_cancel_unstake_request.rs +++ b/src/action/execute/elys_cancel_unstake_request.rs @@ -2,7 +2,6 @@ use super::*; use cosmwasm_std::Coin; pub fn elys_cancel_unstake_request( - env: Env, info: MessageInfo, _deps: DepsMut, validator_address: String, diff --git a/src/action/execute/elys_redelegation_request.rs b/src/action/execute/elys_redelegation_request.rs index 958395c..49b501b 100644 --- a/src/action/execute/elys_redelegation_request.rs +++ b/src/action/execute/elys_redelegation_request.rs @@ -2,7 +2,6 @@ use super::*; use cosmwasm_std::Coin; pub fn elys_redelegation_request( - env: Env, info: MessageInfo, _deps: DepsMut, // the amount to be staked in base denomination. diff --git a/src/action/execute/stake_request.rs b/src/action/execute/stake_request.rs index a5433c2..1fdf30e 100644 --- a/src/action/execute/stake_request.rs +++ b/src/action/execute/stake_request.rs @@ -2,7 +2,6 @@ use super::*; use cosmwasm_std::Int128; pub fn stake_request( - env: Env, info: MessageInfo, deps: DepsMut, // the amount to be staked in base denomination. diff --git a/src/action/execute/unstake_request.rs b/src/action/execute/unstake_request.rs index 2d0f857..de03b63 100644 --- a/src/action/execute/unstake_request.rs +++ b/src/action/execute/unstake_request.rs @@ -2,7 +2,6 @@ use super::*; use cosmwasm_std::Int128; pub fn unstake_request( - env: Env, info: MessageInfo, _deps: DepsMut, // the amount to be staked in base denomination. diff --git a/src/action/query/get_margin_orders.rs b/src/action/query/get_margin_orders.rs index 15d5187..be7fcb8 100644 --- a/src/action/query/get_margin_orders.rs +++ b/src/action/query/get_margin_orders.rs @@ -5,6 +5,7 @@ pub fn get_margin_orders( pagination: PageRequest, order_owner: Option, order_type: Option, + order_status: Option, ) -> Result { let orders: Vec = MARGIN_ORDER .prefix_range(deps.storage, None, None, Order::Ascending) @@ -20,24 +21,21 @@ pub fn get_margin_orders( }); }; - let orders = match (order_owner, order_type) { - (None, Some(order_type)) => orders - .iter() - .filter(|order| order.order_type == order_type) - .cloned() - .collect(), - (Some(owner), None) => orders - .iter() - .filter(|order| order.owner == owner) - .cloned() - .collect(), - (Some(owner), Some(order_type)) => orders - .iter() - .filter(|order| order.owner == owner && order.order_type == order_type) - .cloned() - .collect(), - (None, None) => orders, - }; + let orders: Vec = orders + .iter() + .filter(|order| { + order_owner + .as_ref() + .map_or(true, |owner| owner == &order.owner) + && order_type + .as_ref() + .map_or(true, |order_type| order_type == &order.order_type) + && order_status + .as_ref() + .map_or(true, |status| &order.status == status) + }) + .cloned() + .collect(); let page_response = match page_response.total { Some(_) => PageResponse { diff --git a/src/action/query/get_spot_orders.rs b/src/action/query/get_spot_orders.rs index d6ebbc3..a206e08 100644 --- a/src/action/query/get_spot_orders.rs +++ b/src/action/query/get_spot_orders.rs @@ -5,6 +5,7 @@ pub fn get_spot_orders( pagination: PageRequest, order_owner: Option, order_type: Option, + order_status: Option, ) -> Result { let orders: Vec = SPOT_ORDER .prefix_range(deps.storage, None, None, Order::Ascending) @@ -20,24 +21,21 @@ pub fn get_spot_orders( }); }; - let orders = match (order_owner, order_type) { - (None, Some(order_type)) => orders - .iter() - .filter(|order| order.order_type == order_type) - .cloned() - .collect(), - (Some(owner), None) => orders - .iter() - .filter(|order| order.owner_address == owner) - .cloned() - .collect(), - (Some(owner), Some(order_type)) => orders - .iter() - .filter(|order| order.owner_address == owner && order.order_type == order_type) - .cloned() - .collect(), - (None, None) => orders, - }; + let orders: Vec = orders + .iter() + .filter(|order| { + order_owner + .as_ref() + .map_or(true, |owner| owner == order.owner_address.as_str()) + && order_type + .as_ref() + .map_or(true, |order_type| order_type == &order.order_type) + && order_status + .as_ref() + .map_or(true, |status| &order.status == status) + }) + .cloned() + .collect(); let page_response = match page_response.total { Some(_) => PageResponse { diff --git a/src/action/reply/close_margin_position.rs b/src/action/reply/close_margin_position.rs index c4fc896..a1e1313 100644 --- a/src/action/reply/close_margin_position.rs +++ b/src/action/reply/close_margin_position.rs @@ -16,13 +16,13 @@ pub fn reply_to_close_margin_order( let res: MarginCloseResponse = match get_response_from_reply(module_resp) { Ok(expr) => expr, Err(err) => { - order.status = Status::NotProcessed; + order.status = Status::Pending; MARGIN_ORDER.save(deps.storage, order_id, &order)?; return Ok(err); } }; - order.status = Status::Processed; + order.status = Status::Executed; MARGIN_ORDER.save(deps.storage, order_id, &order)?; diff --git a/src/action/reply/create_margin_order_market_close.rs b/src/action/reply/create_margin_order_market_close.rs index d98f4c4..6530205 100644 --- a/src/action/reply/create_margin_order_market_close.rs +++ b/src/action/reply/create_margin_order_market_close.rs @@ -30,7 +30,7 @@ pub fn reply_to_create_margin_market_close( Err(err) => return Err(err.into()), }; - order.status = Status::Processed; + order.status = Status::Executed; let resp = Response::new().add_event( Event::new("reply_to_create_margin_market_close") diff --git a/src/action/reply/create_margin_order_market_open.rs b/src/action/reply/create_margin_order_market_open.rs index 5ba30bd..1fccdc8 100644 --- a/src/action/reply/create_margin_order_market_open.rs +++ b/src/action/reply/create_margin_order_market_open.rs @@ -30,7 +30,7 @@ pub fn reply_to_create_margin_market_open( Err(err) => return Err(err.into()), }; - order.status = Status::Processed; + order.status = Status::Executed; order.position_id = Some(margin_resp.id); MARGIN_ORDER.save(deps.storage, order_id, &order)?; diff --git a/src/action/reply/open_margin_position.rs b/src/action/reply/open_margin_position.rs index 76d329e..77bca57 100644 --- a/src/action/reply/open_margin_position.rs +++ b/src/action/reply/open_margin_position.rs @@ -16,13 +16,13 @@ pub fn reply_to_open_margin_position( let res: MarginOpenResponse = match get_response_from_reply(module_resp) { Ok(expr) => expr, Err(err) => { - order.status = Status::NotProcessed; + order.status = Status::Pending; MARGIN_ORDER.save(deps.storage, order_id, &order)?; return Ok(err); } }; - order.status = Status::Processed; + order.status = Status::Executed; MARGIN_ORDER.save(deps.storage, order_id, &order)?; diff --git a/src/action/reply/spot_order.rs b/src/action/reply/spot_order.rs index 76ce1d8..d62c699 100644 --- a/src/action/reply/spot_order.rs +++ b/src/action/reply/spot_order.rs @@ -20,7 +20,7 @@ pub fn reply_to_spot_order( } }; - order.status = Status::Processed; + order.status = Status::Executed; SPOT_ORDER.save(deps.storage, order_id, &order)?; diff --git a/src/action/reply/spot_order_market.rs b/src/action/reply/spot_order_market.rs index 88499ee..ce1442b 100644 --- a/src/action/reply/spot_order_market.rs +++ b/src/action/reply/spot_order_market.rs @@ -18,7 +18,7 @@ pub fn reply_to_spot_order_market( let mut order = SPOT_ORDER.load(deps.storage, order_id)?; - order.status = Status::Processed; + order.status = Status::Executed; SPOT_ORDER.save(deps.storage, order_id, &order)?; diff --git a/src/action/sudo/process_orders.rs b/src/action/sudo/process_orders.rs index 20cb821..b7543d0 100644 --- a/src/action/sudo/process_orders.rs +++ b/src/action/sudo/process_orders.rs @@ -52,7 +52,13 @@ pub fn process_orders( )?; if check_margin_order(&margin_order, amm_swap_estimation) { - process_margin_order(margin_order, &mut submsgs, &mut reply_info_id, deps.storage)?; + process_margin_order( + margin_order, + &mut submsgs, + &mut reply_info_id, + deps.storage, + &querier, + )?; } } @@ -68,6 +74,7 @@ fn process_margin_order( submsgs: &mut Vec>, reply_info_id: &mut u64, storage: &mut dyn Storage, + querier: &ElysQuerier<'_>, ) -> StdResult<()> { let (msg, reply_type) = if order.order_type == MarginOrderType::LimitOpen { ( @@ -82,12 +89,10 @@ fn process_margin_order( ReplyType::MarginBrokerOpen, ) } else { + let mtp = querier.mtp(order.owner.clone(), order.position_id.unwrap())?; + let amount = mtp.mtp.unwrap().custodies[0].amount.u128() as i128; ( - ElysMsg::margin_close_position( - &order.owner, - order.position_id.unwrap(), - 0, //AMOUNT - ), + ElysMsg::margin_close_position(&order.owner, order.position_id.unwrap(), amount), ReplyType::MarginBrokerClose, ) }; @@ -97,7 +102,7 @@ fn process_margin_order( reply_type, data: Some(to_json_binary(&order.order_id)?), }; - submsgs.push(SubMsg::reply_on_success(msg, *reply_info_id)); + submsgs.push(SubMsg::reply_always(msg, *reply_info_id)); REPLY_INFO.save(storage, *reply_info_id, &reply_info)?; @@ -111,7 +116,7 @@ fn check_margin_order( ) -> bool { if order.order_type == MarginOrderType::MarketClose || order.order_type == MarginOrderType::MarketOpen - || order.status != Status::NotProcessed + || order.status != Status::Pending { return false; } @@ -156,7 +161,7 @@ fn check_spot_order( if order.order_type == SpotOrderType::MarketBuy { return false; } - if order.status != Status::NotProcessed { + if order.status != Status::Pending { return false; } @@ -207,7 +212,7 @@ fn process_spot_order( data: Some(to_json_binary(&order.order_id)?), }; - submsgs.push(SubMsg::reply_on_success(msg, *reply_info_id)); + submsgs.push(SubMsg::reply_always(msg, *reply_info_id)); REPLY_INFO.save(storage, *reply_info_id, &reply_info)?; diff --git a/src/entry_point/execute.rs b/src/entry_point/execute.rs index 7c03c1e..6d2c488 100644 --- a/src/entry_point/execute.rs +++ b/src/entry_point/execute.rs @@ -44,7 +44,6 @@ pub fn execute( } => create_margin_order( info, deps, - env, position, leverage, trading_asset, @@ -59,24 +58,23 @@ pub fn execute( owner_address, order_type, } => cancel_margin_orders(info, deps, order_ids, owner_address, order_type), - CloseMarginPosition { id, amount } => close_margin_position(info, env, id, amount), + CloseMarginPosition { id, amount } => close_margin_position(info, id, amount), StakeRequest { amount, asset, validator_address, - } => stake_request(env, info, deps, amount, asset, validator_address), + } => stake_request(info, deps, amount, asset, validator_address), UnstakeRequest { amount, asset, validator_address, - } => unstake_request(env, info, deps, amount, asset, validator_address), + } => unstake_request(info, deps, amount, asset, validator_address), ElysRedelegateRequest { validator_src_address, validator_dst_address, amount, } => elys_redelegation_request( - env, info, deps, validator_src_address, @@ -87,16 +85,12 @@ pub fn execute( validator_address, amount, creation_height, - } => { - elys_cancel_unstake_request(env, info, deps, validator_address, amount, creation_height) - } - EdenVestRequest { amount } => eden_vest_request(env, info, deps, amount), - EdenCancelVestRequest { amount } => eden_cancel_vest_request(env, info, deps, amount), - ClaimRewardsRequest { withdraw_type } => { - claim_rewards_request(env, info, deps, withdraw_type) - } + } => elys_cancel_unstake_request(info, deps, validator_address, amount, creation_height), + EdenVestRequest { amount } => eden_vest_request(info, deps, amount), + EdenCancelVestRequest { amount } => eden_cancel_vest_request(info, deps, amount), + ClaimRewardsRequest { withdraw_type } => claim_rewards_request(info, deps, withdraw_type), ClaimValidatorCommissionRequest { validator_address } => { - claim_validator_commission_request(env, info, deps, validator_address) + claim_validator_commission_request(info, deps, validator_address) } } } diff --git a/src/entry_point/query.rs b/src/entry_point/query.rs index fecec44..dd47084 100644 --- a/src/entry_point/query.rs +++ b/src/entry_point/query.rs @@ -20,21 +20,25 @@ pub fn query(deps: Deps, _env: Env, msg: QueryMsg) -> Result Ok(to_json_binary(&query::get_spot_orders( deps, pagination, order_owner, order_type, + order_status, )?)?), GetMarginOrders { pagination, order_owner, order_type, + order_status, } => Ok(to_json_binary(&query::get_margin_orders( deps, pagination, order_owner, order_type, + order_status, )?)?), SwapEstimationByDenom { amount, diff --git a/src/msg/query_msg.rs b/src/msg/query_msg.rs index 1f0e8cd..08ce058 100644 --- a/src/msg/query_msg.rs +++ b/src/msg/query_msg.rs @@ -1,6 +1,6 @@ #[allow(unused_imports)] use super::query_resp::*; -use crate::types::{MarginOrderType, SpotOrderType}; +use crate::types::{MarginOrderType, SpotOrderType, Status}; use cosmwasm_schema::{cw_serde, QueryResponses}; use cosmwasm_std::Coin; #[allow(unused_imports)] @@ -23,12 +23,14 @@ pub enum QueryMsg { pagination: PageRequest, order_owner: Option, order_type: Option, + order_status: Option, }, #[returns(GetMarginOrdersResp)] GetMarginOrders { pagination: PageRequest, order_owner: Option, order_type: Option, + order_status: Option, }, #[returns(AmmSwapEstimationByDenomResponse)] SwapEstimationByDenom { diff --git a/src/tests/cancel_spot_order/process_spot_order_processing.rs b/src/tests/cancel_spot_order/process_spot_order_processing.rs index 7591f8d..c3a04f5 100644 --- a/src/tests/cancel_spot_order/process_spot_order_processing.rs +++ b/src/tests/cancel_spot_order/process_spot_order_processing.rs @@ -25,7 +25,7 @@ fn process_spot_order_processing() { order_amount: coin(120, "usdc"), // 120 USDC to be used for buying, owner_address: Addr::unchecked("user"), order_target_denom: "ubtc".to_string(), - status: Status::Processed, + status: Status::Executed, date: Date { height: 20, time: Timestamp::from_seconds(644), @@ -98,7 +98,7 @@ fn process_spot_order_processing() { assert_eq!( ContractError::CancelStatusError { order_id: 0, - status: Status::Processed + status: Status::Executed }, err.downcast().unwrap() ); diff --git a/src/tests/cancel_spot_orders/successfully_cancel_orders.rs b/src/tests/cancel_spot_orders/successfully_cancel_orders.rs index 72ae3d9..6a2dd2e 100644 --- a/src/tests/cancel_spot_orders/successfully_cancel_orders.rs +++ b/src/tests/cancel_spot_orders/successfully_cancel_orders.rs @@ -21,7 +21,7 @@ fn successfully_cancel_orders() { order_amount: coin(10, "btc"), owner_address: Addr::unchecked("user"), order_target_denom: "".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -38,7 +38,7 @@ fn successfully_cancel_orders() { order_amount: coin(5, "eth"), owner_address: Addr::unchecked("user"), order_target_denom: "".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -55,7 +55,7 @@ fn successfully_cancel_orders() { order_amount: coin(20, "usdt"), owner_address: Addr::unchecked("user1"), order_target_denom: "".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -72,7 +72,7 @@ fn successfully_cancel_orders() { order_amount: coin(6, "btc"), owner_address: Addr::unchecked("user"), order_target_denom: "".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), diff --git a/src/tests/cancel_spot_orders/successfully_cancel_orders_id.rs b/src/tests/cancel_spot_orders/successfully_cancel_orders_id.rs index 48dbba0..d6dd14a 100644 --- a/src/tests/cancel_spot_orders/successfully_cancel_orders_id.rs +++ b/src/tests/cancel_spot_orders/successfully_cancel_orders_id.rs @@ -21,7 +21,7 @@ fn successfully_cancel_orders_ids() { order_amount: coin(10, "btc"), owner_address: Addr::unchecked("user"), order_target_denom: "".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -38,7 +38,7 @@ fn successfully_cancel_orders_ids() { order_amount: coin(5, "eth"), owner_address: Addr::unchecked("user"), order_target_denom: "".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -55,7 +55,7 @@ fn successfully_cancel_orders_ids() { order_amount: coin(20, "usdt"), owner_address: Addr::unchecked("user1"), order_target_denom: "".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -72,7 +72,7 @@ fn successfully_cancel_orders_ids() { order_amount: coin(6, "btc"), owner_address: Addr::unchecked("user"), order_target_denom: "".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), diff --git a/src/tests/cancel_spot_orders/successfully_cancel_orders_type.rs b/src/tests/cancel_spot_orders/successfully_cancel_orders_type.rs index 925042c..b0db94a 100644 --- a/src/tests/cancel_spot_orders/successfully_cancel_orders_type.rs +++ b/src/tests/cancel_spot_orders/successfully_cancel_orders_type.rs @@ -21,7 +21,7 @@ fn successfully_cancel_orders_type() { order_amount: coin(10, "btc"), owner_address: Addr::unchecked("user"), order_target_denom: "".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -38,7 +38,7 @@ fn successfully_cancel_orders_type() { order_amount: coin(5, "eth"), owner_address: Addr::unchecked("user"), order_target_denom: "".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -55,7 +55,7 @@ fn successfully_cancel_orders_type() { order_amount: coin(20, "usdt"), owner_address: Addr::unchecked("user1"), order_target_denom: "".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -72,7 +72,7 @@ fn successfully_cancel_orders_type() { order_amount: coin(6, "btc"), owner_address: Addr::unchecked("user"), order_target_denom: "".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), diff --git a/src/tests/close_margin_position/closing_a_margin_position.rs b/src/tests/close_margin_position/closing_a_margin_position.rs index bbde65a..fe9506c 100644 --- a/src/tests/close_margin_position/closing_a_margin_position.rs +++ b/src/tests/close_margin_position/closing_a_margin_position.rs @@ -43,5 +43,5 @@ fn closing_marging_position() { let last_module_used = app .init_modules(|router, _, storage| router.custom.get_last_module(storage).unwrap()) .unwrap(); - assert_eq!(last_module_used, "MarginBrokerClose"); + assert_eq!(last_module_used, "MarginClose"); } diff --git a/src/tests/create_margin_order/successful_create_margin_market_order.rs b/src/tests/create_margin_order/successful_create_margin_market_order.rs index f50766a..4ddd7d5 100644 --- a/src/tests/create_margin_order/successful_create_margin_market_order.rs +++ b/src/tests/create_margin_order/successful_create_margin_market_order.rs @@ -77,5 +77,5 @@ fn successful_create_margin_market_open_order() { .init_modules(|router, _, store| router.custom.get_last_module(store).unwrap()) .unwrap(); - assert_eq!(last_module, "MarginBrokerOpen"); + assert_eq!(last_module, "MarginOpen"); } diff --git a/src/tests/create_margin_order/successful_create_nargin_market_close.rs b/src/tests/create_margin_order/successful_create_nargin_market_close.rs index 1268590..8e9bacd 100644 --- a/src/tests/create_margin_order/successful_create_nargin_market_close.rs +++ b/src/tests/create_margin_order/successful_create_nargin_market_close.rs @@ -81,5 +81,5 @@ fn successful_create_margin_market_open_order() { .init_modules(|router, _, store| router.custom.get_last_module(store).unwrap()) .unwrap(); - assert_eq!(last_module, "MarginBrokerClose"); + assert_eq!(last_module, "MarginClose"); } diff --git a/src/tests/create_spot_order/coin_number.rs b/src/tests/create_spot_order/coin_number.rs index cd0c4b9..53e1bcd 100644 --- a/src/tests/create_spot_order/coin_number.rs +++ b/src/tests/create_spot_order/coin_number.rs @@ -1,4 +1,5 @@ use cosmwasm_std::Uint128; +use cw_utils::PaymentError; use super::*; // This test case verifies that attempting to create an order without specifying the amount results in a "CoinNumber" error. @@ -49,5 +50,8 @@ fn coin_number() { .unwrap_err(); // Verify that the error is of type "CoinNumber." - assert_eq!(ContractError::CoinNumber, err.downcast().unwrap()); + assert_eq!( + ContractError::Payment(PaymentError::NoFunds {}), + err.downcast().unwrap() + ); } diff --git a/src/tests/create_spot_order/successful_create_market_order.rs b/src/tests/create_spot_order/successful_create_market_order.rs index 1037254..5dffa9d 100644 --- a/src/tests/create_spot_order/successful_create_market_order.rs +++ b/src/tests/create_spot_order/successful_create_market_order.rs @@ -90,9 +90,10 @@ fn successful_create_market_buy_order() { pagination: PageRequest::new(5), order_owner: None, order_type: None, + order_status: None, }, ) .unwrap(); - assert_eq!(res.orders[0].status, Status::Processed); + assert_eq!(res.orders[0].status, Status::Executed); } diff --git a/src/tests/get_spot_orders/get_spot_orders.rs b/src/tests/get_spot_orders/get_spot_orders.rs index 67d3685..8329942 100644 --- a/src/tests/get_spot_orders/get_spot_orders.rs +++ b/src/tests/get_spot_orders/get_spot_orders.rs @@ -38,6 +38,7 @@ fn get_spot_orders() { pagination: page_req.clone(), order_owner: None, order_type: None, + order_status: None, }, ) .unwrap(); @@ -56,6 +57,7 @@ fn get_spot_orders() { pagination: page_req.clone(), order_owner: None, order_type: None, + order_status: None, }, ) .unwrap(); @@ -74,6 +76,7 @@ fn get_spot_orders() { pagination: page_req.clone(), order_owner: None, order_type: None, + order_status: None, }, ) .unwrap(); @@ -94,7 +97,7 @@ fn create_orders() -> Vec { order_amount: coin(255, "btc"), owner_address: Addr::unchecked("userA"), order_target_denom: "btc".to_owned(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(600), @@ -111,7 +114,7 @@ fn create_orders() -> Vec { order_amount: coin(100, "eth"), owner_address: Addr::unchecked("userB"), order_target_denom: "eth".to_owned(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(600), @@ -128,7 +131,7 @@ fn create_orders() -> Vec { order_amount: coin(500, "xrp"), owner_address: Addr::unchecked("userC"), order_target_denom: "xrp".to_owned(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(600), @@ -145,7 +148,7 @@ fn create_orders() -> Vec { order_amount: coin(75, "ltc"), owner_address: Addr::unchecked("userD"), order_target_denom: "ltc".to_owned(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(600), @@ -162,7 +165,7 @@ fn create_orders() -> Vec { order_amount: coin(200, "ada"), owner_address: Addr::unchecked("userE"), order_target_denom: "ada".to_owned(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(600), diff --git a/src/tests/process_margin_order/process_limit_open.rs b/src/tests/process_margin_order/process_limit_open.rs index 362e915..939d020 100644 --- a/src/tests/process_margin_order/process_limit_open.rs +++ b/src/tests/process_margin_order/process_limit_open.rs @@ -118,5 +118,5 @@ fn successful_process_limit_buy_order() { .init_modules(|router, _, store| router.custom.get_last_module(store).unwrap()) .unwrap(); - assert_eq!(last_module, "MarginBrokerOpen"); + assert_eq!(last_module, "MarginOpen"); } diff --git a/src/tests/process_margin_order/process_order_close.rs b/src/tests/process_margin_order/process_order_close.rs index dbf2cc0..67e036a 100644 --- a/src/tests/process_margin_order/process_order_close.rs +++ b/src/tests/process_margin_order/process_order_close.rs @@ -1,5 +1,5 @@ use super::*; -use cosmwasm_std::Coin; +use cosmwasm_std::{Coin, Int128}; #[test] fn successful_process_limit_buy_order() { @@ -69,6 +69,36 @@ fn successful_process_limit_buy_order() { // Execute the order processing. app.wasm_sudo(addr.clone(), &sudo_msg).unwrap(); + app.init_modules(|router, _, storage| { + router.custom.set_mtp( + storage, + &vec![Mtp { + address: "user".to_string(), + collaterals: vec![coin(2, "btc")], + liabilities: Int128::zero(), + interest_paid_collaterals: vec![], + interest_paid_custodies: vec![], + interest_unpaid_collaterals: vec![], + custodies: vec![coin(5000, "usdc")], + take_profit_liabilities: Int128::zero(), + take_profit_custodies: vec![], + leverages: vec![Decimal::from_str("1.2").unwrap()], + mtp_health: Decimal::one(), + position: 2, + id: 1, + amm_pool_id: 1, + consolidate_leverage: Decimal::zero(), + sum_collateral: Int128::zero(), + take_profit_price: Decimal::from_str("1.2").unwrap(), + funding_fee_paid_collaterals: vec![], + funding_fee_paid_custodies: vec![], + funding_fee_received_collaterals: vec![], + funding_fee_received_custodies: vec![], + }], + ) + }) + .unwrap(); + let last_module = app.init_modules(|router, _, store| router.custom.get_last_module(store).unwrap()); @@ -85,5 +115,5 @@ fn successful_process_limit_buy_order() { .init_modules(|router, _, store| router.custom.get_last_module(store).unwrap()) .unwrap(); - assert_eq!(last_module, "MarginBrokerClose"); + assert_eq!(last_module, "MarginClose"); } diff --git a/src/tests/process_spot_order/successful_process_5_of_10_orders.rs b/src/tests/process_spot_order/successful_process_5_of_10_orders.rs index dfa71b4..f20861e 100644 --- a/src/tests/process_spot_order/successful_process_5_of_10_orders.rs +++ b/src/tests/process_spot_order/successful_process_5_of_10_orders.rs @@ -240,7 +240,7 @@ fn create_dummy_orders() -> Vec { quote_denom: "usdc".to_string(), rate: Decimal::from_atomics(Uint128::new(1700), 0).unwrap(), }, - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -257,7 +257,7 @@ fn create_dummy_orders() -> Vec { rate: Decimal::from_atomics(Uint128::new(12000), 0).unwrap(), }, order_target_denom: "usdc".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -274,7 +274,7 @@ fn create_dummy_orders() -> Vec { rate: Decimal::from_atomics(Uint128::new(10000), 0).unwrap(), }, order_target_denom: "usdc".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -291,7 +291,7 @@ fn create_dummy_orders() -> Vec { rate: Decimal::from_atomics(Uint128::new(1800), 0).unwrap(), }, order_target_denom: "usdc".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -308,7 +308,7 @@ fn create_dummy_orders() -> Vec { rate: Decimal::from_atomics(Uint128::new(1200), 0).unwrap(), }, order_target_denom: "usdc".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -325,7 +325,7 @@ fn create_dummy_orders() -> Vec { rate: Decimal::from_atomics(Uint128::new(2500), 0).unwrap(), }, order_target_denom: "usdc".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -342,7 +342,7 @@ fn create_dummy_orders() -> Vec { rate: Decimal::from_atomics(Uint128::new(21000), 0).unwrap(), }, order_target_denom: "usdc".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -359,7 +359,7 @@ fn create_dummy_orders() -> Vec { rate: Decimal::from_atomics(Uint128::new(25000), 0).unwrap(), }, order_target_denom: "usdc".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -376,7 +376,7 @@ fn create_dummy_orders() -> Vec { rate: Decimal::from_atomics(Uint128::new(30000), 0).unwrap(), }, order_target_denom: "usdc".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), @@ -393,7 +393,7 @@ fn create_dummy_orders() -> Vec { rate: Decimal::from_atomics(Uint128::new(2100), 0).unwrap(), }, order_target_denom: "usdc".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 20, time: Timestamp::from_seconds(500), diff --git a/src/types/margin_order.rs b/src/types/margin_order.rs index b9811ec..e4634eb 100644 --- a/src/types/margin_order.rs +++ b/src/types/margin_order.rs @@ -36,7 +36,7 @@ impl MarginOrder { None => 0, }; - let status = Status::NotProcessed; + let status = Status::Pending; Self { order_id, @@ -69,7 +69,7 @@ impl MarginOrder { None => 0, }; - let status = Status::NotProcessed; + let status = Status::Pending; let position = MarginPosition::try_from_i32(position)?; diff --git a/src/types/spot_order/impls/new.rs b/src/types/spot_order/impls/new.rs index 9e43aee..9e51c1d 100644 --- a/src/types/spot_order/impls/new.rs +++ b/src/types/spot_order/impls/new.rs @@ -25,7 +25,7 @@ impl SpotOrder { }, }; - let status = Status::NotProcessed; + let status = Status::Pending; SpotOrder { order_type, diff --git a/src/types/spot_order/impls/new_dummy.rs b/src/types/spot_order/impls/new_dummy.rs index 5dcd158..5677c29 100644 --- a/src/types/spot_order/impls/new_dummy.rs +++ b/src/types/spot_order/impls/new_dummy.rs @@ -14,7 +14,7 @@ impl SpotOrder { rate: Decimal::from_atomics(Uint128::new(5), 0).unwrap(), }, order_target_denom: "eth".to_string(), - status: Status::NotProcessed, + status: Status::Pending, date: Date { height: 12, time: Timestamp::from_nanos(500000), diff --git a/src/types/status.rs b/src/types/status.rs index 0b2f375..19e16f8 100644 --- a/src/types/status.rs +++ b/src/types/status.rs @@ -2,7 +2,7 @@ use cosmwasm_schema::cw_serde; #[cw_serde] pub enum Status { - NotProcessed, - Processed, + Pending, + Executed, Canceled, } From dc1eeddcde410edfebda31240c00e6c126b42d10 Mon Sep 17 00:00:00 2001 From: politeWall <138504353+politeWall@users.noreply.github.com> Date: Wed, 6 Dec 2023 16:24:49 +0100 Subject: [PATCH 5/6] docs: add deployement instruction --- README.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/README.md b/README.md index 668a7db..5f7e6b8 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,48 @@ To start using TradeShield, follow these steps: 4. Review the example implementations provided in the repository to understand the integration process. 5. Customize and deploy the TradeShield smart contracts according to your specific project requirements. +## Deployment Steps for Elys Network + +1. Install Ignite CLI + Begin by installing the Ignite CLI tool by following the instructions provided in the [Ignite CLI documentation](https://docs.ignite.com/welcome/install). + +2. Clone the Elys Repository + Clone the [Elys repository](https://github.com/elys-network/elys/releases) from GitHub and carefully follow the installation instructions provided. + +3. Modify `config.yml` + Within the Elys repository, navigate to the root directory and locate the `config.yml` file. Modify the following lines: + +- Change the `contract_addresses` value (line 38) to `["elys14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s3fsthx"]`. +- Modify the `broker_address` (line 439) to `"elys14hj2tavq8fpesdwxxcu44rty3hh90vhujrvcmstl4zr3txmfvw9s3fsthx"`. + +4. Start Ignite Node + Open a separate terminal within the Elys repository and run the command: + +```sh +ignite chain serve -r +``` + +Optionally, use `-v` to display the node logs. + +5. Download the Contract + Download the desired version of the contract from the [contract repository](https://github.com/elys-network/trade-shield-contract/releases). + +6. Store Contract on Chain + Run the following command to store the contract on the chain: + +```sh +elysd tx wasm store path/to/account_history_contract.wasm --from=treasury --keyring-backend=test --chain-id=elystestnet-1 --gas=auto --gas-adjustment=1.3 -y -b=sync +``` + +Ensure to replace `path/to/account_history_contract.wasm` with the actual path to the downloaded contract. + +7. Instantiate Contract + Execute the command below to instantiate the contract on the Elys network: + +```sh +elysd tx wasm instantiate 1 '{}' --from=treasury --label "Contract" --chain-id=elystestnet-1 --gas=auto --gas-adjustment=1.3 -b=sync --keyring-backend=test --no-admin -y +``` + ## Contributing We welcome contributions from the community to enhance TradeShield's functionality and usability. If you would like to contribute, please follow the guidelines outlined in the `CONTRIBUTING.md` file. From 633d2241ccc610c6cf34c78a5dcacdc8d52d77d2 Mon Sep 17 00:00:00 2001 From: politeWall <138504353+politeWall@users.noreply.github.com> Date: Wed, 6 Dec 2023 16:45:04 +0100 Subject: [PATCH 6/6] fix: optimisation of create spot orders --- src/action/execute/create_spot_order.rs | 10 ++++------ src/entry_point/instantiate.rs | 2 ++ src/states/mod.rs | 2 +- src/states/spot_order.rs | 4 +++- src/tests/mock/instantiate.rs | 14 ++++++-------- .../succesful_process_limit_buy_order.rs | 2 +- .../successful_process_limit_sell_order.rs | 2 +- .../successful_process_stop_loss_order.rs | 2 +- src/types/spot_order/impls/new.rs | 7 +------ 9 files changed, 20 insertions(+), 25 deletions(-) diff --git a/src/action/execute/create_spot_order.rs b/src/action/execute/create_spot_order.rs index db1e5a1..379d79f 100644 --- a/src/action/execute/create_spot_order.rs +++ b/src/action/execute/create_spot_order.rs @@ -1,4 +1,4 @@ -use cosmwasm_std::{to_json_binary, Decimal, Int128, Order, StdError, StdResult, Storage, SubMsg}; +use cosmwasm_std::{to_json_binary, Decimal, Int128, StdError, StdResult, Storage, SubMsg}; use elys_bindings::query_resp::AmmSwapEstimationByDenomResponse; use crate::msg::ReplyType; @@ -37,18 +37,16 @@ pub fn create_spot_order( &Decimal::zero(), )?; - let order_vec: Vec = SPOT_ORDER - .prefix_range(deps.storage, None, None, Order::Ascending) - .filter_map(|res| res.ok().map(|r| r.1)) - .collect(); + let order_id = SPOT_ORDER_MAX_ID.load(deps.storage)? + 1; + SPOT_ORDER_MAX_ID.save(deps.storage, &order_id)?; let new_order: SpotOrder = SpotOrder::new( + order_id, order_type.clone(), order_price, info.funds[0].clone(), info.sender.clone(), order_target_denom, - &order_vec, &env.block, ); diff --git a/src/entry_point/instantiate.rs b/src/entry_point/instantiate.rs index 703050a..0e9e5aa 100644 --- a/src/entry_point/instantiate.rs +++ b/src/entry_point/instantiate.rs @@ -10,5 +10,7 @@ pub fn instantiate( _msg: InstantiateMsg, ) -> StdResult> { MAX_REPLY_ID.save(deps.storage, &0)?; + SPOT_ORDER_MAX_ID.save(deps.storage, &0)?; + Ok(Response::new()) } diff --git a/src/states/mod.rs b/src/states/mod.rs index 5b051d3..0846e32 100644 --- a/src/states/mod.rs +++ b/src/states/mod.rs @@ -4,4 +4,4 @@ mod spot_order; pub use margin_order::MARGIN_ORDER; pub use reply_info::{MAX_REPLY_ID, REPLY_INFO}; -pub use spot_order::SPOT_ORDER; +pub use spot_order::{SPOT_ORDER, SPOT_ORDER_MAX_ID}; diff --git a/src/states/spot_order.rs b/src/states/spot_order.rs index d464d5b..4e1a846 100644 --- a/src/states/spot_order.rs +++ b/src/states/spot_order.rs @@ -1,4 +1,6 @@ use crate::types::SpotOrder; -use cw_storage_plus::Map; +use cw_storage_plus::{Item, Map}; pub const SPOT_ORDER: Map = Map::new("spot order"); + +pub const SPOT_ORDER_MAX_ID: Item = Item::new("spot order max id"); diff --git a/src/tests/mock/instantiate.rs b/src/tests/mock/instantiate.rs index a074e08..912a056 100644 --- a/src/tests/mock/instantiate.rs +++ b/src/tests/mock/instantiate.rs @@ -18,16 +18,14 @@ pub fn instantiate( _info: MessageInfo, msg: InstantiateMockMsg, ) -> StdResult> { - if !msg.spot_orders.is_empty() { - for order in msg.spot_orders.iter() { - SPOT_ORDER.save(deps.storage, order.order_id, order)?; - } + for order in msg.spot_orders.iter() { + SPOT_ORDER.save(deps.storage, order.order_id, order)?; } - if !msg.margin_orders.is_empty() { - for order in msg.margin_orders.iter() { - MARGIN_ORDER.save(deps.storage, order.order_id, order)?; - } + for order in msg.margin_orders.iter() { + MARGIN_ORDER.save(deps.storage, order.order_id, order)?; } MAX_REPLY_ID.save(deps.storage, &0)?; + SPOT_ORDER_MAX_ID.save(deps.storage, &0)?; + Ok(Response::new()) } diff --git a/src/tests/process_spot_order/succesful_process_limit_buy_order.rs b/src/tests/process_spot_order/succesful_process_limit_buy_order.rs index 70141ca..d114d7a 100644 --- a/src/tests/process_spot_order/succesful_process_limit_buy_order.rs +++ b/src/tests/process_spot_order/succesful_process_limit_buy_order.rs @@ -31,6 +31,7 @@ fn successful_process_limit_buy_order() { // Create a "limit buy" order (dummy order) with a specific rate and balance. let dummy_order = SpotOrder::new( + 0, SpotOrderType::LimitBuy, Some(OrderPrice { base_denom: "ubtc".to_string(), @@ -40,7 +41,6 @@ fn successful_process_limit_buy_order() { coin(120, "usdc"), // 120 USDC to be used for buying. Addr::unchecked("user"), "ubtc".to_string(), - &vec![], &BlockInfo { height: 50, time: Timestamp::from_seconds(600), diff --git a/src/tests/process_spot_order/successful_process_limit_sell_order.rs b/src/tests/process_spot_order/successful_process_limit_sell_order.rs index f6221cd..80a0158 100644 --- a/src/tests/process_spot_order/successful_process_limit_sell_order.rs +++ b/src/tests/process_spot_order/successful_process_limit_sell_order.rs @@ -37,6 +37,7 @@ fn successful_process_limit_sell_order() { // Create a "limit sell" order (dummy order) with a specific rate and balance. let dummy_order = SpotOrder::new( + 0, SpotOrderType::LimitSell, Some(OrderPrice { base_denom: "btc".to_string(), @@ -46,7 +47,6 @@ fn successful_process_limit_sell_order() { coin(2, "btc"), // 2 BTC to be sold. Addr::unchecked("user"), "usdc".to_string(), - &vec![], &BlockInfo { height: 50, time: Timestamp::from_seconds(600), diff --git a/src/tests/process_spot_order/successful_process_stop_loss_order.rs b/src/tests/process_spot_order/successful_process_stop_loss_order.rs index 4249ee5..2dab9b8 100644 --- a/src/tests/process_spot_order/successful_process_stop_loss_order.rs +++ b/src/tests/process_spot_order/successful_process_stop_loss_order.rs @@ -36,6 +36,7 @@ fn successful_process_stop_loss_order() { // Create a "stop-loss" order (dummy order) with trigger price and balance. let dummy_order = SpotOrder::new( + 0, SpotOrderType::StopLoss, Some(OrderPrice { base_denom: "btc".to_string(), @@ -45,7 +46,6 @@ fn successful_process_stop_loss_order() { coin(2, "btc"), // 2 BTC to be sold. Addr::unchecked("user"), "usdc".to_string(), - &vec![], &BlockInfo { height: 50, time: Timestamp::from_seconds(600), diff --git a/src/types/spot_order/impls/new.rs b/src/types/spot_order/impls/new.rs index 9e51c1d..b7f481f 100644 --- a/src/types/spot_order/impls/new.rs +++ b/src/types/spot_order/impls/new.rs @@ -3,19 +3,14 @@ use cosmwasm_std::{Addr, BlockInfo, Coin, Decimal}; impl SpotOrder { pub fn new( + order_id: u64, order_type: SpotOrderType, order_price: Option, order_amount: Coin, owner_address: Addr, order_target_denom: String, - order_vec: &Vec, block_info: &BlockInfo, ) -> SpotOrder { - let order_id: u64 = match order_vec.iter().max_by_key(|s| s.order_id) { - Some(x) => x.order_id + 1, - None => 0, - }; - let order_price = match order_price { Some(order_price) => order_price, None => OrderPrice {