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

     1  package keeper
     2  
     3  import (
     4  	"github.com/KiraCore/sekai/x/gov/types"
     5  	"github.com/cosmos/cosmos-sdk/store/prefix"
     6  	sdk "github.com/cosmos/cosmos-sdk/types"
     7  )
     8  
     9  func (k Keeper) SaveNetworkActor(ctx sdk.Context, actor types.NetworkActor) {
    10  	prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), NetworkActorsPrefix)
    11  
    12  	bz := k.cdc.MustMarshal(&actor)
    13  	prefixStore.Set(actor.Address.Bytes(), bz)
    14  }
    15  
    16  func (k Keeper) DeleteNetworkActor(ctx sdk.Context, actor types.NetworkActor) {
    17  	prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), NetworkActorsPrefix)
    18  	prefixStore.Delete(actor.Address.Bytes())
    19  }
    20  
    21  func (k Keeper) GetNetworkActorByAddress(ctx sdk.Context, address sdk.AccAddress) (types.NetworkActor, bool) {
    22  	prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), NetworkActorsPrefix)
    23  
    24  	bz := prefixStore.Get(address.Bytes())
    25  	if bz == nil {
    26  		return types.NetworkActor{}, false
    27  	}
    28  
    29  	var na types.NetworkActor
    30  	k.cdc.MustUnmarshal(bz, &na)
    31  
    32  	return na, true
    33  }
    34  
    35  func (k Keeper) GetNetworkActorFromIterator(iterator sdk.Iterator) *types.NetworkActor {
    36  	bz := iterator.Value()
    37  	if bz == nil {
    38  		return nil
    39  	}
    40  
    41  	var na types.NetworkActor
    42  	k.cdc.MustUnmarshal(bz, &na)
    43  
    44  	return &na
    45  }
    46  
    47  func (k Keeper) SetWhitelistAddressPermKey(ctx sdk.Context, actor types.NetworkActor, perm types.PermValue) {
    48  	store := ctx.KVStore(k.storeKey)
    49  	store.Set(WhitelistAddressPermKey(actor.Address, perm), actor.Address.Bytes())
    50  }
    51  
    52  func (k Keeper) DeleteWhitelistAddressPermKey(ctx sdk.Context, actor types.NetworkActor, perm types.PermValue) {
    53  	store := ctx.KVStore(k.storeKey)
    54  	store.Delete(WhitelistAddressPermKey(actor.Address, perm))
    55  }
    56  
    57  // AddWhitelistPermission whitelist a permission to an address. It saves the actor after it.
    58  func (k Keeper) AddWhitelistPermission(ctx sdk.Context, actor types.NetworkActor, perm types.PermValue) error {
    59  	err := actor.Permissions.AddToWhitelist(perm)
    60  	if err != nil {
    61  		return err
    62  	}
    63  
    64  	k.SaveNetworkActor(ctx, actor)
    65  	k.SetWhitelistAddressPermKey(ctx, actor, perm)
    66  
    67  	// create waiting councilor if it does not exist
    68  	_, found := k.GetCouncilor(ctx, actor.Address)
    69  	if perm == types.PermClaimCouncilor && !found {
    70  		councilor := types.NewCouncilor(actor.Address, types.CouncilorWaiting)
    71  		k.SaveCouncilor(ctx, councilor)
    72  	}
    73  
    74  	return nil
    75  }
    76  
    77  // AddBlacklistPermission blacklist a permission to an address. It saves the actor after it.
    78  func (k Keeper) AddBlacklistPermission(ctx sdk.Context, actor types.NetworkActor, perm types.PermValue) error {
    79  	err := actor.Permissions.AddToBlacklist(perm)
    80  	if err != nil {
    81  		return err
    82  	}
    83  
    84  	k.SaveNetworkActor(ctx, actor)
    85  	return nil
    86  }
    87  
    88  // RemoveWhitelistedPermission removes the whitelisted permission that an address has
    89  func (k Keeper) RemoveWhitelistedPermission(ctx sdk.Context, actor types.NetworkActor, perm types.PermValue) error {
    90  	err := actor.Permissions.RemoveFromWhitelist(perm)
    91  	if err != nil {
    92  		return err
    93  	}
    94  
    95  	k.SaveNetworkActor(ctx, actor)
    96  	k.DeleteWhitelistAddressPermKey(ctx, actor, perm)
    97  	return nil
    98  }
    99  
   100  // RemoveBlacklistedPermission removes the blacklisted permission that an address has
   101  func (k Keeper) RemoveBlacklistedPermission(ctx sdk.Context, actor types.NetworkActor, perm types.PermValue) error {
   102  	err := actor.Permissions.RemoveFromBlacklist(perm)
   103  	if err != nil {
   104  		return err
   105  	}
   106  
   107  	k.SaveNetworkActor(ctx, actor)
   108  	return nil
   109  }
   110  
   111  func (k Keeper) AssignRoleToAccount(ctx sdk.Context, addr sdk.AccAddress, roleId uint64) error {
   112  	permissions, found := k.GetPermissionsForRole(ctx, roleId)
   113  	if !found {
   114  		return types.ErrRoleDoesNotExist
   115  	}
   116  
   117  	actor, found := k.GetNetworkActorByAddress(ctx, addr)
   118  	if !found {
   119  		actor = types.NewDefaultActor(addr)
   120  	}
   121  
   122  	if actor.HasRole(roleId) {
   123  		return types.ErrRoleAlreadyAssigned
   124  	}
   125  
   126  	k.AssignRoleToActor(ctx, actor, roleId)
   127  
   128  	// create waiting councilor if it does not exist and when permission is given
   129  	_, found = k.GetCouncilor(ctx, actor.Address)
   130  	if !found {
   131  		for _, perm := range permissions.Whitelist {
   132  			if perm == uint32(types.PermClaimCouncilor) {
   133  				councilor := types.NewCouncilor(actor.Address, types.CouncilorWaiting)
   134  				k.SaveCouncilor(ctx, councilor)
   135  			}
   136  		}
   137  	}
   138  	return nil
   139  }
   140  
   141  func (k Keeper) UnassignRoleFromAccount(ctx sdk.Context, addr sdk.AccAddress, roleId uint64) error {
   142  	_, found := k.GetPermissionsForRole(ctx, roleId)
   143  	if !found {
   144  		return types.ErrRoleDoesNotExist
   145  	}
   146  
   147  	actor, found := k.GetNetworkActorByAddress(ctx, addr)
   148  	if !found {
   149  		actor = types.NewDefaultActor(addr)
   150  	}
   151  
   152  	if !actor.HasRole(roleId) {
   153  		return types.ErrRoleNotAssigned
   154  	}
   155  
   156  	k.UnassignRoleFromActor(ctx, actor, roleId)
   157  	return nil
   158  }
   159  
   160  func (k Keeper) AssignRoleToActor(ctx sdk.Context, actor types.NetworkActor, role uint64) {
   161  	actor.SetRole(role)
   162  	k.SaveNetworkActor(ctx, actor)
   163  
   164  	store := ctx.KVStore(k.storeKey)
   165  	store.Set(roleAddressKey(role, actor.Address), actor.Address.Bytes())
   166  }
   167  
   168  func (k Keeper) UnassignRoleFromActor(ctx sdk.Context, actor types.NetworkActor, role uint64) {
   169  	actor.RemoveRole(role)
   170  	k.SaveNetworkActor(ctx, actor)
   171  
   172  	store := ctx.KVStore(k.storeKey)
   173  	store.Delete(roleAddressKey(role, actor.Address))
   174  }
   175  
   176  // GetNetworkActorsIterator returns all the actors iterator
   177  func (k Keeper) GetNetworkActorsIterator(ctx sdk.Context) sdk.Iterator {
   178  	store := ctx.KVStore(k.storeKey)
   179  	return sdk.KVStorePrefixIterator(store, NetworkActorsPrefix)
   180  }
   181  
   182  // GetNetworkActorsByWhitelistedPermission returns all the actors that have Perm in individual whitelist.
   183  func (k Keeper) GetNetworkActorsByWhitelistedPermission(ctx sdk.Context, perm types.PermValue) sdk.Iterator {
   184  	store := ctx.KVStore(k.storeKey)
   185  	return sdk.KVStorePrefixIterator(store, WhitelistPermKey(perm))
   186  }
   187  
   188  // GetNetworkActorsByRole returns all network actors that have role assigned.
   189  func (k Keeper) GetNetworkActorsByRole(ctx sdk.Context, role uint64) sdk.Iterator {
   190  	store := ctx.KVStore(k.storeKey)
   191  	return sdk.KVStorePrefixIterator(store, roleKey(role))
   192  }
   193  
   194  // GetNetworkActorsByAbsoluteWhitelistPermission returns all actors that have a specific whitelist permission,
   195  // it does not matter if it is by role or by individual permission.
   196  func (k Keeper) GetNetworkActorsByAbsoluteWhitelistPermission(ctx sdk.Context, perm types.PermValue) []types.NetworkActor {
   197  	duplicateMap := map[string]bool{}
   198  
   199  	var actors []types.NetworkActor
   200  	iterator := k.GetNetworkActorsByWhitelistedPermission(ctx, perm)
   201  	defer iterator.Close()
   202  
   203  	for ; iterator.Valid(); iterator.Next() {
   204  		if _, ok := duplicateMap[sdk.AccAddress(iterator.Value()).String()]; !ok {
   205  			duplicateMap[sdk.AccAddress(iterator.Value()).String()] = true
   206  			actors = append(actors, k.GetNetworkActorOrFail(ctx, iterator.Value()))
   207  		}
   208  	}
   209  
   210  	rolesIter := k.GetRolesByWhitelistedPerm(ctx, perm)
   211  	defer rolesIter.Close()
   212  
   213  	for ; rolesIter.Valid(); rolesIter.Next() {
   214  		actorIter := k.GetNetworkActorsByRole(ctx, bytesToRole(rolesIter.Value()))
   215  
   216  		for ; actorIter.Valid(); actorIter.Next() {
   217  			if _, ok := duplicateMap[sdk.AccAddress(actorIter.Value()).String()]; !ok {
   218  				duplicateMap[sdk.AccAddress(actorIter.Value()).String()] = true
   219  				actors = append(actors, k.GetNetworkActorOrFail(ctx, actorIter.Value()))
   220  			}
   221  		}
   222  	}
   223  
   224  	return actors
   225  }
   226  
   227  func (k Keeper) GetNetworkActorOrFail(ctx sdk.Context, addr sdk.AccAddress) types.NetworkActor {
   228  	actor, found := k.GetNetworkActorByAddress(ctx, addr)
   229  	if !found {
   230  		panic("expected network actor not found")
   231  	}
   232  
   233  	return actor
   234  }
   235  
   236  // WhitelistAddressPermKey returns the prefix key in format <0x31 + Perm_Bytes + address_bytes>
   237  func WhitelistAddressPermKey(address sdk.AccAddress, perm types.PermValue) []byte {
   238  	return append(WhitelistPermKey(perm), address.Bytes()...)
   239  }
   240  
   241  // WhitelistPermKey returns the prefix key in format <0x31 + Perm_Bytes>
   242  func WhitelistPermKey(perm types.PermValue) []byte {
   243  	return append(WhitelistActorPrefix, permToBytes(perm)...)
   244  }
   245  
   246  // roleAddressKey returns the prefix key in format <0x33 + Role_Bytes + address_bytes>
   247  func roleAddressKey(role uint64, address sdk.AccAddress) []byte {
   248  	return append(roleKey(role), address.Bytes()...)
   249  }
   250  
   251  // roleKey returns a prefix key in format <0x32 + Role_Bytes>
   252  func roleKey(role uint64) []byte {
   253  	return append(RoleActorPrefix, roleToBytes(role)...)
   254  }
   255  
   256  // permToBytes returns a PermValue in bytes representation.
   257  func permToBytes(perm types.PermValue) []byte {
   258  	return sdk.Uint64ToBigEndian(uint64(perm))
   259  }
   260  
   261  // roleToBytes returns a Role in bytes representation.
   262  func roleToBytes(role uint64) []byte {
   263  	return sdk.Uint64ToBigEndian(uint64(role))
   264  }
   265  
   266  // bytesToRole converts byte representation of a role to Role type.
   267  func bytesToRole(bz []byte) uint64 {
   268  	return sdk.BigEndianToUint64(bz)
   269  }