@@ -485,12 +485,25 @@ func (msg MsgPinCodes) GetSignBytes() []byte {
485485 return sdk .MustSortJSON (ModuleCdc .MustMarshalJSON (& msg ))
486486}
487487
488+ const maxCodeIDTotal = 50
489+
488490func (msg MsgPinCodes ) ValidateBasic () error {
489491 if _ , err := sdk .AccAddressFromBech32 (msg .Authority ); err != nil {
490492 return errorsmod .Wrap (err , "authority" )
491493 }
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 :
493501 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" )
494507 }
495508 return nil
496509}
@@ -519,10 +532,7 @@ func (msg MsgUnpinCodes) ValidateBasic() error {
519532 if _ , err := sdk .AccAddressFromBech32 (msg .Authority ); err != nil {
520533 return errorsmod .Wrap (err , "authority" )
521534 }
522- if len (msg .CodeIDs ) == 0 {
523- return errorsmod .Wrap (sdkerrors .ErrInvalidRequest , "empty code ids" )
524- }
525- return nil
535+ return validateCodeIDs (msg .CodeIDs )
526536}
527537
528538func (msg MsgSudoContract ) Route () string {
@@ -684,6 +694,7 @@ func (msg MsgRemoveCodeUploadParamsAddresses) ValidateBasic() error {
684694func checkDuplicatedAddresses (addresses []string ) error {
685695 index := map [string ]struct {}{}
686696 for _ , addr := range addresses {
697+ addr = strings .ToUpper (addr )
687698 if _ , err := sdk .AccAddressFromBech32 (addr ); err != nil {
688699 return errorsmod .Wrap (err , "addresses" )
689700 }
@@ -739,3 +750,15 @@ func (msg MsgStoreAndMigrateContract) ValidateBasic() error {
739750 }
740751 return nil
741752}
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