/
store.go
136 lines (115 loc) · 3.98 KB
/
store.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
package keeper
import (
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/umee-network/umee/x/leverage/types"
)
// getAdjustedBorrow gets the adjusted amount borrowed by an address in a given denom. Returns zero
// if no value is found.
func (k Keeper) getAdjustedBorrow(ctx sdk.Context, addr sdk.AccAddress, denom string) sdk.Dec {
key := types.CreateAdjustedBorrowKey(addr, denom)
adjustedAmount := sdk.ZeroDec()
if bz := ctx.KVStore(k.storeKey).Get(key); bz != nil {
if err := adjustedAmount.Unmarshal(bz); err == nil {
return adjustedAmount
}
}
return sdk.ZeroDec()
}
// getAdjustedTotalBorrowed gets the total borrowed amount for a given denom. Returns zero if
// no value is stored.
func (k Keeper) getAdjustedTotalBorrowed(ctx sdk.Context, denom string) sdk.Dec {
key := types.CreateAdjustedTotalBorrowKey(denom)
adjustedAmount := sdk.ZeroDec()
if bz := ctx.KVStore(k.storeKey).Get(key); bz != nil {
if err := adjustedAmount.Unmarshal(bz); err == nil {
return adjustedAmount
}
}
return sdk.ZeroDec()
}
// setAdjustedBorrow sets the adjusted amount borrowed by an address in a given denom directly instead
// of computing it from real borrowed amount. Should only be used by genesis and setBorrow, as other
// functions deal in non-adjusted amounts using setBorrow. Also updates AdjustedTotalBorrowed by the
// resulting changes in borrowed amount. If either amount to store is zero, any stored value is cleared.
func (k Keeper) setAdjustedBorrow(ctx sdk.Context, addr sdk.AccAddress, borrow sdk.DecCoin) error {
if err := borrow.Validate(); err != nil {
return err
}
if addr.Empty() {
return types.ErrEmptyAddress
}
// Update total adjusted borrow based on the change in this borrow's adjusted amount
delta := borrow.Amount.Sub(k.getAdjustedBorrow(ctx, addr, borrow.Denom))
total := sdk.NewDecCoinFromDec(borrow.Denom, k.getAdjustedTotalBorrowed(ctx, borrow.Denom).Add(delta))
// Set new borrow value, or clear if zero
store := ctx.KVStore(k.storeKey)
key := types.CreateAdjustedBorrowKey(addr, borrow.Denom)
if borrow.Amount.IsZero() {
store.Delete(key)
} else {
bz, err := borrow.Amount.Marshal()
if err != nil {
return err
}
store.Set(key, bz)
}
// Also set total borrowed value, or clear if zero
key = types.CreateAdjustedTotalBorrowKey(total.Denom)
if !total.Amount.IsPositive() {
store.Delete(key)
} else {
bz, err := total.Amount.Marshal()
if err != nil {
return err
}
store.Set(key, bz)
}
return nil
}
// setCollateralSetting enables or disables a borrower's collateral setting for a single denom
func (k Keeper) setCollateralSetting(ctx sdk.Context, addr sdk.AccAddress, denom string, enable bool) error {
if err := sdk.ValidateDenom(denom); err != nil {
return err
}
if addr.Empty() {
return types.ErrEmptyAddress
}
// Enable sets to true; disable removes from KVstore rather than setting false
store := ctx.KVStore(k.storeKey)
key := types.CreateCollateralSettingKey(addr, denom)
if enable {
store.Set(key, []byte{0x01})
} else {
store.Delete(key)
}
return nil
}
// getInterestScalar gets the interest scalar for a given base token
// denom. Returns 1.0 if no value is stored.
func (k Keeper) getInterestScalar(ctx sdk.Context, denom string) sdk.Dec {
key := types.CreateInterestScalarKey(denom)
scalar := sdk.OneDec()
if bz := ctx.KVStore(k.storeKey).Get(key); bz != nil {
if err := scalar.Unmarshal(bz); err != nil {
panic(err)
}
}
return scalar
}
// setInterestScalar sets the interest scalar for a given base token denom.
func (k Keeper) setInterestScalar(ctx sdk.Context, denom string, scalar sdk.Dec) error {
if err := sdk.ValidateDenom(denom); err != nil {
return err
}
if scalar.IsNil() || scalar.LT(sdk.OneDec()) {
return sdkerrors.Wrap(types.ErrInvalidInteresrScalar, scalar.String()+denom)
}
bz, err := scalar.Marshal()
if err != nil {
return err
}
key := types.CreateInterestScalarKey(denom)
ctx.KVStore(k.storeKey).Set(key, bz)
return nil
}