func (msg VoteValidatorMsg) ValidateBasic() sdk.Error {
	if !msg.Username.IsValid() {
		return ErrInvalidUsername()
	}
	if len(msg.VotedValidators) > types.MaxVotedValidators ||
		len(msg.VotedValidators) == 0 {
		return ErrInvalidVotedValidators()
	}
	for _, val := range msg.VotedValidators {
		if !val.IsValid() {
			return ErrInvalidVotedValidators()
		}
	}
	return nil
}
ValidateBasic - implement sdk.Msg
package types
import (
	"fmt"
	sdk "github.com/cosmos/cosmos-sdk/types"
	"github.com/tendermint/tendermint/crypto"
	"github.com/lino-network/lino/types"
)
var _ types.Msg = ValidatorRegisterMsg{}
var _ types.Msg = ValidatorRevokeMsg{}
var _ types.Msg = VoteValidatorMsg{}
var _ types.Msg = ValidatorUpdateMsg{}
type ValidatorRegisterMsg struct {
	Username  types.AccountKey `json:"username"`
	ValPubKey crypto.PubKey    `json:"validator_public_key"`
	Link      string           `json:"link"`
}
func NewValidatorRegisterMsg(validator string, pubKey crypto.PubKey, link string) ValidatorRegisterMsg {
	return ValidatorRegisterMsg{
		Username:  types.AccountKey(validator),
		ValPubKey: pubKey,
		Link:      link,
	}
}
func (msg ValidatorRegisterMsg) Route() string { return RouterKey }
func (msg ValidatorRegisterMsg) Type() string { return "ValidatorRegisterMsg" }
func (msg ValidatorRegisterMsg) ValidateBasic() sdk.Error {
	if !msg.Username.IsValid() {
		return ErrInvalidUsername()
	}
	if len(msg.Link) > types.MaximumLinkURL {
		return ErrInvalidWebsite()
	}
	return nil
}
func (msg ValidatorRegisterMsg) String() string {
	return fmt.Sprintf("ValidatorRegisterMsg{Username:%v, PubKey:%v}", msg.Username, msg.ValPubKey)
}
func (msg ValidatorRegisterMsg) GetPermission() types.Permission {
	return types.TransactionPermission
}
func (msg ValidatorRegisterMsg) GetSignBytes() []byte {
	return getSignBytes(msg)
}
func (msg ValidatorRegisterMsg) GetSigners() []sdk.AccAddress {
	return []sdk.AccAddress{sdk.AccAddress(msg.Username)}
}
func (msg ValidatorRegisterMsg) GetConsumeAmount() types.Coin {
	return types.NewCoinFromInt64(0)
}
type ValidatorRevokeMsg struct {
	Username types.AccountKey `json:"username"`
}
func NewValidatorRevokeMsg(validator string) ValidatorRevokeMsg {
	return ValidatorRevokeMsg{
		Username: types.AccountKey(validator),
	}
}
func (msg ValidatorRevokeMsg) Route() string { return RouterKey }
func (msg ValidatorRevokeMsg) Type() string { return "ValidatorRevokeMsg" }
func (msg ValidatorRevokeMsg) ValidateBasic() sdk.Error {
	if !msg.Username.IsValid() {
		return ErrInvalidUsername()
	}
	return nil
}
func (msg ValidatorRevokeMsg) String() string {
	return fmt.Sprintf("ValidatorRevokeMsg{Username:%v}", msg.Username)
}
func (msg ValidatorRevokeMsg) GetPermission() types.Permission {
	return types.TransactionPermission
}
func (msg ValidatorRevokeMsg) GetSignBytes() []byte {
	return getSignBytes(msg)
}
func (msg ValidatorRevokeMsg) GetSigners() []sdk.AccAddress {
	return []sdk.AccAddress{sdk.AccAddress(msg.Username)}
}
func (msg ValidatorRevokeMsg) GetConsumeAmount() types.Coin {
	return types.NewCoinFromInt64(0)
}
type VoteValidatorMsg struct {
	Username        types.AccountKey   `json:"username"`
	VotedValidators []types.AccountKey `json:"voted_validators"`
}
func NewVoteValidatorMsg(username string, votedValidators []string) VoteValidatorMsg {
	var votedVals []types.AccountKey
	for _, val := range votedValidators {
		votedVals = append(votedVals, types.AccountKey(val))
	}
	return VoteValidatorMsg{
		Username:        types.AccountKey(username),
		VotedValidators: votedVals,
	}
}
func (msg VoteValidatorMsg) Route() string { return RouterKey }
func (msg VoteValidatorMsg) Type() string { return "VoteValidatorMsg" }