@@ -63,6 +63,9 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
6363 }
6464
6565 /// Given a keyhash, look up the signature and the associated key
66+ /// Even if signatures for public key Hashes are not available, the users
67+ /// can use this map to provide pkh -> pk mapping which can use useful
68+ /// for dissatisfying pkh.
6669 fn lookup_pkh ( & self , p : & Pk :: Hash ) -> Option < ( bitcoin:: PublicKey , BitcoinSig ) > {
6770 self . lookup_pkh_pk ( p)
6871 . and_then ( |ref pk| Some ( ( pk. to_public_key ( ) , self . lookup_pk ( pk) ?) ) )
@@ -296,19 +299,19 @@ impl<Pk: MiniscriptKey + ToPublicKey> Satisfiable<Pk> for Terminal<Pk> {
296299 r. node . satisfy ( satisfier, age, height) ,
297300 ) {
298301 ( Some ( lsat) , None ) => {
299- let mut rdissat = r. node . dissatisfy ( satisfier) . unwrap ( ) ;
302+ let mut rdissat = r. node . dissatisfy ( satisfier) ? ;
300303 rdissat. extend ( lsat) ;
301304 Some ( rdissat)
302305 }
303306 ( None , Some ( mut rsat) ) => {
304- let ldissat = l. node . dissatisfy ( satisfier) . unwrap ( ) ;
307+ let ldissat = l. node . dissatisfy ( satisfier) ? ;
305308 rsat. extend ( ldissat) ;
306309 Some ( rsat)
307310 }
308311 ( None , None ) => None ,
309312 ( Some ( lsat) , Some ( mut rsat) ) => {
310- let ldissat = l. node . dissatisfy ( satisfier) . unwrap ( ) ;
311- let mut rdissat = r. node . dissatisfy ( satisfier) . unwrap ( ) ;
313+ let ldissat = l. node . dissatisfy ( satisfier) ? ;
314+ let mut rdissat = r. node . dissatisfy ( satisfier) ? ;
312315
313316 if l. ty . mall . safe && !r. ty . mall . safe {
314317 rsat. extend ( ldissat) ;
@@ -339,13 +342,12 @@ impl<Pk: MiniscriptKey + ToPublicKey> Satisfiable<Pk> for Terminal<Pk> {
339342 ( None , None ) => None ,
340343 ( Some ( lsat) , None ) => Some ( lsat) ,
341344 ( None , Some ( mut rsat) ) => {
342- let ldissat = l. node . dissatisfy ( satisfier) . unwrap ( ) ;
345+ let ldissat = l. node . dissatisfy ( satisfier) ? ;
343346 rsat. extend ( ldissat) ;
344347 Some ( rsat)
345348 }
346349 ( Some ( lsat) , Some ( mut rsat) ) => {
347- let ldissat = l. node . dissatisfy ( satisfier) . unwrap ( ) ;
348-
350+ let ldissat = l. node . dissatisfy ( satisfier) ?;
349351 if l. ty . mall . safe && !r. ty . mall . safe {
350352 rsat. extend ( ldissat) ;
351353 Some ( rsat)
@@ -412,7 +414,7 @@ impl<Pk: MiniscriptKey + ToPublicKey> Satisfiable<Pk> for Terminal<Pk> {
412414 let mut ret_dis = Vec :: with_capacity ( subs. len ( ) ) ;
413415
414416 for sub in subs. iter ( ) . rev ( ) {
415- let dissat = sub. node . dissatisfy ( satisfier) . unwrap ( ) ;
417+ let dissat = sub. node . dissatisfy ( satisfier) ? ;
416418 if let Some ( sat) = sub. node . satisfy ( satisfier, age, height) {
417419 ret. push ( sat) ;
418420 satisfied += 1 ;
@@ -487,11 +489,20 @@ impl<Pk: MiniscriptKey + ToPublicKey> Satisfiable<Pk> for Terminal<Pk> {
487489 }
488490}
489491
490- impl < Pk : MiniscriptKey + ToPublicKey > Dissatisfiable < Pk > for Terminal < Pk > {
492+ impl < Pk : MiniscriptKey > Dissatisfiable < Pk > for Terminal < Pk > {
491493 fn dissatisfy < S : Satisfier < Pk > > ( & self , satisfier : & S ) -> Option < Vec < Vec < u8 > > > {
492494 match * self {
493495 Terminal :: Pk ( ..) => Some ( vec ! [ vec![ ] ] ) ,
494- Terminal :: PkH ( ref pkh) => satisfier. lookup_pkh_pk_wit ( pkh) ,
496+ Terminal :: PkH ( ref pkh) => {
497+ let pk1 = satisfier. lookup_pkh_pk_wit ( pkh) ;
498+ let pk2 = satisfier
499+ . lookup_pkh ( pkh)
500+ . and_then ( |( pk, _sig) | Some ( vec ! [ pk. to_bytes( ) ] ) ) ;
501+ match ( pk1, pk2) {
502+ ( Some ( x) , _) | ( _, Some ( x) ) => Some ( x) ,
503+ _ => None ,
504+ }
505+ }
495506 Terminal :: False => Some ( vec ! [ ] ) ,
496507 Terminal :: AndB ( ref left, ref right) => {
497508 let mut ret = right. node . dissatisfy ( satisfier) ?;
0 commit comments