Skip to content

Commit c87e6c4

Browse files
thunderbiscuit110CodingP
authored andcommitted
feat: add KeyRing changeset
1 parent b293b58 commit c87e6c4

File tree

3 files changed

+69
-1
lines changed

3 files changed

+69
-1
lines changed

wallet/src/keyring/changeset.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
use crate::keyring::BTreeMap;
2+
3+
use bitcoin::Network;
4+
use chain::Merge;
5+
use miniscript::{Descriptor, DescriptorPublicKey};
6+
use serde::{Deserialize, Serialize};
7+
8+
/// Represents changes to the `KeyRing`.
9+
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
10+
pub struct ChangeSet<K: Ord> {
11+
/// Network.
12+
pub network: Option<Network>,
13+
/// Added descriptors.
14+
pub descriptors: BTreeMap<K, Descriptor<DescriptorPublicKey>>,
15+
/// Default keychain
16+
pub default_keychain: Option<K>,
17+
}
18+
19+
impl<K: Ord> Default for ChangeSet<K> {
20+
fn default() -> Self {
21+
Self {
22+
network: None,
23+
descriptors: Default::default(),
24+
default_keychain: None,
25+
}
26+
}
27+
}
28+
29+
impl<K: Ord> Merge for ChangeSet<K> {
30+
fn merge(&mut self, other: Self) {
31+
// merge network
32+
if other.network.is_some() && self.network.is_none() {
33+
self.network = other.network;
34+
}
35+
// merge descriptors
36+
self.descriptors.extend(other.descriptors);
37+
38+
// Note: if a new default keychain has been set, it will take precedence over the old one.
39+
if other.default_keychain.is_some() {
40+
self.default_keychain = other.default_keychain;
41+
}
42+
}
43+
44+
fn is_empty(&self) -> bool {
45+
self.network.is_none() && self.descriptors.is_empty()
46+
}
47+
}

wallet/src/keyring/mod.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
//! of descriptors. It ensures descriptors are usable together, consistent with a given network,
1414
//! and will work with a BDK `Wallet`.
1515
16-
mod changeset;
16+
/// Contains `Changeset` corresponding to `KeyRing`.
17+
pub mod changeset;
1718

1819
use crate::descriptor::IntoWalletDescriptor;
1920
use crate::keyring::changeset::ChangeSet;
@@ -93,4 +94,23 @@ where
9394
pub fn list_keychains(&self) -> &BTreeMap<K, Descriptor<DescriptorPublicKey>> {
9495
&self.descriptors
9596
}
97+
98+
/// Initial changeset.
99+
pub fn initial_changeset(&self) -> ChangeSet<K> {
100+
ChangeSet {
101+
network: Some(self.network),
102+
descriptors: self.descriptors.clone(),
103+
default_keychain: Some(self.default_keychain.clone()),
104+
}
105+
}
106+
107+
/// Construct from changeset.
108+
pub fn from_changeset(changeset: ChangeSet<K>) -> Option<Self> {
109+
Some(Self {
110+
secp: Secp256k1::new(),
111+
network: changeset.network?,
112+
descriptors: changeset.descriptors,
113+
default_keychain: changeset.default_keychain?,
114+
})
115+
}
96116
}

wallet/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ pub extern crate serde;
2727
pub extern crate serde_json;
2828

2929
pub mod descriptor;
30+
pub mod keyring;
3031
pub mod keys;
3132
pub mod psbt;
3233
#[cfg(feature = "test-utils")]

0 commit comments

Comments
 (0)