use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct SearchResults {
#[serde(rename = "arkhamEntities", default)]
pub arkham_entities: Vec<Entity>,
#[serde(default)]
pub tokens: Vec<Token>,
#[serde(default)]
pub pools: Vec<SolanaPool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Entity {
#[serde(default)]
pub id: Option<String>,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub r#type: Option<String>,
#[serde(default)]
pub note: Option<String>,
#[serde(default)]
pub twitter: Option<String>,
#[serde(default)]
pub service: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Token {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub symbol: Option<String>,
#[serde(default)]
pub price: Option<f64>,
#[serde(rename = "price24hAgo", default)]
pub price_24h_ago: Option<f64>,
#[serde(default)]
pub identifier: Option<TokenIdentifier>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TokenIdentifier {
#[serde(default)]
pub address: Option<String>,
#[serde(default)]
pub chain: Option<String>,
#[serde(rename = "pricingID", default)]
pub pricing_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SolanaPool {
#[serde(rename = "poolAddress", default)]
pub pool_address: Option<String>,
#[serde(rename = "tokenAddress", default)]
pub token_address: Option<String>,
#[serde(rename = "tokenName", default)]
pub token_name: Option<String>,
#[serde(rename = "tokenSymbol", default)]
pub token_symbol: Option<String>,
#[serde(rename = "priceUsd", default)]
pub price_usd: Option<f64>,
#[serde(rename = "liquidityUsd", default)]
pub liquidity_usd: Option<f64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChainAddressInfo {
#[serde(default)]
pub address: Option<String>,
#[serde(default)]
pub chain: Option<String>,
#[serde(rename = "isUserAddress", default)]
pub is_user_address: bool,
#[serde(default)]
pub contract: bool,
#[serde(rename = "populatedTags", default)]
pub populated_tags: Vec<AddressTag>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AddressTag {
#[serde(default)]
pub id: Option<String>,
#[serde(default)]
pub label: Option<String>,
#[serde(default)]
pub rank: i64,
#[serde(default)]
pub chain: String,
#[serde(rename = "excludeEntities", default)]
pub exclude_entities: bool,
#[serde(rename = "disablePage", default)]
pub disable_page: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
#[serde(transparent)]
pub struct AddressEnriched {
pub chains: HashMap<String, ChainAddressInfo>,
}
impl AddressEnriched {
pub fn known_chains(&self) -> Vec<&str> {
self.chains.keys().map(String::as_str).collect()
}
pub fn all_tags(&self) -> impl Iterator<Item = &AddressTag> {
self.chains.values().flat_map(|c| c.populated_tags.iter())
}
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct TransfersPage {
#[serde(default)]
pub count: u64,
#[serde(default)]
pub transfers: Vec<Transfer>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Transfer {
#[serde(default)]
pub id: Option<String>,
#[serde(rename = "transactionHash", default)]
pub transaction_hash: Option<String>,
#[serde(default)]
pub chain: Option<String>,
#[serde(rename = "fromAddress", default)]
pub from_address: Option<TransferParty>,
#[serde(rename = "toAddress", default)]
pub to_address: Option<TransferParty>,
#[serde(rename = "tokenAddress", default)]
pub token_address: Option<String>,
#[serde(rename = "tokenName", default)]
pub token_name: Option<String>,
#[serde(rename = "tokenSymbol", default)]
pub token_symbol: Option<String>,
#[serde(rename = "tokenDecimals", default)]
pub token_decimals: Option<i64>,
#[serde(rename = "tokenId", default)]
pub token_id: Option<String>,
#[serde(rename = "unitValue", default)]
pub unit_value: Option<f64>,
#[serde(rename = "historicalUSD", default)]
pub historical_usd: Option<f64>,
#[serde(rename = "blockNumber", default)]
pub block_number: Option<u64>,
#[serde(rename = "blockTimestamp", default)]
pub block_timestamp: Option<String>,
#[serde(rename = "blockHash", default)]
pub block_hash: Option<String>,
#[serde(rename = "type", default)]
pub r#type: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TransferParty {
#[serde(default)]
pub address: Option<String>,
#[serde(default)]
pub chain: Option<String>,
#[serde(rename = "isUserAddress", default)]
pub is_user_address: bool,
#[serde(default)]
pub contract: bool,
}
#[derive(Debug, Clone, Default)]
pub struct TransfersQuery<'a> {
pub base: Option<&'a [&'a str]>,
pub flow: Option<&'a str>,
pub usd_gte: Option<&'a str>,
pub sort_key: Option<&'a str>,
pub sort_dir: Option<&'a str>,
pub limit: Option<u32>,
pub offset: Option<u32>,
}