github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/gov/types/msgs.go (about)

     1  package types
     2  
     3  import (
     4  	"fmt"
     5  
     6  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
     7  )
     8  
     9  // Governance message types and routes
    10  const (
    11  	TypeMsgDeposit        = "deposit"
    12  	TypeMsgVote           = "vote"
    13  	TypeMsgSubmitProposal = "submit_proposal"
    14  )
    15  
    16  var _, _, _ sdk.Msg = MsgSubmitProposal{}, MsgDeposit{}, MsgVote{}
    17  
    18  // MsgSubmitProposal
    19  type MsgSubmitProposal struct {
    20  	Content        Content        `json:"content" yaml:"content"`
    21  	InitialDeposit sdk.SysCoins   `json:"initial_deposit" yaml:"initial_deposit"` //  Initial deposit paid by sender. Must be strictly positive
    22  	Proposer       sdk.AccAddress `json:"proposer" yaml:"proposer"`               //  Address of the proposer
    23  }
    24  
    25  func NewMsgSubmitProposal(content Content, initialDeposit sdk.SysCoins, proposer sdk.AccAddress) MsgSubmitProposal {
    26  	return MsgSubmitProposal{content, initialDeposit, proposer}
    27  }
    28  
    29  // nolint
    30  func (msg MsgSubmitProposal) Route() string { return RouterKey }
    31  func (msg MsgSubmitProposal) Type() string  { return TypeMsgSubmitProposal }
    32  
    33  // Implements Msg.
    34  func (msg MsgSubmitProposal) ValidateBasic() sdk.Error {
    35  	if msg.Content == nil {
    36  		return ErrInvalidProposalContent("content is required")
    37  	}
    38  	if msg.Content.ProposalType() == ProposalTypeSoftwareUpgrade {
    39  		// Disable software upgrade proposals as they are currently equivalent
    40  		// to text proposals. Re-enable once a valid software upgrade proposal
    41  		// handler is implemented.
    42  		return ErrInvalidProposalType(msg.Content.ProposalType())
    43  	}
    44  	if msg.Proposer.Empty() {
    45  		return ErrInvalidAddress(msg.Proposer.String())
    46  	}
    47  	if !msg.InitialDeposit.IsValid() {
    48  		return ErrInvalidCoins()
    49  	}
    50  	if msg.InitialDeposit.IsAnyNegative() {
    51  		return ErrInvalidCoins()
    52  	}
    53  
    54  	if len(msg.InitialDeposit) != 1 || msg.InitialDeposit[0].Denom != sdk.DefaultBondDenom || !msg.InitialDeposit.IsValid() {
    55  		return sdk.ErrInvalidCoins(fmt.Sprintf("must deposit %s but got %s", sdk.DefaultBondDenom,
    56  			msg.InitialDeposit.String()))
    57  	}
    58  
    59  	if !IsValidProposalType(msg.Content.ProposalType()) {
    60  		return ErrInvalidProposalType(msg.Content.ProposalType())
    61  	}
    62  
    63  	return msg.Content.ValidateBasic()
    64  }
    65  
    66  func (msg MsgSubmitProposal) String() string {
    67  	return fmt.Sprintf(`Submit Proposal Message:
    68    Content:         %s
    69    Initial Deposit: %s
    70  `, msg.Content.String(), msg.InitialDeposit)
    71  }
    72  
    73  // Implements Msg.
    74  func (msg MsgSubmitProposal) GetSignBytes() []byte {
    75  	bz := ModuleCdc.MustMarshalJSON(msg)
    76  	return sdk.MustSortJSON(bz)
    77  }
    78  
    79  // Implements Msg.
    80  func (msg MsgSubmitProposal) GetSigners() []sdk.AccAddress {
    81  	return []sdk.AccAddress{msg.Proposer}
    82  }
    83  
    84  // MsgDeposit
    85  type MsgDeposit struct {
    86  	ProposalID uint64         `json:"proposal_id" yaml:"proposal_id"` // ID of the proposal
    87  	Depositor  sdk.AccAddress `json:"depositor" yaml:"depositor"`     // Address of the depositor
    88  	Amount     sdk.SysCoins   `json:"amount" yaml:"amount"`           // Coins to add to the proposal's deposit
    89  }
    90  
    91  func NewMsgDeposit(depositor sdk.AccAddress, proposalID uint64, amount sdk.SysCoins) MsgDeposit {
    92  	return MsgDeposit{proposalID, depositor, amount}
    93  }
    94  
    95  // Implements Msg.
    96  // nolint
    97  func (msg MsgDeposit) Route() string { return RouterKey }
    98  func (msg MsgDeposit) Type() string  { return TypeMsgDeposit }
    99  
   100  // Implements Msg.
   101  func (msg MsgDeposit) ValidateBasic() sdk.Error {
   102  	if msg.Depositor.Empty() {
   103  		return ErrInvalidAddress(msg.Depositor.String())
   104  	}
   105  	if !msg.Amount.IsValid() {
   106  		return ErrInvalidCoins()
   107  	}
   108  	if msg.Amount.IsAnyNegative() {
   109  		return ErrInvalidCoins()
   110  	}
   111  
   112  	return nil
   113  }
   114  
   115  func (msg MsgDeposit) String() string {
   116  	return fmt.Sprintf(`Deposit Message:
   117    Depositer:   %s
   118    Proposal ID: %d
   119    Amount:      %s
   120  `, msg.Depositor, msg.ProposalID, msg.Amount)
   121  }
   122  
   123  // Implements Msg.
   124  func (msg MsgDeposit) GetSignBytes() []byte {
   125  	bz := ModuleCdc.MustMarshalJSON(msg)
   126  	return sdk.MustSortJSON(bz)
   127  }
   128  
   129  // Implements Msg.
   130  func (msg MsgDeposit) GetSigners() []sdk.AccAddress {
   131  	return []sdk.AccAddress{msg.Depositor}
   132  }
   133  
   134  // MsgVote
   135  type MsgVote struct {
   136  	ProposalID uint64         `json:"proposal_id" yaml:"proposal_id"` // ID of the proposal
   137  	Voter      sdk.AccAddress `json:"voter" yaml:"voter"`             //  address of the voter
   138  	Option     VoteOption     `json:"option" yaml:"option"`           //  option from OptionSet chosen by the voter
   139  }
   140  
   141  func NewMsgVote(voter sdk.AccAddress, proposalID uint64, option VoteOption) MsgVote {
   142  	return MsgVote{proposalID, voter, option}
   143  }
   144  
   145  // Implements Msg.
   146  // nolint
   147  func (msg MsgVote) Route() string { return RouterKey }
   148  func (msg MsgVote) Type() string  { return TypeMsgVote }
   149  
   150  // Implements Msg.
   151  func (msg MsgVote) ValidateBasic() sdk.Error {
   152  	if msg.Voter.Empty() {
   153  		return ErrInvalidAddress(msg.Voter.String())
   154  	}
   155  	if !ValidVoteOption(msg.Option) {
   156  		return ErrInvalidVote(msg.Option)
   157  	}
   158  
   159  	return nil
   160  }
   161  
   162  func (msg MsgVote) String() string {
   163  	return fmt.Sprintf(`Vote Message:
   164    Proposal ID: %d
   165    Option:      %s
   166  `, msg.ProposalID, msg.Option)
   167  }
   168  
   169  // Implements Msg.
   170  func (msg MsgVote) GetSignBytes() []byte {
   171  	bz := ModuleCdc.MustMarshalJSON(msg)
   172  	return sdk.MustSortJSON(bz)
   173  }
   174  
   175  // Implements Msg.
   176  func (msg MsgVote) GetSigners() []sdk.AccAddress {
   177  	return []sdk.AccAddress{msg.Voter}
   178  }