1use crate::utils::empty_string_as_none;
2use chrono::{DateTime, NaiveDateTime, Utc};
3use ethereum_types::{Address, U256};
4use serde::{Deserialize, Serialize};
5
6pub type Loans = Vec<Loan>;
7pub type Offers = Vec<Offer>;
8pub type Listings = Vec<Listing>;
9pub type Projects = Vec<Project>;
10
11#[derive(Debug, Serialize, Deserialize)]
12pub struct Loan {
13 #[serde(rename = "_id")]
14 pub id: String,
15 #[serde(rename = "contractName")]
16 pub contract_name: ContractName,
17 #[serde(rename = "loanId")]
18 pub loan_id: i64,
19 #[serde(rename = "__v")]
20 pub v: i64,
21 #[serde(rename = "assetCategory")]
22 pub asset_category: String,
23 #[serde(rename = "assetName")]
24 pub asset_name: String,
25 pub borrower: Address,
26 #[serde(rename = "interestIsProRated")]
27 pub interest_is_pro_rated: bool,
28 pub lender: Address,
29 pub liquidated: bool,
30 #[serde(rename = "loanDueTime")]
31 pub loan_due_time: DateTime<Utc>,
32 #[serde(rename = "loanDuration")]
33 pub loan_duration: i64,
34 #[serde(rename = "loanERC20Denomination")]
35 pub loan_erc20_denomination: Option<Address>,
36 #[serde(rename = "loanInterestRateForDurationInBasisPoints")]
37 pub loan_interest_rate_for_duration_in_basis_points: i64,
38 #[serde(rename = "loanPrincipalAmount")]
39 pub loan_principal_amount: f64,
40 #[serde(rename = "loanStartTime")]
41 pub loan_start_time: DateTime<Utc>,
42 #[serde(rename = "maximumRepaymentAmount")]
43 pub maximum_repayment_amount: f64,
44 #[serde(rename = "nftCollateralContract")]
45 pub nft_collateral_contract: Address,
46 #[serde(rename = "nftCollateralId")]
47 pub nft_collateral_id: String,
48 #[serde(rename = "nftKey")]
49 pub nft_key: String,
50 pub repaid: bool,
51 #[serde(rename = "activeTransactionHash")]
52 pub active_transaction_hash: Option<serde_json::Value>,
53 #[serde(rename = "activeTransactionName")]
54 pub active_transaction_name: Option<serde_json::Value>,
55 #[serde(rename = "borrowerNotifiedLoanIsDue")]
56 pub borrower_notified_loan_is_due: bool,
57 #[serde(rename = "adminFee")]
58 pub admin_fee: U256,
59 #[serde(rename = "amountPaidToLender")]
60 pub amount_paid_to_lender: U256,
61 #[serde(rename = "imageUrl")]
62 pub image_url: String,
63 pub status: Status,
64}
65
66#[derive(Debug, Serialize, Deserialize)]
67pub struct Offer {
68 #[serde(rename = "_id")]
69 pub id: String,
70 #[serde(rename = "isDeleted")]
71 pub is_deleted: bool,
72 pub lender: Address,
73 #[serde(rename = "nftCollateralContract")]
74 pub nft_collateral_contract: Address,
75 #[serde(rename = "nftCollateralId")]
76 pub nft_collateral_id: String,
77 #[serde(rename = "__v")]
78 pub v: i64,
79 #[serde(rename = "adminFeeInBasisPoints")]
80 pub admin_fee_in_basis_points: i64,
81 #[serde(rename = "assetCategory")]
82 pub asset_category: String,
83 #[serde(rename = "assetName")]
84 pub asset_name: String,
85 pub borrower: Address,
86 #[serde(rename = "contractName")]
87 pub contract_name: ContractName,
88 #[serde(rename = "interestIsProRated")]
89 pub interest_is_pro_rated: bool,
90 #[serde(rename = "lenderNonce")]
91 pub lender_nonce: String,
92 #[serde(rename = "loanDuration")]
93 pub loan_duration: i64,
94 #[serde(rename = "loanERC20Denomination")]
95 pub loan_erc20_denomination: Option<Address>,
96 #[serde(rename = "loanInterestRateForDurationInBasisPoints")]
97 pub loan_interest_rate_for_duration_in_basis_points: U256,
98 #[serde(rename = "loanPrincipalAmount")]
99 pub loan_principal_amount: f64,
100 #[serde(rename = "maximumRepaymentAmount")]
101 pub maximum_repayment_amount: f64,
102 #[serde(rename = "nftKey")]
103 pub nft_key: String,
104 #[serde(rename = "offerDate")]
105 pub offer_date: DateTime<Utc>,
106 #[serde(rename = "signedMessage")]
107 pub signed_message: String,
108}
109
110#[derive(Debug, Serialize, Deserialize)]
111pub struct Asset {
112 #[serde(rename = "nftCollateralId")]
113 pub nft_collateral_id: String,
114 #[serde(rename = "nftCollateralContract")]
115 pub nft_collateral_contract: Address,
116 pub name: String,
117 #[serde(rename = "projectName")]
118 pub project_name: String,
119 pub description: String,
120 #[serde(rename = "imageUrl")]
121 pub image_url: String,
122 pub traits: Vec<AssetTrait>,
125 #[serde(rename = "dataUri")]
126 pub data_uri: String,
127 #[serde(rename = "supportedInterface")]
128 pub supported_interface: String,
129 pub owner: Owner,
130 pub whitelisted: bool,
131 pub status: Status,
132 #[serde(rename = "desiredLoanPrincipalAmount")]
135 pub desired_loan_principal_amount: U256,
136 #[serde(
137 deserialize_with = "empty_string_as_none",
138 rename = "desiredLoanCurrency"
139 )]
140 pub desired_loan_currency: Option<Address>,
141}
142
143#[derive(Debug, Serialize, Deserialize)]
144pub struct Owner {
145 pub address: Address,
146}
147
148#[derive(Debug, Serialize, Deserialize)]
149pub struct AssetTrait {
150 pub trait_type: String,
151 pub value: String,
152}
153
154#[derive(Debug, Serialize, Deserialize)]
155pub struct Listing {
156 #[serde(rename = "_id")]
157 pub id: String,
158 #[serde(rename = "nftCollateralContract")]
159 pub nft_collateral_contract: Address,
160 #[serde(rename = "nftCollateralId")]
161 pub nft_collateral_id: String,
162 #[serde(rename = "__v")]
163 pub v: i64,
164 pub borrower: String,
165 #[serde(rename = "contractName")]
166 pub contract_name: ContractName,
167 #[serde(
168 deserialize_with = "empty_string_as_none",
169 rename = "desiredLoanCurrency"
170 )]
171 pub desired_loan_currency: Option<Address>,
172 #[serde(rename = "desiredLoanDuration")]
173 pub desired_loan_duration: Option<U256>,
174 #[serde(rename = "desiredLoanPrincipalAmount")]
175 pub desired_loan_principal_amount: Option<U256>,
176 #[serde(rename = "listedDate")]
177 pub listed_date: DateTime<Utc>,
178 #[serde(rename = "nftKey")]
179 pub nft_key: String,
180 pub nonce: String,
181 #[serde(rename = "signedMessage")]
182 pub signed_message: String,
183 pub status: Status,
184 pub whitelisted: bool,
185 pub name: Option<String>,
186 #[serde(rename = "projectName")]
187 pub project_name: String,
188 pub description: String,
189 #[serde(rename = "imageUrl")]
190 pub image_url: String,
191 #[serde(rename = "animationUrl")]
192 pub animation_url: Option<String>,
193 pub traits: Vec<Trait>,
194 #[serde(rename = "dataUri")]
195 pub data_uri: Option<String>,
196}
197
198#[derive(Debug, Serialize, Deserialize)]
199pub struct Trait {
200 pub trait_type: Option<String>,
201 pub value: Value,
202 #[serde(rename = "_id")]
203 pub id: Option<String>,
204 pub display_type: Option<String>,
205 pub max_value: Option<String>,
206 pub trait_count: Option<i64>,
207 }
209
210#[derive(Debug, Serialize, Deserialize)]
211pub struct Project {
212 #[serde(rename = "_id")]
213 pub id: String,
214 pub address: String,
215 #[serde(rename = "__v")]
216 pub v: Option<i64>,
217 pub description: String,
218 #[serde(rename = "disableAnimation")]
219 pub disable_animation: bool,
220 #[serde(rename = "imgSrc")]
221 pub img_src: String,
222 #[serde(rename = "isWhitelisted")]
223 pub is_whitelisted: bool,
224 pub metadata: Metadata,
225 pub name: String,
226}
227
228#[derive(Debug, Serialize, Deserialize)]
229pub struct Metadata {
230 #[serde(rename = "contractAddress")]
231 pub contract_address: Address,
232 pub name: String,
233 pub description: Option<String>,
234 #[serde(rename = "imgSrc")]
235 pub img_src: Option<String>,
236 pub collection: Collection,
237 pub address: Address,
238 pub asset_contract_type: AssetContractType,
239 pub created_date: NaiveDateTime,
240 pub nft_version: Option<NftVersion>,
241 pub opensea_version: Option<String>,
242 pub owner: Option<i64>,
243 pub schema_name: SchemaName,
244 pub symbol: String,
245 pub total_supply: Option<U256>,
246 pub external_link: Option<String>,
247 pub image_url: Option<String>,
248 pub default_to_fiat: bool,
249 pub dev_buyer_fee_basis_points: i64,
250 pub dev_seller_fee_basis_points: i64,
251 pub only_proxied_transfers: bool,
252 pub opensea_buyer_fee_basis_points: i64,
253 pub opensea_seller_fee_basis_points: i64,
254 pub buyer_fee_basis_points: i64,
255 pub seller_fee_basis_points: i64,
256 #[serde(deserialize_with = "empty_string_as_none")]
257 pub payout_address: Option<Address>,
258}
259
260#[derive(Debug, Serialize, Deserialize)]
261pub struct Collection {
262 pub banner_image_url: Option<String>,
263 pub chat_url: Option<String>,
264 pub created_date: NaiveDateTime,
265 pub default_to_fiat: bool,
266 pub description: Option<String>,
267 pub dev_buyer_fee_basis_points: U256,
268 pub dev_seller_fee_basis_points: U256,
269 pub discord_url: Option<String>,
270 pub display_data: DisplayData,
271 pub external_url: Option<String>,
272 pub featured: bool,
273 pub featured_image_url: Option<String>,
274 pub hidden: bool,
275 pub safelist_request_status: SafelistRequestStatus,
276 pub image_url: Option<String>,
277 pub is_subject_to_whitelist: bool,
278 pub large_image_url: Option<String>,
279 pub medium_username: Option<String>,
280 pub name: String,
281 pub only_proxied_transfers: bool,
282 pub opensea_buyer_fee_basis_points: U256,
283 pub opensea_seller_fee_basis_points: U256,
284 #[serde(deserialize_with = "empty_string_as_none")]
285 pub payout_address: Option<Address>,
286 pub require_email: bool,
287 pub short_description: Option<String>,
288 pub slug: String,
289 pub telegram_url: Option<String>,
290 pub twitter_username: Option<String>,
291 pub instagram_username: Option<String>,
292 pub wiki_url: Option<String>,
293 pub is_nsfw: Option<bool>,
294}
295
296#[derive(Debug, Serialize, Deserialize)]
297pub struct DisplayData {
298 pub card_display_style: CardDisplayStyle,
299 pub images: Option<Vec<String>>,
300}
301
302#[derive(Debug, Serialize, Deserialize)]
303#[serde(untagged)]
304pub enum Value {
305 Integer(i64),
306 String(String),
307}
308
309#[derive(Debug, Serialize, Deserialize)]
310pub enum ContractName {
311 #[serde(rename = "v1.loan.fixed")]
312 V1LoanFixed,
313}
314
315#[derive(Debug, Serialize, Deserialize)]
316pub enum Status {
317 #[serde(rename = "listed")]
318 Listed,
319 #[serde(rename = "repaid")]
320 Repaid,
321}
322
323#[derive(Debug, Serialize, Deserialize)]
324pub enum AssetContractType {
325 #[serde(rename = "non-fungible")]
326 NonFungible,
327 #[serde(rename = "semi-fungible")]
328 SemiFungible,
329}
330
331#[derive(Debug, Serialize, Deserialize)]
332pub enum CardDisplayStyle {
333 #[serde(rename = "contain")]
334 Contain,
335 #[serde(rename = "cover")]
336 Cover,
337 #[serde(rename = "padded")]
338 Padded,
339}
340
341#[derive(Debug, Serialize, Deserialize)]
342pub enum SafelistRequestStatus {
343 #[serde(rename = "approved")]
344 Approved,
345 #[serde(rename = "not_requested")]
346 NotRequested,
347 #[serde(rename = "verified")]
348 Verified,
349}
350
351#[derive(Debug, Serialize, Deserialize)]
352pub enum NftVersion {
353 #[serde(rename = "1.0")]
354 The10,
355 #[serde(rename = "3.0")]
356 The30,
357 #[serde(rename = "unsupported")]
358 Unsupported,
359}
360
361#[derive(Debug, Serialize, Deserialize)]
362pub enum SchemaName {
363 #[serde(rename = "ERC1155")]
364 Erc1155,
365 #[serde(rename = "ERC721")]
366 Erc721,
367}