gmsol_store/states/market/
status.rs1use anchor_lang::prelude::*;
2use gmsol_model::{price::Prices, BaseMarketExt, BorrowingFeeMarketExt, PerpMarket};
3
4use super::Market;
5
6#[cfg_attr(feature = "debug", derive(Debug))]
8#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
9#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
10pub struct MarketStatus {
11 pub funding_factor_per_second: i128,
13 pub borrowing_factor_per_second_for_long: u128,
15 pub borrowing_factor_per_second_for_short: u128,
17 pub pending_pnl_for_long: i128,
19 pub pending_pnl_for_short: i128,
21 pub reserve_value_for_long: u128,
23 pub reserve_value_for_short: u128,
25 pub pool_value_without_pnl_for_long: u128,
27 pub pool_value_without_pnl_for_short: u128,
29}
30
31impl MarketStatus {
32 pub fn from_market(
34 market: &Market,
35 prices: &Prices<u128>,
36 maximize_pnl: bool,
37 maximize_pool_value: bool,
38 ) -> gmsol_model::Result<Self> {
39 Ok(Self {
40 funding_factor_per_second: *market.funding_factor_per_second(),
41 borrowing_factor_per_second_for_long: market
42 .borrowing_factor_per_second(true, prices)?,
43 borrowing_factor_per_second_for_short: market
44 .borrowing_factor_per_second(false, prices)?,
45 pending_pnl_for_long: market.pnl(&prices.index_token_price, true, maximize_pnl)?,
46 pending_pnl_for_short: market.pnl(&prices.index_token_price, false, maximize_pnl)?,
47 reserve_value_for_long: market.reserved_value(&prices.index_token_price, true)?,
48 reserve_value_for_short: market.reserved_value(&prices.index_token_price, false)?,
49 pool_value_without_pnl_for_long: market.pool_value_without_pnl_for_one_side(
50 prices,
51 true,
52 maximize_pool_value,
53 )?,
54 pool_value_without_pnl_for_short: market.pool_value_without_pnl_for_one_side(
55 prices,
56 false,
57 maximize_pool_value,
58 )?,
59 })
60 }
61}