Skip to content

Commit 3193ef9

Browse files
authored
Improve market queries (#182)
* Improve Market / Markets query. Add OI values. * Generate schemas.
1 parent da424d4 commit 3193ef9

File tree

5 files changed

+150
-8
lines changed

5 files changed

+150
-8
lines changed

contracts/perps/src/query.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,13 +137,19 @@ pub fn query_market(
137137
let base_denom_price =
138138
oracle.query_price(&deps.querier, &cfg.base_denom, ActionKind::Default)?.price;
139139
let denom_price = oracle.query_price(&deps.querier, &denom, ActionKind::Default)?.price;
140+
141+
let long_oi_value = ms.long_oi.checked_mul_floor(denom_price)?;
142+
let short_oi_value = ms.short_oi.checked_mul_floor(denom_price)?;
143+
140144
let curr_funding = ms.current_funding(current_time, denom_price, base_denom_price)?;
141145

142146
Ok(MarketResponse {
143147
denom: denom.clone(),
144148
enabled: ms.enabled,
145149
long_oi: ms.long_oi,
150+
long_oi_value,
146151
short_oi: ms.short_oi,
152+
short_oi_value,
147153
current_funding_rate: curr_funding.last_funding_rate,
148154
})
149155
}
@@ -170,13 +176,19 @@ pub fn query_markets(
170176

171177
paginate_map_query(&MARKET_STATES, deps.storage, start, Some(limit), |denom, ms| {
172178
let denom_price = oracle.query_price(&deps.querier, &denom, ActionKind::Default)?.price;
179+
180+
let long_oi_value = ms.long_oi.checked_mul_floor(denom_price)?;
181+
let short_oi_value = ms.short_oi.checked_mul_floor(denom_price)?;
182+
173183
let curr_funding = ms.current_funding(current_time, denom_price, base_denom_price)?;
174184

175185
Ok(MarketResponse {
176186
denom: denom.clone(),
177187
enabled: ms.enabled,
178188
long_oi: ms.long_oi,
189+
long_oi_value,
179190
short_oi: ms.short_oi,
191+
short_oi_value,
180192
current_funding_rate: curr_funding.last_funding_rate,
181193
})
182194
})

contracts/perps/tests/tests/test_query.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ fn query_market() {
4444
denom: denom1.to_string(),
4545
enabled: true,
4646
long_oi: Uint128::zero(),
47+
long_oi_value: Uint128::zero(),
4748
short_oi: Uint128::zero(),
49+
short_oi_value: Uint128::zero(),
4850
current_funding_rate: SignedDecimal::zero(),
4951
};
5052

@@ -61,15 +63,37 @@ fn query_market() {
6163
)
6264
.unwrap();
6365

66+
// Open a LONG position
6467
let amount = Uint128::from(200u32);
6568
let size = Int128::try_from(amount).unwrap();
6669

6770
mock.execute_perp_order(&credit_manager, "2", denom1, size, None, &[]).unwrap();
6871

6972
let perp_market_state = mock.query_market(denom1);
7073

74+
let expected_long_oi_value =
75+
amount.checked_mul_floor(Decimal::from_str(denom1_price).unwrap()).unwrap();
7176
let expected_perp_market_state = MarketResponse {
7277
long_oi: amount,
78+
long_oi_value: expected_long_oi_value,
79+
..expected_perp_market_state
80+
};
81+
82+
assert_eq!(perp_market_state, expected_perp_market_state);
83+
84+
// Open a SHORT position
85+
let amount = Uint128::from(350u32);
86+
let size = -Int128::try_from(amount).unwrap();
87+
88+
mock.execute_perp_order(&credit_manager, "3", denom1, size, None, &[]).unwrap();
89+
90+
let perp_market_state = mock.query_market(denom1);
91+
92+
let expected_short_oi_value =
93+
amount.checked_mul_floor(Decimal::from_str(denom1_price).unwrap()).unwrap();
94+
let expected_perp_market_state = MarketResponse {
95+
short_oi: amount,
96+
short_oi_value: expected_short_oi_value,
7397
..expected_perp_market_state
7498
};
7599

@@ -80,6 +104,7 @@ fn query_market() {
80104
fn query_markets() {
81105
let mut mock = MockEnv::new().build().unwrap();
82106
let owner = mock.owner.clone();
107+
let credit_manager = mock.credit_manager.clone();
83108

84109
// Setup the environment for 3 different perp markets
85110
let base_denom = "uusdc";
@@ -139,7 +164,9 @@ fn query_markets() {
139164
denom: base_denom.to_string(),
140165
enabled: true,
141166
long_oi: Uint128::zero(),
167+
long_oi_value: Uint128::zero(),
142168
short_oi: Uint128::zero(),
169+
short_oi_value: Uint128::zero(),
143170
current_funding_rate: SignedDecimal::zero(),
144171
};
145172

@@ -148,13 +175,29 @@ fn query_markets() {
148175
..expected_perp_market_state_base.clone()
149176
};
150177

178+
let long_amount = Uint128::from(200u32);
179+
let long_oi_value =
180+
long_amount.checked_mul_floor(Decimal::from_str(denom2_price).unwrap()).unwrap();
181+
let size = Int128::try_from(long_amount).unwrap();
182+
mock.execute_perp_order(&credit_manager, "2", denom2, size, None, &[]).unwrap();
183+
151184
let expected_perp_market_state2 = MarketResponse {
152185
denom: denom2.to_string(),
186+
long_oi: long_amount,
187+
long_oi_value,
153188
..expected_perp_market_state_base.clone()
154189
};
155190

191+
let short_amount = Uint128::from(420u32);
192+
let short_oi_value =
193+
short_amount.checked_mul_floor(Decimal::from_str(denom3_price).unwrap()).unwrap();
194+
let size = -Int128::try_from(short_amount).unwrap();
195+
mock.execute_perp_order(&credit_manager, "3", denom3, size, None, &[]).unwrap();
196+
156197
let expected_perp_market_state3 = MarketResponse {
157198
denom: denom3.to_string(),
199+
short_oi: short_amount,
200+
short_oi_value,
158201
..expected_perp_market_state_base.clone()
159202
};
160203

packages/types/src/perps.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,10 +325,25 @@ pub struct AccountingResponse {
325325
#[cw_serde]
326326
#[derive(Default)]
327327
pub struct MarketResponse {
328+
/// Denomination of the asset
328329
pub denom: String,
330+
331+
/// Enabled status of the market
329332
pub enabled: bool,
333+
334+
/// Total LONG open interest in utokens
330335
pub long_oi: Uint128,
336+
337+
/// Total LONG open interest in oracle base currency (uusd)
338+
pub long_oi_value: Uint128,
339+
340+
/// Total SHORT open interest in utokens
331341
pub short_oi: Uint128,
342+
343+
/// Total SHORT open interest in oracle base currency (uusd)
344+
pub short_oi_value: Uint128,
345+
346+
/// Current funding rate
332347
pub current_funding_rate: SignedDecimal,
333348
}
334349

schemas/mars-perps/mars-perps.json

Lines changed: 78 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,23 +1120,58 @@
11201120
"denom",
11211121
"enabled",
11221122
"long_oi",
1123-
"short_oi"
1123+
"long_oi_value",
1124+
"short_oi",
1125+
"short_oi_value"
11241126
],
11251127
"properties": {
11261128
"current_funding_rate": {
1127-
"$ref": "#/definitions/SignedDecimal"
1129+
"description": "Current funding rate",
1130+
"allOf": [
1131+
{
1132+
"$ref": "#/definitions/SignedDecimal"
1133+
}
1134+
]
11281135
},
11291136
"denom": {
1137+
"description": "Denomination of the asset",
11301138
"type": "string"
11311139
},
11321140
"enabled": {
1141+
"description": "Enabled status of the market",
11331142
"type": "boolean"
11341143
},
11351144
"long_oi": {
1136-
"$ref": "#/definitions/Uint128"
1145+
"description": "Total LONG open interest in utokens",
1146+
"allOf": [
1147+
{
1148+
"$ref": "#/definitions/Uint128"
1149+
}
1150+
]
1151+
},
1152+
"long_oi_value": {
1153+
"description": "Total LONG open interest in oracle base currency (uusd)",
1154+
"allOf": [
1155+
{
1156+
"$ref": "#/definitions/Uint128"
1157+
}
1158+
]
11371159
},
11381160
"short_oi": {
1139-
"$ref": "#/definitions/Uint128"
1161+
"description": "Total SHORT open interest in utokens",
1162+
"allOf": [
1163+
{
1164+
"$ref": "#/definitions/Uint128"
1165+
}
1166+
]
1167+
},
1168+
"short_oi_value": {
1169+
"description": "Total SHORT open interest in oracle base currency (uusd)",
1170+
"allOf": [
1171+
{
1172+
"$ref": "#/definitions/Uint128"
1173+
}
1174+
]
11401175
}
11411176
},
11421177
"additionalProperties": false,
@@ -1546,23 +1581,58 @@
15461581
"denom",
15471582
"enabled",
15481583
"long_oi",
1549-
"short_oi"
1584+
"long_oi_value",
1585+
"short_oi",
1586+
"short_oi_value"
15501587
],
15511588
"properties": {
15521589
"current_funding_rate": {
1553-
"$ref": "#/definitions/SignedDecimal"
1590+
"description": "Current funding rate",
1591+
"allOf": [
1592+
{
1593+
"$ref": "#/definitions/SignedDecimal"
1594+
}
1595+
]
15541596
},
15551597
"denom": {
1598+
"description": "Denomination of the asset",
15561599
"type": "string"
15571600
},
15581601
"enabled": {
1602+
"description": "Enabled status of the market",
15591603
"type": "boolean"
15601604
},
15611605
"long_oi": {
1562-
"$ref": "#/definitions/Uint128"
1606+
"description": "Total LONG open interest in utokens",
1607+
"allOf": [
1608+
{
1609+
"$ref": "#/definitions/Uint128"
1610+
}
1611+
]
1612+
},
1613+
"long_oi_value": {
1614+
"description": "Total LONG open interest in oracle base currency (uusd)",
1615+
"allOf": [
1616+
{
1617+
"$ref": "#/definitions/Uint128"
1618+
}
1619+
]
15631620
},
15641621
"short_oi": {
1565-
"$ref": "#/definitions/Uint128"
1622+
"description": "Total SHORT open interest in utokens",
1623+
"allOf": [
1624+
{
1625+
"$ref": "#/definitions/Uint128"
1626+
}
1627+
]
1628+
},
1629+
"short_oi_value": {
1630+
"description": "Total SHORT open interest in oracle base currency (uusd)",
1631+
"allOf": [
1632+
{
1633+
"$ref": "#/definitions/Uint128"
1634+
}
1635+
]
15661636
}
15671637
},
15681638
"additionalProperties": false

scripts/types/generated/mars-perps/MarsPerps.types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,9 @@ export interface MarketResponse {
210210
denom: string
211211
enabled: boolean
212212
long_oi: Uint128
213+
long_oi_value: Uint128
213214
short_oi: Uint128
215+
short_oi_value: Uint128
214216
}
215217
export interface AccountingResponse {
216218
accounting: Accounting

0 commit comments

Comments
 (0)