use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Invoice {
pub id: String,
#[serde(default)]
pub merchant_id: String,
pub amount: f64,
pub currency: String,
pub network: String,
pub status: String,
#[serde(default)]
pub wallet_address: String,
#[serde(default)]
pub description: String,
#[serde(default)]
pub customer_email: String,
#[serde(default)]
pub callback_url: String,
#[serde(default)]
pub metadata: Option<HashMap<String, serde_json::Value>>,
#[serde(default)]
pub payment_url: String,
#[serde(default)]
pub tx_hash: String,
#[serde(default)]
pub paid_amount: f64,
#[serde(default)]
pub expires_at: String,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub updated_at: String,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct CreateInvoiceParams {
pub amount: f64,
pub currency: String,
pub network: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub customer_email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expiry_minutes: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Payout {
pub id: String,
pub amount: f64,
pub currency: String,
pub network: String,
pub destination_address: String,
pub status: String,
#[serde(default)]
pub tx_hash: String,
#[serde(default)]
pub fee: f64,
#[serde(default)]
pub metadata: Option<HashMap<String, serde_json::Value>>,
#[serde(default)]
pub created_at: String,
#[serde(default)]
pub completed_at: String,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct CreatePayoutParams {
pub amount: f64,
pub currency: String,
pub network: String,
pub destination_address: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<HashMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub callback_url: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Wallet {
pub id: String,
pub address: String,
pub network: String,
pub currency: String,
#[serde(default)]
pub balance: f64,
#[serde(default)]
pub label: String,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct GenerateWalletParams {
pub network: String,
pub currency: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub label: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SwapQuote {
pub from_currency: String,
pub to_currency: String,
pub from_amount: f64,
pub to_amount: f64,
pub rate: f64,
#[serde(default)]
pub expires_at: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Swap {
pub id: String,
pub from_currency: String,
pub to_currency: String,
pub from_amount: f64,
pub to_amount: f64,
pub rate: f64,
pub status: String,
#[serde(default)]
pub tx_hash: String,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct SwapParams {
pub from_currency: String,
pub to_currency: String,
pub amount: f64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WebhookEvent {
pub id: String,
#[serde(rename = "type")]
pub event_type: String,
pub data: HashMap<String, serde_json::Value>,
#[serde(default)]
pub created_at: String,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct ListParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub page: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub currency: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub network: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct PaginatedList<T> {
pub items: Vec<T>,
pub total: i64,
pub page: i64,
pub per_page: i64,
pub has_more: bool,
}