use serde::{Deserialize, Serialize};
use solana_pubkey::Pubkey;
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct SpotMarket {
#[serde(default)]
pub pubkey: Vec<u8>,
pub market_index: u16,
pub initial_asset_weight: u32,
pub initial_liability_weight: u32,
pub imf_factor: u32,
pub scale_initial_asset_weight_start: u64,
pub decimals: u32,
pub cumulative_deposit_interest: u128,
pub cumulative_borrow_interest: u128,
#[serde(default)]
pub deposit_balance: u128,
#[serde(default)]
pub borrow_balance: u128,
#[serde(default)]
pub optimal_utilization: u32,
#[serde(default)]
pub optimal_borrow_rate: u32,
#[serde(default)]
pub max_borrow_rate: u32,
#[serde(default)]
pub min_borrow_rate: u8,
#[serde(default)]
pub insurance_fund: InsuranceFund,
#[serde(default)]
pub historical_oracle_data: HistoricalOracleData,
#[serde(default)]
pub oracle: Option<Pubkey>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct InsuranceFund {
#[serde(default)]
pub total_factor: u32,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct HistoricalOracleData {
#[serde(default)]
pub last_oracle_price_twap5min: i64,
}
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct DriftUser {
#[serde(default)]
pub authority: Pubkey,
pub spot_positions: Vec<SpotPosition>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Default)]
pub struct SpotPosition {
pub scaled_balance: u64,
pub market_index: u16,
pub balance_type: SpotBalanceType,
#[serde(default)]
pub open_orders: u8,
#[serde(default)]
pub open_bids: i64,
#[serde(default)]
pub open_asks: i64,
#[serde(default)]
pub cumulative_deposits: i64,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, Default)]
pub enum SpotBalanceType {
#[default]
Deposit,
Borrow,
}