Skip to content

Commit 0df1a2a

Browse files
feat: add KeyRing changeset
1 parent b293b58 commit 0df1a2a

File tree

3 files changed

+67
-0
lines changed

3 files changed

+67
-0
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: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,4 +93,23 @@ where
9393
pub fn list_keychains(&self) -> &BTreeMap<K, Descriptor<DescriptorPublicKey>> {
9494
&self.descriptors
9595
}
96+
97+
/// Initial changeset.
98+
pub fn initial_changeset(&self) -> ChangeSet<K> {
99+
ChangeSet {
100+
network: Some(self.network),
101+
descriptors: self.descriptors.clone(),
102+
default_keychain: Some(self.default_keychain.clone()),
103+
}
104+
}
105+
106+
/// Construct from changeset.
107+
pub fn from_changeset(changeset: ChangeSet<K>) -> Option<Self> {
108+
Some(Self {
109+
secp: Secp256k1::new(),
110+
network: changeset.network?,
111+
descriptors: changeset.descriptors,
112+
default_keychain: changeset.default_keychain?,
113+
})
114+
}
96115
}

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)