From f2edee0e2ecd1711dea054d9453c3909996614c5 Mon Sep 17 00:00:00 2001 From: Alekos Filini Date: Fri, 13 Nov 2020 17:27:36 +0100 Subject: [PATCH] [keys] impl `ToDescriptorKey` for `GeneratedKey` --- src/keys/mod.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/keys/mod.rs b/src/keys/mod.rs index f2425227..2b614a04 100644 --- a/src/keys/mod.rs +++ b/src/keys/mod.rs @@ -346,6 +346,11 @@ impl GeneratedKey { phantom: PhantomData, } } + + /// Consumes `self` and returns the key + pub fn into_key(self) -> K { + self.key + } } impl Deref for GeneratedKey { @@ -356,10 +361,12 @@ impl Deref for GeneratedKey { } } +// Make generated "derivable" keys themselves "derivable". Also make sure they are assigned the +// right `valid_networks`. impl DerivableKey for GeneratedKey where Ctx: ScriptContext, - K: GeneratableKey + DerivableKey, + K: DerivableKey, { fn add_metadata( self, @@ -371,12 +378,27 @@ where } } +// Make generated keys directly usable in descriptors, and make sure they get assigned the right +// `valid_networks`. +impl ToDescriptorKey for GeneratedKey +where + Ctx: ScriptContext, + K: ToDescriptorKey, +{ + fn to_descriptor_key(self) -> Result, KeyError> { + let desc_key = self.key.to_descriptor_key()?; + Ok(desc_key.override_valid_networks(self.valid_networks)) + } +} + /// Trait for keys that can be generated /// /// The same rules about [`ScriptContext`] and [`ValidNetworks`] from [`ToDescriptorKey`] apply. /// /// This trait is particularly useful when combined with [`DerivableKey`]: if `Self` -/// implements it, the returned [`GeneratedKey`] will also implement it. +/// implements it, the returned [`GeneratedKey`] will also implement it. The same is true for +/// [`ToDescriptorKey`]: the generated keys can be directly used in descriptors if `Self` is also +/// [`ToDescriptorKey`]. pub trait GeneratableKey: Sized { /// Type specifying the amount of entropy required e.g. [u8;32] type Entropy: AsMut<[u8]> + Default;