1use serde::{Deserialize, Serialize};
2
3pub struct Config {
6 pub query_key: String,
7 pub base_url: Option<String>,
8 pub verbose: bool,
9}
10
11#[derive(Debug, Clone, Default)]
12pub struct FolioOpts {
13 pub cached: bool,
14}
15
16#[derive(Debug, Clone, Default)]
17pub struct EventsOpts {
18 pub since: Option<u64>,
19 pub poll: bool,
20}
21
22#[derive(Debug, Serialize, Default)]
25pub struct CreateAccountParams {
26 pub signer_type: String,
27 #[serde(skip_serializing_if = "Option::is_none")]
28 pub ethereum_signer_address: Option<String>,
29 #[serde(skip_serializing_if = "Option::is_none")]
30 pub solana_signer_address: Option<String>,
31 #[serde(skip_serializing_if = "Option::is_none")]
32 pub p256_public_key: Option<String>,
33 #[serde(skip_serializing_if = "Option::is_none")]
34 pub key_storage: Option<String>,
35}
36
37#[derive(Debug, Serialize, Deserialize)]
38pub struct Account {
39 pub account_id: String,
40 pub signer_type: Option<String>,
41 pub ethereum_signer_address: Option<String>,
42 pub p256_public_key: Option<String>,
43 pub legend_wallet_address: Option<String>,
44 pub solana_wallet_address: Option<String>,
45 pub turnkey_sub_org_id: Option<String>,
46 pub key_storage: Option<String>,
47 pub created_at: String,
48}
49
50#[derive(Debug, Serialize, Deserialize)]
51pub struct AccountList {
52 pub accounts: Vec<Account>,
53}
54
55#[derive(Debug, Serialize, Deserialize)]
56pub struct PrimeAccount {
57 pub id: String,
58 pub name: Option<String>,
59 pub email: Option<String>,
60}
61
62#[derive(Debug, Serialize, Deserialize)]
63pub struct Folio {
64 pub folio: serde_json::Value,
65}
66
67#[derive(Debug, Serialize, Deserialize)]
70pub struct Plan {
71 pub plan_id: String,
72 pub details: serde_json::Value,
73 pub expires_at: String,
74}
75
76impl Plan {
77 pub fn digest(&self) -> Option<&str> {
79 self.details
80 .get("eip712_data")
81 .and_then(|d| d.get("digest"))
82 .and_then(|d| d.as_str())
83 }
84}
85
86#[derive(Debug, Serialize)]
87pub struct ExecuteParams {
88 pub plan_id: String,
89 pub signature: String,
90}
91
92#[derive(Debug, Serialize, Deserialize)]
93pub struct ExecuteResult {
94 pub plan_id: String,
95 pub quark_intent_id: Option<String>,
96 pub activity_id: Option<String>,
97 pub status: String,
98}
99
100#[derive(Debug, Serialize)]
103pub struct EarnParams {
104 pub amount: String,
105 pub asset: String,
106 pub network: String,
107 pub protocol: String,
108 #[serde(skip_serializing_if = "Option::is_none")]
109 pub market: Option<String>,
110}
111
112#[derive(Debug, Serialize)]
113pub struct WithdrawParams {
114 pub amount: String,
115 pub asset: String,
116 pub network: String,
117 pub protocol: String,
118 #[serde(skip_serializing_if = "Option::is_none")]
119 pub market: Option<String>,
120}
121
122#[derive(Debug, Serialize)]
123pub struct TransferParams {
124 pub amount: String,
125 pub asset: String,
126 pub network: String,
127 pub recipient: String,
128}
129
130#[derive(Debug, Serialize)]
131pub struct ClaimRewardsParams {
132 pub asset: String,
133}
134
135#[derive(Debug, Serialize)]
136pub struct BorrowParams {
137 pub amount: String,
138 pub asset: String,
139 pub network: String,
140 pub collateral_amount: String,
141 pub collateral_asset: String,
142 pub protocol: String,
143 #[serde(skip_serializing_if = "Option::is_none")]
144 pub market: Option<String>,
145}
146
147#[derive(Debug, Serialize)]
148pub struct RepayParams {
149 pub amount: String,
150 pub asset: String,
151 pub network: String,
152 pub collateral_amount: String,
153 pub collateral_asset: String,
154 pub protocol: String,
155 #[serde(skip_serializing_if = "Option::is_none")]
156 pub market: Option<String>,
157}
158
159#[derive(Debug, Serialize)]
160pub struct SwapParams {
161 pub sell_asset: String,
162 pub buy_asset: String,
163 pub network: String,
164 #[serde(skip_serializing_if = "Option::is_none")]
165 pub sell_amount: Option<String>,
166 #[serde(skip_serializing_if = "Option::is_none")]
167 pub buy_amount: Option<String>,
168}
169
170#[derive(Debug, Serialize)]
171pub struct LoopLongParams {
172 pub exposure_asset: String,
173 pub backing_asset: String,
174 pub market_id: String,
175 pub is_increase: bool,
176 pub exposure_amount: String,
177 pub max_swap_backing_amount: String,
178 pub max_provided_backing_amount: String,
179 pub pool_fee: u64,
180 pub network: String,
181}
182
183#[derive(Debug, Serialize)]
184pub struct UnloopLongParams {
185 pub exposure_asset: String,
186 pub backing_asset: String,
187 pub market_id: String,
188 pub exposure_amount: String,
189 pub backing_amount_to_exit: String,
190 pub min_swap_backing_amount: String,
191 pub pool_fee: u64,
192 pub network: String,
193}
194
195#[derive(Debug, Serialize)]
196pub struct AddBackingParams {
197 pub exposure_asset: String,
198 pub backing_asset: String,
199 pub market_id: String,
200 pub amount: String,
201 pub is_short: bool,
202 pub network: String,
203}
204
205#[derive(Debug, Serialize)]
206pub struct WithdrawBackingParams {
207 pub exposure_asset: String,
208 pub backing_asset: String,
209 pub market_id: String,
210 pub amount: String,
211 pub is_short: bool,
212 pub network: String,
213}
214
215#[derive(Debug, Serialize)]
216pub struct MigrateParams {
217 pub amount: String,
218 pub asset: String,
219 pub from_protocol: String,
220 pub to_protocol: String,
221 pub network: String,
222 #[serde(skip_serializing_if = "Option::is_none")]
223 pub from_market: Option<String>,
224 #[serde(skip_serializing_if = "Option::is_none")]
225 pub to_market: Option<String>,
226 #[serde(skip_serializing_if = "Option::is_none")]
227 pub migrate_only_supply_balances: Option<bool>,
228}
229
230#[derive(Debug, Serialize)]
231pub struct SwapAndSupplyParams {
232 pub sell_asset: String,
233 pub sell_amount: String,
234 pub buy_asset: String,
235 pub protocol: String,
236 pub network: String,
237 #[serde(skip_serializing_if = "Option::is_none")]
238 pub market: Option<String>,
239}
240
241#[derive(Debug, Serialize)]
242pub struct ReinvestRewardsParams {
243 pub asset: String,
244 pub protocol: String,
245 pub network: String,
246 pub reward_assets: Vec<String>,
247 #[serde(skip_serializing_if = "Option::is_none")]
248 pub market: Option<String>,
249}
250
251#[derive(Debug, Serialize, Deserialize)]
254pub struct ActivityList {
255 pub activities: Vec<Activity>,
256}
257
258#[derive(Debug, Serialize, Deserialize)]
259pub struct Activity {
260 pub id: u64,
261 pub status: Option<String>,
262 pub quark_intent: Option<serde_json::Value>,
263 pub executions: Option<Vec<serde_json::Value>>,
264}
265
266#[derive(Debug, Serialize, Deserialize)]
267pub struct EventList {
268 pub events: Vec<serde_json::Value>,
269 pub cursor: Option<u64>,
270}
271
272#[derive(Debug, Serialize, Deserialize)]
275pub struct NetworkList {
276 pub networks: Vec<Network>,
277}
278
279#[derive(Debug, Serialize, Deserialize)]
280pub struct Network {
281 pub name: String,
282 pub chain_id: u64,
283 pub display_name: String,
284}
285
286#[derive(Debug, Serialize, Deserialize)]
287pub struct AssetMap {
288 pub assets: serde_json::Value,
289}
290
291#[derive(Debug, Serialize, Deserialize)]
292pub struct MarketList {
293 pub markets: Vec<Market>,
294}
295
296#[derive(Debug, Serialize, Deserialize)]
297#[serde(tag = "protocol")]
298pub enum Market {
299 #[serde(rename = "morpho_market")]
300 MorphoMarket {
301 chain_id: u64,
302 morpho: String,
303 market_id: String,
304 irm: String,
305 lltv: u64,
306 oracle: String,
307 loan_token: String,
308 collateral_token: String,
309 wad: u64,
310 },
311 #[serde(rename = "morpho_vault")]
312 MorphoVault {
313 chain_id: u64,
314 name: String,
315 symbol: String,
316 vault: String,
317 asset: String,
318 wad: u64,
319 },
320 #[serde(rename = "aave_market")]
321 AaveMarket {
322 chain_id: u64,
323 name: String,
324 pool: String,
325 ui_pool_data_provider: String,
326 market_base_currency: String,
327 ray_scale: f64,
328 bps_scale: f64,
329 reserves: Vec<AaveReserve>,
330 },
331 #[serde(rename = "comet")]
332 Comet {
333 chain_id: u64,
334 name: String,
335 symbol: String,
336 base_asset: String,
337 factor_scale: u64,
338 comet_address: String,
339 rewards_address: String,
340 collateral_assets: Vec<CometCollateral>,
341 },
342}
343
344#[derive(Debug, Serialize, Deserialize)]
345pub struct AaveReserve {
346 pub symbol: String,
347 pub decimals: u64,
348 pub underlying_asset: String,
349}
350
351#[derive(Debug, Serialize, Deserialize)]
352pub struct CometCollateral {
353 pub asset: String,
354 pub price_feed: String,
355}