@@ -45,6 +45,7 @@ use miniscript::{decode::Terminal, Legacy, Miniscript, Segwitv0};
4545use policy;
4646use push_opcode_size;
4747use script_num_size;
48+ use util:: witness_to_scriptsig;
4849use Bare ;
4950use Error ;
5051use MiniscriptKey ;
@@ -974,24 +975,9 @@ impl<Pk: MiniscriptKey> Descriptor<Pk> {
974975 Pk : ToPublicKey < ToPkCtx > ,
975976 S : Satisfier < ToPkCtx , Pk > ,
976977 {
977- fn witness_to_scriptsig ( witness : & [ Vec < u8 > ] ) -> Script {
978- let mut b = script:: Builder :: new ( ) ;
979- for wit in witness {
980- if let Ok ( n) = script:: read_scriptint ( wit) {
981- b = b. push_int ( n) ;
982- } else {
983- b = b. push_slice ( wit) ;
984- }
985- }
986- b. into_script ( )
987- }
988-
989978 match * self {
990979 Descriptor :: Bare ( ref d) => {
991- let wit = match d. satisfy ( satisfier, to_pk_ctx) {
992- Some ( wit) => wit,
993- None => return Err ( Error :: CouldNotSatisfy ) ,
994- } ;
980+ let wit = d. satisfy ( satisfier, to_pk_ctx) ?;
995981 let script_sig = witness_to_scriptsig ( & wit) ;
996982 let witness = vec ! [ ] ;
997983 Ok ( ( witness, script_sig) )
@@ -1055,20 +1041,14 @@ impl<Pk: MiniscriptKey> Descriptor<Pk> {
10551041 }
10561042 }
10571043 Descriptor :: Sh ( ref d) => {
1058- let mut script_witness = match d. satisfy ( satisfier, to_pk_ctx) {
1059- Some ( wit) => wit,
1060- None => return Err ( Error :: CouldNotSatisfy ) ,
1061- } ;
1044+ let mut script_witness = d. satisfy ( satisfier, to_pk_ctx) ?;
10621045 script_witness. push ( d. encode ( to_pk_ctx) . into_bytes ( ) ) ;
10631046 let script_sig = witness_to_scriptsig ( & script_witness) ;
10641047 let witness = vec ! [ ] ;
10651048 Ok ( ( witness, script_sig) )
10661049 }
10671050 Descriptor :: Wsh ( ref d) => {
1068- let mut witness = match d. satisfy ( satisfier, to_pk_ctx) {
1069- Some ( wit) => wit,
1070- None => return Err ( Error :: CouldNotSatisfy ) ,
1071- } ;
1051+ let mut witness = d. satisfy ( satisfier, to_pk_ctx) ?;
10721052 witness. push ( d. encode ( to_pk_ctx) . into_bytes ( ) ) ;
10731053 let script_sig = Script :: new ( ) ;
10741054 Ok ( ( witness, script_sig) )
@@ -1079,28 +1059,19 @@ impl<Pk: MiniscriptKey> Descriptor<Pk> {
10791059 . push_slice ( & witness_script. to_v0_p2wsh ( ) [ ..] )
10801060 . into_script ( ) ;
10811061
1082- let mut witness = match d. satisfy ( satisfier, to_pk_ctx) {
1083- Some ( wit) => wit,
1084- None => return Err ( Error :: CouldNotSatisfy ) ,
1085- } ;
1062+ let mut witness = d. satisfy ( satisfier, to_pk_ctx) ?;
10861063 witness. push ( witness_script. into_bytes ( ) ) ;
10871064 Ok ( ( witness, script_sig) )
10881065 }
10891066 Descriptor :: ShSortedMulti ( ref smv) => {
1090- let mut script_witness = match smv. satisfy ( satisfier, to_pk_ctx) {
1091- Some ( wit) => wit,
1092- None => return Err ( Error :: CouldNotSatisfy ) ,
1093- } ;
1067+ let mut script_witness = smv. satisfy ( satisfier, to_pk_ctx) ?;
10941068 script_witness. push ( smv. encode ( to_pk_ctx) . into_bytes ( ) ) ;
10951069 let script_sig = witness_to_scriptsig ( & script_witness) ;
10961070 let witness = vec ! [ ] ;
10971071 Ok ( ( witness, script_sig) )
10981072 }
10991073 Descriptor :: WshSortedMulti ( ref smv) => {
1100- let mut witness = match smv. satisfy ( satisfier, to_pk_ctx) {
1101- Some ( wit) => wit,
1102- None => return Err ( Error :: CouldNotSatisfy ) ,
1103- } ;
1074+ let mut witness = smv. satisfy ( satisfier, to_pk_ctx) ?;
11041075 witness. push ( smv. encode ( to_pk_ctx) . into_bytes ( ) ) ;
11051076 let script_sig = Script :: new ( ) ;
11061077 Ok ( ( witness, script_sig) )
@@ -1111,10 +1082,7 @@ impl<Pk: MiniscriptKey> Descriptor<Pk> {
11111082 . push_slice ( & witness_script. to_v0_p2wsh ( ) [ ..] )
11121083 . into_script ( ) ;
11131084
1114- let mut witness = match smv. satisfy ( satisfier, to_pk_ctx) {
1115- Some ( wit) => wit,
1116- None => return Err ( Error :: CouldNotSatisfy ) ,
1117- } ;
1085+ let mut witness = smv. satisfy ( satisfier, to_pk_ctx) ?;
11181086 witness. push ( witness_script. into_bytes ( ) ) ;
11191087 Ok ( ( witness, script_sig) )
11201088 }
@@ -1556,7 +1524,11 @@ impl<Pk: MiniscriptKey, Ctx: ScriptContext> SortedMultiVec<Pk, Ctx> {
15561524
15571525 /// Attempt to produce a satisfying witness for the
15581526 /// witness script represented by the parse tree
1559- pub fn satisfy < ToPkCtx , S > ( & self , satisfier : S , to_pk_ctx : ToPkCtx ) -> Option < Vec < Vec < u8 > > >
1527+ pub fn satisfy < ToPkCtx , S > (
1528+ & self ,
1529+ satisfier : S ,
1530+ to_pk_ctx : ToPkCtx ,
1531+ ) -> Result < Vec < Vec < u8 > > , Error >
15601532 where
15611533 ToPkCtx : Copy ,
15621534 Pk : ToPublicKey < ToPkCtx > ,
0 commit comments