mirror of
				https://github.com/0glabs/0g-chain.git
				synced 2025-11-04 00:37:28 +00:00 
			
		
		
		
	add msgs
This commit is contained in:
		
							parent
							
								
									029842168a
								
							
						
					
					
						commit
						20bcfec407
					
				@ -1,25 +1,24 @@
 | 
				
			|||||||
package committee
 | 
					package committee
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// committee, subcommittee, council, caucus, commission, synod, board
 | 
					 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sdk "github.com/cosmos/cosmos-sdk/types"
 | 
						sdk "github.com/cosmos/cosmos-sdk/types"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/kava-labs/kava/x/committee/keeper"
 | 
						"github.com/kava-labs/kava/x/committee/keeper"
 | 
				
			||||||
 | 
					 | 
				
			||||||
	"github.com/kava-labs/kava/x/committee/types"
 | 
						"github.com/kava-labs/kava/x/committee/types"
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewHandler creates an sdk.Handler for committee messages
 | 
					// NewHandler creates an sdk.Handler for committee messages
 | 
				
			||||||
func NewHandler(k keeper.Keeper) sdk.Handler {
 | 
					func NewHandler(k keeper.Keeper) sdk.Handler {
 | 
				
			||||||
	return func(ctx sdk.Context, msg sdk.Msg) sdk.Result {
 | 
						return func(ctx sdk.Context, msg sdk.Msg) sdk.Result {
 | 
				
			||||||
 | 
							ctx = ctx.WithEventManager(sdk.NewEventManager())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		switch msg := msg.(type) {
 | 
							switch msg := msg.(type) {
 | 
				
			||||||
		case types.MsgSubmitProposal:
 | 
							case types.MsgSubmitProposal:
 | 
				
			||||||
			handleMsgSubmitProposal(ctx, k, msg)
 | 
								return handleMsgSubmitProposal(ctx, k, msg)
 | 
				
			||||||
		case types.MsgVote:
 | 
							case types.MsgVote:
 | 
				
			||||||
			handleMsgVote(ctx, k, msg)
 | 
								return handleMsgVote(ctx, k, msg)
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			errMsg := fmt.Sprintf("unrecognized %s msg type: %T", types.ModuleName, msg)
 | 
								errMsg := fmt.Sprintf("unrecognized %s msg type: %T", types.ModuleName, msg)
 | 
				
			||||||
			return sdk.ErrUnknownRequest(errMsg).Result()
 | 
								return sdk.ErrUnknownRequest(errMsg).Result()
 | 
				
			||||||
@ -28,21 +27,33 @@ func NewHandler(k keeper.Keeper) sdk.Handler {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func handleMsgSubmitProposal(ctx sdk.Context, k keeper.Keeper, msg types.MsgSubmitProposal) sdk.Result {
 | 
					func handleMsgSubmitProposal(ctx sdk.Context, k keeper.Keeper, msg types.MsgSubmitProposal) sdk.Result {
 | 
				
			||||||
	err := keeper.SubmitProposal(ctx, msg)
 | 
						proposalID, err := k.SubmitProposal(ctx, msg.Proposer, msg.CommitteeID, msg.PubProposal)
 | 
				
			||||||
 | 
					 | 
				
			||||||
	if err != nil {
 | 
						if err != nil {
 | 
				
			||||||
		return err.Result()
 | 
							return err.Result()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return sdk.Result{}
 | 
						ctx.EventManager().EmitEvent(
 | 
				
			||||||
 | 
							sdk.NewEvent(
 | 
				
			||||||
 | 
								sdk.EventTypeMessage,
 | 
				
			||||||
 | 
								// TODO sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
 | 
				
			||||||
 | 
								sdk.NewAttribute(sdk.AttributeKeySender, msg.Proposer.String()),
 | 
				
			||||||
 | 
							),
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return sdk.Result{
 | 
				
			||||||
 | 
							Data:   GetKeyFromID(proposalID),
 | 
				
			||||||
 | 
							Events: ctx.EventManager().Events(),
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func handleMsgVote(ctx sdk.Context, k keeper.Keeper, msg types.MsgVote) sdk.Result {
 | 
					func handleMsgVote(ctx sdk.Context, k keeper.Keeper, msg types.MsgVote) sdk.Result {
 | 
				
			||||||
	err := keeper.AddVote(ctx, msg)
 | 
						err := k.AddVote(ctx, msg.ProposalID, msg.Voter)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
	// Try closing proposal
 | 
							return err.Result()
 | 
				
			||||||
	_ = k.CloseOutProposal(ctx, proposalID)
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Try closing proposal in case enough votes have been cast
 | 
				
			||||||
 | 
						_ = k.CloseOutProposal(ctx, msg.ProposalID)
 | 
				
			||||||
	// if err.Error() == "note enough votes to close proposal" { // TODO
 | 
						// if err.Error() == "note enough votes to close proposal" { // TODO
 | 
				
			||||||
	// 	return nil // This is not a reason to error
 | 
						// 	return nil // This is not a reason to error
 | 
				
			||||||
	// }
 | 
						// }
 | 
				
			||||||
@ -50,10 +61,13 @@ func handleMsgVote(ctx sdk.Context, k keeper.Keeper, msg types.MsgVote) sdk.Resu
 | 
				
			|||||||
	// 	return err
 | 
						// 	return err
 | 
				
			||||||
	// }
 | 
						// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if err != nil {
 | 
						ctx.EventManager().EmitEvent(
 | 
				
			||||||
		return err.Result()
 | 
							sdk.NewEvent(
 | 
				
			||||||
	}
 | 
								sdk.EventTypeMessage,
 | 
				
			||||||
 | 
								// TODO sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
 | 
				
			||||||
 | 
								sdk.NewAttribute(sdk.AttributeKeySender, msg.Voter.String()),
 | 
				
			||||||
 | 
							),
 | 
				
			||||||
 | 
						)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return sdk.Result{}
 | 
						return sdk.Result{Events: ctx.EventManager().Events()}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -13,7 +13,6 @@ const (
 | 
				
			|||||||
	// StoreKey Top level store key where all module items will be stored
 | 
						// StoreKey Top level store key where all module items will be stored
 | 
				
			||||||
	StoreKey = ModuleName
 | 
						StoreKey = ModuleName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
	// RouterKey Top level router key
 | 
						// RouterKey Top level router key
 | 
				
			||||||
	RouterKey = ModuleName
 | 
						RouterKey = ModuleName
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -22,7 +21,6 @@ const (
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// DefaultParamspace default name for parameter store
 | 
						// DefaultParamspace default name for parameter store
 | 
				
			||||||
	DefaultParamspace = ModuleName
 | 
						DefaultParamspace = ModuleName
 | 
				
			||||||
*/
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Key prefixes
 | 
					// Key prefixes
 | 
				
			||||||
 | 
				
			|||||||
@ -1,11 +1,97 @@
 | 
				
			|||||||
package types
 | 
					package types
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						sdk "github.com/cosmos/cosmos-sdk/types"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const (
 | 
				
			||||||
 | 
						TypeMsgSubmitProposal = "submit_proposal"
 | 
				
			||||||
 | 
						TypeMsgVote           = "vote"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var _, _ sdk.Msg = MsgSubmitProposal{}, MsgVote{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// MsgSubmitProposal is used by committee members to create a new proposal that they can vote on.
 | 
					// MsgSubmitProposal is used by committee members to create a new proposal that they can vote on.
 | 
				
			||||||
type MsgSubmitProposal struct {
 | 
					type MsgSubmitProposal struct {
 | 
				
			||||||
 | 
						PubProposal PubProposal    `json:"pub_proposal" yaml:"pub_proposal"`
 | 
				
			||||||
 | 
						Proposer    sdk.AccAddress `json:"proposer" yaml:"proposer"`
 | 
				
			||||||
 | 
						CommitteeID uint64
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewMsgSubmitProposal creates a new MsgSubmitProposal instance
 | 
				
			||||||
 | 
					func NewMsgSubmitProposal(pubProposal PubProposal, proposer sdk.AccAddress, committeeID uint64) MsgSubmitProposal {
 | 
				
			||||||
 | 
						return MsgSubmitProposal{
 | 
				
			||||||
 | 
							PubProposal: pubProposal,
 | 
				
			||||||
 | 
							Proposer:    proposer,
 | 
				
			||||||
 | 
							CommitteeID: committeeID,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Route return the message type used for routing the message.
 | 
				
			||||||
 | 
					func (msg MsgSubmitProposal) Route() string { return RouterKey }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Type returns a human-readable string for the message, intended for utilization within events.
 | 
				
			||||||
 | 
					func (msg MsgSubmitProposal) Type() string { return TypeMsgSubmitProposal }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ValidateBasic does a simple validation check that doesn't require access to any other information.
 | 
				
			||||||
 | 
					func (msg MsgSubmitProposal) ValidateBasic() sdk.Error {
 | 
				
			||||||
 | 
						if msg.PubProposal == nil {
 | 
				
			||||||
 | 
							return sdk.ErrInternal("no proposal")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if msg.Proposer.Empty() {
 | 
				
			||||||
 | 
							return sdk.ErrInvalidAddress(msg.Proposer.String())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	// TODO
 | 
						// TODO
 | 
				
			||||||
 | 
						// if !IsValidProposalType(msg.Content.ProposalType()) {
 | 
				
			||||||
 | 
						// 	return ErrInvalidProposalType(DefaultCodespace, msg.Content.ProposalType())
 | 
				
			||||||
 | 
						// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return msg.PubProposal.ValidateBasic()
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetSignBytes gets the canonical byte representation of the Msg.
 | 
				
			||||||
 | 
					func (msg MsgSubmitProposal) GetSignBytes() []byte {
 | 
				
			||||||
 | 
						bz := ModuleCdc.MustMarshalJSON(msg)
 | 
				
			||||||
 | 
						return sdk.MustSortJSON(bz)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetSigners returns the addresses of signers that must sign.
 | 
				
			||||||
 | 
					func (msg MsgSubmitProposal) GetSigners() []sdk.AccAddress {
 | 
				
			||||||
 | 
						return []sdk.AccAddress{msg.Proposer}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// MsgVote is submitted by committee members to vote on proposals.
 | 
					// MsgVote is submitted by committee members to vote on proposals.
 | 
				
			||||||
type MsgVote struct {
 | 
					type MsgVote struct {
 | 
				
			||||||
	// TODO
 | 
						ProposalID uint64         `json:"proposal_id" yaml:"proposal_id"`
 | 
				
			||||||
 | 
						Voter      sdk.AccAddress `json:"voter" yaml:"voter"`
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewMsgVote creates a message to cast a vote on an active proposal
 | 
				
			||||||
 | 
					func NewMsgVote(voter sdk.AccAddress, proposalID uint64) MsgVote {
 | 
				
			||||||
 | 
						return MsgVote{proposalID, voter}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Route return the message type used for routing the message.
 | 
				
			||||||
 | 
					func (msg MsgVote) Route() string { return RouterKey }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Type returns a human-readable string for the message, intended for utilization within events.
 | 
				
			||||||
 | 
					func (msg MsgVote) Type() string { return TypeMsgVote }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ValidateBasic does a simple validation check that doesn't require access to any other information.
 | 
				
			||||||
 | 
					func (msg MsgVote) ValidateBasic() sdk.Error {
 | 
				
			||||||
 | 
						if msg.Voter.Empty() {
 | 
				
			||||||
 | 
							return sdk.ErrInvalidAddress(msg.Voter.String())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetSignBytes gets the canonical byte representation of the Msg.
 | 
				
			||||||
 | 
					func (msg MsgVote) GetSignBytes() []byte {
 | 
				
			||||||
 | 
						bz := ModuleCdc.MustMarshalJSON(msg)
 | 
				
			||||||
 | 
						return sdk.MustSortJSON(bz)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// GetSigners returns the addresses of signers that must sign.
 | 
				
			||||||
 | 
					func (msg MsgVote) GetSigners() []sdk.AccAddress {
 | 
				
			||||||
 | 
						return []sdk.AccAddress{msg.Voter}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										81
									
								
								x/committee/types/msg_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								x/committee/types/msg_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,81 @@
 | 
				
			|||||||
 | 
					package types
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sdk "github.com/cosmos/cosmos-sdk/types"
 | 
				
			||||||
 | 
						"github.com/cosmos/cosmos-sdk/x/gov"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestMsgSubmitProposal_ValidateBasic(t *testing.T) {
 | 
				
			||||||
 | 
						addr := sdk.AccAddress([]byte("someName"))
 | 
				
			||||||
 | 
						tests := []struct {
 | 
				
			||||||
 | 
							name       string
 | 
				
			||||||
 | 
							msg        MsgSubmitProposal
 | 
				
			||||||
 | 
							expectPass bool
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:       "normal",
 | 
				
			||||||
 | 
								msg:        MsgSubmitProposal{gov.NewTextProposal("A Title", "A proposal description."), addr, 3},
 | 
				
			||||||
 | 
								expectPass: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:       "empty address",
 | 
				
			||||||
 | 
								msg:        MsgSubmitProposal{gov.NewTextProposal("A Title", "A proposal description."), nil, 3},
 | 
				
			||||||
 | 
								expectPass: false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:       "invalid proposal",
 | 
				
			||||||
 | 
								msg:        MsgSubmitProposal{gov.TextProposal{}, addr, 3},
 | 
				
			||||||
 | 
								expectPass: false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, tc := range tests {
 | 
				
			||||||
 | 
							t.Run(tc.name, func(t *testing.T) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								err := tc.msg.ValidateBasic()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if tc.expectPass {
 | 
				
			||||||
 | 
									require.NoError(t, err)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									require.Error(t, err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestMsgVote_ValidateBasic(t *testing.T) {
 | 
				
			||||||
 | 
						addr := sdk.AccAddress([]byte("someName"))
 | 
				
			||||||
 | 
						tests := []struct {
 | 
				
			||||||
 | 
							name       string
 | 
				
			||||||
 | 
							msg        MsgVote
 | 
				
			||||||
 | 
							expectPass bool
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:       "normal",
 | 
				
			||||||
 | 
								msg:        MsgVote{5, addr},
 | 
				
			||||||
 | 
								expectPass: true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								name:       "empty address",
 | 
				
			||||||
 | 
								msg:        MsgVote{5, nil},
 | 
				
			||||||
 | 
								expectPass: false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, tc := range tests {
 | 
				
			||||||
 | 
							t.Run(tc.name, func(t *testing.T) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								err := tc.msg.ValidateBasic()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if tc.expectPass {
 | 
				
			||||||
 | 
									require.NoError(t, err)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									require.Error(t, err)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user