159 lines
4.2 KiB
Go
159 lines
4.2 KiB
Go
package keeper
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"strconv"
|
|
|
|
"github.com/armon/go-metrics"
|
|
"github.com/cosmos/cosmos-sdk/telemetry"
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
|
"github.com/cosmos/cosmos-sdk/x/gov/types"
|
|
)
|
|
|
|
type msgServer struct {
|
|
Keeper
|
|
}
|
|
|
|
// NewMsgServerImpl returns an implementation of the gov MsgServer interface
|
|
// for the provided Keeper.
|
|
func NewMsgServerImpl(keeper Keeper) types.MsgServer {
|
|
return &msgServer{Keeper: keeper}
|
|
}
|
|
|
|
var _ types.MsgServer = msgServer{}
|
|
|
|
func (k msgServer) SubmitProposal(goCtx context.Context, msg *types.MsgSubmitProposal) (*types.MsgSubmitProposalResponse, error) {
|
|
ctx := sdk.UnwrapSDKContext(goCtx)
|
|
proposal, err := k.Keeper.SubmitProposal(ctx, msg.GetContent())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
defer telemetry.IncrCounter(1, types.ModuleName, "proposal")
|
|
|
|
votingStarted, err := k.Keeper.AddDeposit(ctx, proposal.ProposalId, msg.GetProposer(), msg.GetInitialDeposit())
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ctx.EventManager().EmitEvent(
|
|
sdk.NewEvent(
|
|
sdk.EventTypeMessage,
|
|
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
|
|
sdk.NewAttribute(sdk.AttributeKeySender, msg.GetProposer().String()),
|
|
),
|
|
)
|
|
|
|
submitEvent := sdk.NewEvent(types.EventTypeSubmitProposal, sdk.NewAttribute(types.AttributeKeyProposalType, msg.GetContent().ProposalType()))
|
|
if votingStarted {
|
|
submitEvent = submitEvent.AppendAttributes(
|
|
sdk.NewAttribute(types.AttributeKeyVotingPeriodStart, fmt.Sprintf("%d", proposal.ProposalId)),
|
|
)
|
|
}
|
|
|
|
ctx.EventManager().EmitEvent(submitEvent)
|
|
return &types.MsgSubmitProposalResponse{
|
|
ProposalId: proposal.ProposalId,
|
|
}, nil
|
|
}
|
|
|
|
func (k msgServer) Vote(goCtx context.Context, msg *types.MsgVote) (*types.MsgVoteResponse, error) {
|
|
ctx := sdk.UnwrapSDKContext(goCtx)
|
|
accAddr, accErr := sdk.AccAddressFromBech32(msg.Voter)
|
|
if accErr != nil {
|
|
return nil, accErr
|
|
}
|
|
err := k.Keeper.AddVote(ctx, msg.ProposalId, accAddr, types.NewNonSplitVoteOption(msg.Option))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
defer telemetry.IncrCounterWithLabels(
|
|
[]string{types.ModuleName, "vote"},
|
|
1,
|
|
[]metrics.Label{
|
|
telemetry.NewLabel("proposal_id", strconv.Itoa(int(msg.ProposalId))),
|
|
},
|
|
)
|
|
|
|
ctx.EventManager().EmitEvent(
|
|
sdk.NewEvent(
|
|
sdk.EventTypeMessage,
|
|
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
|
|
sdk.NewAttribute(sdk.AttributeKeySender, msg.Voter),
|
|
),
|
|
)
|
|
|
|
return &types.MsgVoteResponse{}, nil
|
|
}
|
|
|
|
func (k msgServer) WeightedVote(goCtx context.Context, msg *types.MsgWeightedVote) (*types.MsgVoteResponse, error) {
|
|
ctx := sdk.UnwrapSDKContext(goCtx)
|
|
accAddr, accErr := sdk.AccAddressFromBech32(msg.Voter)
|
|
if accErr != nil {
|
|
return nil, accErr
|
|
}
|
|
err := k.Keeper.AddVote(ctx, msg.ProposalId, accAddr, msg.Options)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
defer telemetry.IncrCounterWithLabels(
|
|
[]string{types.ModuleName, "vote"},
|
|
1,
|
|
[]metrics.Label{
|
|
telemetry.NewLabel("proposal_id", strconv.Itoa(int(msg.ProposalId))),
|
|
},
|
|
)
|
|
|
|
ctx.EventManager().EmitEvent(
|
|
sdk.NewEvent(
|
|
sdk.EventTypeMessage,
|
|
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
|
|
sdk.NewAttribute(sdk.AttributeKeySender, msg.Voter),
|
|
),
|
|
)
|
|
|
|
return &types.MsgVoteResponse{}, nil
|
|
}
|
|
|
|
func (k msgServer) Deposit(goCtx context.Context, msg *types.MsgDeposit) (*types.MsgDepositResponse, error) {
|
|
ctx := sdk.UnwrapSDKContext(goCtx)
|
|
accAddr, err := sdk.AccAddressFromBech32(msg.Depositor)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
votingStarted, err := k.Keeper.AddDeposit(ctx, msg.ProposalId, accAddr, msg.Amount)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
defer telemetry.IncrCounterWithLabels(
|
|
[]string{types.ModuleName, "deposit"},
|
|
1,
|
|
[]metrics.Label{
|
|
telemetry.NewLabel("proposal_id", strconv.Itoa(int(msg.ProposalId))),
|
|
},
|
|
)
|
|
|
|
ctx.EventManager().EmitEvent(
|
|
sdk.NewEvent(
|
|
sdk.EventTypeMessage,
|
|
sdk.NewAttribute(sdk.AttributeKeyModule, types.AttributeValueCategory),
|
|
sdk.NewAttribute(sdk.AttributeKeySender, msg.Depositor),
|
|
),
|
|
)
|
|
|
|
if votingStarted {
|
|
ctx.EventManager().EmitEvent(
|
|
sdk.NewEvent(
|
|
types.EventTypeProposalDeposit,
|
|
sdk.NewAttribute(types.AttributeKeyVotingPeriodStart, fmt.Sprintf("%d", msg.ProposalId)),
|
|
),
|
|
)
|
|
}
|
|
|
|
return &types.MsgDepositResponse{}, nil
|
|
}
|