Skip to content

Commit 004957d

Browse files
committed
refactor(bdk)!: drop FeeRate from bdk::types
Adopt `bitcoin::FeeRate` throughout
1 parent fc637a7 commit 004957d

File tree

10 files changed

+151
-298
lines changed

10 files changed

+151
-298
lines changed

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`?
@@ -65,7 +66,7 @@ impl PsbtUtils for Psbt {
6566
let fee_amount = self.fee_amount();
6667
fee_amount.map(|fee| {
6768
let weight = self.clone().extract_tx().weight();
68-
FeeRate::from_wu(fee, weight)
69+
Amount::from_sat(fee) / weight
6970
})
7071
}
7172
}

crates/bdk/src/types.rs

Lines changed: 1 addition & 169 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, Sequence, 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.
@@ -244,73 +146,3 @@ impl Utxo {
244146
}
245147
}
246148
}
247-
248-
#[cfg(test)]
249-
mod tests {
250-
use super::*;
251-
252-
#[test]
253-
fn can_store_feerate_in_const() {
254-
const _MIN_RELAY: FeeRate = FeeRate::default_min_relay_fee();
255-
}
256-
257-
#[test]
258-
#[should_panic]
259-
fn test_invalid_feerate_neg_zero() {
260-
let _ = FeeRate::from_sat_per_vb(-0.0);
261-
}
262-
263-
#[test]
264-
#[should_panic]
265-
fn test_invalid_feerate_neg_value() {
266-
let _ = FeeRate::from_sat_per_vb(-5.0);
267-
}
268-
269-
#[test]
270-
#[should_panic]
271-
fn test_invalid_feerate_nan() {
272-
let _ = FeeRate::from_sat_per_vb(f32::NAN);
273-
}
274-
275-
#[test]
276-
#[should_panic]
277-
fn test_invalid_feerate_inf() {
278-
let _ = FeeRate::from_sat_per_vb(f32::INFINITY);
279-
}
280-
281-
#[test]
282-
fn test_valid_feerate_pos_zero() {
283-
let _ = FeeRate::from_sat_per_vb(0.0);
284-
}
285-
286-
#[test]
287-
fn test_fee_from_btc_per_kvb() {
288-
let fee = FeeRate::from_btc_per_kvb(1e-5);
289-
assert!((fee.as_sat_per_vb() - 1.0).abs() < f32::EPSILON);
290-
}
291-
292-
#[test]
293-
fn test_fee_from_sat_per_vbyte() {
294-
let fee = FeeRate::from_sat_per_vb(1.0);
295-
assert!((fee.as_sat_per_vb() - 1.0).abs() < f32::EPSILON);
296-
}
297-
298-
#[test]
299-
fn test_fee_default_min_relay_fee() {
300-
let fee = FeeRate::default_min_relay_fee();
301-
assert!((fee.as_sat_per_vb() - 1.0).abs() < f32::EPSILON);
302-
}
303-
304-
#[test]
305-
fn test_fee_from_sat_per_kvb() {
306-
let fee = FeeRate::from_sat_per_kvb(1000.0);
307-
assert!((fee.as_sat_per_vb() - 1.0).abs() < f32::EPSILON);
308-
}
309-
310-
#[test]
311-
fn test_fee_from_sat_per_kwu() {
312-
let fee = FeeRate::from_sat_per_kwu(250.0);
313-
assert!((fee.as_sat_per_vb() - 1.0).abs() < f32::EPSILON);
314-
assert_eq!(fee.sat_per_kwu(), 250.0);
315-
}
316-
}

0 commit comments

Comments
 (0)