use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TokenAnalytics {
pub token_address: String,
pub network: String,
pub holder_count: i64,
pub top10_pct: f64,
pub creator_pct: f64,
pub buys: i64,
pub sells: i64,
pub volume_usd: f64,
pub graduation_pct: f64,
pub launched: bool,
pub bundle_buyers: i64,
pub bundle_flag: bool,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TopTrader {
pub address: String,
#[serde(default)]
pub username: Option<String>,
#[serde(default)]
pub avatar: Option<String>,
pub realized_pnl_usd: f64,
pub unrealized_pnl_usd: f64,
pub total_pnl_usd: f64,
pub volume_usd: f64,
pub is_creator: bool,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct WalletStats {
pub address: String,
#[serde(default)]
pub username: Option<String>,
#[serde(default)]
pub avatar: Option<String>,
pub volume_usd: f64,
pub realized_pnl_usd: f64,
pub unrealized_pnl_usd: f64,
pub total_pnl_usd: f64,
pub roi_pct: f64,
pub win_rate: f64,
pub tokens_traded: i64,
pub trade_count: i64,
pub holding_value_usd: f64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PortfolioPosition {
pub token_address: String,
pub name: String,
pub symbol: String,
#[serde(default)]
pub image: Option<String>,
pub network: String,
pub balance: f64,
pub current_price_usd: f64,
pub value_usd: f64,
pub cost_usd: f64,
pub avg_buy_price_usd: f64,
pub unrealized_pnl_usd: f64,
pub unrealized_pnl_pct: f64,
pub realized_pnl_usd: f64,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Portfolio {
pub address: String,
pub total_value_usd: f64,
pub total_cost_usd: f64,
pub unrealized_pnl_usd: f64,
pub realized_pnl_usd: f64,
pub total_pnl_usd: f64,
pub roi_pct: f64,
pub positions: Vec<PortfolioPosition>,
}