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;