diff --git a/crates/chain/src/indexed_tx_graph.rs b/crates/chain/src/indexed_tx_graph.rs
index e2d71af1c..450d02b82 100644
--- a/crates/chain/src/indexed_tx_graph.rs
+++ b/crates/chain/src/indexed_tx_graph.rs
@@ -1,11 +1,11 @@
-use core::{convert::Infallible, ops::AddAssign};
+use core::convert::Infallible;
use bitcoin::{OutPoint, Script, Transaction, TxOut};
use crate::{
keychain::Balance,
tx_graph::{Additions, TxGraph, TxNode},
- BlockAnchor, ChainOracle, FullTxOut, ObservedAs, TxIndex,
+ Append, BlockAnchor, ChainOracle, FullTxOut, ObservedAs, TxIndex,
};
/// An outwards-facing view of a transaction that is part of the *best chain*'s history.
@@ -50,18 +50,14 @@ impl Default for IndexedAdditions {
}
}
-impl AddAssign for IndexedAdditions {
- fn add_assign(&mut self, rhs: Self) {
- let Self {
- graph_additions,
- index_additions: index_delta,
- last_height,
- } = rhs;
- self.graph_additions.append(graph_additions);
- self.index_additions += index_delta;
- if self.last_height < last_height {
- let last_height =
- last_height.expect("must exist as it is larger than self.last_height");
+impl Append for IndexedAdditions {
+ fn append(&mut self, other: Self) {
+ self.graph_additions.append(other.graph_additions);
+ self.index_additions.append(other.index_additions);
+ if self.last_height < other.last_height {
+ let last_height = other
+ .last_height
+ .expect("must exist as it is larger than self.last_height");
self.last_height.replace(last_height);
}
}
@@ -201,7 +197,7 @@ impl IndexedTxGraph {
) -> IndexedAdditions
where
T: Iterator- ,
- I::Additions: Default + AddAssign,
+ I::Additions: Default + Append,
{
txs.filter_map(|tx| {
if self.index.is_tx_relevant(tx) {
@@ -211,7 +207,7 @@ impl IndexedTxGraph {
}
})
.fold(IndexedAdditions::default(), |mut acc, other| {
- acc += other;
+ acc.append(other);
acc
})
}
diff --git a/crates/chain/src/keychain.rs b/crates/chain/src/keychain.rs
index 53da284f2..81503049b 100644
--- a/crates/chain/src/keychain.rs
+++ b/crates/chain/src/keychain.rs
@@ -14,14 +14,13 @@
//! [`KeychainChangeSet`]s.
//!
//! [`SpkTxOutIndex`]: crate::SpkTxOutIndex
-use core::ops::AddAssign;
use crate::{
chain_graph::{self, ChainGraph},
collections::BTreeMap,
sparse_chain::ChainPosition,
tx_graph::TxGraph,
- ForEachTxOut,
+ Append, ForEachTxOut,
};
#[cfg(feature = "miniscript")]
@@ -71,12 +70,12 @@ impl DerivationAdditions {
}
}
-impl DerivationAdditions {
+impl Append for DerivationAdditions {
/// Append another [`DerivationAdditions`] into self.
///
/// If the keychain already exists, increase the index when the other's index > self's index.
/// If the keychain did not exist, append the new keychain.
- pub fn append(&mut self, mut other: Self) {
+ fn append(&mut self, mut other: Self) {
self.0.iter_mut().for_each(|(key, index)| {
if let Some(other_index) = other.0.remove(key) {
*index = other_index.max(*index);
@@ -87,12 +86,6 @@ impl DerivationAdditions {
}
}
-impl AddAssign for DerivationAdditions {
- fn add_assign(&mut self, rhs: Self) {
- self.append(rhs)
- }
-}
-
impl Default for DerivationAdditions {
fn default() -> Self {
Self(Default::default())
diff --git a/crates/chain/src/keychain/txout_index.rs b/crates/chain/src/keychain/txout_index.rs
index 101278b7a..fc4c4e62f 100644
--- a/crates/chain/src/keychain/txout_index.rs
+++ b/crates/chain/src/keychain/txout_index.rs
@@ -7,6 +7,8 @@ use alloc::{borrow::Cow, vec::Vec};
use bitcoin::{secp256k1::Secp256k1, OutPoint, Script, TxOut};
use core::{fmt::Debug, ops::Deref};
+use crate::Append;
+
use super::DerivationAdditions;
/// Maximum [BIP32](https://bips.xyz/32) derivation index.
diff --git a/crates/chain/src/tx_data_traits.rs b/crates/chain/src/tx_data_traits.rs
index 366fc34b8..716b45f18 100644
--- a/crates/chain/src/tx_data_traits.rs
+++ b/crates/chain/src/tx_data_traits.rs
@@ -56,6 +56,16 @@ impl BlockAnchor for (u32, BlockHash) {
}
}
+/// Trait that makes an object appendable.
+pub trait Append {
+ /// Append another object of the same type onto `self`.
+ fn append(&mut self, other: Self);
+}
+
+impl Append for () {
+ fn append(&mut self, _other: Self) {}
+}
+
/// Represents an index of transaction data.
pub trait TxIndex {
/// The resultant "additions" when new transaction data is indexed.
diff --git a/example-crates/keychain_tracker_example_cli/src/lib.rs b/example-crates/keychain_tracker_example_cli/src/lib.rs
index df42df1ac..702cc2a25 100644
--- a/example-crates/keychain_tracker_example_cli/src/lib.rs
+++ b/example-crates/keychain_tracker_example_cli/src/lib.rs
@@ -13,7 +13,7 @@ use bdk_chain::{
Descriptor, DescriptorPublicKey,
},
sparse_chain::{self, ChainPosition},
- DescriptorExt, FullTxOut,
+ Append, DescriptorExt, FullTxOut,
};
use bdk_coin_select::{coin_select_bnb, CoinSelector, CoinSelectorOpt, WeightedValue};
use bdk_file_store::KeychainStore;