use serde::{Deserialize, Deserializer, Serialize};
mod string_or_int {
use serde::{Deserialize, Deserializer};
pub fn deserialize<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
#[serde(untagged)]
enum StringOrInt {
String(String),
Int(i64),
UInt(u64),
Float(f64),
}
Ok(
Option::<StringOrInt>::deserialize(deserializer)?.map(|v| match v {
StringOrInt::String(s) => s,
StringOrInt::Int(i) => i.to_string(),
StringOrInt::UInt(u) => u.to_string(),
StringOrInt::Float(f) => f.to_string(),
}),
)
}
}
fn deserialize_flexible_string<'de, D>(deserializer: D) -> Result<Option<String>, D::Error>
where
D: Deserializer<'de>,
{
string_or_int::deserialize(deserializer)
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Vault {
pub address: String,
pub name: Option<String>,
pub symbol: Option<String>,
pub chain_id: u64,
pub api_version: Option<String>,
#[serde(default, deserialize_with = "deserialize_flexible_string")]
pub decimals: Option<String>,
pub v3: Option<bool>,
pub yearn: Option<bool>,
pub erc4626: Option<bool>,
pub is_shutdown: Option<bool>,
pub emergency_shutdown: Option<bool>,
pub vault_type: Option<i32>,
pub token: Option<String>,
#[serde(default)]
pub total_assets: Option<String>,
#[serde(default)]
pub total_supply: Option<String>,
#[serde(default)]
pub price_per_share: Option<String>,
#[serde(default)]
pub deposit_limit: Option<String>,
#[serde(default)]
pub available_deposit_limit: Option<String>,
#[serde(default)]
pub management_fee: Option<String>,
#[serde(default)]
pub performance_fee: Option<String>,
pub governance: Option<String>,
pub guardian: Option<String>,
pub management: Option<String>,
pub rewards: Option<String>,
pub registry: Option<String>,
#[serde(default)]
pub incept_time: Option<String>,
#[serde(default)]
pub incept_block: Option<String>,
#[serde(default)]
pub last_report: Option<String>,
#[serde(default)]
pub activation: Option<String>,
pub project_id: Option<String>,
pub project_name: Option<String>,
#[serde(default)]
pub withdrawal_queue: Option<Vec<String>>,
#[serde(default)]
pub strategies: Option<Vec<String>>,
pub tvl: Option<SparklinePoint>,
pub apy: Option<Apy>,
pub fees: Option<Fees>,
pub risk: Option<RiskScore>,
pub meta: Option<VaultMeta>,
pub asset: Option<Erc20>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Strategy {
pub address: String,
pub name: Option<String>,
pub chain_id: u64,
pub api_version: Option<String>,
pub vault: Option<String>,
pub v3: Option<bool>,
#[serde(default)]
pub activation: Option<u64>,
#[serde(default)]
pub incept_time: Option<u64>,
#[serde(default)]
pub incept_block: Option<u64>,
#[serde(default)]
pub last_report: Option<u64>,
#[serde(default)]
pub total_debt: Option<String>,
#[serde(default)]
pub total_gain: Option<String>,
#[serde(default)]
pub total_loss: Option<String>,
#[serde(default)]
pub performance_fee: Option<String>,
#[serde(default)]
pub debt_ratio: Option<String>,
#[serde(default)]
pub estimated_total_assets: Option<String>,
pub is_active: Option<bool>,
pub is_shutdown: Option<bool>,
pub keeper: Option<String>,
pub strategist: Option<String>,
pub risk: Option<RiskScore>,
pub apy: Option<Apy>,
pub tvl: Option<SparklinePoint>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Apy {
pub net: Option<f64>,
pub weekly_net: Option<f64>,
pub monthly_net: Option<f64>,
pub inception_net: Option<f64>,
pub gross_apr: Option<f64>,
#[serde(default)]
pub price_per_share: Option<String>,
pub block_number: Option<String>,
pub block_time: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SparklinePoint {
pub close: Option<f64>,
pub block_number: Option<String>,
pub block_time: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Fees {
pub management_fee: Option<f64>,
pub performance_fee: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct RiskScore {
pub risk_level: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VaultMeta {
pub display_name: Option<String>,
pub description: Option<String>,
pub category: Option<String>,
pub is_hidden: Option<bool>,
pub is_boosted: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Erc20 {
pub address: String,
pub name: Option<String>,
pub symbol: Option<String>,
#[serde(default, deserialize_with = "deserialize_flexible_string")]
pub decimals: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Price {
pub address: String,
pub chain_id: u64,
pub price_usd: f64,
pub price_source: String,
pub block_number: u64,
pub timestamp: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Tvl {
pub chain_id: u64,
pub address: String,
pub value: f64,
pub price_usd: Option<f64>,
pub price_source: String,
pub period: String,
pub block_number: u64,
pub time: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VaultReport {
pub chain_id: u64,
pub address: String,
pub event_name: String,
pub strategy: String,
pub gain: String,
pub loss: String,
pub debt_paid: Option<String>,
pub total_gain: Option<String>,
pub total_loss: Option<String>,
pub total_debt: Option<String>,
pub debt_added: Option<String>,
pub debt_ratio: Option<String>,
pub current_debt: Option<String>,
pub protocol_fees: Option<String>,
pub total_fees: Option<String>,
pub total_refunds: Option<String>,
pub gain_usd: Option<f64>,
pub loss_usd: Option<f64>,
pub debt_paid_usd: Option<f64>,
pub total_gain_usd: Option<f64>,
pub total_loss_usd: Option<f64>,
pub total_debt_usd: Option<f64>,
pub debt_added_usd: Option<f64>,
pub current_debt_usd: Option<f64>,
pub protocol_fees_usd: Option<f64>,
pub total_fees_usd: Option<f64>,
pub total_refunds_usd: Option<f64>,
pub price_usd: Option<f64>,
pub price_source: Option<String>,
pub apr: Option<ReportApr>,
pub block_number: u64,
pub block_time: u64,
pub log_index: u64,
pub transaction_hash: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct StrategyReport {
pub chain_id: u64,
pub address: String,
pub event_name: String,
pub profit: String,
pub loss: String,
pub debt_payment: Option<String>,
pub debt_outstanding: Option<String>,
pub protocol_fees: Option<String>,
pub performance_fees: Option<String>,
pub apr: Option<ReportApr>,
pub profit_usd: Option<f64>,
pub loss_usd: Option<f64>,
pub debt_payment_usd: Option<f64>,
pub debt_outstanding_usd: Option<f64>,
pub protocol_fees_usd: Option<f64>,
pub performance_fees_usd: Option<f64>,
pub price_usd: Option<f64>,
pub price_source: Option<String>,
pub block_number: u64,
pub block_time: u64,
pub log_index: u64,
pub transaction_hash: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ReportApr {
pub gross: Option<f64>,
pub net: Option<f64>,
pub forward: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TvlEntry {
pub address: Option<String>,
pub chain_id: Option<u64>,
pub tvl: Option<f64>,
pub block_number: Option<u64>,
pub block_time: Option<u64>,
pub period: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct VaultAccount {
pub address: String,
pub vault: String,
pub chain_id: u64,
#[serde(default)]
pub balance: Option<String>,
#[serde(default)]
pub deposits: Option<String>,
#[serde(default)]
pub withdrawals: Option<String>,
#[serde(default)]
pub profit: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GraphQLResponse<T> {
pub data: Option<T>,
pub errors: Option<Vec<GraphQLError>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GraphQLError {
pub message: String,
pub locations: Option<Vec<GraphQLLocation>>,
pub extensions: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GraphQLLocation {
pub line: u32,
pub column: u32,
}