package types import ( "fmt" sdk "github.com/cosmos/cosmos-sdk/types" sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" ) // Governance message types and routes const ( TypeMsgDeposit = "deposit" TypeMsgVote = "vote" TypeMsgSubmitProposal = "submit_proposal" ) var _, _, _ sdk.Msg = MsgSubmitProposal{}, MsgDeposit{}, MsgVote{} // MsgSubmitProposal defines a message to create a governance proposal with a // given content and initial deposit type MsgSubmitProposal struct { Content Content `json:"content" yaml:"content"` InitialDeposit sdk.Coins `json:"initial_deposit" yaml:"initial_deposit"` // Initial deposit paid by sender. Must be strictly positive Proposer sdk.AccAddress `json:"proposer" yaml:"proposer"` // Address of the proposer } // NewMsgSubmitProposal creates a new MsgSubmitProposal instance func NewMsgSubmitProposal(content Content, initialDeposit sdk.Coins, proposer sdk.AccAddress) MsgSubmitProposal { return MsgSubmitProposal{content, initialDeposit, proposer} } // Route implements Msg func (msg MsgSubmitProposal) Route() string { return RouterKey } // Type implements Msg func (msg MsgSubmitProposal) Type() string { return TypeMsgSubmitProposal } // ValidateBasic implements Msg func (msg MsgSubmitProposal) ValidateBasic() error { if msg.Content == nil { return sdkerrors.Wrap(ErrInvalidProposalContent, "missing content") } if msg.Proposer.Empty() { return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Proposer.String()) } if !msg.InitialDeposit.IsValid() { return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, msg.InitialDeposit.String()) } if msg.InitialDeposit.IsAnyNegative() { return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, msg.InitialDeposit.String()) } if !IsValidProposalType(msg.Content.ProposalType()) { return sdkerrors.Wrap(ErrInvalidProposalType, msg.Content.ProposalType()) } return msg.Content.ValidateBasic() } // String implements the Stringer interface func (msg MsgSubmitProposal) String() string { return fmt.Sprintf(`Submit Proposal Message: Content: %s Initial Deposit: %s `, msg.Content.String(), msg.InitialDeposit) } // GetSignBytes implements Msg func (msg MsgSubmitProposal) GetSignBytes() []byte { bz := ModuleCdc.MustMarshalJSON(msg) return sdk.MustSortJSON(bz) } // GetSigners implements Msg func (msg MsgSubmitProposal) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{msg.Proposer} } // NewMsgDeposit creates a new MsgDeposit instance func NewMsgDeposit(depositor sdk.AccAddress, proposalID uint64, amount sdk.Coins) MsgDeposit { return MsgDeposit{proposalID, depositor, amount} } // Route implements Msg func (msg MsgDeposit) Route() string { return RouterKey } // Type implements Msg func (msg MsgDeposit) Type() string { return TypeMsgDeposit } // ValidateBasic implements Msg func (msg MsgDeposit) ValidateBasic() error { if msg.Depositor.Empty() { return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Depositor.String()) } if !msg.Amount.IsValid() { return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) } if msg.Amount.IsAnyNegative() { return sdkerrors.Wrap(sdkerrors.ErrInvalidCoins, msg.Amount.String()) } return nil } // String implements the Stringer interface func (msg MsgDeposit) String() string { return fmt.Sprintf(`Deposit Message: Depositer: %s Proposal ID: %d Amount: %s `, msg.Depositor, msg.ProposalID, msg.Amount) } // GetSignBytes implements Msg func (msg MsgDeposit) GetSignBytes() []byte { bz := ModuleCdc.MustMarshalJSON(msg) return sdk.MustSortJSON(bz) } // GetSigners implements Msg func (msg MsgDeposit) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{msg.Depositor} } // NewMsgVote creates a message to cast a vote on an active proposal func NewMsgVote(voter sdk.AccAddress, proposalID uint64, option VoteOption) MsgVote { return MsgVote{proposalID, voter, option} } // Route implements Msg func (msg MsgVote) Route() string { return RouterKey } // Type implements Msg func (msg MsgVote) Type() string { return TypeMsgVote } // ValidateBasic implements Msg func (msg MsgVote) ValidateBasic() error { if msg.Voter.Empty() { return sdkerrors.Wrap(sdkerrors.ErrInvalidAddress, msg.Voter.String()) } if !ValidVoteOption(msg.Option) { return sdkerrors.Wrap(ErrInvalidVote, msg.Option.String()) } return nil } // String implements the Stringer interface func (msg MsgVote) String() string { return fmt.Sprintf(`Vote Message: Proposal ID: %d Option: %s `, msg.ProposalID, msg.Option) } // GetSignBytes implements Msg func (msg MsgVote) GetSignBytes() []byte { bz := ModuleCdc.MustMarshalJSON(msg) return sdk.MustSortJSON(bz) } // GetSigners implements Msg func (msg MsgVote) GetSigners() []sdk.AccAddress { return []sdk.AccAddress{msg.Voter} }