]> Untitled Git - bdk/commitdiff
feat(chain): derive Copy and implement AddAssign, Sum for Balance
authorbhuvan-somisetty <somisettybhuvan5@gmail.com>
Sat, 10 Oct 2026 23:32:04 +0000 (05:02 +0530)
committerbhuvan-somisetty <somisettybhuvan5@gmail.com>
Mon, 19 Oct 2026 17:33:56 +0000 (23:03 +0530)
Derive `Copy` on `Balance` and implement `AddAssign` and `Sum`.

Fixes #2366.

Signed-off-by: bhuvan-somisetty <somisettybhuvan5@gmail.com>
crates/chain/src/balance.rs

index 2d4dc9dbe325dec336737ae672766f6ccf2d8fd0..dc4db823c970a2b5f88223ecd7cd65f0c1debb8b 100644 (file)
@@ -1,7 +1,7 @@
 use bitcoin::Amount;
 
 /// Balance, differentiated into various categories.
-#[derive(Debug, PartialEq, Eq, Clone, Default)]
+#[derive(Debug, PartialEq, Eq, Clone, Copy, Default)]
 #[cfg_attr(feature = "serde", derive(serde::Deserialize, serde::Serialize))]
 pub struct Balance {
     /// All coinbase outputs not yet matured
@@ -51,3 +51,54 @@ impl core::ops::Add for Balance {
         }
     }
 }
+
+impl core::ops::AddAssign for Balance {
+    fn add_assign(&mut self, other: Self) {
+        *self = *self + other;
+    }
+}
+
+impl core::iter::Sum for Balance {
+    fn sum<I: Iterator<Item = Self>>(iter: I) -> Self {
+        iter.fold(Self::default(), core::ops::Add::add)
+    }
+}
+
+#[cfg(test)]
+mod test {
+    use super::*;
+
+    #[test]
+    fn test_balance_add_assign_and_sum() {
+        let b1 = Balance {
+            immature: Amount::from_sat(10),
+            trusted_pending: Amount::from_sat(20),
+            untrusted_pending: Amount::from_sat(30),
+            confirmed: Amount::from_sat(40),
+        };
+        let b2 = Balance {
+            immature: Amount::from_sat(1),
+            trusted_pending: Amount::from_sat(2),
+            untrusted_pending: Amount::from_sat(3),
+            confirmed: Amount::from_sat(4),
+        };
+
+        let mut b = b1;
+        b += b2;
+        assert_eq!(
+            b,
+            Balance {
+                immature: Amount::from_sat(11),
+                trusted_pending: Amount::from_sat(22),
+                untrusted_pending: Amount::from_sat(33),
+                confirmed: Amount::from_sat(44),
+            }
+        );
+
+        assert_eq!(
+            core::iter::empty::<Balance>().sum::<Balance>(),
+            Balance::default()
+        );
+        assert_eq!([b1, b2, b1].into_iter().sum::<Balance>(), b1 + b2 + b1);
+    }
+}