@@ -447,66 +447,101 @@ fn fmt_derivation_paths(f: &mut fmt::Formatter, paths: &[bip32::DerivationPath])
447
447
Ok ( ( ) )
448
448
}
449
449
450
- impl FromStr for DescriptorPublicKey {
450
+ impl FromStr for DescriptorSinglePublicKey {
451
+ type Err = DescriptorKeyParseError ;
452
+
453
+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
454
+ let ( key_part, origin) = parse_key_origin ( s) ?;
455
+
456
+ let key = match key_part. len ( ) {
457
+ 64 => {
458
+ let x_only_key = XOnlyPublicKey :: from_str ( key_part)
459
+ . map_err ( |_| DescriptorKeyParseError ( "Error while parsing simple xonly key" ) ) ?;
460
+ SinglePubKey :: XOnly ( x_only_key)
461
+ }
462
+ 66 | 130 => {
463
+ if !( & key_part[ 0 ..2 ] == "02" || & key_part[ 0 ..2 ] == "03" || & key_part[ 0 ..2 ] == "04" )
464
+ {
465
+ return Err ( DescriptorKeyParseError (
466
+ "Only publickeys with prefixes 02/03/04 are allowed" ,
467
+ ) ) ;
468
+ }
469
+ let key = bitcoin:: PublicKey :: from_str ( key_part) . map_err ( |_| {
470
+ DescriptorKeyParseError ( "Error while parsing simple public key" )
471
+ } ) ?;
472
+ SinglePubKey :: FullKey ( key)
473
+ }
474
+ _ => {
475
+ return Err ( DescriptorKeyParseError (
476
+ "Public keys must be 64/66/130 characters in size" ,
477
+ ) )
478
+ }
479
+ } ;
480
+
481
+ Ok ( Self { key, origin } )
482
+ }
483
+ }
484
+
485
+ impl FromStr for DescriptorExtendedPublicKey {
451
486
type Err = DescriptorKeyParseError ;
452
487
453
488
fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
454
- // A "raw" public key without any origin is the least we accept.
455
- if s. len ( ) < 64 {
489
+ let ( key_part, origin) = parse_key_origin ( s) ?;
490
+
491
+ let ( xpub, derivation_paths, wildcard) =
492
+ parse_xkey_deriv :: < bip32:: ExtendedPubKey > ( key_part) ?;
493
+
494
+ if derivation_paths. len ( ) > 1 {
456
495
return Err ( DescriptorKeyParseError (
457
- "Key too short (<66 char), doesn't match any format " ,
496
+ "Multiple derivation paths are not allowed for single extended keys " ,
458
497
) ) ;
459
498
}
460
499
500
+ Ok ( Self {
501
+ origin,
502
+ xkey : xpub,
503
+ derivation_path : derivation_paths. into_iter ( ) . next ( ) . unwrap_or_default ( ) ,
504
+ wildcard,
505
+ } )
506
+ }
507
+ }
508
+
509
+ impl FromStr for DescriptorMultiExtendedPublicKey {
510
+ type Err = DescriptorKeyParseError ;
511
+
512
+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
461
513
let ( key_part, origin) = parse_key_origin ( s) ?;
462
514
463
- if key_part. contains ( "pub" ) {
464
- let ( xpub, derivation_paths, wildcard) =
465
- parse_xkey_deriv :: < bip32:: ExtendedPubKey > ( key_part) ?;
466
- if derivation_paths. len ( ) > 1 {
467
- Ok ( DescriptorPublicKey :: MultiXPub ( DescriptorMultiXKey {
468
- origin,
469
- xkey : xpub,
470
- derivation_paths : DerivPaths :: new ( derivation_paths) . expect ( "Not empty" ) ,
471
- wildcard,
472
- } ) )
515
+ let ( xpub, derivation_paths, wildcard) =
516
+ parse_xkey_deriv :: < bip32:: ExtendedPubKey > ( key_part) ?;
517
+
518
+ if derivation_paths. len ( ) < 2 {
519
+ return Err ( DescriptorKeyParseError (
520
+ "Multiple derivation paths are required for multi extended keys" ,
521
+ ) ) ;
522
+ }
523
+
524
+ Ok ( Self {
525
+ origin,
526
+ xkey : xpub,
527
+ derivation_paths : DerivPaths :: new ( derivation_paths) . expect ( "Not empty" ) ,
528
+ wildcard,
529
+ } )
530
+ }
531
+ }
532
+
533
+ impl FromStr for DescriptorPublicKey {
534
+ type Err = DescriptorKeyParseError ;
535
+
536
+ fn from_str ( s : & str ) -> Result < Self , Self :: Err > {
537
+ if s. contains ( "pub" ) {
538
+ if s. contains ( "<" ) {
539
+ DescriptorMultiExtendedPublicKey :: from_str ( s) . map ( Self :: MultiXPub )
473
540
} else {
474
- Ok ( DescriptorPublicKey :: XPub ( DescriptorXKey {
475
- origin,
476
- xkey : xpub,
477
- derivation_path : derivation_paths. into_iter ( ) . next ( ) . unwrap_or_default ( ) ,
478
- wildcard,
479
- } ) )
541
+ DescriptorExtendedPublicKey :: from_str ( s) . map ( Self :: XPub )
480
542
}
481
543
} else {
482
- let key = match key_part. len ( ) {
483
- 64 => {
484
- let x_only_key = XOnlyPublicKey :: from_str ( key_part) . map_err ( |_| {
485
- DescriptorKeyParseError ( "Error while parsing simple xonly key" )
486
- } ) ?;
487
- SinglePubKey :: XOnly ( x_only_key)
488
- }
489
- 66 | 130 => {
490
- if !( & key_part[ 0 ..2 ] == "02"
491
- || & key_part[ 0 ..2 ] == "03"
492
- || & key_part[ 0 ..2 ] == "04" )
493
- {
494
- return Err ( DescriptorKeyParseError (
495
- "Only publickeys with prefixes 02/03/04 are allowed" ,
496
- ) ) ;
497
- }
498
- let key = bitcoin:: PublicKey :: from_str ( key_part) . map_err ( |_| {
499
- DescriptorKeyParseError ( "Error while parsing simple public key" )
500
- } ) ?;
501
- SinglePubKey :: FullKey ( key)
502
- }
503
- _ => {
504
- return Err ( DescriptorKeyParseError (
505
- "Public keys must be 64/66/130 characters in size" ,
506
- ) )
507
- }
508
- } ;
509
- Ok ( DescriptorPublicKey :: Single ( SinglePub { key, origin } ) )
544
+ DescriptorSinglePublicKey :: from_str ( s) . map ( Self :: Single )
510
545
}
511
546
}
512
547
}
0 commit comments