use crate::cli::{Asset, Network, OutputFormat}; use serde::{Deserialize, Serialize}; use serde_json::Value; pub const DEVNET_RPC_URL: &str = "https://api.devnet.solana.com"; pub const MAINNET_RPC_URL: &str = "https://api.mainnet-beta.solana.com"; pub const DEVNET_USDC_MINT: &str = "4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU"; pub const COINBASE_API_URL: &str = "https://api.coinbase.com"; #[derive(Debug, Clone, Serialize, Deserialize)] #[serde(default)] pub struct Config { pub network: Network, pub format: OutputFormat, pub quiet: bool, pub rpc_url: Option, pub stripe_base_url: Option, pub coinbase_base_url: Option, pub solana_private_key_base58: Option, pub fee_program_id: Option, pub onchain_fee_collection_enabled: bool, pub fee_fixed_cents: u64, pub fee_variable_bps: u16, pub sol_price_usd: String, pub cardholder_name: String, pub cardholder_email: String, } impl Default for Config { fn default() -> Self { Self { network: Network::Devnet, format: OutputFormat::Json, quiet: false, rpc_url: None, stripe_base_url: None, coinbase_base_url: None, solana_private_key_base58: None, fee_program_id: None, onchain_fee_collection_enabled: false, fee_fixed_cents: 10, fee_variable_bps: 20, sol_price_usd: "100.00".to_string(), cardholder_name: "CardCLI Demo User".to_string(), cardholder_email: "demo@cardcli.dev".to_string(), } } } impl Config { pub fn rpc_url(&self) -> &str { self.rpc_url.as_deref().unwrap_or(match self.network { Network::Devnet => DEVNET_RPC_URL, Network::Mainnet => MAINNET_RPC_URL, }) } pub fn stripe_base_url(&self) -> &str { self.stripe_base_url .as_deref() .unwrap_or("https://api.stripe.com") } pub fn coinbase_base_url(&self) -> &str { self.coinbase_base_url .as_deref() .unwrap_or(COINBASE_API_URL) } } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Credentials { pub api_key: String, pub created_at: String, } #[derive(Debug, Clone, Serialize, Deserialize, Default)] #[serde(default)] pub struct State { pub stripe_cardholder_id: Option, pub deposits: Vec, pub cards: Vec, pub fee_payments: Vec, pub audit_log: Vec, pub idempotency_keys: Vec, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Deposit { pub id: String, pub asset: Asset, pub network: Network, pub address: String, pub token_mint: Option, pub token_address: Option, pub secret_key_base58: String, pub created_at: String, pub status: DepositState, pub amount_native: String, pub amount_usd: String, #[serde(default)] pub fee_paid_lamports: u64, pub confirmed_at: Option, pub last_signature: Option, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "lowercase")] pub enum DepositState { Pending, Confirmed, Expired, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CardRecord { pub id: String, pub stripe_card_id: String, pub stripe_cardholder_id: String, pub amount_usd: String, pub currency: String, pub status: CardState, pub last4: Option, pub brand: Option, pub exp_month: Option, pub exp_year: Option, #[serde(default)] pub fee_fixed_usd: String, #[serde(default)] pub fee_variable_usd: String, #[serde(default)] pub fee_total_usd: String, #[serde(default)] pub total_debited_usd: String, #[serde(default)] pub fee_lamports: u64, #[serde(default)] pub fee_transaction_signature: Option, #[serde(default)] pub fee_reference: Option, pub number: Option, pub cvc: Option, pub reveal_unavailable_reason: Option, pub created_at: String, pub frozen_at: Option, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct FeePayment { pub id: String, pub source_deposit_id: String, pub program_id: String, pub treasury_vault: String, pub fee_signature: String, pub fee_usd: String, pub fee_lamports: u64, pub card_amount_usd: String, pub sol_price_usd: String, pub created_at: String, } #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "lowercase")] pub enum CardState { Pending, Active, Frozen, Canceled, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct AuditEntry { pub timestamp: String, pub action: String, pub resource_type: String, pub resource_id: String, pub details: Value, } #[derive(Debug, Clone, Serialize, Deserialize)] pub struct IdempotencyRecord { pub key: String, pub operation: String, pub resource_id: String, pub created_at: String, }