github.com/KiraCore/sekai@v0.3.43/x/gov/keeper/msg_server.go (about)

     1  package keeper
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"sort"
     7  	"strconv"
     8  	"time"
     9  
    10  	"github.com/KiraCore/sekai/x/gov/types"
    11  	sdk "github.com/cosmos/cosmos-sdk/types"
    12  	"github.com/cosmos/cosmos-sdk/types/errors"
    13  	sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
    14  	"golang.org/x/exp/utf8string"
    15  )
    16  
    17  type msgServer struct {
    18  	keeper Keeper
    19  }
    20  
    21  // NewMsgServerImpl returns an implementation of the bank MsgServer interface
    22  // for the provided Keeper.
    23  func NewMsgServerImpl(keeper Keeper) types.MsgServer {
    24  	return &msgServer{
    25  		keeper: keeper,
    26  	}
    27  }
    28  
    29  var _ types.MsgServer = msgServer{}
    30  
    31  func (k msgServer) SubmitProposal(goCtx context.Context, msg *types.MsgSubmitProposal) (*types.MsgSubmitProposalResponse, error) {
    32  	ctx := sdk.UnwrapSDKContext(goCtx)
    33  	content := msg.GetContent()
    34  
    35  	err := content.ValidateBasic()
    36  	if err != nil {
    37  		return nil, err
    38  	}
    39  
    40  	// check special proposal with dynamic voter proposal handler
    41  	if content.ProposalPermission() == types.PermZero {
    42  		router := k.keeper.GetProposalRouter()
    43  		isAllowed := router.IsAllowedAddressDynamicProposal(ctx, msg.Proposer, content)
    44  		if !isAllowed {
    45  			return nil, errors.Wrap(types.ErrNotEnoughPermissions, "spending pool permission")
    46  		}
    47  	} else {
    48  		isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, content.ProposalPermission())
    49  		if !isAllowed {
    50  			return nil, errors.Wrap(types.ErrNotEnoughPermissions, content.ProposalPermission().String())
    51  		}
    52  	}
    53  
    54  	proposalID, err := k.keeper.CreateAndSaveProposalWithContent(ctx, msg.Title, msg.Description, content)
    55  	if err != nil {
    56  		return nil, err
    57  	}
    58  
    59  	// call councilor rank update function
    60  	k.keeper.OnCouncilorAct(ctx, msg.Proposer)
    61  
    62  	cacheCtx, _ := ctx.CacheContext()
    63  	router := k.keeper.GetProposalRouter()
    64  	proposal, found := k.keeper.GetProposal(cacheCtx, proposalID)
    65  	if !found {
    66  		return nil, types.ErrProposalDoesNotExist
    67  	}
    68  
    69  	err = router.ApplyProposal(cacheCtx, proposalID, proposal.GetContent(), sdk.ZeroDec())
    70  	if err != nil {
    71  		return nil, err
    72  	}
    73  
    74  	ctx.EventManager().EmitEvent(
    75  		sdk.NewEvent(
    76  			types.EventTypeSubmitProposal,
    77  			sdk.NewAttribute(types.AttributeKeyProposalId, fmt.Sprintf("%d", proposalID)),
    78  			sdk.NewAttribute(types.AttributeKeyProposalType, content.ProposalType()),
    79  			sdk.NewAttribute(types.AttributeKeyProposalContent, msg.String()),
    80  		),
    81  	)
    82  
    83  	return &types.MsgSubmitProposalResponse{
    84  		ProposalID: proposalID,
    85  	}, nil
    86  }
    87  
    88  func (k msgServer) VoteProposal(
    89  	goCtx context.Context,
    90  	msg *types.MsgVoteProposal,
    91  ) (*types.MsgVoteProposalResponse, error) {
    92  	ctx := sdk.UnwrapSDKContext(goCtx)
    93  
    94  	actor, found := k.keeper.GetNetworkActorByAddress(ctx, msg.Voter)
    95  	if !found || !actor.IsActive() {
    96  		return nil, types.ErrActorIsNotActive
    97  	}
    98  
    99  	proposal, found := k.keeper.GetProposal(ctx, msg.ProposalId)
   100  	if !found {
   101  		return nil, types.ErrProposalDoesNotExist
   102  	}
   103  
   104  	if proposal.VotingEndTime.Before(ctx.BlockTime()) {
   105  		return nil, types.ErrVotingTimeEnded
   106  	}
   107  
   108  	// check special proposal with dynamic voter proposal handler
   109  	content := proposal.GetContent()
   110  	if content.VotePermission() == types.PermZero {
   111  		router := k.keeper.GetProposalRouter()
   112  		isAllowed := router.IsAllowedAddressDynamicProposal(ctx, msg.Voter, content)
   113  		if !isAllowed {
   114  			return nil, errors.Wrap(types.ErrNotEnoughPermissions, "spending pool permission")
   115  		}
   116  	} else {
   117  		isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Voter, content.VotePermission())
   118  		if !isAllowed {
   119  			return nil, errors.Wrap(types.ErrNotEnoughPermissions, content.VotePermission().String())
   120  		}
   121  	}
   122  
   123  	// call councilor rank update function when it's the first vote
   124  	if _, found := k.keeper.GetVote(ctx, msg.ProposalId, msg.Voter); !found {
   125  		k.keeper.OnCouncilorAct(ctx, msg.Voter)
   126  	}
   127  
   128  	vote := types.NewVote(msg.ProposalId, msg.Voter, msg.Option, msg.Slash)
   129  	k.keeper.SaveVote(ctx, vote)
   130  
   131  	ctx.EventManager().EmitEvent(
   132  		sdk.NewEvent(
   133  			types.EventTypeProposalVote,
   134  			sdk.NewAttribute(types.AttributeKeyProposalId, fmt.Sprintf("%d", msg.ProposalId)),
   135  			sdk.NewAttribute(types.AttributeKeyVoter, msg.Voter.String()),
   136  			sdk.NewAttribute(types.AttributeKeyOption, msg.Option.String()),
   137  		),
   138  	)
   139  	return &types.MsgVoteProposalResponse{}, nil
   140  }
   141  
   142  func (k msgServer) PollCreate(goCtx context.Context, msg *types.MsgPollCreate) (*types.MsgPollCreateResponse, error) {
   143  	ctx := sdk.UnwrapSDKContext(goCtx)
   144  	blockTime := ctx.BlockTime()
   145  	properties := k.keeper.GetNetworkProperties(ctx)
   146  	allowedTypes := []string{"string", "uint", "int", "float", "bool"}
   147  
   148  	isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Creator, types.PermCreatePollProposal)
   149  	if !isAllowed {
   150  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, types.PermCreatePollProposal.String())
   151  	}
   152  
   153  	if len(msg.Title) > int(properties.MaxProposalTitleSize) {
   154  		return nil, types.ErrProposalTitleSizeExceeds
   155  	}
   156  
   157  	if len(msg.Description) > int(properties.MaxProposalDescriptionSize) {
   158  		return nil, types.ErrProposalDescriptionSizeExceeds
   159  	}
   160  
   161  	if len(msg.Reference) > int(properties.MaxProposalReferenceSize) {
   162  		return nil, types.ErrProposalTitleSizeExceeds
   163  	}
   164  
   165  	if len(msg.Checksum) > int(properties.MaxProposalChecksumSize) {
   166  		return nil, types.ErrProposalTitleSizeExceeds
   167  	}
   168  
   169  	if len(msg.PollValues) > int(properties.MaxProposalPollOptionCount) {
   170  		return nil, types.ErrProposalOptionCountExceeds
   171  	}
   172  
   173  	duration, err := time.ParseDuration(msg.Duration)
   174  	if err != nil || blockTime.Add(duration).Before(blockTime) {
   175  		return nil, fmt.Errorf("invalid duration: %w", err)
   176  	}
   177  
   178  	for _, v := range msg.PollValues {
   179  		if len(v) > int(properties.MaxProposalPollOptionSize) {
   180  			return nil, types.ErrProposalOptionSizeExceeds
   181  		}
   182  
   183  		if !utf8string.NewString(v).IsASCII() {
   184  			return nil, types.ErrProposalOptionOnlyAscii
   185  		}
   186  	}
   187  
   188  	for _, v := range msg.Roles {
   189  		_, err := k.keeper.GetRoleBySid(ctx, v)
   190  		if err != nil {
   191  			return nil, errors.Wrap(types.ErrRoleDoesNotExist, v)
   192  		}
   193  	}
   194  
   195  	sort.Strings(allowedTypes)
   196  	i := sort.SearchStrings(allowedTypes, msg.ValueType)
   197  
   198  	if i == len(allowedTypes) && allowedTypes[i] != msg.ValueType {
   199  		return nil, types.ErrProposalTypeNotAllowed
   200  	}
   201  
   202  	pollID, err := k.keeper.PollCreate(ctx, msg)
   203  
   204  	if err != nil {
   205  		return nil, err
   206  	}
   207  
   208  	return &types.MsgPollCreateResponse{
   209  		PollID: pollID,
   210  	}, nil
   211  }
   212  
   213  func (k msgServer) PollVote(goCtx context.Context, msg *types.MsgPollVote) (*types.MsgPollVoteResponse, error) {
   214  	ctx := sdk.UnwrapSDKContext(goCtx)
   215  
   216  	actor, found := k.keeper.GetNetworkActorByAddress(ctx, msg.Voter)
   217  	if !found || !actor.IsActive() {
   218  		return nil, types.ErrActorIsNotActive
   219  	}
   220  
   221  	poll, pErr := k.keeper.GetPoll(ctx, msg.PollId)
   222  	if pErr != nil {
   223  		return nil, pErr
   224  	}
   225  
   226  	if poll.VotingEndTime.Before(time.Now()) {
   227  		return nil, types.ErrVotingTimeEnded
   228  	}
   229  
   230  	roles := intersection(poll.Roles, actor.Roles)
   231  
   232  	if len(roles) == 0 {
   233  		return nil, types.ErrNotEnoughPermissions
   234  	}
   235  
   236  	switch poll.Options.Type {
   237  	case "uint":
   238  		_, err := strconv.ParseUint(msg.Value, 10, 64)
   239  		if err != nil {
   240  			return nil, errors.Wrap(types.ErrPollWrongValue, "Can not be converted to the unsigned integer")
   241  		}
   242  	case "int":
   243  		_, err := strconv.ParseInt(msg.Value, 10, 64)
   244  		if err != nil {
   245  			return nil, errors.Wrap(types.ErrPollWrongValue, "Can not be converted to the integer")
   246  		}
   247  	case "bool":
   248  		_, err := strconv.ParseBool(msg.Value)
   249  		if err != nil {
   250  			return nil, errors.Wrap(types.ErrPollWrongValue, "Can not be converted to the boolean")
   251  		}
   252  	case "float":
   253  		_, err := strconv.ParseFloat(msg.Value, 64)
   254  		if err != nil {
   255  			return nil, errors.Wrap(types.ErrPollWrongValue, "Can not be converted to the float")
   256  		}
   257  	}
   258  
   259  	if msg.Option == types.PollOptionCustom && poll.Options.Count <= uint64(len(poll.Options.Values)) && !inSlice(poll.Options.Values, msg.Value) {
   260  		return nil, errors.Wrap(types.ErrPollWrongValue, "Maximum custom values exceeded")
   261  	}
   262  
   263  	if msg.Option == types.PollOptionCustom && poll.Options.Count > uint64(len(poll.Options.Values)) && !inSlice(poll.Options.Values, msg.Value) {
   264  		poll.Options.Values = append(poll.Options.Values, msg.Value)
   265  		k.keeper.SavePoll(ctx, poll)
   266  	}
   267  
   268  	err := k.keeper.PollVote(ctx, msg)
   269  	return &types.MsgPollVoteResponse{}, err
   270  }
   271  
   272  // RegisterIdentityRecords defines a method to create identity record
   273  func (k msgServer) RegisterIdentityRecords(goCtx context.Context, msg *types.MsgRegisterIdentityRecords) (*types.MsgRegisterIdentityRecordsResponse, error) {
   274  	ctx := sdk.UnwrapSDKContext(goCtx)
   275  	err := k.keeper.RegisterIdentityRecords(ctx, msg.Address, msg.Infos)
   276  	return &types.MsgRegisterIdentityRecordsResponse{}, err
   277  }
   278  
   279  func (k msgServer) DeleteIdentityRecords(goCtx context.Context, msg *types.MsgDeleteIdentityRecords) (*types.MsgDeleteIdentityRecordsResponse, error) {
   280  	ctx := sdk.UnwrapSDKContext(goCtx)
   281  	err := k.keeper.DeleteIdentityRecords(ctx, msg.Address, msg.Keys)
   282  	return &types.MsgDeleteIdentityRecordsResponse{}, err
   283  }
   284  
   285  // RequestIdentityRecordsVerify defines a method to request verify request from specific verifier
   286  func (k msgServer) RequestIdentityRecordsVerify(goCtx context.Context, msg *types.MsgRequestIdentityRecordsVerify) (*types.MsgRequestIdentityRecordsVerifyResponse, error) {
   287  	ctx := sdk.UnwrapSDKContext(goCtx)
   288  	requestId, err := k.keeper.RequestIdentityRecordsVerify(ctx, msg.Address, msg.Verifier, msg.RecordIds, msg.Tip)
   289  	return &types.MsgRequestIdentityRecordsVerifyResponse{
   290  		RequestId: requestId,
   291  	}, err
   292  }
   293  
   294  // ApproveIdentityRecords defines a method to accept verification request
   295  func (k msgServer) HandleIdentityRecordsVerifyRequest(goCtx context.Context, msg *types.MsgHandleIdentityRecordsVerifyRequest) (*types.MsgHandleIdentityRecordsVerifyResponse, error) {
   296  	ctx := sdk.UnwrapSDKContext(goCtx)
   297  	err := k.keeper.HandleIdentityRecordsVerifyRequest(ctx, msg.Verifier, msg.VerifyRequestId, msg.Yes)
   298  	return &types.MsgHandleIdentityRecordsVerifyResponse{}, err
   299  }
   300  
   301  func (k msgServer) CancelIdentityRecordsVerifyRequest(goCtx context.Context, msg *types.MsgCancelIdentityRecordsVerifyRequest) (*types.MsgCancelIdentityRecordsVerifyRequestResponse, error) {
   302  	ctx := sdk.UnwrapSDKContext(goCtx)
   303  	err := k.keeper.CancelIdentityRecordsVerifyRequest(ctx, msg.Executor, msg.VerifyRequestId)
   304  	return &types.MsgCancelIdentityRecordsVerifyRequestResponse{}, err
   305  }
   306  
   307  func (k msgServer) UnassignRole(
   308  	goCtx context.Context,
   309  	msg *types.MsgUnassignRole,
   310  ) (*types.MsgUnassignRoleResponse, error) {
   311  	ctx := sdk.UnwrapSDKContext(goCtx)
   312  
   313  	isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermUpsertRole)
   314  	if !isAllowed {
   315  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, types.PermUpsertRole.String())
   316  	}
   317  
   318  	err := k.keeper.UnassignRoleFromAccount(ctx, msg.Address, uint64(msg.RoleId))
   319  	if err != nil {
   320  		return nil, err
   321  	}
   322  	ctx.EventManager().EmitEvent(
   323  		sdk.NewEvent(
   324  			types.EventTypeUnassignRole,
   325  			sdk.NewAttribute(types.AttributeKeyProposer, msg.Proposer.String()),
   326  			sdk.NewAttribute(types.AttributeKeyAddress, msg.Address.String()),
   327  			sdk.NewAttribute(types.AttributeKeyRoleId, fmt.Sprintf("%d", msg.RoleId)),
   328  		),
   329  	)
   330  	return &types.MsgUnassignRoleResponse{}, nil
   331  }
   332  
   333  func (k msgServer) AssignRole(
   334  	goCtx context.Context,
   335  	msg *types.MsgAssignRole,
   336  ) (*types.MsgAssignRoleResponse, error) {
   337  	ctx := sdk.UnwrapSDKContext(goCtx)
   338  
   339  	isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermUpsertRole)
   340  	if !isAllowed {
   341  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, types.PermUpsertRole.String())
   342  	}
   343  
   344  	err := k.keeper.AssignRoleToAccount(ctx, msg.Address, uint64(msg.RoleId))
   345  	if err != nil {
   346  		return nil, err
   347  	}
   348  
   349  	ctx.EventManager().EmitEvent(
   350  		sdk.NewEvent(
   351  			types.EventTypeAssignRole,
   352  			sdk.NewAttribute(types.AttributeKeyProposer, msg.Proposer.String()),
   353  			sdk.NewAttribute(types.AttributeKeyAddress, msg.Address.String()),
   354  			sdk.NewAttribute(types.AttributeKeyRoleId, fmt.Sprintf("%d", msg.RoleId)),
   355  		),
   356  	)
   357  	return &types.MsgAssignRoleResponse{}, nil
   358  }
   359  
   360  func (k msgServer) CreateRole(
   361  	goCtx context.Context,
   362  	msg *types.MsgCreateRole,
   363  ) (*types.MsgCreateRoleResponse, error) {
   364  	ctx := sdk.UnwrapSDKContext(goCtx)
   365  
   366  	isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermUpsertRole)
   367  	if !isAllowed {
   368  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, "PermUpsertRole")
   369  	}
   370  
   371  	// check sid is good variable naming form
   372  	if !ValidateRoleSidKey(msg.RoleSid) {
   373  		return nil, errors.Wrap(types.ErrInvalidRoleSid, fmt.Sprintf("invalid role sid configuration: sid=%s", msg.RoleSid))
   374  	}
   375  
   376  	_, err := k.keeper.GetRoleBySid(ctx, msg.RoleSid)
   377  	if err == nil {
   378  		return nil, types.ErrRoleExist
   379  	}
   380  
   381  	roleId := k.keeper.CreateRole(ctx, msg.RoleSid, msg.RoleDescription)
   382  	ctx.EventManager().EmitEvent(
   383  		sdk.NewEvent(
   384  			types.EventTypeCreateRole,
   385  			sdk.NewAttribute(types.AttributeKeyProposer, msg.Proposer.String()),
   386  			sdk.NewAttribute(types.AttributeKeyRoleId, fmt.Sprintf("%d", roleId)),
   387  		),
   388  	)
   389  	return &types.MsgCreateRoleResponse{}, nil
   390  }
   391  
   392  func (k msgServer) RemoveBlacklistRolePermission(
   393  	goCtx context.Context,
   394  	msg *types.MsgRemoveBlacklistRolePermission,
   395  ) (*types.MsgRemoveBlacklistRolePermissionResponse, error) {
   396  	ctx := sdk.UnwrapSDKContext(goCtx)
   397  
   398  	isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermUpsertRole)
   399  	if !isAllowed {
   400  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, types.PermUpsertRole.String())
   401  	}
   402  
   403  	roleId, err := k.keeper.GetRoleIdFromIdentifierString(ctx, msg.RoleIdentifier)
   404  	if err != nil {
   405  		return nil, err
   406  	}
   407  
   408  	err = k.keeper.RemoveBlacklistRolePermission(ctx, roleId, types.PermValue(msg.Permission))
   409  	if err != nil {
   410  		return nil, err
   411  	}
   412  	ctx.EventManager().EmitEvent(
   413  		sdk.NewEvent(
   414  			types.EventTypeRemoveBlacklistRolePermisison,
   415  			sdk.NewAttribute(types.AttributeKeyProposer, msg.Proposer.String()),
   416  			sdk.NewAttribute(types.AttributeKeyRoleId, msg.RoleIdentifier),
   417  			sdk.NewAttribute(types.AttributeKeyPermission, fmt.Sprintf("%d", msg.Permission)),
   418  		),
   419  	)
   420  	return &types.MsgRemoveBlacklistRolePermissionResponse{}, nil
   421  }
   422  
   423  func (k msgServer) RemoveWhitelistRolePermission(
   424  	goCtx context.Context,
   425  	msg *types.MsgRemoveWhitelistRolePermission,
   426  ) (*types.MsgRemoveWhitelistRolePermissionResponse, error) {
   427  	ctx := sdk.UnwrapSDKContext(goCtx)
   428  
   429  	isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermUpsertRole)
   430  	if !isAllowed {
   431  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, types.PermUpsertRole.String())
   432  	}
   433  
   434  	roleId, err := k.keeper.GetRoleIdFromIdentifierString(ctx, msg.RoleIdentifier)
   435  	if err != nil {
   436  		return nil, err
   437  	}
   438  
   439  	err = k.keeper.RemoveWhitelistRolePermission(ctx, roleId, types.PermValue(msg.Permission))
   440  	if err != nil {
   441  		return nil, err
   442  	}
   443  	ctx.EventManager().EmitEvent(
   444  		sdk.NewEvent(
   445  			types.EventTypeRemoveWhitelistRolePermisison,
   446  			sdk.NewAttribute(types.AttributeKeyProposer, msg.Proposer.String()),
   447  			sdk.NewAttribute(types.AttributeKeyRoleId, msg.RoleIdentifier),
   448  			sdk.NewAttribute(types.AttributeKeyPermission, fmt.Sprintf("%d", msg.Permission)),
   449  		),
   450  	)
   451  	return &types.MsgRemoveWhitelistRolePermissionResponse{}, nil
   452  }
   453  
   454  func (k msgServer) BlacklistRolePermission(
   455  	goCtx context.Context,
   456  	msg *types.MsgBlacklistRolePermission,
   457  ) (*types.MsgBlacklistRolePermissionResponse, error) {
   458  	ctx := sdk.UnwrapSDKContext(goCtx)
   459  
   460  	isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermUpsertRole)
   461  	if !isAllowed {
   462  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, types.PermUpsertRole.String())
   463  	}
   464  
   465  	roleId, err := k.keeper.GetRoleIdFromIdentifierString(ctx, msg.RoleIdentifier)
   466  	if err != nil {
   467  		return nil, err
   468  	}
   469  
   470  	err = k.keeper.BlacklistRolePermission(ctx, roleId, types.PermValue(msg.Permission))
   471  	if err != nil {
   472  		return nil, err
   473  	}
   474  	ctx.EventManager().EmitEvent(
   475  		sdk.NewEvent(
   476  			types.EventTypeBlacklistRolePermisison,
   477  			sdk.NewAttribute(types.AttributeKeyProposer, msg.Proposer.String()),
   478  			sdk.NewAttribute(types.AttributeKeyRoleId, msg.RoleIdentifier),
   479  			sdk.NewAttribute(types.AttributeKeyPermission, fmt.Sprintf("%d", msg.Permission)),
   480  		),
   481  	)
   482  	return &types.MsgBlacklistRolePermissionResponse{}, nil
   483  }
   484  
   485  func (k msgServer) WhitelistRolePermission(
   486  	goCtx context.Context,
   487  	msg *types.MsgWhitelistRolePermission,
   488  ) (*types.MsgWhitelistRolePermissionResponse, error) {
   489  	ctx := sdk.UnwrapSDKContext(goCtx)
   490  
   491  	isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermUpsertRole)
   492  	if !isAllowed {
   493  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, types.PermUpsertRole.String())
   494  	}
   495  
   496  	roleId, err := k.keeper.GetRoleIdFromIdentifierString(ctx, msg.RoleIdentifier)
   497  	if err != nil {
   498  		return nil, err
   499  	}
   500  
   501  	err = k.keeper.WhitelistRolePermission(ctx, roleId, types.PermValue(msg.Permission))
   502  	if err != nil {
   503  		return nil, err
   504  	}
   505  	ctx.EventManager().EmitEvent(
   506  		sdk.NewEvent(
   507  			types.EventTypeWhitelistRolePermisison,
   508  			sdk.NewAttribute(types.AttributeKeyProposer, msg.Proposer.String()),
   509  			sdk.NewAttribute(types.AttributeKeyRoleId, msg.RoleIdentifier),
   510  			sdk.NewAttribute(types.AttributeKeyPermission, fmt.Sprintf("%d", msg.Permission)),
   511  		),
   512  	)
   513  	return &types.MsgWhitelistRolePermissionResponse{}, nil
   514  }
   515  
   516  func (k msgServer) WhitelistPermissions(
   517  	goCtx context.Context,
   518  	msg *types.MsgWhitelistPermissions,
   519  ) (*types.MsgWhitelistPermissionsResponse, error) {
   520  	ctx := sdk.UnwrapSDKContext(goCtx)
   521  
   522  	isSetClaimValidatorMsg := msg.Permission == uint32(types.PermClaimValidator)
   523  	hasSetClaimValidatorPermission := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermSetClaimValidatorPermission)
   524  	hasSetPermissionsPermission := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermSetPermissions)
   525  	if !hasSetPermissionsPermission && !(isSetClaimValidatorMsg && hasSetClaimValidatorPermission) {
   526  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, "PermSetPermissions || (ClaimValidatorPermission && ClaimValidatorPermMsg)")
   527  	}
   528  
   529  	actor, found := k.keeper.GetNetworkActorByAddress(ctx, msg.Address)
   530  	if !found {
   531  		actor = types.NewDefaultActor(msg.Address)
   532  	}
   533  
   534  	err := k.keeper.AddWhitelistPermission(ctx, actor, types.PermValue(msg.Permission))
   535  	if err != nil {
   536  		return nil, errors.Wrapf(types.ErrSetPermissions, "error setting %d to whitelist: %s", msg.Permission, err)
   537  	}
   538  
   539  	ctx.EventManager().EmitEvent(
   540  		sdk.NewEvent(
   541  			types.EventTypeWhitelistPermisison,
   542  			sdk.NewAttribute(types.AttributeKeyProposer, msg.Proposer.String()),
   543  			sdk.NewAttribute(types.AttributeKeyRoleId, msg.Address.String()),
   544  			sdk.NewAttribute(types.AttributeKeyPermission, fmt.Sprintf("%d", msg.Permission)),
   545  		),
   546  	)
   547  	return &types.MsgWhitelistPermissionsResponse{}, nil
   548  }
   549  
   550  func (k msgServer) RemoveWhitelistedPermissions(
   551  	goCtx context.Context,
   552  	msg *types.MsgRemoveWhitelistedPermissions,
   553  ) (*types.MsgRemoveWhitelistedPermissionsResponse, error) {
   554  	ctx := sdk.UnwrapSDKContext(goCtx)
   555  
   556  	isSetClaimValidatorMsg := msg.Permission == uint32(types.PermClaimValidator)
   557  	hasSetClaimValidatorPermission := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermSetClaimValidatorPermission)
   558  	hasSetPermissionsPermission := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermSetPermissions)
   559  	if !hasSetPermissionsPermission && !(isSetClaimValidatorMsg && hasSetClaimValidatorPermission) {
   560  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, "PermSetPermissions || (ClaimValidatorPermission && ClaimValidatorPermMsg)")
   561  	}
   562  
   563  	actor, found := k.keeper.GetNetworkActorByAddress(ctx, msg.Address)
   564  	if !found {
   565  		actor = types.NewDefaultActor(msg.Address)
   566  	}
   567  
   568  	err := k.keeper.RemoveWhitelistedPermission(ctx, actor, types.PermValue(msg.Permission))
   569  	if err != nil {
   570  		return nil, errors.Wrapf(types.ErrSetPermissions, "error setting %d to whitelist: %s", msg.Permission, err)
   571  	}
   572  
   573  	ctx.EventManager().EmitEvent(
   574  		sdk.NewEvent(
   575  			types.EventTypeRemoveWhitelistedPermisison,
   576  			sdk.NewAttribute(types.AttributeKeyProposer, msg.Proposer.String()),
   577  			sdk.NewAttribute(types.AttributeKeyRoleId, msg.Address.String()),
   578  			sdk.NewAttribute(types.AttributeKeyPermission, fmt.Sprintf("%d", msg.Permission)),
   579  		),
   580  	)
   581  	return &types.MsgRemoveWhitelistedPermissionsResponse{}, nil
   582  }
   583  
   584  func (k msgServer) BlacklistPermissions(
   585  	goCtx context.Context,
   586  	msg *types.MsgBlacklistPermissions,
   587  ) (*types.MsgBlacklistPermissionsResponse, error) {
   588  	ctx := sdk.UnwrapSDKContext(goCtx)
   589  
   590  	isSetClaimValidatorMsg := msg.Permission == uint32(types.PermClaimValidator)
   591  	hasSetClaimValidatorPermission := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermSetClaimValidatorPermission)
   592  	hasSetPermissionsPermission := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermSetPermissions)
   593  	if !hasSetPermissionsPermission && !(isSetClaimValidatorMsg && hasSetClaimValidatorPermission) {
   594  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, "PermSetPermissions || (ClaimValidatorPermission && ClaimValidatorPermMsg)")
   595  	}
   596  
   597  	actor, found := k.keeper.GetNetworkActorByAddress(ctx, msg.Address)
   598  	if !found {
   599  		actor = types.NewDefaultActor(msg.Address)
   600  	}
   601  
   602  	err := actor.Permissions.AddToBlacklist(types.PermValue(msg.Permission))
   603  	if err != nil {
   604  		return nil, errors.Wrapf(types.ErrSetPermissions, "error setting %d to whitelist: %s", msg.Permission, err)
   605  	}
   606  
   607  	k.keeper.SaveNetworkActor(ctx, actor)
   608  	ctx.EventManager().EmitEvent(
   609  		sdk.NewEvent(
   610  			types.EventTypeBlacklistPermisison,
   611  			sdk.NewAttribute(types.AttributeKeyProposer, msg.Proposer.String()),
   612  			sdk.NewAttribute(types.AttributeKeyRoleId, msg.Address.String()),
   613  			sdk.NewAttribute(types.AttributeKeyPermission, fmt.Sprintf("%d", msg.Permission)),
   614  		),
   615  	)
   616  	return &types.MsgBlacklistPermissionsResponse{}, nil
   617  }
   618  
   619  func (k msgServer) RemoveBlacklistedPermissions(
   620  	goCtx context.Context,
   621  	msg *types.MsgRemoveBlacklistedPermissions,
   622  ) (*types.MsgRemoveBlacklistedPermissionsResponse, error) {
   623  	ctx := sdk.UnwrapSDKContext(goCtx)
   624  
   625  	isSetClaimValidatorMsg := msg.Permission == uint32(types.PermClaimValidator)
   626  	hasSetClaimValidatorPermission := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermSetClaimValidatorPermission)
   627  	hasSetPermissionsPermission := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermSetPermissions)
   628  	if !hasSetPermissionsPermission && !(isSetClaimValidatorMsg && hasSetClaimValidatorPermission) {
   629  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, "PermSetPermissions || (ClaimValidatorPermission && ClaimValidatorPermMsg)")
   630  	}
   631  
   632  	actor, found := k.keeper.GetNetworkActorByAddress(ctx, msg.Address)
   633  	if !found {
   634  		actor = types.NewDefaultActor(msg.Address)
   635  	}
   636  
   637  	err := actor.Permissions.RemoveFromBlacklist(types.PermValue(msg.Permission))
   638  	if err != nil {
   639  		return nil, errors.Wrapf(types.ErrSetPermissions, "error setting %d to whitelist: %s", msg.Permission, err)
   640  	}
   641  
   642  	k.keeper.SaveNetworkActor(ctx, actor)
   643  	ctx.EventManager().EmitEvent(
   644  		sdk.NewEvent(
   645  			types.EventTypeRemoveBlacklistedPermisison,
   646  			sdk.NewAttribute(types.AttributeKeyProposer, msg.Proposer.String()),
   647  			sdk.NewAttribute(types.AttributeKeyRoleId, msg.Address.String()),
   648  			sdk.NewAttribute(types.AttributeKeyPermission, fmt.Sprintf("%d", msg.Permission)),
   649  		),
   650  	)
   651  	return &types.MsgRemoveBlacklistedPermissionsResponse{}, nil
   652  }
   653  
   654  func (k msgServer) SetNetworkProperties(
   655  	goCtx context.Context,
   656  	msg *types.MsgSetNetworkProperties,
   657  ) (*types.MsgSetNetworkPropertiesResponse, error) {
   658  	ctx := sdk.UnwrapSDKContext(goCtx)
   659  
   660  	isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermChangeTxFee)
   661  	if !isAllowed {
   662  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, "PermChangeTxFee")
   663  	}
   664  	err := k.keeper.SetNetworkProperties(ctx, msg.NetworkProperties)
   665  	if err != nil {
   666  		return nil, err
   667  	}
   668  	ctx.EventManager().EmitEvent(
   669  		sdk.NewEvent(
   670  			types.EventTypeSetNetworkProperties,
   671  			sdk.NewAttribute(types.AttributeKeyProposer, msg.Proposer.String()),
   672  			sdk.NewAttribute(types.AttributeKeyProperties, msg.NetworkProperties.String()),
   673  		),
   674  	)
   675  	return &types.MsgSetNetworkPropertiesResponse{}, nil
   676  }
   677  
   678  func (k msgServer) SetExecutionFee(
   679  	goCtx context.Context,
   680  	msg *types.MsgSetExecutionFee,
   681  ) (*types.MsgSetExecutionFeeResponse, error) {
   682  	ctx := sdk.UnwrapSDKContext(goCtx)
   683  
   684  	isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Proposer, types.PermChangeTxFee)
   685  	if !isAllowed {
   686  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, "PermChangeTxFee")
   687  	}
   688  
   689  	k.keeper.SetExecutionFee(ctx, types.ExecutionFee{
   690  		TransactionType:   msg.TransactionType,
   691  		ExecutionFee:      msg.ExecutionFee,
   692  		FailureFee:        msg.FailureFee,
   693  		Timeout:           msg.Timeout,
   694  		DefaultParameters: msg.DefaultParameters,
   695  	})
   696  	ctx.EventManager().EmitEvent(
   697  		sdk.NewEvent(
   698  			types.EventTypeSetExecutionFee,
   699  			sdk.NewAttribute(types.AttributeKeyProposer, msg.Proposer.String()),
   700  			sdk.NewAttribute(types.AttributeKeyTransactionType, msg.TransactionType),
   701  			sdk.NewAttribute(types.AttributeKeyExecutionFee, fmt.Sprintf("%d", msg.ExecutionFee)),
   702  			sdk.NewAttribute(types.AttributeKeyFailureFee, fmt.Sprintf("%d", msg.FailureFee)),
   703  			sdk.NewAttribute(types.AttributeKeyTimeout, fmt.Sprintf("%d", msg.FailureFee)),
   704  			sdk.NewAttribute(types.AttributeKeyDefaultParameters, fmt.Sprintf("%d", msg.DefaultParameters)),
   705  		),
   706  	)
   707  	return &types.MsgSetExecutionFeeResponse{}, nil
   708  }
   709  
   710  func (k msgServer) ClaimCouncilor(
   711  	goCtx context.Context,
   712  	msg *types.MsgClaimCouncilor,
   713  ) (*types.MsgClaimCouncilorResponse, error) {
   714  	ctx := sdk.UnwrapSDKContext(goCtx)
   715  
   716  	isAllowed := CheckIfAllowedPermission(ctx, k.keeper, msg.Address, types.PermClaimCouncilor)
   717  	if !isAllowed {
   718  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, "PermClaimCouncilor")
   719  	}
   720  
   721  	actor, found := k.keeper.GetNetworkActorByAddress(ctx, msg.Address)
   722  	if !found {
   723  		return nil, errors.Wrap(types.ErrNotEnoughPermissions, "network actor not found")
   724  	}
   725  	err := actor.Permissions.AddToWhitelist(types.PermCreatePollProposal)
   726  	if err == nil {
   727  		k.keeper.SaveNetworkActor(ctx, actor)
   728  	}
   729  
   730  	councilor := types.NewCouncilor(msg.Address, types.CouncilorActive)
   731  	k.keeper.SaveCouncilor(ctx, councilor)
   732  
   733  	identityInfo := []types.IdentityInfoEntry{}
   734  	if msg.Moniker != "" {
   735  		identityInfo = append(identityInfo, types.IdentityInfoEntry{
   736  			Key:  "moniker",
   737  			Info: msg.Moniker,
   738  		})
   739  	}
   740  
   741  	if msg.Username != "" {
   742  		identityInfo = append(identityInfo, types.IdentityInfoEntry{
   743  			Key:  "username",
   744  			Info: msg.Username,
   745  		})
   746  	}
   747  
   748  	if msg.Description != "" {
   749  		identityInfo = append(identityInfo, types.IdentityInfoEntry{
   750  			Key:  "description",
   751  			Info: msg.Description,
   752  		})
   753  	}
   754  
   755  	if msg.Social != "" {
   756  		identityInfo = append(identityInfo, types.IdentityInfoEntry{
   757  			Key:  "social",
   758  			Info: msg.Social,
   759  		})
   760  	}
   761  
   762  	if msg.Contact != "" {
   763  		identityInfo = append(identityInfo, types.IdentityInfoEntry{
   764  			Key:  "contact",
   765  			Info: msg.Contact,
   766  		})
   767  	}
   768  
   769  	if msg.Avatar != "" {
   770  		identityInfo = append(identityInfo, types.IdentityInfoEntry{
   771  			Key:  "avatar",
   772  			Info: msg.Avatar,
   773  		})
   774  	}
   775  
   776  	err = k.keeper.RegisterIdentityRecords(ctx, msg.Address, identityInfo)
   777  	if err != nil {
   778  		return nil, err
   779  	}
   780  
   781  	ctx.EventManager().EmitEvent(
   782  		sdk.NewEvent(
   783  			types.EventTypeClaimCouncilor,
   784  			sdk.NewAttribute(types.AttributeKeyAddress, msg.Address.String()),
   785  		),
   786  	)
   787  	return &types.MsgClaimCouncilorResponse{}, nil
   788  }
   789  
   790  // CouncilorPause - signal to the network that Councilor will NOT be present for a prolonged period of time
   791  func (k msgServer) CouncilorPause(
   792  	goCtx context.Context,
   793  	msg *types.MsgCouncilorPause,
   794  ) (*types.MsgCouncilorPauseResponse, error) {
   795  	ctx := sdk.UnwrapSDKContext(goCtx)
   796  
   797  	sender, err := sdk.AccAddressFromBech32(msg.Sender)
   798  	if err != nil {
   799  		return nil, err
   800  	}
   801  
   802  	councilor, found := k.keeper.GetCouncilor(ctx, sender)
   803  	if !found {
   804  		return nil, types.ErrCouncilorNotFound
   805  	}
   806  
   807  	// cannot be paused if not jailed already
   808  	if councilor.Status == types.CouncilorJailed {
   809  		return nil, sdkerrors.Wrap(types.ErrCouncilorJailed, "Can NOT pause jailed councilor")
   810  	}
   811  
   812  	// cannot be paused if not inactive already
   813  	if councilor.Status == types.CouncilorInactive {
   814  		return nil, sdkerrors.Wrap(types.ErrCouncilorInactivated, "Can NOT pause inactivated councilor")
   815  	}
   816  
   817  	// cannot be paused if not paused already
   818  	if councilor.Status == types.CouncilorPaused {
   819  		return nil, sdkerrors.Wrap(types.ErrCouncilorPaused, "Can NOT pause already paused councilor")
   820  	}
   821  
   822  	councilor.Status = types.CouncilorPaused
   823  	k.keeper.SaveCouncilor(ctx, councilor)
   824  	return &types.MsgCouncilorPauseResponse{}, nil
   825  }
   826  
   827  // CouncilorUnpause - signal to the network that Councilor wishes to regain voting ability after planned absence
   828  func (k msgServer) CouncilorUnpause(
   829  	goCtx context.Context,
   830  	msg *types.MsgCouncilorUnpause,
   831  ) (*types.MsgCouncilorUnpauseResponse, error) {
   832  	ctx := sdk.UnwrapSDKContext(goCtx)
   833  
   834  	sender, err := sdk.AccAddressFromBech32(msg.Sender)
   835  	if err != nil {
   836  		return nil, err
   837  	}
   838  
   839  	councilor, found := k.keeper.GetCouncilor(ctx, sender)
   840  	if !found {
   841  		return nil, types.ErrCouncilorNotFound
   842  	}
   843  
   844  	// cannot be paused if not paused already
   845  	if councilor.Status != types.CouncilorPaused {
   846  		return nil, sdkerrors.Wrap(types.ErrCouncilorNotPaused, "Can NOT unpause not paused councilor")
   847  	}
   848  
   849  	councilor.Status = types.CouncilorActive
   850  	k.keeper.SaveCouncilor(ctx, councilor)
   851  
   852  	return &types.MsgCouncilorUnpauseResponse{}, nil
   853  }
   854  
   855  // CouncilorActivate - signal to the network that Councilor wishes to regain voting ability after planned absence
   856  func (k msgServer) CouncilorActivate(
   857  	goCtx context.Context,
   858  	msg *types.MsgCouncilorActivate,
   859  ) (*types.MsgCouncilorActivateResponse, error) {
   860  	ctx := sdk.UnwrapSDKContext(goCtx)
   861  
   862  	sender, err := sdk.AccAddressFromBech32(msg.Sender)
   863  	if err != nil {
   864  		return nil, err
   865  	}
   866  
   867  	councilor, found := k.keeper.GetCouncilor(ctx, sender)
   868  	if !found {
   869  		return nil, types.ErrCouncilorNotFound
   870  	}
   871  
   872  	// cannot be activated if not inactive already
   873  	if councilor.Status != types.CouncilorInactive {
   874  		return nil, sdkerrors.Wrap(types.ErrCouncilorNotInactivated, "Can NOT activate NOT inactive councilor")
   875  	}
   876  
   877  	councilor.Status = types.CouncilorActive
   878  	councilor.AbstentionCounter = 0
   879  	k.keeper.SaveCouncilor(ctx, councilor)
   880  
   881  	return &types.MsgCouncilorActivateResponse{}, nil
   882  }
   883  
   884  func intersection(first, second []uint64) []uint64 {
   885  	out := []uint64{}
   886  	bucket := map[uint64]bool{}
   887  
   888  	for _, i := range first {
   889  		for _, j := range second {
   890  			if i == j && !bucket[i] {
   891  				out = append(out, i)
   892  				bucket[i] = true
   893  			}
   894  		}
   895  	}
   896  
   897  	return out
   898  }
   899  
   900  func inSlice(sl []string, name string) bool {
   901  	for _, value := range sl {
   902  		if value == name {
   903  			return true
   904  		}
   905  	}
   906  	return false
   907  }