-
Notifications
You must be signed in to change notification settings - Fork 127
/
denom.go
134 lines (109 loc) · 3.66 KB
/
denom.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
package keeper
import (
"encoding/binary"
"time"
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkvesting "github.com/cosmos/cosmos-sdk/x/auth/vesting/types"
"github.com/haqq-network/haqq/x/liquidvesting/types"
)
// CreateDenom creates new liquid denom and stores it
func (k Keeper) CreateDenom(
ctx sdk.Context,
originalDenom string,
startTime int64,
periods sdkvesting.Periods,
) (types.Denom, error) {
counter := k.GetDenomCounter(ctx)
denom := types.Denom{
StartTime: time.Unix(startTime, 0),
LockupPeriods: periods,
OriginalDenom: originalDenom,
EndTime: time.Unix(startTime+periods.TotalLength(), 0),
BaseDenom: types.DenomBaseNameFromID(counter),
DisplayDenom: types.DenomDisplayNameFromID(counter),
}
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.DenomKeyPrefix)
appendedValue := k.cdc.MustMarshal(&denom)
store.Set([]byte(denom.GetBaseDenom()), appendedValue)
// Update denom counter
k.SetDenomCounter(ctx, counter+1)
return denom, nil
}
// UpdateDenomPeriods updates schedule periods bound to liquid denom
func (k Keeper) UpdateDenomPeriods(ctx sdk.Context, baseDenom string, newPeriods sdkvesting.Periods) error {
d, found := k.GetDenom(ctx, baseDenom)
if !found {
return types.ErrDenomNotFound
}
d.LockupPeriods = newPeriods
k.SetDenom(ctx, d)
return nil
}
// DeleteDenom deletes denom from the storage
func (k Keeper) DeleteDenom(ctx sdk.Context, baseDenom string) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.DenomKeyPrefix)
store.Delete([]byte(baseDenom))
}
// GetDenom queries denom from the store
func (k Keeper) GetDenom(ctx sdk.Context, baseDenom string) (val types.Denom, found bool) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.DenomKeyPrefix)
b := store.Get([]byte(baseDenom))
if b == nil {
return val, false
}
k.cdc.MustUnmarshal(b, &val)
return val, true
}
// SetDenom sets denom in the store
func (k Keeper) SetDenom(ctx sdk.Context, denom types.Denom) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.DenomKeyPrefix)
b := k.cdc.MustMarshal(&denom)
store.Set([]byte(denom.GetBaseDenom()), b)
}
// GetAllGenesisAccount returns all genesisAccount
func (k Keeper) GetAllDenoms(ctx sdk.Context) (list []types.Denom) {
store := ctx.KVStore(k.storeKey)
iterator := sdk.KVStorePrefixIterator(store, types.DenomKeyPrefix)
defer iterator.Close()
for ; iterator.Valid(); iterator.Next() {
var denom types.Denom
k.cdc.MustUnmarshal(iterator.Value(), &denom)
list = append(list, denom)
}
return
}
// GetDenomCounter get the counter for denoms
func (k Keeper) GetDenomCounter(ctx sdk.Context) uint64 {
store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte{})
byteKey := types.DenomCounterKey
bz := store.Get(byteKey)
// Counter doesn't exist: no element
if bz == nil {
return 0
}
// Parse bytes
return binary.BigEndian.Uint64(bz)
}
// SetDenomCounter set the counter for denoms
func (k Keeper) SetDenomCounter(ctx sdk.Context, counter uint64) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), []byte{})
byteKey := types.DenomCounterKey
bz := make([]byte, 8)
binary.BigEndian.PutUint64(bz, counter)
store.Set(byteKey, bz)
}
// IterateDenoms iterates over all the stored denoms and performs a callback function.
// Stops iteration when callback returns true.
func (k Keeper) IterateDenoms(ctx sdk.Context, cb func(account types.Denom) (stop bool)) {
store := ctx.KVStore(k.storeKey)
iterator := sdk.KVStorePrefixIterator(store, types.DenomKeyPrefix)
defer iterator.Close()
for ; iterator.Valid(); iterator.Next() {
var denom types.Denom
k.cdc.MustUnmarshal(iterator.Value(), &denom)
if cb(denom) {
break
}
}
}