Merge rust-bitcoin/rust-bitcoin#4542: Fix FeeRate::checked_add/sub

395252c6d9 Fix FeeRate::checked_add/sub (Tobin C. Harding)

Pull request description:

  Currently the `checked_add` and `checked_sub` functions use a `u64` for the right hand side. This leaks the inner unit because the RHS value is implicitly in the same unit.

  Make the functions have `FeeRate` on the RHS.

ACKs for top commit:
  apoelstra:
    ACK 395252c6d95fdd581ce5e8ad5d7978515aafea23; successfully ran local tests; will one-ACK merge as this is units-only

Tree-SHA512: 1f0893f75c47f720ac741ace0274171ed24efcb6d2724d0fed941899d43b213e165b97aa050d6e40eea78c527af45d090a81b9d6cbd95835ef7105585786fca6
This commit is contained in:
merge-script 2025-05-23 03:57:18 +00:00
commit 7dcff506dd
No known key found for this signature in database
GPG Key ID: C588D63CE41B97C1
1 changed files with 15 additions and 10 deletions

View File

@ -110,9 +110,9 @@ impl FeeRate {
///
/// Computes `self + rhs` returning [`None`] if overflow occurred.
#[must_use]
pub const fn checked_add(self, rhs: u64) -> Option<Self> {
pub const fn checked_add(self, rhs: FeeRate) -> Option<Self> {
// No `map()` in const context.
match self.to_sat_per_kwu().checked_add(rhs) {
match self.to_sat_per_kwu().checked_add(rhs.to_sat_per_kwu()) {
Some(res) => Some(Self::from_sat_per_kwu(res)),
None => None,
}
@ -122,9 +122,9 @@ impl FeeRate {
///
/// Computes `self - rhs` returning [`None`] if overflow occurred.
#[must_use]
pub const fn checked_sub(self, rhs: u64) -> Option<Self> {
pub const fn checked_sub(self, rhs: FeeRate) -> Option<Self> {
// No `map()` in const context.
match self.to_sat_per_kwu().checked_sub(rhs) {
match self.to_sat_per_kwu().checked_sub(rhs.to_sat_per_kwu()) {
Some(res) => Some(Self::from_sat_per_kwu(res)),
None => None,
}
@ -250,19 +250,24 @@ mod tests {
#[test]
fn checked_add() {
let f = FeeRate::from_sat_per_kwu(1).checked_add(2).unwrap();
assert_eq!(FeeRate::from_sat_per_kwu(3), f);
let one = FeeRate::from_sat_per_kwu(1);
let two = FeeRate::from_sat_per_kwu(2);
let three = FeeRate::from_sat_per_kwu(3);
let f = FeeRate::from_sat_per_kwu(u64::MAX).checked_add(1);
assert_eq!(one.checked_add(two).unwrap(), three);
let f = FeeRate::from_sat_per_kwu(u64::MAX).checked_add(one);
assert!(f.is_none());
}
#[test]
fn checked_sub() {
let f = FeeRate::from_sat_per_kwu(2).checked_sub(1).unwrap();
assert_eq!(FeeRate::from_sat_per_kwu(1), f);
let one = FeeRate::from_sat_per_kwu(1);
let two = FeeRate::from_sat_per_kwu(2);
let three = FeeRate::from_sat_per_kwu(3);
assert_eq!(three.checked_sub(two).unwrap(), one);
let f = FeeRate::ZERO.checked_sub(1);
let f = FeeRate::ZERO.checked_sub(one);
assert!(f.is_none());
}