Skip to content

Commit e533b79

Browse files
committed
Refactor fee-related structs and serialization
- Replace `u32` fields with `FeeRate` in `FeeRecommendations` - Adjust serialization for `FeeRate` using new `fee_rate_u64_serde` and `fee_rate_f64_serde` modules - Update tests and add a new test for `FeeRecommendations` deserialization Signed-off-by: Yuki Kishimoto <yukikishimoto@protonmail.com>
1 parent f2be766 commit e533b79

2 files changed

Lines changed: 65 additions & 22 deletions

File tree

src/deser.rs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,28 @@ pub(crate) mod weight_serde {
1818
}
1919
}
2020

21-
pub(crate) mod fee_rate_serde {
21+
pub(crate) mod fee_rate_u64_serde {
22+
use bitcoin::FeeRate;
23+
use serde::{Deserialize, Deserializer, Serializer};
24+
25+
pub fn serialize<S>(fee_rate: &FeeRate, serializer: S) -> Result<S::Ok, S::Error>
26+
where
27+
S: Serializer,
28+
{
29+
let sat_per_vb: u64 = fee_rate.to_sat_per_vb_ceil();
30+
serializer.serialize_u64(sat_per_vb)
31+
}
32+
33+
pub fn deserialize<'de, D>(deserializer: D) -> Result<FeeRate, D::Error>
34+
where
35+
D: Deserializer<'de>,
36+
{
37+
let sat_per_vb = u64::deserialize(deserializer)?;
38+
Ok(FeeRate::from_sat_per_vb_unchecked(sat_per_vb))
39+
}
40+
}
41+
42+
pub(crate) mod fee_rate_f64_serde {
2243
use bitcoin::FeeRate;
2344
use serde::{Deserialize, Deserializer, Serializer};
2445

@@ -27,18 +48,16 @@ pub(crate) mod fee_rate_serde {
2748
S: Serializer,
2849
{
2950
// Convert from sat/kwu to sat/vB
30-
let sat_per_vb: f64 = fee_rate.to_sat_per_kwu() as f64 / 1000.0;
51+
let sat_per_vb: f64 = fee_rate.to_sat_per_vb_ceil() as f64;
3152
serializer.serialize_f64(sat_per_vb)
3253
}
3354

3455
pub fn deserialize<'de, D>(deserializer: D) -> Result<FeeRate, D::Error>
3556
where
3657
D: Deserializer<'de>,
3758
{
38-
let sat_per_vb = f64::deserialize(deserializer)?;
39-
// Convert from sat/vB to sat/kwu (multiply by 1000)
40-
let sat_per_kwu: u64 = (sat_per_vb * 1000.0) as u64;
41-
Ok(FeeRate::from_sat_per_kwu(sat_per_kwu))
59+
let sat_per_vb: f64 = f64::deserialize(deserializer)?;
60+
Ok(FeeRate::from_sat_per_vb_unchecked(sat_per_vb as u64))
4261
}
4362
}
4463

src/response.rs

Lines changed: 40 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -171,33 +171,38 @@ pub struct HashrateStats {
171171
pub current_difficulty: f64,
172172
}
173173

174-
/// Bitcoin fee recommendations in sat/vB
174+
/// Bitcoin fee recommendations
175175
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
176176
pub struct FeeRecommendations {
177-
/// Fastest confirmation fee (sat/vB)
177+
/// Fastest confirmation fee
178178
#[serde(rename = "fastestFee")]
179-
pub fastest_fee: u32,
180-
/// Fee for confirmation within 30 minutes (sat/vB)
179+
#[serde(with = "deser::fee_rate_u64_serde")]
180+
pub fastest_fee: FeeRate,
181+
/// Fee for confirmation within 30 minutes
181182
#[serde(rename = "halfHourFee")]
182-
pub half_hour_fee: u32,
183-
/// Fee for confirmation within 1 hour (sat/vB)
183+
#[serde(with = "deser::fee_rate_u64_serde")]
184+
pub half_hour_fee: FeeRate,
185+
/// Fee for confirmation within 1 hour
184186
#[serde(rename = "hourFee")]
185-
pub hour_fee: u32,
186-
/// Economy fee for slower confirmation (sat/vB)
187+
#[serde(with = "deser::fee_rate_u64_serde")]
188+
pub hour_fee: FeeRate,
189+
/// Economy fee for slower confirmation
187190
#[serde(rename = "economyFee")]
188-
pub economy_fee: u32,
189-
/// Minimum fee (sat/vB)
191+
#[serde(with = "deser::fee_rate_u64_serde")]
192+
pub economy_fee: FeeRate,
193+
/// Minimum fee
190194
#[serde(rename = "minimumFee")]
191-
pub minimum_fee: u32,
195+
#[serde(with = "deser::fee_rate_u64_serde")]
196+
pub minimum_fee: FeeRate,
192197
}
193198

194199
/// Fee histogram entry representing transactions at a specific fee rate
195200
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)]
196201
pub struct FeeHistogramEntry {
197-
/// Fee rate in sat/vB (converted from API)
198-
#[serde(with = "deser::fee_rate_serde")]
202+
/// Fee rate (converted from API)
203+
#[serde(with = "deser::fee_rate_f64_serde")]
199204
pub fee_rate: FeeRate,
200-
/// Virtual size of transactions at this fee rate (vB)
205+
/// Virtual size of transactions at this fee rate
201206
#[serde(with = "deser::weight_serde")]
202207
pub vsize: Weight,
203208
}
@@ -241,7 +246,7 @@ pub struct MempoolBlockFees {
241246
pub total_fees: Amount,
242247
/// Median fee rate
243248
#[serde(rename = "medianFee")]
244-
#[serde(with = "deser::fee_rate_serde")]
249+
#[serde(with = "deser::fee_rate_f64_serde")]
245250
pub median_fee: FeeRate,
246251
/// Fee rate range
247252
#[serde(rename = "feeRange")]
@@ -290,6 +295,25 @@ mod tests {
290295
);
291296
}
292297

