gmsol_store/states/market/
status.rs

1use anchor_lang::prelude::*;
2use gmsol_model::{price::Prices, BaseMarketExt, BorrowingFeeMarketExt, PerpMarket};
3
4use super::Market;
5
6/// Market Status.
7#[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    /// Funding factor per second.
12    pub funding_factor_per_second: i128,
13    /// Borrowing factor per second for long.
14    pub borrowing_factor_per_second_for_long: u128,
15    /// Borrowing factor per second for short.
16    pub borrowing_factor_per_second_for_short: u128,
17    /// Pending pnl for long.
18    pub pending_pnl_for_long: i128,
19    /// Pending pnl for short.
20    pub pending_pnl_for_short: i128,
21    /// Reserve value for long.
22    pub reserve_value_for_long: u128,
23    /// Reserve value for short.
24    pub reserve_value_for_short: u128,
25    /// Pool value without pnl for long.
26    pub pool_value_without_pnl_for_long: u128,
27    /// Pool avlue without pnl for short.
28    pub pool_value_without_pnl_for_short: u128,
29}
30
31impl MarketStatus {
32    /// Create from market and prices.
33    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}