Skip to content

Commit

Permalink
implement satisfier for psbt
Browse files Browse the repository at this point in the history
  • Loading branch information
sanket1729 committed Dec 27, 2021
1 parent 885dcf8 commit 1a63641
Showing 1 changed file with 53 additions and 0 deletions.
53 changes: 53 additions & 0 deletions src/psbt/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
//! `https://github.com/bitcoin/bips/blob/master/bip-0174.mediawiki`
//!

use std::collections::BTreeMap;
use std::{error, fmt};

use bitcoin;
Expand All @@ -27,6 +28,7 @@ use bitcoin::secp256k1::{self, Secp256k1};
use bitcoin::util::psbt::PartiallySignedTransaction as Psbt;
use bitcoin::Script;

use bitcoin::util::taproot::{ControlBlock, LeafVersion, TapLeafHash};
use interpreter;
use miniscript::limits::SEQUENCE_LOCKTIME_DISABLE_FLAG;
use miniscript::satisfy::{After, Older};
Expand Down Expand Up @@ -231,6 +233,57 @@ impl<'psbt> PsbtInputSatisfier<'psbt> {
}

impl<'psbt, Pk: MiniscriptKey + ToPublicKey> Satisfier<Pk> for PsbtInputSatisfier<'psbt> {
fn lookup_tap_key_spend_sig(&self) -> Option<bitcoin::SchnorrSig> {
if let Some((sig, hash_ty)) = self.psbt.inputs[self.index].tap_key_sig {
Some(bitcoin::SchnorrSig { sig, hash_ty })
} else {
None
}
}

fn lookup_tap_leaf_script_sig(&self, pk: &Pk, lh: &TapLeafHash) -> Option<bitcoin::SchnorrSig> {
let pk = pk.to_x_only_pubkey();

if let Some((sig, hash_ty)) = self.psbt.inputs[self.index].tap_script_sigs.get(&(pk, *lh)) {
Some(bitcoin::SchnorrSig {
sig: *sig,
hash_ty: *hash_ty,
})
} else {
None
}
}

fn lookup_tap_control_block_map(
&self,
) -> Option<&BTreeMap<ControlBlock, (bitcoin::Script, LeafVersion)>> {
Some(&self.psbt.inputs[self.index].tap_scripts)
}

fn lookup_pkh_tap_leaf_script_sig(
&self,
pkh: &(Pk::Hash, TapLeafHash),
) -> Option<(bitcoin::schnorr::PublicKey, bitcoin::SchnorrSig)> {
if let Some(((pk, _lh), sig)) = self.psbt.inputs[self.index]
.tap_script_sigs
.iter()
.filter(|&((pubkey, lh), _sig)| {
pubkey.to_pubkeyhash() == Pk::hash_to_hash160(&pkh.0) && *lh == pkh.1
})
.next()
{
Some((
*pk,
bitcoin::SchnorrSig {
sig: sig.0,
hash_ty: sig.1,
},
))
} else {
None
}
}

fn lookup_ec_sig(&self, pk: &Pk) -> Option<bitcoin::EcdsaSig> {
if let Some(rawsig) = self.psbt.inputs[self.index]
.partial_sigs
Expand Down

0 comments on commit 1a63641

Please sign in to comment.