Skip to main content

legend_client/
types.rs

1use serde::{Deserialize, Serialize};
2
3// --- Config ---
4
5pub 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// --- Account types ---
23
24#[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// --- Plan types ---
68
69#[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    /// Extract the EIP-712 digest from plan details.
78    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// --- Plan request params ---
101
102#[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// --- Activity types ---
252
253#[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// --- Reference types ---
273
274#[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}