From a4e861f34012b9776d80c27e12942bfdd09aab7e Mon Sep 17 00:00:00 2001 From: Artur Abliazimov Date: Mon, 9 Sep 2024 14:19:47 +0300 Subject: [PATCH] Add or update vote logic --- warden/x/act/keeper/actions.go | 2 +- .../act/keeper/msg_server_vote_for_action.go | 2 +- warden/x/act/types/v1beta1/action.go | 15 ++++++--- warden/x/act/types/v1beta1/errors.go | 31 +++++++++---------- 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/warden/x/act/keeper/actions.go b/warden/x/act/keeper/actions.go index df9a83b8e..770644c40 100644 --- a/warden/x/act/keeper/actions.go +++ b/warden/x/act/keeper/actions.go @@ -239,7 +239,7 @@ func (k Keeper) AddAction(ctx context.Context, creator string, msg sdk.Msg, time // add initial approver sdkCtx := sdk.UnwrapSDKContext(ctx) - if err := act.AddApprover(sdkCtx, creator); err != nil { + if err := act.AddOrUpdateVote(sdkCtx, creator, types.ActionVoteType_VOTE_TYPE_APPROVED); err != nil { return nil, err } diff --git a/warden/x/act/keeper/msg_server_vote_for_action.go b/warden/x/act/keeper/msg_server_vote_for_action.go index 17a162996..a99ef2eb4 100644 --- a/warden/x/act/keeper/msg_server_vote_for_action.go +++ b/warden/x/act/keeper/msg_server_vote_for_action.go @@ -28,7 +28,7 @@ func (k msgServer) VoteForAction(goCtx context.Context, msg *types.MsgVoteForAct }, nil } - if err := act.AddVote(ctx, msg.Participant, msg.VoteType); err != nil { + if err := act.AddOrUpdateVote(ctx, msg.Participant, msg.VoteType); err != nil { return nil, err } diff --git a/warden/x/act/types/v1beta1/action.go b/warden/x/act/types/v1beta1/action.go index 8a357064c..afe0600b6 100644 --- a/warden/x/act/types/v1beta1/action.go +++ b/warden/x/act/types/v1beta1/action.go @@ -72,19 +72,26 @@ func (a *Action) AddApprover(ctx sdk.Context, address string) error { return nil } -func (a *Action) AddVote(ctx sdk.Context, participant string, voteType ActionVoteType) error { +func (a *Action) AddOrUpdateVote(ctx sdk.Context, participant string, voteType ActionVoteType) error { if a.Status != ActionStatus_ACTION_STATUS_PENDING { return errors.Wrapf(ErrInvalidActionStatus, "can't add a vote to an action that's not pending") } - for _, v := range a.Votes { + updated := false + + for i, v := range a.Votes { if v.Participant == participant { - return ErrAlreadyParticipatedInVoting + a.Votes[i].VoteType = voteType + updated = true + break } } + if !updated { + a.Votes = append(a.Votes, NewVote(participant, voteType, ctx.BlockTime())) + } + a.UpdatedAt = ctx.BlockTime() - a.Votes = append(a.Votes, NewVote(participant, voteType, a.UpdatedAt)) if err := ctx.EventManager().EmitTypedEvent(&EventActionVoted{ Id: a.Id, diff --git a/warden/x/act/types/v1beta1/errors.go b/warden/x/act/types/v1beta1/errors.go index 1ecdae71b..c7fa0615d 100644 --- a/warden/x/act/types/v1beta1/errors.go +++ b/warden/x/act/types/v1beta1/errors.go @@ -8,20 +8,19 @@ import ( // x/act module sentinel errors var ( - ErrInvalidSigner = sdkerrors.Register(ModuleName, 1100, "expected gov account as only signer for proposal message") - ErrSample = sdkerrors.Register(ModuleName, 1101, "sample error") - ErrInvalidActionMsgSigner = sdkerrors.Register(ModuleName, 1102, "expected x/act account as only signer for action message") - ErrInvalidActionStatus = sdkerrors.Register(ModuleName, 1103, "invalid action status") - ErrInvalidActionStatusChange = sdkerrors.Register(ModuleName, 1104, "invalid status change") - ErrApproverExists = sdkerrors.Register(ModuleName, 1105, "approver already exists") - ErrRuleEvaluationFailed = sdkerrors.Register(ModuleName, 1106, "rule evaluation failed") - ErrRuleNotBoolean = sdkerrors.Register(ModuleName, 1107, "rule must evaluate to a boolean") - ErrInvalidRule = sdkerrors.Register(ModuleName, 1108, "rule is invalid") - ErrInvalidActionMsg = sdkerrors.Register(ModuleName, 1109, "invalid action message") - ErrNoActionMsgHandler = sdkerrors.Register(ModuleName, 1110, "no action message handler registered for message type") - ErrNoRuleRegistryHandler = sdkerrors.Register(ModuleName, 1111, "no rule registry handler registered for message type") - ErrInvalidRuleDefinition = sdkerrors.Register(ModuleName, 1112, "invalid rule definition") - ErrInvalidRevoker = sdkerrors.Register(ModuleName, 1113, "this account can't revoke this action") - ErrInvalidUpdateRuleAccount = sdkerrors.Register(ModuleName, 1114, "this account can't update this rule") - ErrAlreadyParticipatedInVoting = sdkerrors.Register(ModuleName, 1115, "account already participated in voting") + ErrInvalidSigner = sdkerrors.Register(ModuleName, 1100, "expected gov account as only signer for proposal message") + ErrSample = sdkerrors.Register(ModuleName, 1101, "sample error") + ErrInvalidActionMsgSigner = sdkerrors.Register(ModuleName, 1102, "expected x/act account as only signer for action message") + ErrInvalidActionStatus = sdkerrors.Register(ModuleName, 1103, "invalid action status") + ErrInvalidActionStatusChange = sdkerrors.Register(ModuleName, 1104, "invalid status change") + ErrApproverExists = sdkerrors.Register(ModuleName, 1105, "approver already exists") + ErrRuleEvaluationFailed = sdkerrors.Register(ModuleName, 1106, "rule evaluation failed") + ErrRuleNotBoolean = sdkerrors.Register(ModuleName, 1107, "rule must evaluate to a boolean") + ErrInvalidRule = sdkerrors.Register(ModuleName, 1108, "rule is invalid") + ErrInvalidActionMsg = sdkerrors.Register(ModuleName, 1109, "invalid action message") + ErrNoActionMsgHandler = sdkerrors.Register(ModuleName, 1110, "no action message handler registered for message type") + ErrNoRuleRegistryHandler = sdkerrors.Register(ModuleName, 1111, "no rule registry handler registered for message type") + ErrInvalidRuleDefinition = sdkerrors.Register(ModuleName, 1112, "invalid rule definition") + ErrInvalidRevoker = sdkerrors.Register(ModuleName, 1113, "this account can't revoke this action") + ErrInvalidUpdateRuleAccount = sdkerrors.Register(ModuleName, 1114, "this account can't update this rule") )