Skip to content

Commit

Permalink
derivative market query test
Browse files Browse the repository at this point in the history
  • Loading branch information
jbernal87 committed Feb 13, 2024
1 parent cbfd7a7 commit 4ce1d52
Show file tree
Hide file tree
Showing 6 changed files with 331 additions and 73 deletions.
30 changes: 26 additions & 4 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions contracts/injective-cosmwasm-mock/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ injective-math = { path = "../../packages/injective-math" }
schemars = { version ="0.8.16"}
serde = { version = "1.0.196", default-features = false, features = [ "derive" ] }
thiserror = { version = "1.0.56" }
protobuf = "3.3.0"
prost = "0.11.9"

[dev-dependencies]
injective-test-tube = "1.1.7"
Expand Down
3 changes: 2 additions & 1 deletion contracts/injective-cosmwasm-mock/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +37,9 @@ pub fn query(deps: Deps<InjectiveQueryWrapper>, _env: Env, msg: QueryMsg) -> Std
let querier: InjectiveQuerier = InjectiveQuerier::new(&deps.querier);

match msg {
QueryMsg::TestSpotMarketQuery { market_id } => to_json_binary(&querier.query_spot_market(&market_id)?),
QueryMsg::TestExchangeParamsQuery {} => to_json_binary(&querier.query_exchange_params()?),
QueryMsg::TestSubAccountDepositQuery { subaccount_id, denom } => to_json_binary(&querier.query_subaccount_deposit(&subaccount_id, &denom)?),
QueryMsg::TestSpotMarketQuery { market_id } => to_json_binary(&querier.query_spot_market(&market_id)?),
QueryMsg::TestDerivativeMarketQuery { market_id } => to_json_binary(&querier.query_derivative_market(&market_id)?),
}
}
1 change: 1 addition & 0 deletions contracts/injective-cosmwasm-mock/src/msg.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,6 @@ pub enum ExecuteMsg {
pub enum QueryMsg {
TestExchangeParamsQuery {},
TestSpotMarketQuery { market_id: MarketId },
TestDerivativeMarketQuery { market_id: MarketId },
TestSubAccountDepositQuery { subaccount_id: SubaccountId, denom: String },
}
205 changes: 139 additions & 66 deletions contracts/injective-cosmwasm-mock/src/testing/query_exchange_test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ use crate::{
};

use cosmwasm_std::Coin;
use injective_cosmwasm::{ExchangeParamsResponse, MarketId, SubaccountDepositResponse};
use injective_cosmwasm::{DerivativeMarketResponse, ExchangeParamsResponse, MarketId, SubaccountDepositResponse};
use injective_math::{scale::Scaled, FPDecimal};
use injective_std::types::injective::exchange::v1beta1::{
Deposit, MsgDeposit, MsgInstantSpotMarketLaunch, QuerySpotMarketsRequest, QuerySubaccountDepositsRequest,
Deposit, MsgDeposit, MsgInstantPerpetualMarketLaunch, MsgInstantSpotMarketLaunch, QueryDerivativeMarketsRequest, QuerySpotMarketsRequest,
QuerySubaccountDepositsRequest,
};
use injective_test_tube::{injective_cosmwasm::SpotMarketResponse, Account, Exchange, Module, RunnerResult, Wasm};

Expand Down Expand Up @@ -53,6 +54,82 @@ fn test_exchange_params() {
assert_eq!(params.is_instant_derivative_market_launch_enabled, Some(true));
}

#[test]
#[cfg_attr(not(feature = "integration"), ignore)]
fn test_query_subaccount_deposit() {
let env = Setup::new();
let exchange = Exchange::new(&env.app);
let wasm = Wasm::new(&env.app);

{
exchange
.deposit(
MsgDeposit {
sender: env.users[0].account.address(),
subaccount_id: env.users[0].subaccount_id.to_string(),
amount: Some(injective_std::types::cosmos::base::v1beta1::Coin {
amount: "10000000000000000000".to_string(),
denom: env.denoms["base"].clone(),
}),
},
&env.users[0].account,
)
.unwrap();
}

{
exchange
.deposit(
MsgDeposit {
sender: env.users[0].account.address(),
subaccount_id: env.users[0].subaccount_id.to_string(),
amount: Some(injective_std::types::cosmos::base::v1beta1::Coin {
amount: "100000000".to_string(),
denom: env.denoms["quote"].clone(),
}),
},
&env.users[0].account,
)
.unwrap();
}

let response = exchange
.query_subaccount_deposits(&QuerySubaccountDepositsRequest {
subaccount_id: env.users[0].subaccount_id.clone().to_string(),
subaccount: None,
})
.unwrap();

assert_eq!(
response.deposits[&env.denoms["base"].clone()],
Deposit {
available_balance: human_to_proto("10.0", BASE_DECIMALS),
total_balance: human_to_proto("10.0", BASE_DECIMALS),
}
);
assert_eq!(
response.deposits[&env.denoms["quote"].clone()],
Deposit {
available_balance: human_to_proto("100.0", QUOTE_DECIMALS),
total_balance: human_to_proto("100.0", QUOTE_DECIMALS),
}
);

let query_msg = QueryMsg::TestSubAccountDepositQuery {
subaccount_id: env.users[0].subaccount_id.clone(),
denom: BASE_DENOM.to_string(),
};
let contract_response: SubaccountDepositResponse = wasm.query(&env.contract_address, &query_msg).unwrap();
assert_eq!(contract_response.deposits.total_balance, human_to_dec("10.0", BASE_DECIMALS));

let query_msg = QueryMsg::TestSubAccountDepositQuery {
subaccount_id: env.users[0].subaccount_id.clone(),
denom: QUOTE_DENOM.to_string(),
};
let contract_response: SubaccountDepositResponse = wasm.query(&env.contract_address, &query_msg).unwrap();
assert_eq!(contract_response.deposits.available_balance, human_to_dec("100.0", QUOTE_DECIMALS));
}

#[test]
#[cfg_attr(not(feature = "integration"), ignore)]
fn test_query_spot_market_no_market_on_exchange() {
Expand All @@ -70,7 +147,6 @@ fn test_query_spot_market_no_market_on_exchange() {
#[cfg_attr(not(feature = "integration"), ignore)]
fn test_query_spot_market() {
let env = Setup::new();

let wasm = Wasm::new(&env.app);
let exchange = Exchange::new(&env.app);

Expand Down Expand Up @@ -120,77 +196,74 @@ fn test_query_spot_market() {

#[test]
#[cfg_attr(not(feature = "integration"), ignore)]
fn test_query_subaccount_deposit() {
fn test_query_derivative_market() {
let env = Setup::new();

let exchange = Exchange::new(&env.app);
let wasm = Wasm::new(&env.app);
let exchange = Exchange::new(&env.app);

{
exchange
.deposit(
MsgDeposit {
sender: env.users[0].account.address(),
subaccount_id: env.users[0].subaccount_id.to_string(),
amount: Some(injective_std::types::cosmos::base::v1beta1::Coin {
amount: "10000000000000000000".to_string(),
denom: env.denoms["base"].clone(),
}),
},
&env.users[0].account,
)
.unwrap();
}
let ticker = "INJ/USDT".to_string();
let initial_margin_ratio = FPDecimal::must_from_str("0.195");
let maintenance_margin_ratio = FPDecimal::must_from_str("0.05");
let min_price_tick_size = FPDecimal::must_from_str("1000000000000000000000");
let min_quantity_tick_size = FPDecimal::must_from_str("1000000000000000");
let quote_denom = QUOTE_DENOM.to_string();
let maker_fee_rate = FPDecimal::ZERO;
let taker_fee_rate = FPDecimal::ZERO;

{
exchange
.deposit(
MsgDeposit {
sender: env.users[0].account.address(),
subaccount_id: env.users[0].subaccount_id.to_string(),
amount: Some(injective_std::types::cosmos::base::v1beta1::Coin {
amount: "100000000".to_string(),
denom: env.denoms["quote"].clone(),
}),
},
&env.users[0].account,
)
.unwrap();
}
println!("{} {}", initial_margin_ratio, dec_to_proto(initial_margin_ratio));
exchange
.instant_perpetual_market_launch(
MsgInstantPerpetualMarketLaunch {
sender: env.signer.address(),
ticker: ticker.to_owned(),
quote_denom: quote_denom.to_owned(),
oracle_base: BASE_DENOM.to_owned(),
oracle_quote: quote_denom.to_owned(),
oracle_scale_factor: 6u32,
oracle_type: 2i32,
maker_fee_rate: dec_to_proto(maker_fee_rate).to_string(),
taker_fee_rate: dec_to_proto(taker_fee_rate),
initial_margin_ratio: dec_to_proto(initial_margin_ratio),
maintenance_margin_ratio: dec_to_proto(maintenance_margin_ratio),
min_price_tick_size: dec_to_proto(min_price_tick_size),
min_quantity_tick_size: dec_to_proto(min_quantity_tick_size),
},
&env.signer,
)
.unwrap();

let response = exchange
.query_subaccount_deposits(&QuerySubaccountDepositsRequest {
subaccount_id: env.users[0].subaccount_id.clone().to_string(),
subaccount: None,
let derivative_markets = exchange
.query_derivative_markets(&QueryDerivativeMarketsRequest {
status: "Active".to_string(),
market_ids: vec![],
with_mid_price_and_tob: false,
})
.unwrap()
.markets;

let market = derivative_markets
.iter()
.filter(|m| m.market.is_some())
.find(|m| m.market.as_ref().unwrap().ticker == ticker)
.unwrap()
.market
.as_ref()
.unwrap();

assert_eq!(
response.deposits[&env.denoms["base"].clone()],
Deposit {
available_balance: human_to_proto("10.0", BASE_DECIMALS),
total_balance: human_to_proto("10.0", BASE_DECIMALS),
}
);
assert_eq!(
response.deposits[&env.denoms["quote"].clone()],
Deposit {
available_balance: human_to_proto("100.0", QUOTE_DECIMALS),
total_balance: human_to_proto("100.0", QUOTE_DECIMALS),
}
);
let derivative_market_id = market.market_id.to_string();

let query_msg = QueryMsg::TestSubAccountDepositQuery {
subaccount_id: env.users[0].subaccount_id.clone(),
denom: BASE_DENOM.to_string(),
};
let contract_response: SubaccountDepositResponse = wasm.query(&env.contract_address, &query_msg).unwrap();
assert_eq!(contract_response.deposits.total_balance, human_to_dec("10.0", BASE_DECIMALS));
let market_id = MarketId::new(derivative_market_id.clone()).unwrap();
let query_msg = QueryMsg::TestDerivativeMarketQuery { market_id };
let res: DerivativeMarketResponse = wasm.query(&env.contract_address, &query_msg).unwrap();

let query_msg = QueryMsg::TestSubAccountDepositQuery {
subaccount_id: env.users[0].subaccount_id.clone(),
denom: QUOTE_DENOM.to_string(),
};
let contract_response: SubaccountDepositResponse = wasm.query(&env.contract_address, &query_msg).unwrap();
assert_eq!(contract_response.deposits.available_balance, human_to_dec("100.0", QUOTE_DECIMALS));
let response_market = res.market.unwrap().market.unwrap();
println!("{:?}", response_market);
assert_eq!(response_market.market_id.as_str(), derivative_market_id);
assert_eq!(response_market.ticker, ticker);
assert_eq!(response_market.quote_denom, quote_denom);
assert_eq!(response_market.min_price_tick_size, min_price_tick_size);
assert_eq!(response_market.min_quantity_tick_size, min_quantity_tick_size);
assert_eq!(response_market.maker_fee_rate, maker_fee_rate);
assert_eq!(response_market.taker_fee_rate, taker_fee_rate);
assert_eq!(response_market.initial_margin_ratio, initial_margin_ratio);
}
Loading

0 comments on commit 4ce1d52

Please sign in to comment.