@@ -26,7 +26,7 @@ use crate::miniscript::{Legacy, Miniscript, Segwitv0};
26
26
use crate :: prelude:: * ;
27
27
use crate :: {
28
28
expression, hash256, miniscript, BareCtx , Error , ForEachKey , MiniscriptKey , Satisfier ,
29
- ToPublicKey , TranslatePk , Translator ,
29
+ ToPublicKey , TranslateErr , TranslatePk , Translator ,
30
30
} ;
31
31
32
32
mod bare;
@@ -519,7 +519,7 @@ where
519
519
type Output = Descriptor < Q > ;
520
520
521
521
/// 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 > >
523
523
where
524
524
T : Translator < P , Q , E > ,
525
525
{
@@ -584,7 +584,10 @@ impl Descriptor<DescriptorPublicKey> {
584
584
585
585
translate_hash_clone ! ( DescriptorPublicKey , DescriptorPublicKey , ConversionError ) ;
586
586
}
587
- self . translate_pk ( & mut Derivator ( index) )
587
+ self . translate_pk ( & mut Derivator ( index) ) . map_err ( |e| {
588
+ e. try_into_translator_err ( )
589
+ . expect ( "No Context errors while translating" )
590
+ } )
588
591
}
589
592
590
593
#[ deprecated( note = "use at_derivation_index instead" ) ]
@@ -697,9 +700,13 @@ impl Descriptor<DescriptorPublicKey> {
697
700
}
698
701
699
702
let descriptor = Descriptor :: < String > :: from_str ( s) ?;
700
- let descriptor = descriptor
701
- . translate_pk ( & mut keymap_pk)
702
- . map_err ( |e| Error :: Unexpected ( e. to_string ( ) ) ) ?;
703
+ let descriptor = descriptor. translate_pk ( & mut keymap_pk) . map_err ( |e| {
704
+ Error :: Unexpected (
705
+ e. try_into_translator_err ( )
706
+ . expect ( "No Outer context errors" )
707
+ . to_string ( ) ,
708
+ )
709
+ } ) ?;
703
710
704
711
Ok ( ( descriptor, keymap_pk. 0 ) )
705
712
}
@@ -826,49 +833,16 @@ impl Descriptor<DescriptorPublicKey> {
826
833
827
834
for ( i, desc) in descriptors. iter_mut ( ) . enumerate ( ) {
828
835
let mut index_choser = IndexChoser ( i) ;
829
- * desc = desc. translate_pk ( & mut index_choser) ?;
836
+ * desc = desc. translate_pk ( & mut index_choser) . map_err ( |e| {
837
+ e. try_into_translator_err ( )
838
+ . expect ( "No Context errors possible" )
839
+ } ) ?;
830
840
}
831
841
832
842
Ok ( descriptors)
833
843
}
834
844
}
835
845
836
- impl < Pk : MiniscriptKey > Descriptor < Pk > {
837
- /// Whether this descriptor is a multipath descriptor that contains any 2 multipath keys
838
- /// with a different number of derivation paths.
839
- /// Such a descriptor is invalid according to BIP389.
840
- pub fn multipath_length_mismatch ( & self ) -> bool {
841
- // (Ab)use `for_each_key` to record the number of derivation paths a multipath key has.
842
- #[ derive( PartialEq ) ]
843
- enum MultipathLenChecker {
844
- SinglePath ,
845
- MultipathLen ( usize ) ,
846
- LenMismatch ,
847
- }
848
-
849
- let mut checker = MultipathLenChecker :: SinglePath ;
850
- self . for_each_key ( |key| {
851
- match key. num_der_paths ( ) {
852
- 0 | 1 => { }
853
- n => match checker {
854
- MultipathLenChecker :: SinglePath => {
855
- checker = MultipathLenChecker :: MultipathLen ( n) ;
856
- }
857
- MultipathLenChecker :: MultipathLen ( len) => {
858
- if len != n {
859
- checker = MultipathLenChecker :: LenMismatch ;
860
- }
861
- }
862
- MultipathLenChecker :: LenMismatch => { }
863
- } ,
864
- }
865
- true
866
- } ) ;
867
-
868
- checker == MultipathLenChecker :: LenMismatch
869
- }
870
- }
871
-
872
846
impl Descriptor < DefiniteDescriptorKey > {
873
847
/// Convert all the public keys in the descriptor to [`bitcoin::PublicKey`] by deriving them or
874
848
/// otherwise converting them. All [`bitcoin::secp256k1::XOnlyPublicKey`]s are converted to by adding a
@@ -912,8 +886,14 @@ impl Descriptor<DefiniteDescriptorKey> {
912
886
translate_hash_clone ! ( DefiniteDescriptorKey , bitcoin:: PublicKey , ConversionError ) ;
913
887
}
914
888
915
- let derived = self . translate_pk ( & mut Derivator ( secp) ) ?;
916
- Ok ( derived)
889
+ let derived = self . translate_pk ( & mut Derivator ( secp) ) ;
890
+ match derived {
891
+ Ok ( derived) => Ok ( derived) ,
892
+ Err ( e) => match e. try_into_translator_err ( ) {
893
+ Ok ( e) => Err ( e) ,
894
+ Err ( _) => unreachable ! ( "No Context errors when deriving keys" ) ,
895
+ } ,
896
+ }
917
897
}
918
898
}
919
899
@@ -947,10 +927,6 @@ impl_from_str!(
947
927
expression:: FromTree :: from_tree( & top)
948
928
} ?;
949
929
950
- if desc. multipath_length_mismatch( ) {
951
- return Err ( Error :: MultipathDescLenMismatch ) ;
952
- }
953
-
954
930
Ok ( desc)
955
931
}
956
932
) ;
@@ -1995,7 +1971,6 @@ pk(03f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8))";
1995
1971
// We can parse a multipath descriptors, and make it into separate single-path descriptors.
1996
1972
let desc = Descriptor :: from_str ( "wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/<7';8h;20>/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/4567/<0;1;987>/*)))" ) . unwrap ( ) ;
1997
1973
assert ! ( desc. is_multipath( ) ) ;
1998
- assert ! ( !desc. multipath_length_mismatch( ) ) ;
1999
1974
assert_eq ! ( desc. into_single_descriptors( ) . unwrap( ) , vec![
2000
1975
Descriptor :: from_str( "wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/7'/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/4567/0/*)))" ) . unwrap( ) ,
2001
1976
Descriptor :: from_str( "wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/8h/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/4567/1/*)))" ) . unwrap( ) ,
@@ -2005,7 +1980,6 @@ pk(03f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8))";
2005
1980
// Even if only one of the keys is multipath.
2006
1981
let desc = Descriptor :: from_str ( "wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/<0;1>/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/4567/*)))" ) . unwrap ( ) ;
2007
1982
assert ! ( desc. is_multipath( ) ) ;
2008
- assert ! ( !desc. multipath_length_mismatch( ) ) ;
2009
1983
assert_eq ! ( desc. into_single_descriptors( ) . unwrap( ) , vec![
2010
1984
Descriptor :: from_str( "wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/0/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/4567/*)))" ) . unwrap( ) ,
2011
1985
Descriptor :: from_str( "wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/1/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/4567/*)))" ) . unwrap( ) ,
@@ -2014,7 +1988,6 @@ pk(03f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8))";
2014
1988
// We can detect regular single-path descriptors.
2015
1989
let notmulti_desc = Descriptor :: from_str ( "wsh(andor(pk(tpubDEN9WSToTyy9ZQfaYqSKfmVqmq1VVLNtYfj3Vkqh67et57eJ5sTKZQBkHqSwPUsoSskJeaYnPttHe2VrkCsKA27kUaN9SDc5zhqeLzKa1rr/0'/*),older(10000),pk(tpubD8LYfn6njiA2inCoxwM7EuN3cuLVcaHAwLYeups13dpevd3nHLRdK9NdQksWXrhLQVxcUZRpnp5CkJ1FhE61WRAsHxDNAkvGkoQkAeWDYjV/8/4567/*)))" ) . unwrap ( ) ;
2016
1990
assert ! ( !notmulti_desc. is_multipath( ) ) ;
2017
- assert ! ( !notmulti_desc. multipath_length_mismatch( ) ) ;
2018
1991
assert_eq ! (
2019
1992
notmulti_desc. clone( ) . into_single_descriptors( ) . unwrap( ) ,
2020
1993
vec![ notmulti_desc]
@@ -2031,7 +2004,7 @@ pk(03f28773c2d975288bc7d1d205c3748651b075fbc6610e58cddeeddf8f19405aa8))";
2031
2004
"02015e4cb53458bf813db8c79968e76e10d13ed6426a23fa71c2f41ba021c2a7ab" ,
2032
2005
)
2033
2006
. unwrap ( ) ;
2034
- let x_only_key = bitcoin:: XOnlyPublicKey :: from_str (
2007
+ let x_only_key = bitcoin:: secp256k1 :: XOnlyPublicKey :: from_str (
2035
2008
"015e4cb53458bf813db8c79968e76e10d13ed6426a23fa71c2f41ba021c2a7ab" ,
2036
2009
)
2037
2010
. unwrap ( ) ;
0 commit comments