From b593c886e34e89b7c628e9b34de84a0e20e805af Mon Sep 17 00:00:00 2001 From: Nadav Ivgi Date: Fri, 13 Sep 2024 11:46:07 +0300 Subject: [PATCH] Support GetKey where the Xpriv is a direct child of the looked up KeySource --- bitcoin/src/psbt/mod.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/bitcoin/src/psbt/mod.rs b/bitcoin/src/psbt/mod.rs index 472847655..dd27611af 100644 --- a/bitcoin/src/psbt/mod.rs +++ b/bitcoin/src/psbt/mod.rs @@ -20,7 +20,7 @@ use std::collections::{HashMap, HashSet}; use internals::write_err; use secp256k1::{Keypair, Message, Secp256k1, Signing, Verification}; -use crate::bip32::{self, KeySource, Xpriv, Xpub}; +use crate::bip32::{self, DerivationPath, KeySource, Xpriv, Xpub}; use crate::crypto::key::{PrivateKey, PublicKey}; use crate::crypto::{ecdsa, taproot}; use crate::key::{TapTweak, XOnlyPublicKey}; @@ -764,6 +764,13 @@ impl GetKey for Xpriv { let key = if self.fingerprint(secp) == *fingerprint { let k = self.derive_priv(secp, &path); Some(k.to_priv()) + } else if self.parent_fingerprint == *fingerprint + && !path.is_empty() + && path[0] == self.child_number + { + let path = DerivationPath::from_iter(path.into_iter().skip(1).copied()); + let k = self.derive_priv(secp, &path); + Some(k.to_priv()) } else { None };