use anchor_lang::prelude::*;
use gmsol_model::{price::Prices, BaseMarketExt, BorrowingFeeMarketExt, PerpMarket};
use super::Market;
#[cfg_attr(feature = "debug", derive(Debug))]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, AnchorSerialize, AnchorDeserialize)]
pub struct MarketStatus {
pub funding_factor_per_second: i128,
pub borrowing_factor_per_second_for_long: u128,
pub borrowing_factor_per_second_for_short: u128,
pub pending_pnl_for_long: i128,
pub pending_pnl_for_short: i128,
pub reserve_value_for_long: u128,
pub reserve_value_for_short: u128,
pub pool_value_without_pnl_for_long: u128,
pub pool_value_without_pnl_for_short: u128,
}
impl MarketStatus {
pub fn from_market(
market: &Market,
prices: &Prices<u128>,
maximize_pnl: bool,
maximize_pool_value: bool,
) -> gmsol_model::Result<Self> {
Ok(Self {
funding_factor_per_second: *market.funding_factor_per_second(),
borrowing_factor_per_second_for_long: market
.borrowing_factor_per_second(true, prices)?,
borrowing_factor_per_second_for_short: market
.borrowing_factor_per_second(false, prices)?,
pending_pnl_for_long: market.pnl(&prices.index_token_price, true, maximize_pnl)?,
pending_pnl_for_short: market.pnl(&prices.index_token_price, false, maximize_pnl)?,
reserve_value_for_long: market.reserved_value(&prices.index_token_price, true)?,
reserve_value_for_short: market.reserved_value(&prices.index_token_price, false)?,
pool_value_without_pnl_for_long: market.pool_value_without_pnl_for_one_side(
prices,
true,
maximize_pool_value,
)?,
pool_value_without_pnl_for_short: market.pool_value_without_pnl_for_one_side(
prices,
false,
maximize_pool_value,
)?,
})
}
}