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 }