@@ -176,7 +176,13 @@ private static bool TryParseExpressions(ParsingContext ctx, [MaybeNullWhen(true)
176176 return TryParseExpression ( ctx , out error , out node ) ;
177177 }
178178 }
179- private static bool TryParsePubKeys < T > ( ParsingContext ctx , [ MaybeNullWhen ( true ) ] out MiniscriptError error , [ MaybeNullWhen ( false ) ] out MiniscriptNode node )
179+ private static bool TryParseCheckMultiSigPubKeys ( ParsingContext ctx , [ MaybeNullWhen ( true ) ] out MiniscriptError error , [ MaybeNullWhen ( false ) ] out MiniscriptNode node ) =>
180+ TryParsePubKeys < Value . PubKeyValue > ( ctx , FragmentDescriptor . MaxCheckMultiSigPubKeys , out error , out node ) ;
181+
182+ private static bool TryParsePubKeys < T > ( ParsingContext ctx , [ MaybeNullWhen ( true ) ] out MiniscriptError error , [ MaybeNullWhen ( false ) ] out MiniscriptNode node ) =>
183+ TryParsePubKeys < T > ( ctx , null , out error , out node ) ;
184+
185+ private static bool TryParsePubKeys < T > ( ParsingContext ctx , int ? maxPubKeys , [ MaybeNullWhen ( true ) ] out MiniscriptError error , [ MaybeNullWhen ( false ) ] out MiniscriptNode node )
180186 {
181187 node = null ;
182188 error = null ;
@@ -200,6 +206,12 @@ private static bool TryParsePubKeys<T>(ParsingContext ctx, [MaybeNullWhen(true)]
200206 }
201207 else
202208 {
209+ var parsedPubKeyCount = ctx . CurrentFrame . Parameters . Count - 1 ;
210+ if ( maxPubKeys is { } max && parsedPubKeyCount >= max )
211+ {
212+ error = new MiniscriptError . TooManyKeys ( ctx . Offset , max ) ;
213+ return false ;
214+ }
203215 if ( ctx . CurrentFrame . ExpectedParameterCount == ctx . CurrentFrame . Parameters . Count + 1 )
204216 ctx . CurrentFrame . ExpectedParameterCount = - 1 ;
205217 return TryParseKey ( ctx , out error , out node ) ;
@@ -556,8 +568,8 @@ private static bool TryParseExpression(ParsingContext ctx, [MaybeNullWhen(true)]
556568 "or_d" => TryParseParameters ( ctx , 2 , TryParseExpression , out error , out var p ) ? FragmentTwoParameters . or_d ( p [ 0 ] , p [ 1 ] ) : null ,
557569 "or_i" => TryParseParameters ( ctx , 2 , TryParseExpression , out error , out var p ) ? FragmentTwoParameters . or_i ( p [ 0 ] , p [ 1 ] ) : null ,
558570 "thresh" => TryParseParameters ( ctx , 1 , TryParseExpressions , out error , out var p ) ? FragmentUnboundedParameters . thresh ( p ) : null ,
559- "sortedmulti" => TryParseParameters ( ctx , 1 , TryParsePubKeys < Value . PubKeyValue > , out error , out var p ) ? FragmentUnboundedParameters . sortedmulti ( p ) : null ,
560- "multi" => TryParseParameters ( ctx , 1 , TryParsePubKeys < Value . PubKeyValue > , out error , out var p ) ? FragmentUnboundedParameters . multi ( p ) : null ,
571+ "sortedmulti" => TryParseParameters ( ctx , 1 , TryParseCheckMultiSigPubKeys , out error , out var p ) ? FragmentUnboundedParameters . sortedmulti ( p ) : null ,
572+ "multi" => TryParseParameters ( ctx , 1 , TryParseCheckMultiSigPubKeys , out error , out var p ) ? FragmentUnboundedParameters . multi ( p ) : null ,
561573 "multi_a" => ctx . Network . Consensus . SupportTaproot && TryParseParameters ( ctx , 1 , TryParsePubKeys < Value . TaprootPubKeyValue > , out error , out var p ) ? FragmentUnboundedParameters . multi_a ( p ) : null ,
562574 "sortedmulti_a" => ctx . Network . Consensus . SupportTaproot && TryParseParameters ( ctx , 1 , TryParsePubKeys < Value . TaprootPubKeyValue > , out error , out var p ) ? FragmentUnboundedParameters . sortedmulti_a ( p ) : null ,
563575 _ => null
@@ -924,6 +936,10 @@ public record TooManyParameters(int Index, int Expected) : MiniscriptError
924936 {
925937 public override string ToString ( ) => $ "Too many parameters at index { Index } , expected { Expected } ";
926938 }
939+ public record TooManyKeys ( int Index , int Maximum ) : MiniscriptError
940+ {
941+ public override string ToString ( ) => $ "Too many keys at index { Index } , maximum { Maximum } ";
942+ }
927943 public record TooFewParameters ( int Index , int Expected ) : MiniscriptError
928944 {
929945 public override string ToString ( ) => $ "Too few parameters at index { Index } , expected { Expected } ";
0 commit comments