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 }