From e3bf159572bc2dd72d97d33cf70ed0fe49746b4d Mon Sep 17 00:00:00 2001 From: Dr Maxim Orlovsky Date: Sun, 19 Nov 2023 13:20:43 +0100 Subject: [PATCH] descriptor: add default_keychain method --- descriptors/src/descriptor.rs | 7 +++++++ descriptors/src/segwit.rs | 3 +++ descriptors/src/taproot.rs | 3 +++ std/src/derive.rs | 11 +++++++++++ std/src/path.rs | 8 ++++++++ 5 files changed, 32 insertions(+) diff --git a/descriptors/src/descriptor.rs b/descriptors/src/descriptor.rs index 251d4fe..2c874e1 100644 --- a/descriptors/src/descriptor.rs +++ b/descriptors/src/descriptor.rs @@ -140,6 +140,13 @@ pub enum StdDescr { } impl Derive for StdDescr { + fn default_keychain(&self) -> Keychain { + match self { + StdDescr::Wpkh(d) => d.default_keychain(), + StdDescr::TrKey(d) => d.default_keychain(), + } + } + fn keychains(&self) -> &BTreeSet { match self { StdDescr::Wpkh(d) => d.keychains(), diff --git a/descriptors/src/segwit.rs b/descriptors/src/segwit.rs index 67f13bf..e56cebc 100644 --- a/descriptors/src/segwit.rs +++ b/descriptors/src/segwit.rs @@ -41,6 +41,9 @@ impl Wpkh { } impl Derive for Wpkh { + #[inline] + fn default_keychain(&self) -> Keychain { self.0.default_keychain() } + #[inline] fn keychains(&self) -> &BTreeSet { self.0.keychains() } diff --git a/descriptors/src/taproot.rs b/descriptors/src/taproot.rs index 73018e2..b6afaf8 100644 --- a/descriptors/src/taproot.rs +++ b/descriptors/src/taproot.rs @@ -41,6 +41,9 @@ impl TrKey { } impl Derive for TrKey { + #[inline] + fn default_keychain(&self) -> Keychain { self.0.default_keychain() } + #[inline] fn keychains(&self) -> &BTreeSet { self.0.keychains() } diff --git a/std/src/derive.rs b/std/src/derive.rs index 9ea6978..ee98634 100644 --- a/std/src/derive.rs +++ b/std/src/derive.rs @@ -281,6 +281,8 @@ impl FromStr for DerivedAddr { } pub trait Derive { + fn default_keychain(&self) -> Keychain; + fn keychains(&self) -> &BTreeSet; fn derive(&self, keychain: impl Into, index: impl Into) -> D; @@ -358,6 +360,9 @@ impl DeriveKey for XpubDerivable { } impl Derive for XpubDerivable { + #[inline] + fn default_keychain(&self) -> Keychain { self.keychains.first() } + #[inline] fn keychains(&self) -> &BTreeSet { self.keychains.as_ref() } @@ -367,6 +372,9 @@ impl Derive for XpubDerivable { } impl Derive for XpubDerivable { + #[inline] + fn default_keychain(&self) -> Keychain { self.keychains.first() } + #[inline] fn keychains(&self) -> &BTreeSet { self.keychains.as_ref() } @@ -376,6 +384,9 @@ impl Derive for XpubDerivable { } impl Derive for XpubDerivable { + #[inline] + fn default_keychain(&self) -> Keychain { self.keychains.first() } + #[inline] fn keychains(&self) -> &BTreeSet { self.keychains.as_ref() } diff --git a/std/src/path.rs b/std/src/path.rs index 3bd07bf..983b30c 100644 --- a/std/src/path.rs +++ b/std/src/path.rs @@ -58,6 +58,14 @@ impl DerivationSeg { #[inline] pub fn at(&self, index: u8) -> Option { self.0.iter().nth(index as usize).copied() } + + #[inline] + pub fn first(&self) -> I { + *self + .0 + .first() + .expect("confined type guarantees that there is at least one item in the collection") + } } impl DerivationSeg {