use crate::{varint_size, DrainWeights, FeeRate};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd)]
pub struct Target {
pub fee: TargetFee,
pub outputs: TargetOutputs,
}
impl Target {
pub fn value(&self) -> u64 {
self.outputs.value_sum
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd)]
pub struct TargetOutputs {
pub value_sum: u64,
pub weight_sum: u64,
pub n_outputs: usize,
}
impl TargetOutputs {
pub fn output_weight(&self) -> u64 {
self.weight_sum + varint_size(self.n_outputs) * 4
}
pub fn output_weight_with_drain(&self, drain_weight: DrainWeights) -> u64 {
let n_outputs = drain_weight.n_outputs + self.n_outputs;
varint_size(n_outputs) * 4 + drain_weight.output_weight + self.weight_sum
}
pub fn fund_outputs(outputs: impl IntoIterator<Item = (u64, u64)>) -> Self {
let mut n_outputs = 0;
let mut weight_sum = 0;
let mut value_sum = 0;
for (weight, value) in outputs {
n_outputs += 1;
weight_sum += weight;
value_sum += value;
}
Self {
n_outputs,
weight_sum,
value_sum,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd)]
pub struct TargetFee {
pub rate: FeeRate,
pub replace: Option<Replace>,
}
impl Default for TargetFee {
fn default() -> Self {
Self {
rate: FeeRate::DEFAULT_MIN_RELAY,
replace: None,
}
}
}
impl TargetFee {
pub const ZERO: Self = TargetFee {
rate: FeeRate::ZERO,
replace: None,
};
pub fn from_feerate(feerate: FeeRate) -> Self {
Self {
rate: feerate,
replace: None,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd)]
pub struct Replace {
pub fee: u64,
pub incremental_relay_feerate: FeeRate,
}
impl Replace {
pub fn new(tx_fee: u64) -> Self {
Self {
fee: tx_fee,
incremental_relay_feerate: FeeRate::DEFUALT_RBF_INCREMENTAL_RELAY,
}
}
pub fn min_fee_to_do_replacement(&self, replacing_tx_weight: u64) -> u64 {
self.fee
+ self
.incremental_relay_feerate
.implied_fee(replacing_tx_weight)
}
pub fn min_fee_to_do_replacement_wu(&self, replacing_tx_weight: u64) -> u64 {
self.fee
+ self
.incremental_relay_feerate
.implied_fee_wu(replacing_tx_weight)
}
}