Skip to content

Commit

Permalink
Improve market queries (#182)
Browse files Browse the repository at this point in the history
* Improve Market / Markets query. Add OI values.

* Generate schemas.
piobab authored Nov 30, 2024
1 parent da424d4 commit 3193ef9
Showing 5 changed files with 150 additions and 8 deletions.
12 changes: 12 additions & 0 deletions contracts/perps/src/query.rs
Original file line number Diff line number Diff line change
@@ -137,13 +137,19 @@ pub fn query_market(
let base_denom_price =
oracle.query_price(&deps.querier, &cfg.base_denom, ActionKind::Default)?.price;
let denom_price = oracle.query_price(&deps.querier, &denom, ActionKind::Default)?.price;

let long_oi_value = ms.long_oi.checked_mul_floor(denom_price)?;
let short_oi_value = ms.short_oi.checked_mul_floor(denom_price)?;

let curr_funding = ms.current_funding(current_time, denom_price, base_denom_price)?;

Ok(MarketResponse {
denom: denom.clone(),
enabled: ms.enabled,
long_oi: ms.long_oi,
long_oi_value,
short_oi: ms.short_oi,
short_oi_value,
current_funding_rate: curr_funding.last_funding_rate,
})
}
@@ -170,13 +176,19 @@ pub fn query_markets(

paginate_map_query(&MARKET_STATES, deps.storage, start, Some(limit), |denom, ms| {
let denom_price = oracle.query_price(&deps.querier, &denom, ActionKind::Default)?.price;

let long_oi_value = ms.long_oi.checked_mul_floor(denom_price)?;
let short_oi_value = ms.short_oi.checked_mul_floor(denom_price)?;

let curr_funding = ms.current_funding(current_time, denom_price, base_denom_price)?;

Ok(MarketResponse {
denom: denom.clone(),
enabled: ms.enabled,
long_oi: ms.long_oi,
long_oi_value,
short_oi: ms.short_oi,
short_oi_value,
current_funding_rate: curr_funding.last_funding_rate,
})
})
43 changes: 43 additions & 0 deletions contracts/perps/tests/tests/test_query.rs
Original file line number Diff line number Diff line change
@@ -44,7 +44,9 @@ fn query_market() {
denom: denom1.to_string(),
enabled: true,
long_oi: Uint128::zero(),
long_oi_value: Uint128::zero(),
short_oi: Uint128::zero(),
short_oi_value: Uint128::zero(),
current_funding_rate: SignedDecimal::zero(),
};

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

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

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

let perp_market_state = mock.query_market(denom1);

let expected_long_oi_value =
amount.checked_mul_floor(Decimal::from_str(denom1_price).unwrap()).unwrap();
let expected_perp_market_state = MarketResponse {
long_oi: amount,
long_oi_value: expected_long_oi_value,
..expected_perp_market_state
};

assert_eq!(perp_market_state, expected_perp_market_state);

// Open a SHORT position
let amount = Uint128::from(350u32);
let size = -Int128::try_from(amount).unwrap();

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

let perp_market_state = mock.query_market(denom1);

let expected_short_oi_value =
amount.checked_mul_floor(Decimal::from_str(denom1_price).unwrap()).unwrap();
let expected_perp_market_state = MarketResponse {
short_oi: amount,
short_oi_value: expected_short_oi_value,
..expected_perp_market_state
};

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

// Setup the environment for 3 different perp markets
let base_denom = "uusdc";
@@ -139,7 +164,9 @@ fn query_markets() {
denom: base_denom.to_string(),
enabled: true,
long_oi: Uint128::zero(),
long_oi_value: Uint128::zero(),
short_oi: Uint128::zero(),
short_oi_value: Uint128::zero(),
current_funding_rate: SignedDecimal::zero(),
};

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

let long_amount = Uint128::from(200u32);
let long_oi_value =
long_amount.checked_mul_floor(Decimal::from_str(denom2_price).unwrap()).unwrap();
let size = Int128::try_from(long_amount).unwrap();
mock.execute_perp_order(&credit_manager, "2", denom2, size, None, &[]).unwrap();

let expected_perp_market_state2 = MarketResponse {
denom: denom2.to_string(),
long_oi: long_amount,
long_oi_value,
..expected_perp_market_state_base.clone()
};

let short_amount = Uint128::from(420u32);
let short_oi_value =
short_amount.checked_mul_floor(Decimal::from_str(denom3_price).unwrap()).unwrap();
let size = -Int128::try_from(short_amount).unwrap();
mock.execute_perp_order(&credit_manager, "3", denom3, size, None, &[]).unwrap();

let expected_perp_market_state3 = MarketResponse {
denom: denom3.to_string(),
short_oi: short_amount,
short_oi_value,
..expected_perp_market_state_base.clone()
};

15 changes: 15 additions & 0 deletions packages/types/src/perps.rs
Original file line number Diff line number Diff line change
@@ -325,10 +325,25 @@ pub struct AccountingResponse {
#[cw_serde]
#[derive(Default)]
pub struct MarketResponse {
/// Denomination of the asset
pub denom: String,

/// Enabled status of the market
pub enabled: bool,

/// Total LONG open interest in utokens
pub long_oi: Uint128,

/// Total LONG open interest in oracle base currency (uusd)
pub long_oi_value: Uint128,

/// Total SHORT open interest in utokens
pub short_oi: Uint128,

/// Total SHORT open interest in oracle base currency (uusd)
pub short_oi_value: Uint128,

/// Current funding rate
pub current_funding_rate: SignedDecimal,
}

86 changes: 78 additions & 8 deletions schemas/mars-perps/mars-perps.json
Original file line number Diff line number Diff line change
@@ -1120,23 +1120,58 @@
"denom",
"enabled",
"long_oi",
"short_oi"
"long_oi_value",
"short_oi",
"short_oi_value"
],
"properties": {
"current_funding_rate": {
"$ref": "#/definitions/SignedDecimal"
"description": "Current funding rate",
"allOf": [
{
"$ref": "#/definitions/SignedDecimal"
}
]
},
"denom": {
"description": "Denomination of the asset",
"type": "string"
},
"enabled": {
"description": "Enabled status of the market",
"type": "boolean"
},
"long_oi": {
"$ref": "#/definitions/Uint128"
"description": "Total LONG open interest in utokens",
"allOf": [
{
"$ref": "#/definitions/Uint128"
}
]
},
"long_oi_value": {
"description": "Total LONG open interest in oracle base currency (uusd)",
"allOf": [
{
"$ref": "#/definitions/Uint128"
}
]
},
"short_oi": {
"$ref": "#/definitions/Uint128"
"description": "Total SHORT open interest in utokens",
"allOf": [
{
"$ref": "#/definitions/Uint128"
}
]
},
"short_oi_value": {
"description": "Total SHORT open interest in oracle base currency (uusd)",
"allOf": [
{
"$ref": "#/definitions/Uint128"
}
]
}
},
"additionalProperties": false,
@@ -1546,23 +1581,58 @@
"denom",
"enabled",
"long_oi",
"short_oi"
"long_oi_value",
"short_oi",
"short_oi_value"
],
"properties": {
"current_funding_rate": {
"$ref": "#/definitions/SignedDecimal"
"description": "Current funding rate",
"allOf": [
{
"$ref": "#/definitions/SignedDecimal"
}
]
},
"denom": {
"description": "Denomination of the asset",
"type": "string"
},
"enabled": {
"description": "Enabled status of the market",
"type": "boolean"
},
"long_oi": {
"$ref": "#/definitions/Uint128"
"description": "Total LONG open interest in utokens",
"allOf": [
{
"$ref": "#/definitions/Uint128"
}
]
},
"long_oi_value": {
"description": "Total LONG open interest in oracle base currency (uusd)",
"allOf": [
{
"$ref": "#/definitions/Uint128"
}
]
},
"short_oi": {
"$ref": "#/definitions/Uint128"
"description": "Total SHORT open interest in utokens",
"allOf": [
{
"$ref": "#/definitions/Uint128"
}
]
},
"short_oi_value": {
"description": "Total SHORT open interest in oracle base currency (uusd)",
"allOf": [
{
"$ref": "#/definitions/Uint128"
}
]
}
},
"additionalProperties": false
2 changes: 2 additions & 0 deletions scripts/types/generated/mars-perps/MarsPerps.types.ts
Original file line number Diff line number Diff line change
@@ -210,7 +210,9 @@ export interface MarketResponse {
denom: string
enabled: boolean
long_oi: Uint128
long_oi_value: Uint128
short_oi: Uint128
short_oi_value: Uint128
}
export interface AccountingResponse {
accounting: Accounting

0 comments on commit 3193ef9

Please sign in to comment.