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 }