Skip to content

Commit 429b65c

Browse files
committed
refactor(bdk)!: drop FeeRate from bdk::types
instead adopting `bitcoin::FeeRate` throughout
1 parent d6a0cf0 commit 429b65c

File tree

9 files changed

+153
-293
lines changed

9 files changed

+153
-293
lines changed

crates/bdk/src/error.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ pub enum Error {
4949
IrreplaceableTransaction,
5050
/// When bumping a tx the fee rate requested is lower than required
5151
FeeRateTooLow {
52-
/// Required fee rate (satoshi/vbyte)
53-
required: crate::types::FeeRate,
52+
/// Required fee rate
53+
required: bitcoin::FeeRate,
5454
},
5555
/// When bumping a tx the absolute fee requested is lower than replaced tx absolute fee
5656
FeeTooLow {
@@ -137,8 +137,8 @@ impl fmt::Display for Error {
137137
Self::IrreplaceableTransaction => write!(f, "Transaction can't be replaced"),
138138
Self::FeeRateTooLow { required } => write!(
139139
f,
140-
"Fee rate too low: required {} sat/vbyte",
141-
required.as_sat_per_vb()
140+
"Fee rate too low: required {} sat/kwu",
141+
required.to_sat_per_kwu()
142142
),
143143
Self::FeeTooLow { required } => write!(f, "Fee to low: required {} sat", required),
144144
Self::FeeRateUnavailable => write!(f, "Fee rate unavailable"),

crates/bdk/src/psbt/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@
1111

1212
//! Additional functions on the `rust-bitcoin` `PartiallySignedTransaction` structure.
1313
14-
use crate::FeeRate;
1514
use alloc::vec::Vec;
1615
use bitcoin::psbt::PartiallySignedTransaction as Psbt;
16+
use bitcoin::Amount;
17+
use bitcoin::FeeRate;
1718
use bitcoin::TxOut;
1819

1920
// TODO upstream the functions here to `rust-bitcoin`?
@@ -73,7 +74,7 @@ impl PsbtUtils for Psbt {
7374
let fee_amount = self.fee_amount();
7475
fee_amount.map(|fee| {
7576
let weight = self.clone().extract_tx().weight();
76-
FeeRate::from_wu(fee, weight)
77+
Amount::from_sat(fee) / weight
7778
})
7879
}
7980
}

crates/bdk/src/types.rs

Lines changed: 3 additions & 164 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,10 @@
1111

1212
use alloc::boxed::Box;
1313
use core::convert::AsRef;
14-
use core::ops::Sub;
1514

1615
use bdk_chain::ConfirmationTime;
1716
use bitcoin::blockdata::transaction::{OutPoint, TxOut};
18-
use bitcoin::{psbt, Weight};
17+
use bitcoin::psbt;
1918

2019
use serde::{Deserialize, Serialize};
2120

@@ -47,103 +46,6 @@ impl AsRef<[u8]> for KeychainKind {
4746
}
4847
}
4948

50-
/// Fee rate
51-
#[derive(Debug, Copy, Clone, PartialEq, PartialOrd)]
52-
// Internally stored as satoshi/vbyte
53-
pub struct FeeRate(f32);
54-
55-
impl FeeRate {
56-
/// Create a new instance checking the value provided
57-
///
58-
/// ## Panics
59-
///
60-
/// Panics if the value is not [normal](https://doc.rust-lang.org/std/primitive.f32.html#method.is_normal) (except if it's a positive zero) or negative.
61-
fn new_checked(value: f32) -> Self {
62-
assert!(value.is_normal() || value == 0.0);
63-
assert!(value.is_sign_positive());
64-
65-
FeeRate(value)
66-
}
67-
68-
/// Create a new instance of [`FeeRate`] given a float fee rate in sats/kwu
69-
pub fn from_sat_per_kwu(sat_per_kwu: f32) -> Self {
70-
FeeRate::new_checked(sat_per_kwu / 250.0_f32)
71-
}
72-
73-
/// Create a new instance of [`FeeRate`] given a float fee rate in sats/kvb
74-
pub fn from_sat_per_kvb(sat_per_kvb: f32) -> Self {
75-
FeeRate::new_checked(sat_per_kvb / 1000.0_f32)
76-
}
77-
78-
/// Create a new instance of [`FeeRate`] given a float fee rate in btc/kvbytes
79-
///
80-
/// ## Panics
81-
///
82-
/// Panics if the value is not [normal](https://doc.rust-lang.org/std/primitive.f32.html#method.is_normal) (except if it's a positive zero) or negative.
83-
pub fn from_btc_per_kvb(btc_per_kvb: f32) -> Self {
84-
FeeRate::new_checked(btc_per_kvb * 1e5)
85-
}
86-
87-
/// Create a new instance of [`FeeRate`] given a float fee rate in satoshi/vbyte
88-
///
89-
/// ## Panics
90-
///
91-
/// Panics if the value is not [normal](https://doc.rust-lang.org/std/primitive.f32.html#method.is_normal) (except if it's a positive zero) or negative.
92-
pub fn from_sat_per_vb(sat_per_vb: f32) -> Self {
93-
FeeRate::new_checked(sat_per_vb)
94-
}
95-
96-
/// Create a new [`FeeRate`] with the default min relay fee value
97-
pub const fn default_min_relay_fee() -> Self {
98-
FeeRate(1.0)
99-
}
100-
101-
/// Calculate fee rate from `fee` and weight units (`wu`).
102-
pub fn from_wu(fee: u64, wu: Weight) -> FeeRate {
103-
Self::from_vb(fee, wu.to_vbytes_ceil() as usize)
104-
}
105-
106-
/// Calculate fee rate from `fee` and `vbytes`.
107-
pub fn from_vb(fee: u64, vbytes: usize) -> FeeRate {
108-
let rate = fee as f32 / vbytes as f32;
109-
Self::from_sat_per_vb(rate)
110-
}
111-
112-
/// Return the value as satoshi/vbyte
113-
pub fn as_sat_per_vb(&self) -> f32 {
114-
self.0
115-
}
116-
117-
/// Return the value as satoshi/kwu
118-
pub fn sat_per_kwu(&self) -> f32 {
119-
self.0 * 250.0_f32
120-
}
121-
122-
/// Calculate absolute fee in Satoshis using size in weight units.
123-
pub fn fee_wu(&self, wu: Weight) -> u64 {
124-
self.fee_vb(wu.to_vbytes_ceil() as usize)
125-
}
126-
127-
/// Calculate absolute fee in Satoshis using size in virtual bytes.
128-
pub fn fee_vb(&self, vbytes: usize) -> u64 {
129-
(self.as_sat_per_vb() * vbytes as f32).ceil() as u64
130-
}
131-
}
132-
133-
impl Default for FeeRate {
134-
fn default() -> Self {
135-
FeeRate::default_min_relay_fee()
136-
}
137-
}
138-
139-
impl Sub for FeeRate {
140-
type Output = Self;
141-
142-
fn sub(self, other: FeeRate) -> Self::Output {
143-
FeeRate(self.0 - other.0)
144-
}
145-
}
146-
14749
/// Trait implemented by types that can be used to measure weight units.
14850
pub trait Vbytes {
14951
/// Convert weight units to virtual bytes.
@@ -236,70 +138,7 @@ impl Utxo {
236138

237139
#[cfg(test)]
238140
mod tests {
239-
use super::*;
240-
241-
#[test]
242-
fn can_store_feerate_in_const() {
243-
const _MIN_RELAY: FeeRate = FeeRate::default_min_relay_fee();
244-
}
245-
246-
#[test]
247-
#[should_panic]
248-
fn test_invalid_feerate_neg_zero() {
249-
let _ = FeeRate::from_sat_per_vb(-0.0);
250-
}
251-
252-
#[test]
253-
#[should_panic]
254-
fn test_invalid_feerate_neg_value() {
255-
let _ = FeeRate::from_sat_per_vb(-5.0);
256-
}
141+
//use super::*;
257142

258-
#[test]
259-
#[should_panic]
260-
fn test_invalid_feerate_nan() {
261-
let _ = FeeRate::from_sat_per_vb(f32::NAN);
262-
}
263-
264-
#[test]
265-
#[should_panic]
266-
fn test_invalid_feerate_inf() {
267-
let _ = FeeRate::from_sat_per_vb(f32::INFINITY);
268-
}
269-
270-
#[test]
271-
fn test_valid_feerate_pos_zero() {
272-
let _ = FeeRate::from_sat_per_vb(0.0);
273-
}
274-
275-
#[test]
276-
fn test_fee_from_btc_per_kvb() {
277-
let fee = FeeRate::from_btc_per_kvb(1e-5);
278-
assert!((fee.as_sat_per_vb() - 1.0).abs() < f32::EPSILON);
279-
}
280-
281-
#[test]
282-
fn test_fee_from_sat_per_vbyte() {
283-
let fee = FeeRate::from_sat_per_vb(1.0);
284-
assert!((fee.as_sat_per_vb() - 1.0).abs() < f32::EPSILON);
285-
}
286-
287-
#[test]
288-
fn test_fee_default_min_relay_fee() {
289-
let fee = FeeRate::default_min_relay_fee();
290-
assert!((fee.as_sat_per_vb() - 1.0).abs() < f32::EPSILON);
291-
}
292-
293-
#[test]
294-
fn test_fee_from_sat_per_kvb() {
295-
let fee = FeeRate::from_sat_per_kvb(1000.0);
296-
assert!((fee.as_sat_per_vb() - 1.0).abs() < f32::EPSILON);
297-
}
298-
299-
#[test]
300-
fn test_fee_from_sat_per_kwu() {
301-
let fee = FeeRate::from_sat_per_kwu(250.0);
302-
assert!((fee.as_sat_per_vb() - 1.0).abs() < f32::EPSILON);
303-
assert_eq!(fee.sat_per_kwu(), 250.0);
304-
}
143+
// TODO: decide what goes here
305144
}

0 commit comments

Comments
 (0)