@@ -26,7 +26,7 @@ use crate::miniscript::{Legacy, Miniscript, Segwitv0};
2626use crate :: prelude:: * ;
2727use crate :: {
2828 expression, hash256, miniscript, BareCtx , Error , ForEachKey , MiniscriptKey , Satisfier ,
29- ToPublicKey , TranslatePk , Translator ,
29+ ToPublicKey , TranslateErr , TranslatePk , Translator ,
3030} ;
3131
3232mod bare;
@@ -519,7 +519,7 @@ where
519519 type Output = Descriptor < Q > ;
520520
521521 /// Converts a descriptor using abstract keys to one using specific keys.
522- fn translate_pk < T , E > ( & self , t : & mut T ) -> Result < Self :: Output , E >
522+ fn translate_pk < T , E > ( & self , t : & mut T ) -> Result < Self :: Output , TranslateErr < E > >
523523 where
524524 T : Translator < P , Q , E > ,
525525 {
@@ -581,7 +581,10 @@ impl Descriptor<DescriptorPublicKey> {
581581
582582 translate_hash_clone ! ( DescriptorPublicKey , DescriptorPublicKey , ConversionError ) ;
583583 }
584- self . translate_pk ( & mut Derivator ( index) )
584+ self . translate_pk ( & mut Derivator ( index) ) . map_err ( |e| {
585+ e. try_into_translator_err ( )
586+ . expect ( "No Context errors while translating" )
587+ } )
585588 }
586589
587590 #[ deprecated( note = "use at_derivation_index instead" ) ]
@@ -694,9 +697,13 @@ impl Descriptor<DescriptorPublicKey> {
694697 }
695698
696699 let descriptor = Descriptor :: < String > :: from_str ( s) ?;
697- let descriptor = descriptor
698- . translate_pk ( & mut keymap_pk)
699- . map_err ( |e| Error :: Unexpected ( e. to_string ( ) ) ) ?;
700+ let descriptor = descriptor. translate_pk ( & mut keymap_pk) . map_err ( |e| {
701+ Error :: Unexpected (
702+ e. try_into_translator_err ( )
703+ . expect ( "No Outer context errors" )
704+ . to_string ( ) ,
705+ )
706+ } ) ?;
700707
701708 Ok ( ( descriptor, keymap_pk. 0 ) )
702709 }
@@ -823,49 +830,16 @@ impl Descriptor<DescriptorPublicKey> {
823830
824831 for ( i, desc) in descriptors. iter_mut ( ) . enumerate ( ) {
825832 let mut index_choser = IndexChoser ( i) ;
826- * desc = desc. translate_pk ( & mut index_choser) ?;
833+ * desc = desc. translate_pk ( & mut index_choser) . map_err ( |e| {
834+ e. try_into_translator_err ( )
835+ . expect ( "No Context errors possible" )
836+ } ) ?;
827837 }
828838
829839 Ok ( descriptors)
830840 }
831841}
832842
833- impl < Pk : MiniscriptKey > Descriptor < Pk > {
834- /// Whether this descriptor is a multipath descriptor that contains any 2 multipath keys
835- /// with a different number of derivation paths.
836- /// Such a descriptor is invalid according to BIP389.
837- pub fn multipath_length_mismatch ( & self ) -> bool {
838- // (Ab)use `for_each_key` to record the number of derivation paths a multipath key has.
839- #[ derive( PartialEq ) ]
840- enum MultipathLenChecker {
841- SinglePath ,
842- MultipathLen ( usize ) ,
843- LenMismatch ,
844- }
845-
846- let mut checker = MultipathLenChecker :: SinglePath ;
847- self . for_each_key ( |key| {
848- match key. num_der_paths ( ) {
849- 0 | 1 => { }
850- n => match checker {
851- MultipathLenChecker :: SinglePath => {
852- checker = MultipathLenChecker :: MultipathLen ( n) ;
853- }
854- MultipathLenChecker :: MultipathLen ( len) => {
855- if len != n {
856- checker = MultipathLenChecker :: LenMismatch ;
857- }
858- }
859- MultipathLenChecker :: LenMismatch => { }
860- } ,
861- }
862- true
863- } ) ;
864-
865- checker == MultipathLenChecker :: LenMismatch
866- }
867- }
868-
869843impl Descriptor < DefiniteDescriptorKey > {
870844 /// Convert all the public keys in the descriptor to [`bitcoin::PublicKey`] by deriving them or
871845 /// otherwise converting them. All [`bitcoin::secp256k1::XOnlyPublicKey`]s are converted to by adding a
@@ -909,8 +883,14 @@ impl Descriptor<DefiniteDescriptorKey> {
909883 translate_hash_clone ! ( DefiniteDescriptorKey , bitcoin:: PublicKey , ConversionError ) ;
910884 }
911885
912- let derived = self . translate_pk ( & mut Derivator ( secp) ) ?;
913- Ok ( derived)
886+ let derived = self . translate_pk ( & mut Derivator ( secp) ) ;
887+ match derived {
888+ Ok ( derived) => Ok ( derived) ,
889+ Err ( e) => match e. try_into_translator_err ( ) {
890+ Ok ( e) => Err ( e) ,
891+ Err ( _) => unreachable ! ( "No Context errors when deriving keys" ) ,
892+ } ,
893+ }
914894 }
915895}
916896
@@ -944,10 +924,6 @@ impl_from_str!(
944924 expression:: FromTree :: from_tree( & top)
945925 } ?;
946926
947- if desc. multipath_length_mismatch( ) {
948- return Err ( Error :: MultipathDescLenMismatch ) ;
949- }
950-
951927 Ok ( desc)
952928 }
953929) ;
@@ -1992,7 +1968,6 @@ pk(03f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8))";
19921968 // We can parse a multipath descriptors, and make it into separate single-path descriptors.
19931969 let desc = Descriptor :: from_str ( "wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/<7';8h;20>/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/4567/<0;1;987>/*)))" ) . unwrap ( ) ;
19941970 assert ! ( desc. is_multipath( ) ) ;
1995- assert ! ( !desc. multipath_length_mismatch( ) ) ;
19961971 assert_eq ! ( desc. into_single_descriptors( ) . unwrap( ) , vec![
19971972 Descriptor :: from_str( "wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/7'/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/4567/0/*)))" ) . unwrap( ) ,
19981973 Descriptor :: from_str( "wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/8h/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/4567/1/*)))" ) . unwrap( ) ,
@@ -2002,7 +1977,6 @@ pk(03f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8))";
20021977 // Even if only one of the keys is multipath.
20031978 let desc = Descriptor :: from_str ( "wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/<0;1>/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/4567/*)))" ) . unwrap ( ) ;
20041979 assert ! ( desc. is_multipath( ) ) ;
2005- assert ! ( !desc. multipath_length_mismatch( ) ) ;
20061980 assert_eq ! ( desc. into_single_descriptors( ) . unwrap( ) , vec![
20071981 Descriptor :: from_str( "wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/0/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/4567/*)))" ) . unwrap( ) ,
20081982 Descriptor :: from_str( "wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/1/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/4567/*)))" ) . unwrap( ) ,
@@ -2011,7 +1985,6 @@ pk(03f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8))";
20111985 // We can detect regular single-path descriptors.
20121986 let notmulti_desc = Descriptor :: from_str ( "wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/4567/*)))" ) . unwrap ( ) ;
20131987 assert ! ( !notmulti_desc. is_multipath( ) ) ;
2014- assert ! ( !notmulti_desc. multipath_length_mismatch( ) ) ;
20151988 assert_eq ! (
20161989 notmulti_desc. clone( ) . into_single_descriptors( ) . unwrap( ) ,
20171990 vec![ notmulti_desc]
0 commit comments