@@ -26,6 +26,7 @@ use crate::miniscript::limits::{
2626 MAX_SCRIPT_SIZE , MAX_STACK_SIZE , MAX_STANDARD_P2WSH_SCRIPT_SIZE ,
2727 MAX_STANDARD_P2WSH_STACK_ITEMS ,
2828} ;
29+ use crate :: miniscript:: musig_key:: KeyExpr ;
2930use crate :: miniscript:: types;
3031use crate :: prelude:: * ;
3132use crate :: util:: witness_to_scriptsig;
@@ -77,6 +78,8 @@ pub enum ScriptContextError {
7778 CheckMultiSigLimitExceeded ,
7879 /// MultiA is only allowed in post tapscript
7980 MultiANotAllowed ,
81+ /// Musig is only allowed in tapscript and taproot descriptors
82+ MusigNotAllowed ( String ) ,
8083}
8184
8285#[ cfg( feature = "std" ) ]
@@ -100,6 +103,7 @@ impl error::Error for ScriptContextError {
100103 | TaprootMultiDisabled
101104 | StackSizeLimitExceeded { .. }
102105 | CheckMultiSigLimitExceeded
106+ | MusigNotAllowed ( _)
103107 | MultiANotAllowed => None ,
104108 }
105109 }
@@ -180,6 +184,9 @@ impl fmt::Display for ScriptContextError {
180184 ScriptContextError :: MultiANotAllowed => {
181185 write ! ( f, "Multi a(CHECKSIGADD) only allowed post tapscript" )
182186 }
187+ ScriptContextError :: MusigNotAllowed ( ref err) => {
188+ write ! ( f, "Musig is only allowed in tapscript : err {}" , err)
189+ }
183190 }
184191 }
185192}
@@ -334,6 +341,13 @@ where
334341 /// 34 for Segwitv0, 33 for Tap
335342 fn pk_len < Pk : MiniscriptKey > ( pk : & Pk ) -> usize ;
336343
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+ }
337351 /// Local helper function to display error messages with context
338352 fn name_str ( ) -> & ' static str ;
339353}
@@ -384,12 +398,21 @@ impl ScriptContext for Legacy {
384398 }
385399
386400 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+ } ,
393416 Terminal :: Multi ( _k, ref pks) => {
394417 if pks. len ( ) > MAX_PUBKEYS_PER_MULTISIG {
395418 return Err ( ScriptContextError :: CheckMultiSigLimitExceeded ) ;
@@ -490,17 +513,24 @@ impl ScriptContext for Segwitv0 {
490513 }
491514
492515 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 (
499530 Self :: name_str ( ) ,
500- ) ) ;
531+ ) ) ) ;
501532 }
502- Ok ( ( ) )
503- }
533+ } ,
504534 Terminal :: Multi ( _k, ref pks) => {
505535 if pks. len ( ) > MAX_PUBKEYS_PER_MULTISIG {
506536 return Err ( ScriptContextError :: CheckMultiSigLimitExceeded ) ;
@@ -618,13 +648,24 @@ impl ScriptContext for Tap {
618648 }
619649
620650 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 ( ( ) )
624656 }
625- Ok ( ( ) )
626657 }
627658 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+ }
628669 _ => Ok ( ( ) ) ,
629670 }
630671 }
@@ -712,11 +753,23 @@ impl ScriptContext for BareCtx {
712753 return Err ( ScriptContextError :: MaxWitnessScriptSizeExceeded ) ;
713754 }
714755 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 ( ( ) )
720773 }
721774 Terminal :: Multi ( _k, ref pks) => {
722775 if pks. len ( ) > MAX_PUBKEYS_PER_MULTISIG {
@@ -753,7 +806,13 @@ impl ScriptContext for BareCtx {
753806 match & ms. node {
754807 Terminal :: Check ( ref ms) => match & ms. node {
755808 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+ } ,
757816 _ => Err ( Error :: NonStandardBareScript ) ,
758817 } ,
759818 Terminal :: Multi ( _k, subs) if subs. len ( ) <= 3 => Ok ( ( ) ) ,
0 commit comments