use gmsol_programs::gmsol_store::{accounts::Glv, types::GlvMarketConfig};
use gmsol_utils::glv::GlvMarketFlag;
use indexmap::IndexMap;
use solana_sdk::pubkey::Pubkey;
use crate::utils::{GmAmount, Value};
use super::StringPubkey;
#[derive(Debug, Clone)]
#[cfg_attr(serde, derive(serde::Serialize, serde::Deserialize))]
pub struct SerdeGlv {
pub index: u16,
pub store: StringPubkey,
pub glv_token: StringPubkey,
pub long_token: StringPubkey,
pub short_token: StringPubkey,
pub shift_last_executed_at: i64,
pub min_tokens_for_first_deposit: GmAmount,
pub shift_min_interval_secs: u32,
pub shift_max_price_impact_factor: Value,
pub shift_min_value: Value,
pub markets: IndexMap<StringPubkey, SerdeGlvMarketConfig>,
}
impl SerdeGlv {
pub fn from_glv(glv: &Glv) -> crate::Result<Self> {
Ok(Self {
index: glv.index,
store: glv.store.into(),
glv_token: glv.glv_token.into(),
long_token: glv.long_token.into(),
short_token: glv.short_token.into(),
shift_last_executed_at: glv.shift_last_executed_at,
min_tokens_for_first_deposit: GmAmount::from_u64(glv.min_tokens_for_first_deposit),
shift_min_interval_secs: glv.shift_min_interval_secs,
shift_max_price_impact_factor: Value::from_u128(glv.shift_max_price_impact_factor),
shift_min_value: Value::from_u128(glv.shift_min_value),
markets: glv
.markets
.entries()
.map(|(k, config)| {
let market_token = Pubkey::new_from_array(*k);
Ok((
market_token.into(),
SerdeGlvMarketConfig::from_config(config)?,
))
})
.collect::<crate::Result<_>>()?,
})
}
}
#[derive(Debug, Clone)]
#[cfg_attr(serde, derive(serde::Serialize, serde::Deserialize))]
pub struct SerdeGlvMarketConfig {
pub max_amount: GmAmount,
pub is_deposit_allowed: bool,
pub max_value: Value,
pub balance: GmAmount,
}
impl SerdeGlvMarketConfig {
pub fn from_config(config: &GlvMarketConfig) -> crate::Result<Self> {
Ok(Self {
max_amount: GmAmount::from_u64(config.max_amount),
is_deposit_allowed: config.flags.get_flag(GlvMarketFlag::IsDepositAllowed),
max_value: Value::from_u128(config.max_value),
balance: GmAmount::from_u64(config.balance),
})
}
}