nftfi/
models.rs

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    // #[serde(rename = "animationUrl")]
123    // pub animation_url: Option<serde_json::Value>,
124    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 = "desiredLoanDuration")]
133    // pub desired_loan_duration: Option<serde_json::Value>,
134    #[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    // pub order: Option<serde_json::Value>,
208}
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}