github.com/KiraCore/sekai@v0.3.43/x/tokens/keeper/alias.go (about) 1 package keeper 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/cosmos/cosmos-sdk/store/prefix" 8 sdk "github.com/cosmos/cosmos-sdk/types" 9 10 "github.com/KiraCore/sekai/x/tokens/types" 11 ) 12 13 // GetTokenAlias returns a token alias 14 func (k Keeper) GetTokenAlias(ctx sdk.Context, symbol string) *types.TokenAlias { 15 prefixStore := prefix.NewStore(ctx.KVStore(k.storeKey), PrefixKeyTokenAlias) 16 bz := prefixStore.Get([]byte(symbol)) 17 if bz == nil { 18 return nil 19 } 20 21 alias := new(types.TokenAlias) 22 k.cdc.MustUnmarshal(bz, alias) 23 24 return alias 25 } 26 27 // ListTokenAlias returns all list of token alias 28 func (k Keeper) ListTokenAlias(ctx sdk.Context) []*types.TokenAlias { 29 var tokenAliases []*types.TokenAlias 30 31 // get iterator for token aliases 32 store := ctx.KVStore(k.storeKey) 33 iterator := sdk.KVStorePrefixIterator(store, PrefixKeyTokenAlias) 34 defer iterator.Close() 35 36 for ; iterator.Valid(); iterator.Next() { 37 symbol := strings.TrimPrefix(string(iterator.Key()), string(PrefixKeyTokenAlias)) 38 tokenAlias := k.GetTokenAlias(ctx, symbol) 39 if tokenAlias != nil { 40 tokenAliases = append(tokenAliases, tokenAlias) 41 } 42 } 43 return tokenAliases 44 } 45 46 // GetTokenAliasesByDenom returns all list of token alias 47 func (k Keeper) GetTokenAliasesByDenom(ctx sdk.Context, denoms []string) map[string]*types.TokenAlias { 48 // get iterator for token aliases 49 store := ctx.KVStore(k.storeKey) 50 tokenAliasesMap := make(map[string]*types.TokenAlias) 51 52 for _, denom := range denoms { 53 denomTokenStoreID := append([]byte(PrefixKeyDenomToken), []byte(denom)...) 54 55 if store.Has(denomTokenStoreID) { 56 symbol := string(store.Get(denomTokenStoreID)) 57 tokenAlias := k.GetTokenAlias(ctx, symbol) 58 tokenAliasesMap[denom] = tokenAlias 59 } 60 } 61 return tokenAliasesMap 62 } 63 64 // UpsertTokenAlias upsert a token alias to the registry 65 func (k Keeper) UpsertTokenAlias(ctx sdk.Context, alias types.TokenAlias) error { 66 store := ctx.KVStore(k.storeKey) 67 // we use symbol of TokenAlias as an ID inside KVStore storage 68 tokenAliasStoreID := append([]byte(PrefixKeyTokenAlias), []byte(alias.Symbol)...) 69 70 for _, denom := range alias.Denoms { 71 denomTokenStoreID := append([]byte(PrefixKeyDenomToken), []byte(denom)...) 72 73 if store.Has(denomTokenStoreID) { 74 symbol := string(store.Get(denomTokenStoreID)) 75 if symbol != alias.Symbol { 76 return fmt.Errorf("%s denom is already registered for %s token alias", denom, symbol) 77 } 78 } 79 store.Set(denomTokenStoreID, []byte(alias.Symbol)) 80 } 81 store.Set(tokenAliasStoreID, k.cdc.MustMarshal(&alias)) 82 return nil 83 } 84 85 // DeleteTokenAlias delete token alias by symbol 86 func (k Keeper) DeleteTokenAlias(ctx sdk.Context, symbol string) error { 87 store := ctx.KVStore(k.storeKey) 88 // we use symbol of TokenAlias as an ID inside KVStore storage 89 tokenAliasStoreID := append([]byte(PrefixKeyTokenAlias), []byte(symbol)...) 90 91 if !store.Has(tokenAliasStoreID) { 92 return fmt.Errorf("no alias is available for %s symbol", symbol) 93 } 94 95 var alias types.TokenAlias 96 bz := store.Get(tokenAliasStoreID) 97 k.cdc.MustUnmarshal(bz, &alias) 98 99 for _, denom := range alias.Denoms { 100 denomTokenStoreID := append([]byte(PrefixKeyDenomToken), []byte(denom)...) 101 store.Delete(denomTokenStoreID) 102 } 103 104 store.Delete(tokenAliasStoreID) 105 return nil 106 }