@@ -485,12 +485,25 @@ func (msg MsgPinCodes) GetSignBytes() []byte {
485
485
return sdk .MustSortJSON (ModuleCdc .MustMarshalJSON (& msg ))
486
486
}
487
487
488
+ const maxCodeIDTotal = 50
489
+
488
490
func (msg MsgPinCodes ) ValidateBasic () error {
489
491
if _ , err := sdk .AccAddressFromBech32 (msg .Authority ); err != nil {
490
492
return errorsmod .Wrap (err , "authority" )
491
493
}
492
- if len (msg .CodeIDs ) == 0 {
494
+ return validateCodeIDs (msg .CodeIDs )
495
+ }
496
+
497
+ // ensure not empty, not duplicates and not exceeding max number
498
+ func validateCodeIDs (codeIDs []uint64 ) error {
499
+ switch n := len (codeIDs ); {
500
+ case n == 0 :
493
501
return errorsmod .Wrap (sdkerrors .ErrInvalidRequest , "empty code ids" )
502
+ case n > maxCodeIDTotal :
503
+ return errorsmod .Wrapf (sdkerrors .ErrInvalidRequest , "total number of code ids is greater than %d" , maxCodeIDTotal )
504
+ }
505
+ if hasDuplicates (codeIDs ) {
506
+ return errorsmod .Wrap (sdkerrors .ErrInvalidRequest , "duplicate code ids" )
494
507
}
495
508
return nil
496
509
}
@@ -519,10 +532,7 @@ func (msg MsgUnpinCodes) ValidateBasic() error {
519
532
if _ , err := sdk .AccAddressFromBech32 (msg .Authority ); err != nil {
520
533
return errorsmod .Wrap (err , "authority" )
521
534
}
522
- if len (msg .CodeIDs ) == 0 {
523
- return errorsmod .Wrap (sdkerrors .ErrInvalidRequest , "empty code ids" )
524
- }
525
- return nil
535
+ return validateCodeIDs (msg .CodeIDs )
526
536
}
527
537
528
538
func (msg MsgSudoContract ) Route () string {
@@ -684,6 +694,7 @@ func (msg MsgRemoveCodeUploadParamsAddresses) ValidateBasic() error {
684
694
func checkDuplicatedAddresses (addresses []string ) error {
685
695
index := map [string ]struct {}{}
686
696
for _ , addr := range addresses {
697
+ addr = strings .ToUpper (addr )
687
698
if _ , err := sdk .AccAddressFromBech32 (addr ); err != nil {
688
699
return errorsmod .Wrap (err , "addresses" )
689
700
}
@@ -739,3 +750,15 @@ func (msg MsgStoreAndMigrateContract) ValidateBasic() error {
739
750
}
740
751
return nil
741
752
}
753
+
754
+ // returns true when slice contains any duplicates
755
+ func hasDuplicates [T comparable ](s []T ) bool {
756
+ index := make (map [T ]struct {}, len (s ))
757
+ for _ , v := range s {
758
+ if _ , exists := index [v ]; exists {
759
+ return true
760
+ }
761
+ index [v ] = struct {}{}
762
+ }
763
+ return false
764
+ }
0 commit comments