use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FeeEstimates {
pub fastest_fee: u64,
pub half_hour_fee: u64,
pub hour_fee: u64,
pub economy_fee: u64,
pub minimum_fee: u64,
}
impl FeeEstimates {
pub fn for_blocks(&self, blocks: u32) -> u64 {
match blocks {
0..=1 => self.fastest_fee,
2..=3 => self.half_hour_fee,
4..=6 => self.hour_fee,
_ => self.economy_fee,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct AddressInfo {
pub address: String,
pub chain_stats: ChainStats,
pub mempool_stats: MempoolStats,
}
impl AddressInfo {
pub fn confirmed_balance(&self) -> i64 {
self.chain_stats.funded_txo_sum as i64 - self.chain_stats.spent_txo_sum as i64
}
pub fn unconfirmed_balance(&self) -> i64 {
self.mempool_stats.funded_txo_sum as i64 - self.mempool_stats.spent_txo_sum as i64
}
pub fn total_balance(&self) -> i64 {
self.confirmed_balance() + self.unconfirmed_balance()
}
pub fn tx_count(&self) -> u64 {
self.chain_stats.tx_count + self.mempool_stats.tx_count
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ChainStats {
pub funded_txo_count: u64,
pub funded_txo_sum: u64,
pub spent_txo_count: u64,
pub spent_txo_sum: u64,
pub tx_count: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct MempoolStats {
pub funded_txo_count: u64,
pub funded_txo_sum: u64,
pub spent_txo_count: u64,
pub spent_txo_sum: u64,
pub tx_count: u64,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Utxo {
pub txid: String,
pub vout: u32,
pub value: u64,
pub status: UtxoStatus,
}
impl Utxo {
pub fn is_confirmed(&self) -> bool {
self.status.confirmed
}
pub fn outpoint(&self) -> String {
format!("{}:{}", self.txid, self.vout)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct UtxoStatus {
pub confirmed: bool,
pub block_height: Option<u64>,
pub block_hash: Option<String>,
pub block_time: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct Transaction {
pub txid: String,
pub version: i32,
pub locktime: u32,
pub size: u32,
pub weight: u32,
pub fee: u64,
pub status: TxStatus,
}
impl Transaction {
pub fn is_confirmed(&self) -> bool {
self.status.confirmed
}
pub fn vsize(&self) -> u32 {
self.weight.div_ceil(4)
}
pub fn fee_rate(&self) -> f64 {
self.fee as f64 / self.vsize() as f64
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TxStatus {
pub confirmed: bool,
pub block_height: Option<u64>,
pub block_hash: Option<String>,
pub block_time: Option<u64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct BlockInfo {
pub id: String,
pub height: u64,
pub version: i32,
pub timestamp: u64,
pub tx_count: u32,
pub size: u32,
pub weight: u32,
pub merkle_root: String,
pub previousblockhash: String,
pub nonce: u32,
pub bits: u32,
}