Skip to content
This repository was archived by the owner on Nov 15, 2024. It is now read-only.

Commit 7b3d674

Browse files
CryptoKage2306Wgil
andauthored
DEV-76-limit-num-perpetual-limit-order (#449)
* feat: add max limit for perpetual limit order * fix: test case number of limit --------- Co-authored-by: Warao Gil <wari@elys.network>
1 parent cad1b9b commit 7b3d674

File tree

11 files changed

+194
-20
lines changed

11 files changed

+194
-20
lines changed

bindings-test/src/multitest.rs

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use cosmwasm_std::{
1111
to_json_binary, Addr, BankMsg, BlockInfo, Coin, Decimal, Empty, Int64, Querier, StdError,
1212
StdResult, Storage,
1313
};
14-
use cosmwasm_std::{Int128, SignedDecimal, Uint128, Uint64};
14+
use cosmwasm_std::{Int128, SignedDecimal, Uint128};
1515
use cw_multi_test::{App, AppResponse, BankKeeper, BankSudo, BasicAppBuilder, Module, WasmKeeper};
1616
use cw_storage_plus::Item;
1717
use elys_bindings::{
@@ -25,12 +25,12 @@ use elys_bindings::{
2525
LeveragelpIsWhitelistedResponse, LeveragelpParams, LeveragelpParamsResponse,
2626
LeveragelpStatusResponse, LeveragelpWhitelistResponse, MasterchefUserPendingRewardResponse,
2727
OracleAssetInfoResponse, PerpetualGetPositionsForAddressResponse, PerpetualMtpResponse,
28-
PerpetualOpenEstimationRawResponse, PerpetualQueryPositionsResponse, PoolApr,
29-
QueryAprResponse, QueryAprsResponse, QueryGetEntryAllResponse, QueryGetEntryResponse,
30-
QueryGetPriceResponse, QueryPoolAprsResponse, QueryShowCommitmentsResponse,
31-
QueryStableStakeAprResponse, QueryStakedPositionResponse, QueryUnstakedPositionResponse,
32-
QueryVestingInfoResponse, StableStakeParamsData, StableStakeParamsResp,
33-
TierCalculateDiscountResponse,
28+
PerpetualOpenEstimationRawResponse, PerpetualParamsRaw, PerpetualParamsResponseRaw,
29+
PerpetualQueryPositionsResponse, PoolApr, QueryAprResponse, QueryAprsResponse,
30+
QueryGetEntryAllResponse, QueryGetEntryResponse, QueryGetPriceResponse,
31+
QueryPoolAprsResponse, QueryShowCommitmentsResponse, QueryStableStakeAprResponse,
32+
QueryStakedPositionResponse, QueryUnstakedPositionResponse, QueryVestingInfoResponse,
33+
StableStakeParamsData, StableStakeParamsResp, TierCalculateDiscountResponse,
3434
},
3535
types::{
3636
BalanceAvailable, Mtp, OracleAssetInfo, PageResponse, Price, SwapAmountInRoute,
@@ -666,6 +666,13 @@ impl Module for ElysModule {
666666
}
667667
ElysQuery::CommitmentNumberOfCommitments {} => todo!("CommitmentNumberOfCommitments"),
668668
ElysQuery::LeveragelpRewards { .. } => todo!(),
669+
ElysQuery::PerpetualParams {} => {
670+
let mut default_perpetual_raw = PerpetualParamsRaw::default();
671+
default_perpetual_raw.max_limit_order = Some(10000i64);
672+
Ok(to_json_binary(&PerpetualParamsResponseRaw {
673+
params: Some(default_perpetual_raw),
674+
})?)
675+
}
669676
}
670677
}
671678

bindings/src/querier.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1139,6 +1139,14 @@ impl<'a> ElysQuerier<'a> {
11391139
Ok(ParameterParamsResponse { params })
11401140
}
11411141

1142+
pub fn query_perpetual_params(&self) -> StdResult<PerpetualParamsResponse> {
1143+
let query = ElysQuery::query_perpetual_params();
1144+
let request = QueryRequest::Custom(query);
1145+
let PerpetualParamsResponseRaw { params: raw_params } = self.querier.query(&request)?;
1146+
let params: Option<PerpetualParams> = raw_params.map(|val| val.into());
1147+
Ok(PerpetualParamsResponse { params })
1148+
}
1149+
11421150
#[allow(dead_code)]
11431151
#[cfg(feature = "debug")]
11441152
fn query_binary(&self, request: &QueryRequest<ElysQuery>) -> StdResult<Binary> {

bindings/src/query.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,9 @@ pub enum ElysQuery {
189189
// Define Tier
190190
#[returns(TierCalculateDiscountResponse)]
191191
TierCalculateDiscount { user: String },
192+
// Define PerpetualParams
193+
#[returns(PerpetualParamsResponse)]
194+
PerpetualParams {},
192195
}
193196

194197
impl CustomQuery for ElysQuery {}
@@ -469,4 +472,8 @@ impl ElysQuery {
469472
pub fn query_leverage_lp_rewards(address: String, ids: Vec<u64>) -> Self {
470473
Self::LeveragelpRewards { address, ids }
471474
}
475+
476+
pub fn query_perpetual_params() -> Self {
477+
Self::PerpetualParams {}
478+
}
472479
}

bindings/src/query_resp.rs

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,16 +601,85 @@ pub struct LeveragelpParams {
601601
pub epoch_length: i64,
602602
}
603603

604+
#[cw_serde]
605+
#[derive(Default)]
606+
pub struct PerpetualParamsRaw {
607+
pub option: Option<bool>,
608+
pub leverage_max: Option<Decimal>,
609+
pub borrow_interest_rate_max: Option<Decimal>,
610+
pub borrow_interest_rate_min: Option<Decimal>,
611+
pub borrow_interest_rate_increase: Option<Decimal>,
612+
pub borrow_interest_rate_decrease: Option<Decimal>,
613+
pub health_gain_factor: Option<Decimal>,
614+
pub epoch_length: Option<i64>,
615+
pub max_open_positions: Option<i64>,
616+
pub pool_open_threshold: Option<Decimal>,
617+
pub force_close_fund_percentage: Option<Decimal>,
618+
pub force_close_fund_address: Option<String>,
619+
pub incremental_borrow_interest_payment_fund_percentage: Option<Decimal>,
620+
pub incremental_borrow_interest_payment_fund_address: Option<String>,
621+
pub safety_factor: Option<Decimal>,
622+
pub incremental_borrow_interest_payment_enabled: Option<bool>,
623+
pub whitelisting_enabled: Option<bool>,
624+
pub invariant_check_epoch: Option<String>,
625+
pub take_profit_borrow_interest_rate_min: Option<Decimal>,
626+
pub funding_fee_base_rate: Option<Decimal>,
627+
pub funding_fee_max_rate: Option<Decimal>,
628+
pub funding_fee_min_rate: Option<Decimal>,
629+
pub funding_fee_collection_address: Option<String>,
630+
pub swap_fee: Option<Decimal>,
631+
pub max_limit_order: Option<i64>,
632+
}
633+
634+
#[cw_serde]
635+
pub struct PerpetualParams {
636+
pub option: bool,
637+
pub leverage_max: Decimal,
638+
pub borrow_interest_rate_max: Decimal,
639+
pub borrow_interest_rate_min: Decimal,
640+
pub borrow_interest_rate_increase: Decimal,
641+
pub borrow_interest_rate_decrease: Decimal,
642+
pub health_gain_factor: Decimal,
643+
pub epoch_length: i64,
644+
pub max_open_positions: i64,
645+
pub pool_open_threshold: Decimal,
646+
pub force_close_fund_percentage: Decimal,
647+
pub force_close_fund_address: String,
648+
pub incremental_borrow_interest_payment_fund_percentage: Decimal,
649+
pub incremental_borrow_interest_payment_fund_address: String,
650+
pub safety_factor: Decimal,
651+
pub incremental_borrow_interest_payment_enabled: bool,
652+
pub whitelisting_enabled: bool,
653+
pub invariant_check_epoch: String,
654+
pub take_profit_borrow_interest_rate_min: Decimal,
655+
pub funding_fee_base_rate: Decimal,
656+
pub funding_fee_max_rate: Decimal,
657+
pub funding_fee_min_rate: Decimal,
658+
pub funding_fee_collection_address: String,
659+
pub swap_fee: Decimal,
660+
pub max_limit_order: i64,
661+
}
662+
604663
#[cw_serde]
605664
pub struct LeveragelpParamsResponseRaw {
606665
pub params: Option<LeveragelpParamsRaw>,
607666
}
608667

668+
#[cw_serde]
669+
pub struct PerpetualParamsResponseRaw {
670+
pub params: Option<PerpetualParamsRaw>,
671+
}
672+
609673
#[cw_serde]
610674
pub struct LeveragelpParamsResponse {
611675
pub params: Option<LeveragelpParams>,
612676
}
613677

678+
#[cw_serde]
679+
pub struct PerpetualParamsResponse {
680+
pub params: Option<PerpetualParams>,
681+
}
682+
614683
#[cw_serde]
615684
pub struct Position {
616685
pub address: String,
@@ -1149,3 +1218,43 @@ pub struct ParameterParamsResponseRaw {
11491218
pub struct ParameterParamsResponse {
11501219
pub params: ParameterParams,
11511220
}
1221+
1222+
impl Into<PerpetualParams> for PerpetualParamsRaw {
1223+
fn into(self) -> PerpetualParams {
1224+
PerpetualParams {
1225+
option: self.option.unwrap_or_default(),
1226+
leverage_max: self.leverage_max.unwrap_or_default(),
1227+
borrow_interest_rate_max: self.borrow_interest_rate_max.unwrap_or_default(),
1228+
borrow_interest_rate_min: self.borrow_interest_rate_min.unwrap_or_default(),
1229+
borrow_interest_rate_increase: self.borrow_interest_rate_increase.unwrap_or_default(),
1230+
borrow_interest_rate_decrease: self.borrow_interest_rate_decrease.unwrap_or_default(),
1231+
health_gain_factor: self.health_gain_factor.unwrap_or_default(),
1232+
epoch_length: self.epoch_length.unwrap_or_default(),
1233+
max_open_positions: self.max_open_positions.unwrap_or_default(),
1234+
pool_open_threshold: self.pool_open_threshold.unwrap_or_default(),
1235+
force_close_fund_percentage: self.force_close_fund_percentage.unwrap_or_default(),
1236+
force_close_fund_address: self.force_close_fund_address.unwrap_or_default(),
1237+
incremental_borrow_interest_payment_fund_percentage: self
1238+
.incremental_borrow_interest_payment_fund_percentage
1239+
.unwrap_or_default(),
1240+
incremental_borrow_interest_payment_fund_address: self
1241+
.incremental_borrow_interest_payment_fund_address
1242+
.unwrap_or_default(),
1243+
safety_factor: self.safety_factor.unwrap_or_default(),
1244+
incremental_borrow_interest_payment_enabled: self
1245+
.incremental_borrow_interest_payment_enabled
1246+
.unwrap_or_default(),
1247+
whitelisting_enabled: self.whitelisting_enabled.unwrap_or_default(),
1248+
invariant_check_epoch: self.invariant_check_epoch.unwrap_or_default(),
1249+
take_profit_borrow_interest_rate_min: self
1250+
.take_profit_borrow_interest_rate_min
1251+
.unwrap_or_default(),
1252+
funding_fee_base_rate: self.funding_fee_base_rate.unwrap_or_default(),
1253+
funding_fee_max_rate: self.funding_fee_max_rate.unwrap_or_default(),
1254+
funding_fee_min_rate: self.funding_fee_min_rate.unwrap_or_default(),
1255+
funding_fee_collection_address: self.funding_fee_collection_address.unwrap_or_default(),
1256+
swap_fee: self.swap_fee.unwrap_or_default(),
1257+
max_limit_order: self.max_limit_order.unwrap_or_default(),
1258+
}
1259+
}
1260+
}

contracts/trade-shield-contract/src/action/execute/create_perpetual_order.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::ops::Sub;
2+
13
use crate::{helper::get_discount, msg::ReplyType};
24

35
use super::*;
@@ -7,6 +9,7 @@ use cosmwasm_std::{
79
};
810
use cw_utils;
911
use elys_bindings::query_resp::{Entry, QueryGetEntryResponse};
12+
use query_resp::PerpetualParams;
1013
use PerpetualOrderType::*;
1114

1215
pub fn create_perpetual_order(
@@ -232,6 +235,18 @@ fn create_perpetual_open_order(
232235

233236
if order_type != MarketOpen {
234237
let number_of_pending_order = NUMBER_OF_PENDING_ORDER.load(deps.storage)? + 1;
238+
let PerpetualParams {
239+
max_limit_order, ..
240+
} = querier
241+
.query_perpetual_params()?
242+
.params
243+
.ok_or(StdError::generic_err("Perpetual Params are not present"))?;
244+
(max_limit_order as u128)
245+
.checked_sub(number_of_pending_order as u128)
246+
.ok_or(StdError::generic_err(
247+
"Number of pending orders cannot be greater than maximum number of limit order",
248+
))?;
249+
235250
NUMBER_OF_PENDING_ORDER.save(deps.storage, &number_of_pending_order)?;
236251

237252
return Ok(resp);

contracts/trade-shield-contract/src/entry_point/instantiate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub fn instantiate(
1212
deps: DepsMut<ElysQuery>,
1313
_env: Env,
1414
_info: MessageInfo,
15-
msg: InstantiateMsg,
15+
_msg: InstantiateMsg,
1616
) -> StdResult<Response<ElysMsg>> {
1717
set_contract_version(deps.storage, CONTRACT_NAME, CONTRACT_VERSION)?;
1818
MAX_REPLY_ID.save(deps.storage, &0)?;

contracts/trade-shield-contract/src/entry_point/migrate.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ use trade_shield::{
2222
pub fn migrate(
2323
deps: DepsMut<ElysQuery>,
2424
_env: Env,
25-
msg: MigrateMsg,
25+
_msg: MigrateMsg,
2626
) -> StdResult<Response<ElysMsg>> {
2727
let admin = "elys16xffmfa6k45j340cx5zyp66lqvuw62a0neaa7w".to_string();
2828
PARAMS_ADMIN.save(deps.storage, &admin)?;

contracts/trade-shield-contract/src/tests/process_perpetual_order/pending_limit_open_long_with_price_met.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ use cw_multi_test::{AppResponse, BasicAppBuilder, ContractWrapper, Executor, Mod
1111
use elys_bindings::msg_resp::PerpetualOpenResponse;
1212
use elys_bindings::query_resp::{
1313
OracleAssetInfoResponse, PerpetualGetPositionsForAddressResponseRaw,
14-
PerpetualOpenEstimationRawResponse, QueryGetEntryResponseRaw, QueryGetPriceResponse, RawEntry,
15-
TierCalculateDiscountResponse,
14+
PerpetualOpenEstimationRawResponse, PerpetualParamsRaw, PerpetualParamsResponseRaw,
15+
QueryGetEntryResponseRaw, QueryGetPriceResponse, RawEntry, TierCalculateDiscountResponse,
1616
};
1717
use elys_bindings::trade_shield::msg::query_resp::GetPerpetualOrderResp;
1818
use elys_bindings::trade_shield::msg::{ExecuteMsg, QueryMsg, SudoMsg};
@@ -157,6 +157,13 @@ impl Module for ElysModuleWrapper {
157157
};
158158
Ok(to_json_binary(&resp)?)
159159
}
160+
ElysQuery::PerpetualParams {} => {
161+
let mut default_perpetual_raw = PerpetualParamsRaw::default();
162+
default_perpetual_raw.max_limit_order = Some(10000i64);
163+
Ok(to_json_binary(&PerpetualParamsResponseRaw {
164+
params: Some(default_perpetual_raw),
165+
})?)
166+
}
160167
_ => panic!("not implemented {request:?}"),
161168
}
162169
}

contracts/trade-shield-contract/src/tests/process_perpetual_order/pending_limit_open_long_with_price_not_met.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ use crate::tests::get_order_id_from_events::get_attr_from_events;
55
use anyhow::{bail, Result as AnyResult};
66
use cosmwasm_std::{
77
coin, coins, to_json_binary, Addr, BankMsg, Coin, Decimal, Empty, Int128, SignedDecimal,
8-
SignedDecimal256, StdError, Uint64,
8+
SignedDecimal256, StdError,
99
};
1010
use cw_multi_test::{AppResponse, BasicAppBuilder, ContractWrapper, Executor, Module};
1111
use elys_bindings::msg_resp::PerpetualOpenResponse;
1212
use elys_bindings::query_resp::{
1313
OracleAssetInfoResponse, PerpetualGetPositionsForAddressResponseRaw,
14-
PerpetualOpenEstimationRawResponse, QueryGetEntryResponseRaw, QueryGetPriceResponse, RawEntry,
15-
TierCalculateDiscountResponse,
14+
PerpetualOpenEstimationRawResponse, PerpetualParamsRaw, PerpetualParamsResponseRaw,
15+
QueryGetEntryResponseRaw, QueryGetPriceResponse, RawEntry, TierCalculateDiscountResponse,
1616
};
1717
use elys_bindings::trade_shield::msg::query_resp::GetPerpetualOrderResp;
1818
use elys_bindings::trade_shield::msg::{ExecuteMsg, QueryMsg, SudoMsg};
@@ -157,6 +157,13 @@ impl Module for ElysModuleWrapper {
157157
};
158158
Ok(to_json_binary(&resp)?)
159159
}
160+
ElysQuery::PerpetualParams {} => {
161+
let mut default_perpetual_raw = PerpetualParamsRaw::default();
162+
default_perpetual_raw.max_limit_order = Some(10000i64);
163+
Ok(to_json_binary(&PerpetualParamsResponseRaw {
164+
params: Some(default_perpetual_raw),
165+
})?)
166+
}
160167
_ => panic!("not implemented {request:?}"),
161168
}
162169
}

contracts/trade-shield-contract/src/tests/process_perpetual_order/pending_limit_open_short_with_price_met.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ use crate::tests::get_order_id_from_events::get_attr_from_events;
55
use anyhow::{bail, Result as AnyResult};
66
use cosmwasm_std::{
77
coin, coins, to_json_binary, Addr, BankMsg, Coin, Decimal, Empty, Int128, SignedDecimal,
8-
SignedDecimal256, StdError, Uint64,
8+
SignedDecimal256, StdError,
99
};
1010
use cw_multi_test::{AppResponse, BasicAppBuilder, ContractWrapper, Executor, Module};
1111
use elys_bindings::msg_resp::PerpetualOpenResponse;
1212
use elys_bindings::query_resp::{
1313
OracleAssetInfoResponse, PerpetualGetPositionsForAddressResponseRaw,
14-
PerpetualOpenEstimationRawResponse, QueryGetEntryResponseRaw, QueryGetPriceResponse, RawEntry,
15-
TierCalculateDiscountResponse,
14+
PerpetualOpenEstimationRawResponse, PerpetualParamsRaw, PerpetualParamsResponseRaw,
15+
QueryGetEntryResponseRaw, QueryGetPriceResponse, RawEntry, TierCalculateDiscountResponse,
1616
};
1717
use elys_bindings::trade_shield::msg::query_resp::GetPerpetualOrderResp;
1818
use elys_bindings::trade_shield::msg::{ExecuteMsg, QueryMsg, SudoMsg};
@@ -157,6 +157,13 @@ impl Module for ElysModuleWrapper {
157157
};
158158
Ok(to_json_binary(&resp)?)
159159
}
160+
ElysQuery::PerpetualParams {} => {
161+
let mut default_perpetual_raw = PerpetualParamsRaw::default();
162+
default_perpetual_raw.max_limit_order = Some(10000i64);
163+
Ok(to_json_binary(&PerpetualParamsResponseRaw {
164+
params: Some(default_perpetual_raw),
165+
})?)
166+
}
160167
_ => panic!("not implemented {request:?}"),
161168
}
162169
}

0 commit comments

Comments
 (0)