Skip to content

Commit bcd35f8

Browse files
committed
descriptor: derived_descriptor
This enables us to work with pubkey descriptors instead of inaccessible xpubs without wildcards. Again copied from rust-miniscript.
1 parent faad192 commit bcd35f8

File tree

1 file changed

+34
-1
lines changed

1 file changed

+34
-1
lines changed

src/policy/descriptor.rs

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use crate::{miniscript, Error, Policy};
22
use bitcoin_hashes::{hash160, ripemd160, sha256, Hash};
33
use elements::schnorr::{TapTweak, XOnlyPublicKey};
4-
use elements::secp256k1_zkp;
54
use elements::taproot::{
65
ControlBlock, LeafVersion, TapBranchHash, TapLeafHash, TaprootBuilder, TaprootMerkleBranch,
76
TaprootSpendInfo,
87
};
8+
use elements::{bitcoin, secp256k1_zkp};
99
use miniscript::descriptor::{ConversionError, DescriptorSecretKey, KeyMap};
1010
use miniscript::Error as MSError;
1111
use miniscript::{
@@ -395,6 +395,39 @@ impl Descriptor<DescriptorPublicKey> {
395395
}
396396
}
397397

398+
impl Descriptor<DefiniteDescriptorKey> {
399+
/// Convert all the public keys in the descriptor to [`bitcoin::PublicKey`] by deriving them or
400+
/// otherwise converting them. All [`secp256k1_zkp::XOnlyPublicKey`]s are converted to by adding a
401+
/// default(0x02) y-coordinate.
402+
///
403+
/// # Errors
404+
///
405+
/// This function will return an error if hardened derivation is attempted.
406+
pub fn derived_descriptor<C: secp256k1_zkp::Verification>(
407+
&self,
408+
secp: &secp256k1_zkp::Secp256k1<C>,
409+
) -> Result<Descriptor<bitcoin::PublicKey>, ConversionError> {
410+
struct Derivator<'a, C: secp256k1_zkp::Verification>(&'a secp256k1_zkp::Secp256k1<C>);
411+
412+
impl<'a, C: secp256k1_zkp::Verification>
413+
Translator<DefiniteDescriptorKey, bitcoin::PublicKey, ConversionError>
414+
for Derivator<'a, C>
415+
{
416+
fn pk(
417+
&mut self,
418+
pk: &DefiniteDescriptorKey,
419+
) -> Result<bitcoin::PublicKey, ConversionError> {
420+
pk.derive_public_key(self.0)
421+
}
422+
423+
translate_hash_clone!(DefiniteDescriptorKey, bitcoin::PublicKey, ConversionError);
424+
}
425+
426+
let derived = self.translate_pk(&mut Derivator(secp))?;
427+
Ok(derived)
428+
}
429+
}
430+
398431
impl<Pk: MiniscriptKey> fmt::Display for Descriptor<Pk> {
399432
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
400433
write!(f, "sim({},{})", self.internal_key, self.policy)

0 commit comments

Comments
 (0)