use df_hyperliquid_core::utils::Json;
use crate::utils::wire::{BadWire, field, i128_of, parse, u64_of, u128_of};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Summary {
pub block: u64,
pub at_ms: u64,
pub genesis_ms: u64,
pub tvl: u128,
pub margin: u128,
pub lp: u128,
pub reserve: u128,
pub queue: u128,
pub volume: u128,
pub open_positions: u64,
pub fees_pending: u128,
pub fees_lifetime: u128,
pub paper: PaperFigures,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct PaperFigures {
pub supply: u128,
pub staked: u128,
pub tracked_lp: i128,
pub accumulator: u128,
pub tail_progress: u128,
pub reserve: u128,
pub unallocated: u128,
pub pending_rewards: u128,
pub cliff: u128,
pub cap: u128,
pub excess: u128,
pub rate: u128,
pub decay: u128,
}
impl PaperFigures {
#[must_use]
pub fn mint_rate(&self) -> u128 {
crate::trade::math::mint_rate(self.tracked_lp, self.cliff, self.rate, self.decay, self.tail_progress)
}
}
impl Summary {
pub fn parse(text: &str) -> Result<Summary, BadWire> {
let json = parse(text, "summary")?;
let source = field(&json, "source")?;
let balances = field(&json, "balances")?;
let activity = field(&json, "activity")?;
let fees = field(&json, "fees")?;
let paper = field(&json, "paper")?;
let amount = |json: &Json, key: &str| u128_of(field(json, key)?, key);
Ok(Summary {
block: u64_of(field(source, "block")?, "block")?,
at_ms: u64_of(field(source, "at")?, "at")?,
genesis_ms: u64_of(field(source, "genesis")?, "genesis")?,
tvl: amount(balances, "tvl")?,
margin: amount(balances, "margin")?,
lp: amount(balances, "lp")?,
reserve: amount(balances, "reserve")?,
queue: amount(balances, "queue")?,
volume: amount(activity, "volume")?,
open_positions: u64_of(field(activity, "open")?, "open")?,
fees_pending: amount(fees, "pending")?,
fees_lifetime: amount(fees, "lifetime")?,
paper: PaperFigures {
supply: amount(paper, "supply")?,
staked: amount(paper, "staked")?,
tracked_lp: i128_of(field(paper, "trackedLp")?, "trackedLp")?,
accumulator: amount(paper, "accumulator")?,
tail_progress: amount(paper, "tailProgress")?,
reserve: amount(paper, "reserve")?,
unallocated: amount(paper, "unallocated")?,
pending_rewards: amount(paper, "pendingRewards")?,
cliff: amount(paper, "cliff")?,
cap: amount(paper, "cap")?,
excess: amount(paper, "excess")?,
rate: amount(paper, "rate")?,
decay: amount(paper, "decay")?,
},
})
}
}
#[cfg(test)]
#[path = "tests/summary.rs"]
mod tests;