Skip to content

Commit 9f68b46

Browse files
committed
Return None instead of unwrap. This may fail because in case of PkH dissat may not be available
1 parent 3b7c987 commit 9f68b46

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

src/miniscript/satisfy.rs

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)