298+
#[test]
299+
fn test_fee_recommendations_deserialization() {
300+
let json_data =
301+
r#"{"fastestFee":10,"halfHourFee":8,"hourFee":5,"economyFee":2,"minimumFee":1}"#;
302+
303+
let fees: FeeRecommendations = serde_json::from_str(json_data).unwrap();
304+
305+
assert_eq!(
306+
fees,
307+
FeeRecommendations {
308+
fastest_fee: FeeRate::from_sat_per_vb_unchecked(10),
309+
half_hour_fee: FeeRate::from_sat_per_vb_unchecked(8),
310+
hour_fee: FeeRate::from_sat_per_vb_unchecked(5),
311+
economy_fee: FeeRate::from_sat_per_vb_unchecked(2),
312+
minimum_fee: FeeRate::from_sat_per_vb_unchecked(1),
313+
}
314+
);
315+
}
316+
293317
#[test]
294318
fn test_mempool_stats_deser() {
295319
let json_data = r#"{"count":4364,"vsize":4407712,"total_fee":7277557,"fee_histogram":[[8.687,50041],[5.135,50041],[4.07,50231]]}"#;
@@ -344,7 +368,7 @@ mod tests {
344368
assert_eq!(block_fee.block_v_size, 746096.5);
345369
assert_eq!(block_fee.n_tx, 863);
346370
assert_eq!(block_fee.total_fees.to_sat(), 8875608);
347-
assert_eq!(block_fee.median_fee.to_sat_per_kwu(), 10796);
371+
assert_eq!(block_fee.median_fee.to_sat_per_vb_ceil(), 10);
348372
assert_eq!(block_fee.fee_range.len(), 3);
349373
assert_eq!(block_fee.fee_range[0].to_sat_per_kwu(), 1000);
350374
assert_eq!(block_fee.fee_range[1].to_sat_per_kwu(), 2424);

0 commit comments

Comments
 (0)