self.graph.apply_changeset(changeset.graph);
}
+
+ /// Determines the [`ChangeSet`] between `self` and an empty [`IndexedTxGraph`].
+ pub fn initial_changeset(&self) -> ChangeSet<A, I::ChangeSet> {
+ let graph = self.graph.initial_changeset();
+ let indexer = self.index.initial_changeset();
+ ChangeSet { graph, indexer }
+ }
}
impl<A: Anchor, I: Indexer> IndexedTxGraph<A, I>
/// Apply changeset to itself.
fn apply_changeset(&mut self, changeset: Self::ChangeSet);
+ /// Determines the [`ChangeSet`] between `self` and an empty [`Indexer`].
+ fn initial_changeset(&self) -> Self::ChangeSet;
+
/// Determines whether the transaction should be included in the index.
fn is_tx_relevant(&self, tx: &Transaction) -> bool;
}
pub use txout_index::*;
/// Represents updates to the derivation index of a [`KeychainTxOutIndex`].
+/// It maps each keychain `K` to its last revealed index.
///
/// It can be applied to [`KeychainTxOutIndex`] with [`apply_changeset`]. [`ChangeSet] are
/// monotone in that they will never decrease the revealed derivation index.
self.scan(tx)
}
+ fn initial_changeset(&self) -> Self::ChangeSet {
+ super::ChangeSet(self.last_revealed.clone())
+ }
+
fn apply_changeset(&mut self, changeset: Self::ChangeSet) {
self.apply_changeset(changeset)
}
Default::default()
}
+ fn initial_changeset(&self) -> Self::ChangeSet {}
+
fn apply_changeset(&mut self, _changeset: Self::ChangeSet) {
// This applies nothing.
}
changeset
}
+ /// Determines the [`ChangeSet`] between `self` and an empty [`TxGraph`].
+ pub fn initial_changeset(&self) -> ChangeSet<A> {
+ Self::default().determine_changeset(self.clone())
+ }
+
/// Applies [`ChangeSet`] to [`TxGraph`].
pub fn apply_changeset(&mut self, changeset: ChangeSet<A>) {
for tx in changeset.txs {
let txs = [tx_c, tx_b, tx_a];
+ let changeset = indexed_tx_graph::ChangeSet {
+ graph: tx_graph::ChangeSet {
+ txs: txs.clone().into(),
+ ..Default::default()
+ },
+ indexer: keychain::ChangeSet([((), 9_u32)].into()),
+ };
+
assert_eq!(
graph.insert_relevant_txs(txs.iter().map(|tx| (tx, None)), None),
- indexed_tx_graph::ChangeSet {
- graph: tx_graph::ChangeSet {
- txs: txs.into(),
- ..Default::default()
- },
- indexer: keychain::ChangeSet([((), 9_u32)].into()),
- }
- )
+ changeset,
+ );
+
+ assert_eq!(graph.initial_changeset(), changeset,);
}
#[test]
#[test]
fn test_set_all_derivation_indices() {
+ use bdk_chain::indexed_tx_graph::Indexer;
+
let (mut txout_index, _, _) = init_txout_index();
let derive_to: BTreeMap<_, _> =
[(TestKeychain::External, 12), (TestKeychain::Internal, 24)].into();
keychain::ChangeSet::default(),
"no changes if we set to the same thing"
);
+ assert_eq!(txout_index.initial_changeset().as_inner(), &derive_to);
}
#[test]
changeset,
ChangeSet {
txs: [update_txs.clone()].into(),
- txouts: update_ops.into(),
+ txouts: update_ops.clone().into(),
anchors: [(conf_anchor, update_txs.txid()), (unconf_anchor, h!("tx2"))].into(),
last_seen: [(h!("tx2"), 1000000)].into()
}
)]
.into()
);
+
+ // Check that the initial_changeset is correct
+ assert_eq!(
+ graph.initial_changeset(),
+ ChangeSet {
+ txs: [update_txs.clone()].into(),
+ txouts: update_ops.into_iter().chain(original_ops).collect(),
+ anchors: [(conf_anchor, update_txs.txid()), (unconf_anchor, h!("tx2"))].into(),
+ last_seen: [(h!("tx2"), 1000000)].into()
+ }
+ );
}
#[test]