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  }