[wallet_redesign] Move the majority of Update to bdk_chain

This is to make it easier for chain source crates to formulate updates.
This commit is contained in:
志宇 2023-05-11 18:46:41 +08:00
parent e69fccb15f
commit aba88130d9
No known key found for this signature in database
GPG Key ID: F6345C9837C2BDE8
2 changed files with 26 additions and 10 deletions

View File

@ -22,7 +22,7 @@ use alloc::{
pub use bdk_chain::keychain::Balance; pub use bdk_chain::keychain::Balance;
use bdk_chain::{ use bdk_chain::{
indexed_tx_graph::{IndexedAdditions, IndexedTxGraph}, indexed_tx_graph::{IndexedAdditions, IndexedTxGraph},
keychain::{DerivationAdditions, KeychainTxOutIndex}, keychain::{DerivationAdditions, KeychainTxOutIndex, LocalUpdate},
local_chain::{self, LocalChain, UpdateNotConnectedError}, local_chain::{self, LocalChain, UpdateNotConnectedError},
tx_graph::{CanonicalTx, TxGraph}, tx_graph::{CanonicalTx, TxGraph},
Anchor, Append, BlockId, ConfirmationTime, ConfirmationTimeAnchor, FullTxOut, ObservedAs, Anchor, Append, BlockId, ConfirmationTime, ConfirmationTimeAnchor, FullTxOut, ObservedAs,
@ -94,21 +94,14 @@ pub struct Wallet<D = ()> {
} }
/// The update to a [`Wallet`] used in [`Wallet::apply_update`]. This is usually returned from blockchain data sources. /// The update to a [`Wallet`] used in [`Wallet::apply_update`]. This is usually returned from blockchain data sources.
/// The type parameter `T` indicates the kind of transaction contained in the update. It's usually a [`bitcoin::Transaction`]. pub type Update = LocalUpdate<KeychainKind, ConfirmationTimeAnchor>;
#[derive(Debug, Default, PartialEq)]
pub struct Update<K = KeychainKind, A = ConfirmationTimeAnchor> {
keychain: BTreeMap<K, u32>,
graph: TxGraph<A>,
chain: LocalChain,
}
/// The changeset produced internally by applying an update /// The changeset produced internally by applying an update.
#[derive(Debug, PartialEq, serde::Deserialize, serde::Serialize)] #[derive(Debug, PartialEq, serde::Deserialize, serde::Serialize)]
#[serde(bound( #[serde(bound(
deserialize = "A: Ord + serde::Deserialize<'de>, K: Ord + serde::Deserialize<'de>", deserialize = "A: Ord + serde::Deserialize<'de>, K: Ord + serde::Deserialize<'de>",
serialize = "A: Ord + serde::Serialize, K: Ord + serde::Serialize" serialize = "A: Ord + serde::Serialize, K: Ord + serde::Serialize"
))] ))]
// #[cfg_attr(predicate, attr)]
pub struct ChangeSet<K = KeychainKind, A = ConfirmationTimeAnchor> { pub struct ChangeSet<K = KeychainKind, A = ConfirmationTimeAnchor> {
pub chain_changeset: local_chain::ChangeSet, pub chain_changeset: local_chain::ChangeSet,
pub indexed_additions: IndexedAdditions<A, DerivationAdditions<K>>, pub indexed_additions: IndexedAdditions<A, DerivationAdditions<K>>,

View File

@ -18,6 +18,7 @@
use crate::{ use crate::{
chain_graph::{self, ChainGraph}, chain_graph::{self, ChainGraph},
collections::BTreeMap, collections::BTreeMap,
local_chain::LocalChain,
sparse_chain::ChainPosition, sparse_chain::ChainPosition,
tx_graph::TxGraph, tx_graph::TxGraph,
Append, ForEachTxOut, Append, ForEachTxOut,
@ -102,6 +103,28 @@ impl<K> AsRef<BTreeMap<K, u32>> for DerivationAdditions<K> {
} }
} }
/// A structure to update [`KeychainTxOutIndex`], [`TxGraph`] and [`LocalChain`]
/// atomically.
#[derive(Debug, Clone, PartialEq)]
pub struct LocalUpdate<K, A> {
/// Last active derivation index per keychain (`K`).
pub keychain: BTreeMap<K, u32>,
/// Update for the [`TxGraph`].
pub graph: TxGraph<A>,
/// Update for the [`LocalChain`].
pub chain: LocalChain,
}
impl<K, A> Default for LocalUpdate<K, A> {
fn default() -> Self {
Self {
keychain: Default::default(),
graph: Default::default(),
chain: Default::default(),
}
}
}
#[derive(Clone, Debug, PartialEq)] #[derive(Clone, Debug, PartialEq)]
/// An update that includes the last active indexes of each keychain. /// An update that includes the last active indexes of each keychain.
pub struct KeychainScan<K, P> { pub struct KeychainScan<K, P> {