-
Notifications
You must be signed in to change notification settings - Fork 169
/
token.go
184 lines (149 loc) · 5.43 KB
/
token.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
package keeper
import (
"fmt"
"strings"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/umee-network/umee/v2/x/leverage/types"
)
// FromUTokenToTokenDenom strips the uToken prefix ("u/") from an input denom.
// An empty string is returned if the prefix is not present or if the resulting
// token denom is not an accepted asset type.
func (k Keeper) FromUTokenToTokenDenom(ctx sdk.Context, uTokenDenom string) string {
if strings.HasPrefix(uTokenDenom, types.UTokenPrefix) {
tokenDenom := strings.TrimPrefix(uTokenDenom, types.UTokenPrefix)
if k.IsAcceptedToken(ctx, tokenDenom) {
return tokenDenom
}
}
return ""
}
// FromTokenToUTokenDenom adds the uToken prefix ("u/") to an input denom.
// An empty string is returned if the input token denom is not an accepted asset type.
func (k Keeper) FromTokenToUTokenDenom(ctx sdk.Context, tokenDenom string) string {
if k.IsAcceptedToken(ctx, tokenDenom) {
return types.UTokenPrefix + tokenDenom
}
return ""
}
// IsAcceptedToken returns true if a given (non-UToken) token denom is an
// accepted asset type.
func (k Keeper) IsAcceptedToken(ctx sdk.Context, tokenDenom string) bool {
store := ctx.KVStore(k.storeKey)
key := types.CreateRegisteredTokenKey(tokenDenom)
return store.Has(key)
}
// IsAcceptedUToken returns true if a given uToken denom is associated with
// an accepted base asset type.
func (k Keeper) IsAcceptedUToken(ctx sdk.Context, uTokenDenom string) bool {
tokenDenom := k.FromUTokenToTokenDenom(ctx, uTokenDenom)
return k.IsAcceptedToken(ctx, tokenDenom)
}
// SetRegisteredToken stores a Token into the x/leverage module's KVStore.
func (k Keeper) SetRegisteredToken(ctx sdk.Context, token types.Token) {
if token.BaseDenom == "" {
panic("empty base denom")
}
store := ctx.KVStore(k.storeKey)
tokenKey := types.CreateRegisteredTokenKey(token.BaseDenom)
bz, err := k.cdc.Marshal(&token)
if err != nil {
panic(fmt.Sprintf("failed to encode token: %s", err))
}
k.hooks.AfterTokenRegistered(ctx, token)
store.Set(tokenKey, bz)
}
// DeleteRegisteredTokens deletes all registered tokens from the x/leverage
// module's KVStore.
func (k Keeper) DeleteRegisteredTokens(ctx sdk.Context) error {
tokens := k.GetAllRegisteredTokens(ctx)
for _, t := range tokens {
k.DeleteRegisteredToken(ctx, t.BaseDenom)
k.hooks.AfterRegisteredTokenRemoved(ctx, t)
}
return nil
}
// DeleteRegisteredToken deletes a registered Token by base denomination from
// the x/leverage KVStore.
func (k Keeper) DeleteRegisteredToken(ctx sdk.Context, denom string) {
store := ctx.KVStore(k.storeKey)
store.Delete(types.CreateRegisteredTokenKey(denom))
}
// GetRegisteredToken gets a token from the x/leverage module's KVStore.
func (k Keeper) GetRegisteredToken(ctx sdk.Context, denom string) (types.Token, error) {
store := ctx.KVStore(k.storeKey)
tokenKey := types.CreateRegisteredTokenKey(denom)
token := types.Token{}
bz := store.Get(tokenKey)
if len(bz) == 0 {
return token, sdkerrors.Wrap(types.ErrInvalidAsset, denom)
}
err := k.cdc.Unmarshal(bz, &token)
return token, err
}
// GetReserveFactor gets the reserve factor for a given token.
func (k Keeper) GetReserveFactor(ctx sdk.Context, denom string) (sdk.Dec, error) {
token, err := k.GetRegisteredToken(ctx, denom)
if err != nil {
return sdk.ZeroDec(), err
}
return token.ReserveFactor, nil
}
// GetInterestBase gets the base interest rate for a given token.
func (k Keeper) GetInterestBase(ctx sdk.Context, denom string) (sdk.Dec, error) {
token, err := k.GetRegisteredToken(ctx, denom)
if err != nil {
return sdk.ZeroDec(), err
}
return token.BaseBorrowRate, nil
}
// GetInterestMax gets the maximum interest rate for a given token.
func (k Keeper) GetInterestMax(ctx sdk.Context, denom string) (sdk.Dec, error) {
token, err := k.GetRegisteredToken(ctx, denom)
if err != nil {
return sdk.ZeroDec(), err
}
return token.MaxBorrowRate, nil
}
// GetInterestAtKink gets the interest rate at the "kink" in the
// utilization:interest graph for a given token.
func (k Keeper) GetInterestAtKink(ctx sdk.Context, denom string) (sdk.Dec, error) {
token, err := k.GetRegisteredToken(ctx, denom)
if err != nil {
return sdk.ZeroDec(), err
}
return token.KinkBorrowRate, nil
}
// GetInterestKinkUtilization gets the utilization at the "kink" in the
// utilization:interest graph for a given token.
func (k Keeper) GetInterestKinkUtilization(ctx sdk.Context, denom string) (sdk.Dec, error) {
token, err := k.GetRegisteredToken(ctx, denom)
if err != nil {
return sdk.ZeroDec(), err
}
return token.KinkUtilizationRate, nil
}
// GetCollateralWeight gets collateral weight of a given token.
func (k Keeper) GetCollateralWeight(ctx sdk.Context, denom string) (sdk.Dec, error) {
token, err := k.GetRegisteredToken(ctx, denom)
if err != nil {
return sdk.ZeroDec(), err
}
return token.CollateralWeight, nil
}
// GetLiquidationThreshold gets liquidation threshold of a given token.
func (k Keeper) GetLiquidationThreshold(ctx sdk.Context, denom string) (sdk.Dec, error) {
token, err := k.GetRegisteredToken(ctx, denom)
if err != nil {
return sdk.ZeroDec(), err
}
return token.LiquidationThreshold, nil
}
// GetLiquidationIncentive gets liquidation incentive of a given token.
func (k Keeper) GetLiquidationIncentive(ctx sdk.Context, denom string) (sdk.Dec, error) {
token, err := k.GetRegisteredToken(ctx, denom)
if err != nil {
return sdk.ZeroDec(), err
}
return token.LiquidationIncentive, nil
}