func (msg StakeInForMsg) ValidateBasic() sdk.Error {
	if !msg.Sender.IsValid() || !msg.Receiver.IsValid() {
		return ErrInvalidUsername()
	}
	_, err := types.LinoToCoin(msg.Deposit)
	if err != nil {
		return err
	}
	return nil
}
ValidateBasic - implements sdk.Msg
package types
import (
	"fmt"
	"github.com/lino-network/lino/types"
	sdk "github.com/cosmos/cosmos-sdk/types"
)
var _ types.Msg = StakeInMsg{}
var _ types.Msg = StakeOutMsg{}
var _ types.Msg = ClaimInterestMsg{}
var _ types.Msg = StakeInForMsg{}
type StakeInMsg struct {
	Username types.AccountKey `json:"username"`
	Deposit  types.LNO        `json:"deposit"`
}
type StakeOutMsg struct {
	Username types.AccountKey `json:"username"`
	Amount   types.LNO        `json:"amount"`
}
type ClaimInterestMsg struct {
	Username types.AccountKey `json:"username"`
}
type StakeInForMsg struct {
	Sender   types.AccountKey `json:"username"`
	Receiver types.AccountKey `json:"receiver"`
	Deposit  types.LNO        `json:"deposit"`
}
func NewStakeInMsg(username string, deposit types.LNO) StakeInMsg {
	return StakeInMsg{
		Username: types.AccountKey(username),
		Deposit:  deposit,
	}
}
func (msg StakeInMsg) Route() string { return RouterKey }
func (msg StakeInMsg) Type() string { return "StakeInMsg" }
func (msg StakeInMsg) ValidateBasic() sdk.Error {
	if !msg.Username.IsValid() {
		return ErrInvalidUsername()
	}
	_, err := types.LinoToCoin(msg.Deposit)
	if err != nil {
		return err
	}
	return nil
}
func (msg StakeInMsg) String() string {
	return fmt.Sprintf("StakeInMsg{Username:%v, Deposit:%v}", msg.Username, msg.Deposit)
}
func (msg StakeInMsg) GetPermission() types.Permission {
	return types.TransactionPermission
}
func (msg StakeInMsg) GetSignBytes() []byte {
	b, err := msgCdc.MarshalJSON(msg)  
	if err != nil {
		panic(err)
	}
	return b
}
func (msg StakeInMsg) GetSigners() []sdk.AccAddress {
	return []sdk.AccAddress{sdk.AccAddress(msg.Username)}
}
func (msg StakeInMsg) GetConsumeAmount() types.Coin {
	return types.NewCoinFromInt64(0)
}
func NewStakeOutMsg(username string, amount types.LNO) StakeOutMsg {
	return StakeOutMsg{
		Username: types.AccountKey(username),
		Amount:   amount,
	}
}
func (msg StakeOutMsg) Route() string { return RouterKey }
func (msg StakeOutMsg) Type() string { return "StakeOutMsg" }
func (msg StakeOutMsg) ValidateBasic() sdk.Error {
	if !msg.Username.IsValid() {
		return ErrInvalidUsername()
	}
	_, err := types.LinoToCoin(msg.Amount)
	if err != nil {
		return err
	}
	return nil
}
func (msg StakeOutMsg) String() string {
	return fmt.Sprintf("StakeOutMsg{Username:%v, Amount:%v}", msg.Username, msg.Amount)
}
func (msg StakeOutMsg) GetPermission() types.Permission {
	return types.TransactionPermission
}
func (msg StakeOutMsg) GetSignBytes() []byte {
	b, err := msgCdc.MarshalJSON(msg)
	if err != nil {
		panic(err)
	}
	return b
}
func (msg StakeOutMsg) GetSigners() []sdk.AccAddress {
	return []sdk.AccAddress{sdk.AccAddress(msg.Username)}
}
func (msg StakeOutMsg) GetConsumeAmount() types.Coin {
	return types.NewCoinFromInt64(0)
}
func NewClaimInterestMsg(username string) ClaimInterestMsg {
	return ClaimInterestMsg{
		Username: types.AccountKey(username),
	}
}
func (msg ClaimInterestMsg) Route() string { return RouterKey }
func (msg ClaimInterestMsg) Type() string { return "ClaimInterestMsg" }
func (msg ClaimInterestMsg) ValidateBasic() sdk.Error {
	if !msg.Username.IsValid() {
		return ErrInvalidUsername()
	}
	return nil
}
func (msg ClaimInterestMsg) String() string {
	return fmt.Sprintf("ClaimInterestMsg{Username:%v}", msg.Username)
}
func (msg ClaimInterestMsg) GetPermission() types.Permission {
	return types.TransactionPermission
}
func (msg ClaimInterestMsg) GetSignBytes() []byte {
	b, err := msgCdc.MarshalJSON(msg)  
	if err != nil {
		panic(err)
	}
	return b
}
func (msg ClaimInterestMsg) GetSigners() []sdk.AccAddress {
	return []sdk.AccAddress{sdk.AccAddress(msg.Username)}
}
func (msg ClaimInterestMsg) GetConsumeAmount() types.Coin {
	return types.NewCoinFromInt64(0)
}
func NewStakeInForMsg(sender, receiver string, deposit types.LNO) StakeInForMsg {
	return StakeInForMsg{
		Sender:   types.AccountKey(sender),
		Receiver: types.AccountKey(receiver),
		Deposit:  deposit,
	}
}
func (msg StakeInForMsg) Route() string { return RouterKey }
func (msg StakeInForMsg) Type() string { return "StakeInForMsg" }