1use std::collections::HashMap;
9
10use serde::{Deserialize, Serialize};
11
12#[derive(Debug, Clone, Default, Serialize, Deserialize)]
14pub struct SearchResults {
15 #[serde(rename = "arkhamEntities", default)]
17 pub arkham_entities: Vec<Entity>,
18
19 #[serde(default)]
21 pub tokens: Vec<Token>,
22
23 #[serde(default)]
25 pub pools: Vec<SolanaPool>,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct Entity {
35 #[serde(default)]
36 pub id: Option<String>,
37 #[serde(default)]
38 pub name: Option<String>,
39 #[serde(default)]
43 pub r#type: Option<String>,
44 #[serde(default)]
46 pub note: Option<String>,
47 #[serde(default)]
49 pub twitter: Option<String>,
50 #[serde(default)]
52 pub service: Option<bool>,
53}
54
55#[derive(Debug, Clone, Serialize, Deserialize)]
57pub struct Token {
58 #[serde(default)]
59 pub name: Option<String>,
60 #[serde(default)]
61 pub symbol: Option<String>,
62 #[serde(default)]
63 pub price: Option<f64>,
64 #[serde(rename = "price24hAgo", default)]
65 pub price_24h_ago: Option<f64>,
66 #[serde(default)]
67 pub identifier: Option<TokenIdentifier>,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct TokenIdentifier {
72 #[serde(default)]
73 pub address: Option<String>,
74 #[serde(default)]
75 pub chain: Option<String>,
76 #[serde(rename = "pricingID", default)]
77 pub pricing_id: Option<String>,
78}
79
80#[derive(Debug, Clone, Serialize, Deserialize)]
82pub struct SolanaPool {
83 #[serde(rename = "poolAddress", default)]
84 pub pool_address: Option<String>,
85 #[serde(rename = "tokenAddress", default)]
86 pub token_address: Option<String>,
87 #[serde(rename = "tokenName", default)]
88 pub token_name: Option<String>,
89 #[serde(rename = "tokenSymbol", default)]
90 pub token_symbol: Option<String>,
91 #[serde(rename = "priceUsd", default)]
92 pub price_usd: Option<f64>,
93 #[serde(rename = "liquidityUsd", default)]
94 pub liquidity_usd: Option<f64>,
95}
96
97#[derive(Debug, Clone, Serialize, Deserialize)]
107pub struct ChainAddressInfo {
108 #[serde(default)]
109 pub address: Option<String>,
110 #[serde(default)]
111 pub chain: Option<String>,
112 #[serde(rename = "isUserAddress", default)]
113 pub is_user_address: bool,
114 #[serde(default)]
115 pub contract: bool,
116 #[serde(rename = "populatedTags", default)]
117 pub populated_tags: Vec<AddressTag>,
118}
119
120#[derive(Debug, Clone, Serialize, Deserialize)]
122pub struct AddressTag {
123 #[serde(default)]
124 pub id: Option<String>,
125 #[serde(default)]
126 pub label: Option<String>,
127 #[serde(default)]
128 pub rank: i64,
129 #[serde(default)]
130 pub chain: String,
131 #[serde(rename = "excludeEntities", default)]
132 pub exclude_entities: bool,
133 #[serde(rename = "disablePage", default)]
134 pub disable_page: bool,
135}
136
137#[derive(Debug, Clone, Default, Serialize, Deserialize)]
140#[serde(transparent)]
141pub struct AddressEnriched {
142 pub chains: HashMap<String, ChainAddressInfo>,
143}
144
145impl AddressEnriched {
146 pub fn known_chains(&self) -> Vec<&str> {
150 self.chains.keys().map(String::as_str).collect()
151 }
152
153 pub fn all_tags(&self) -> impl Iterator<Item = &AddressTag> {
155 self.chains.values().flat_map(|c| c.populated_tags.iter())
156 }
157}
158
159#[derive(Debug, Clone, Default, Serialize, Deserialize)]
163pub struct TransfersPage {
164 #[serde(default)]
167 pub count: u64,
168 #[serde(default)]
169 pub transfers: Vec<Transfer>,
170}
171
172#[derive(Debug, Clone, Serialize, Deserialize)]
177pub struct Transfer {
178 #[serde(default)]
179 pub id: Option<String>,
180 #[serde(rename = "transactionHash", default)]
181 pub transaction_hash: Option<String>,
182 #[serde(default)]
183 pub chain: Option<String>,
184
185 #[serde(rename = "fromAddress", default)]
186 pub from_address: Option<TransferParty>,
187 #[serde(rename = "toAddress", default)]
188 pub to_address: Option<TransferParty>,
189
190 #[serde(rename = "tokenAddress", default)]
191 pub token_address: Option<String>,
192 #[serde(rename = "tokenName", default)]
193 pub token_name: Option<String>,
194 #[serde(rename = "tokenSymbol", default)]
195 pub token_symbol: Option<String>,
196 #[serde(rename = "tokenDecimals", default)]
197 pub token_decimals: Option<i64>,
198 #[serde(rename = "tokenId", default)]
199 pub token_id: Option<String>,
200
201 #[serde(rename = "unitValue", default)]
203 pub unit_value: Option<f64>,
204 #[serde(rename = "historicalUSD", default)]
206 pub historical_usd: Option<f64>,
207
208 #[serde(rename = "blockNumber", default)]
209 pub block_number: Option<u64>,
210 #[serde(rename = "blockTimestamp", default)]
211 pub block_timestamp: Option<String>,
212 #[serde(rename = "blockHash", default)]
213 pub block_hash: Option<String>,
214
215 #[serde(rename = "type", default)]
216 pub r#type: Option<String>,
217}
218
219#[derive(Debug, Clone, Serialize, Deserialize)]
220pub struct TransferParty {
221 #[serde(default)]
222 pub address: Option<String>,
223 #[serde(default)]
224 pub chain: Option<String>,
225 #[serde(rename = "isUserAddress", default)]
226 pub is_user_address: bool,
227 #[serde(default)]
228 pub contract: bool,
229}
230
231#[derive(Debug, Clone, Default)]
234pub struct TransfersQuery<'a> {
235 pub base: Option<&'a [&'a str]>,
238 pub flow: Option<&'a str>,
240 pub usd_gte: Option<&'a str>,
242 pub sort_key: Option<&'a str>,
244 pub sort_dir: Option<&'a str>,
246 pub limit: Option<u32>,
247 pub offset: Option<u32>,
248}