@@ -63,6 +63,9 @@ pub trait Satisfier<Pk: MiniscriptKey + ToPublicKey> {
63
63
}
64
64
65
65
/// 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.
66
69
fn lookup_pkh ( & self , p : & Pk :: Hash ) -> Option < ( bitcoin:: PublicKey , BitcoinSig ) > {
67
70
self . lookup_pkh_pk ( p)
68
71
. 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> {
296
299
r. node . satisfy ( satisfier, age, height) ,
297
300
) {
298
301
( Some ( lsat) , None ) => {
299
- let mut rdissat = r. node . dissatisfy ( satisfier) . unwrap ( ) ;
302
+ let mut rdissat = r. node . dissatisfy ( satisfier) ? ;
300
303
rdissat. extend ( lsat) ;
301
304
Some ( rdissat)
302
305
}
303
306
( None , Some ( mut rsat) ) => {
304
- let ldissat = l. node . dissatisfy ( satisfier) . unwrap ( ) ;
307
+ let ldissat = l. node . dissatisfy ( satisfier) ? ;
305
308
rsat. extend ( ldissat) ;
306
309
Some ( rsat)
307
310
}
308
311
( None , None ) => None ,
309
312
( 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) ? ;
312
315
313
316
if l. ty . mall . safe && !r. ty . mall . safe {
314
317
rsat. extend ( ldissat) ;
@@ -339,13 +342,12 @@ impl<Pk: MiniscriptKey + ToPublicKey> Satisfiable<Pk> for Terminal<Pk> {
339
342
( None , None ) => None ,
340
343
( Some ( lsat) , None ) => Some ( lsat) ,
341
344
( None , Some ( mut rsat) ) => {
342
- let ldissat = l. node . dissatisfy ( satisfier) . unwrap ( ) ;
345
+ let ldissat = l. node . dissatisfy ( satisfier) ? ;
343
346
rsat. extend ( ldissat) ;
344
347
Some ( rsat)
345
348
}
346
349
( Some ( lsat) , Some ( mut rsat) ) => {
347
- let ldissat = l. node . dissatisfy ( satisfier) . unwrap ( ) ;
348
-
350
+ let ldissat = l. node . dissatisfy ( satisfier) ?;
349
351
if l. ty . mall . safe && !r. ty . mall . safe {
350
352
rsat. extend ( ldissat) ;
351
353
Some ( rsat)
@@ -412,7 +414,7 @@ impl<Pk: MiniscriptKey + ToPublicKey> Satisfiable<Pk> for Terminal<Pk> {
412
414
let mut ret_dis = Vec :: with_capacity ( subs. len ( ) ) ;
413
415
414
416
for sub in subs. iter ( ) . rev ( ) {
415
- let dissat = sub. node . dissatisfy ( satisfier) . unwrap ( ) ;
417
+ let dissat = sub. node . dissatisfy ( satisfier) ? ;
416
418
if let Some ( sat) = sub. node . satisfy ( satisfier, age, height) {
417
419
ret. push ( sat) ;
418
420
satisfied += 1 ;
@@ -487,11 +489,20 @@ impl<Pk: MiniscriptKey + ToPublicKey> Satisfiable<Pk> for Terminal<Pk> {
487
489
}
488
490
}
489
491
490
- impl < Pk : MiniscriptKey + ToPublicKey > Dissatisfiable < Pk > for Terminal < Pk > {
492
+ impl < Pk : MiniscriptKey > Dissatisfiable < Pk > for Terminal < Pk > {
491
493
fn dissatisfy < S : Satisfier < Pk > > ( & self , satisfier : & S ) -> Option < Vec < Vec < u8 > > > {
492
494
match * self {
493
495
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
+ }
495
506
Terminal :: False => Some ( vec ! [ ] ) ,
496
507
Terminal :: AndB ( ref left, ref right) => {
497
508
let mut ret = right. node . dissatisfy ( satisfier) ?;
0 commit comments