@@ -26,6 +26,7 @@ use crate::miniscript::limits::{
26
26
MAX_SCRIPT_SIZE , MAX_STACK_SIZE , MAX_STANDARD_P2WSH_SCRIPT_SIZE ,
27
27
MAX_STANDARD_P2WSH_STACK_ITEMS ,
28
28
} ;
29
+ use crate :: miniscript:: musig_key:: KeyExpr ;
29
30
use crate :: miniscript:: types;
30
31
use crate :: prelude:: * ;
31
32
use crate :: util:: witness_to_scriptsig;
@@ -77,6 +78,8 @@ pub enum ScriptContextError {
77
78
CheckMultiSigLimitExceeded ,
78
79
/// MultiA is only allowed in post tapscript
79
80
MultiANotAllowed ,
81
+ /// Musig is only allowed in tapscript and taproot descriptors
82
+ MusigNotAllowed ( String ) ,
80
83
}
81
84
82
85
#[ cfg( feature = "std" ) ]
@@ -100,6 +103,7 @@ impl error::Error for ScriptContextError {
100
103
| TaprootMultiDisabled
101
104
| StackSizeLimitExceeded { .. }
102
105
| CheckMultiSigLimitExceeded
106
+ | MusigNotAllowed ( _)
103
107
| MultiANotAllowed => None ,
104
108
}
105
109
}
@@ -180,6 +184,9 @@ impl fmt::Display for ScriptContextError {
180
184
ScriptContextError :: MultiANotAllowed => {
181
185
write ! ( f, "Multi a(CHECKSIGADD) only allowed post tapscript" )
182
186
}
187
+ ScriptContextError :: MusigNotAllowed ( ref err) => {
188
+ write ! ( f, "Musig is only allowed in tapscript : err {}" , err)
189
+ }
183
190
}
184
191
}
185
192
}
@@ -334,6 +341,13 @@ where
334
341
/// 34 for Segwitv0, 33 for Tap
335
342
fn pk_len < Pk : MiniscriptKey > ( pk : & Pk ) -> usize ;
336
343
344
+ /// Get the len of the keyexpr
345
+ fn key_expr_len < Pk : MiniscriptKey > ( pk : & KeyExpr < Pk > ) -> usize {
346
+ match pk {
347
+ KeyExpr :: SingleKey ( pk) => Self :: pk_len ( pk) ,
348
+ KeyExpr :: MuSig ( _) => 33 ,
349
+ }
350
+ }
337
351
/// Local helper function to display error messages with context
338
352
fn name_str ( ) -> & ' static str ;
339
353
}
@@ -384,12 +398,21 @@ impl ScriptContext for Legacy {
384
398
}
385
399
386
400
match ms. node {
387
- Terminal :: PkK ( ref key) if key. is_x_only_key ( ) => {
388
- return Err ( ScriptContextError :: XOnlyKeysNotAllowed (
389
- key. to_string ( ) ,
390
- Self :: name_str ( ) ,
391
- ) )
392
- }
401
+ Terminal :: PkK ( ref key) => match key {
402
+ KeyExpr :: < Pk > :: SingleKey ( pk) => {
403
+ if pk. is_x_only_key ( ) {
404
+ return Err ( ScriptContextError :: XOnlyKeysNotAllowed (
405
+ pk. to_string ( ) ,
406
+ Self :: name_str ( ) ,
407
+ ) ) ;
408
+ }
409
+ }
410
+ KeyExpr :: < Pk > :: MuSig ( _) => {
411
+ return Err ( ScriptContextError :: MusigNotAllowed ( String :: from (
412
+ Self :: name_str ( ) ,
413
+ ) ) )
414
+ }
415
+ } ,
393
416
Terminal :: Multi ( _k, ref pks) => {
394
417
if pks. len ( ) > MAX_PUBKEYS_PER_MULTISIG {
395
418
return Err ( ScriptContextError :: CheckMultiSigLimitExceeded ) ;
@@ -490,17 +513,24 @@ impl ScriptContext for Segwitv0 {
490
513
}
491
514
492
515
match ms. node {
493
- Terminal :: PkK ( ref pk) => {
494
- if pk. is_uncompressed ( ) {
495
- return Err ( ScriptContextError :: CompressedOnly ( pk. to_string ( ) ) ) ;
496
- } else if pk. is_x_only_key ( ) {
497
- return Err ( ScriptContextError :: XOnlyKeysNotAllowed (
498
- pk. to_string ( ) ,
516
+ Terminal :: PkK ( ref key) => match key {
517
+ KeyExpr :: < Pk > :: SingleKey ( pk) => {
518
+ if pk. is_uncompressed ( ) {
519
+ return Err ( ScriptContextError :: CompressedOnly ( pk. to_string ( ) ) ) ;
520
+ } else if pk. is_x_only_key ( ) {
521
+ return Err ( ScriptContextError :: XOnlyKeysNotAllowed (
522
+ pk. to_string ( ) ,
523
+ Self :: name_str ( ) ,
524
+ ) ) ;
525
+ }
526
+ Ok ( ( ) )
527
+ }
528
+ KeyExpr :: < Pk > :: MuSig ( _) => {
529
+ return Err ( ScriptContextError :: MusigNotAllowed ( String :: from (
499
530
Self :: name_str ( ) ,
500
- ) ) ;
531
+ ) ) ) ;
501
532
}
502
- Ok ( ( ) )
503
- }
533
+ } ,
504
534
Terminal :: Multi ( _k, ref pks) => {
505
535
if pks. len ( ) > MAX_PUBKEYS_PER_MULTISIG {
506
536
return Err ( ScriptContextError :: CheckMultiSigLimitExceeded ) ;
@@ -618,13 +648,24 @@ impl ScriptContext for Tap {
618
648
}
619
649
620
650
match ms. node {
621
- Terminal :: PkK ( ref pk) => {
622
- if pk. is_uncompressed ( ) {
623
- return Err ( ScriptContextError :: UncompressedKeysNotAllowed ) ;
651
+ Terminal :: PkK ( ref key) => {
652
+ if key. iter ( ) . any ( |pk| pk. is_uncompressed ( ) ) {
653
+ Err ( ScriptContextError :: UncompressedKeysNotAllowed )
654
+ } else {
655
+ Ok ( ( ) )
624
656
}
625
- Ok ( ( ) )
626
657
}
627
658
Terminal :: Multi ( ..) => Err ( ScriptContextError :: TaprootMultiDisabled ) ,
659
+ Terminal :: MultiA ( _, ref keys) => {
660
+ if keys
661
+ . iter ( )
662
+ . all ( |keyexpr| keyexpr. iter ( ) . any ( |pk| pk. is_uncompressed ( ) ) )
663
+ {
664
+ Err ( ScriptContextError :: UncompressedKeysNotAllowed )
665
+ } else {
666
+ Ok ( ( ) )
667
+ }
668
+ }
628
669
_ => Ok ( ( ) ) ,
629
670
}
630
671
}
@@ -712,11 +753,23 @@ impl ScriptContext for BareCtx {
712
753
return Err ( ScriptContextError :: MaxWitnessScriptSizeExceeded ) ;
713
754
}
714
755
match ms. node {
715
- Terminal :: PkK ( ref key) if key. is_x_only_key ( ) => {
716
- return Err ( ScriptContextError :: XOnlyKeysNotAllowed (
717
- key. to_string ( ) ,
718
- Self :: name_str ( ) ,
719
- ) )
756
+ Terminal :: PkK ( ref key) => {
757
+ match key {
758
+ KeyExpr :: < Pk > :: SingleKey ( pk) => {
759
+ if pk. is_x_only_key ( ) {
760
+ return Err ( ScriptContextError :: XOnlyKeysNotAllowed (
761
+ key. to_string ( ) ,
762
+ Self :: name_str ( ) ,
763
+ ) ) ;
764
+ }
765
+ }
766
+ KeyExpr :: < Pk > :: MuSig ( _) => {
767
+ return Err ( ScriptContextError :: MusigNotAllowed ( String :: from (
768
+ Self :: name_str ( ) ,
769
+ ) ) )
770
+ }
771
+ }
772
+ Ok ( ( ) )
720
773
}
721
774
Terminal :: Multi ( _k, ref pks) => {
722
775
if pks. len ( ) > MAX_PUBKEYS_PER_MULTISIG {
@@ -753,7 +806,13 @@ impl ScriptContext for BareCtx {
753
806
match & ms. node {
754
807
Terminal :: Check ( ref ms) => match & ms. node {
755
808
Terminal :: RawPkH ( _pkh) => Ok ( ( ) ) ,
756
- Terminal :: PkK ( _pk) | Terminal :: PkH ( _pk) => Ok ( ( ) ) ,
809
+ Terminal :: PkH ( _pk) => Ok ( ( ) ) ,
810
+ Terminal :: PkK ( key) => match key {
811
+ KeyExpr :: < Pk > :: SingleKey ( _pk) => Ok ( ( ) ) ,
812
+ KeyExpr :: < Pk > :: MuSig ( _) => Err ( Error :: ContextError (
813
+ ScriptContextError :: MusigNotAllowed ( String :: from ( Self :: name_str ( ) ) ) ,
814
+ ) ) ,
815
+ } ,
757
816
_ => Err ( Error :: NonStandardBareScript ) ,
758
817
} ,
759
818
Terminal :: Multi ( _k, subs) if subs. len ( ) <= 3 => Ok ( ( ) ) ,
0 commit comments