use crate::bitcoin::wallet::AddressType;
use std::collections::HashMap;
#[derive(Debug, Clone)]
pub struct TxOptions {
pub coin_selection: CoinSelectionStrategy,
pub rbf: bool,
pub lock_time: Option<u32>,
pub change_address_type: AddressType,
pub change_address_index: Option<u32>,
pub confirmed_only: bool,
pub custom_inputs: Option<Vec<Utxo>>,
pub extra_outputs: Vec<(String, u64)>,
pub op_return_data: Option<Vec<u8>>,
pub subtract_fee_from_amount: bool,
pub signature_type: SignatureType,
pub metadata: HashMap<String, String>,
}
impl Default for TxOptions {
fn default() -> Self {
Self {
coin_selection: CoinSelectionStrategy::default(),
rbf: true,
lock_time: None,
change_address_type: AddressType::SegWit,
change_address_index: None,
confirmed_only: true,
custom_inputs: None,
extra_outputs: vec![],
op_return_data: None,
subtract_fee_from_amount: false,
signature_type: SignatureType::default(),
metadata: HashMap::new(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum CoinSelectionStrategy {
BranchAndBound,
FIFO,
LargestFirst,
SmallestFirst,
Random,
SelectAll,
}
impl Default for CoinSelectionStrategy {
fn default() -> Self {
Self::BranchAndBound
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SignatureType {
ECDSA,
Schnorr,
}
impl Default for SignatureType {
fn default() -> Self {
Self::ECDSA
}
}
#[derive(Debug, Clone)]
pub struct Utxo {
pub txid: String,
pub vout: u32,
pub amount: u64,
pub address: String,
pub script_pubkey: Vec<u8>,
pub derivation_path: Option<String>,
pub confirmed: bool,
pub confirmation_height: Option<u32>,
}
pub struct TransactionAnalyzer;
impl TransactionAnalyzer {
pub fn calculate_fee(tx_size: usize, fee_rate: f64) -> u64 {
(tx_size as f64 * fee_rate).ceil() as u64
}
pub fn estimate_tx_size(input_count: usize, output_count: usize) -> usize {
let header_size = 10; let input_size = 148; let output_size = 34;
header_size + (input_count * input_size) + (output_count * output_size)
}
pub fn estimate_tx_vsize(input_count: usize, output_count: usize) -> usize {
let header_vsize = 10.0; let input_vsize = 68.0; let output_vsize = 31.0;
(header_vsize + (input_count as f64 * input_vsize) + (output_count as f64 * output_vsize))
.ceil() as usize
}
pub fn calculate_fee_rate(tx_size: usize, fee: u64) -> f64 {
fee as f64 / tx_size as f64
}
}