-
Notifications
You must be signed in to change notification settings - Fork 202
/
unbonding_record.go
130 lines (104 loc) · 4.92 KB
/
unbonding_record.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
package keeper
import (
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/Stride-Labs/stride/v21/x/staketia/types"
)
// Writes an unbonding record to the active store
func (k Keeper) SetUnbondingRecord(ctx sdk.Context, unbondingRecord types.UnbondingRecord) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.UnbondingRecordsKeyPrefix)
recordKey := types.IntKey(unbondingRecord.Id)
recordValue := k.cdc.MustMarshal(&unbondingRecord)
store.Set(recordKey, recordValue)
}
// Writes an unbonding record to the archive store
func (k Keeper) SetArchivedUnbondingRecord(ctx sdk.Context, unbondingRecord types.UnbondingRecord) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.UnbondingRecordsArchiveKeyPrefix)
recordKey := types.IntKey(unbondingRecord.Id)
recordValue := k.cdc.MustMarshal(&unbondingRecord)
store.Set(recordKey, recordValue)
}
// Reads a unbonding record from the active store
func (k Keeper) GetUnbondingRecord(ctx sdk.Context, recordId uint64) (unbondingRecord types.UnbondingRecord, found bool) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.UnbondingRecordsKeyPrefix)
recordKey := types.IntKey(recordId)
recordBz := store.Get(recordKey)
if len(recordBz) == 0 {
return unbondingRecord, false
}
k.cdc.MustUnmarshal(recordBz, &unbondingRecord)
return unbondingRecord, true
}
// Reads a unbonding record from the archive store
func (k Keeper) GetArchivedUnbondingRecord(ctx sdk.Context, recordId uint64) (unbondingRecord types.UnbondingRecord, found bool) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.UnbondingRecordsArchiveKeyPrefix)
recordKey := types.IntKey(recordId)
recordBz := store.Get(recordKey)
if len(recordBz) == 0 {
return unbondingRecord, false
}
k.cdc.MustUnmarshal(recordBz, &unbondingRecord)
return unbondingRecord, true
}
// Removes an unbonding record from the active store
func (k Keeper) RemoveUnbondingRecord(ctx sdk.Context, recordId uint64) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.UnbondingRecordsKeyPrefix)
recordKey := types.IntKey(recordId)
store.Delete(recordKey)
}
// Removes a unbonding record from the active store, and writes it to the archive store
// to preserve history
func (k Keeper) ArchiveUnbondingRecord(ctx sdk.Context, unbondingRecord types.UnbondingRecord) {
k.RemoveUnbondingRecord(ctx, unbondingRecord.Id)
k.SetArchivedUnbondingRecord(ctx, unbondingRecord)
}
// Returns all active unbonding records
func (k Keeper) GetAllActiveUnbondingRecords(ctx sdk.Context) (unbondingRecords []types.UnbondingRecord) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.UnbondingRecordsKeyPrefix)
return k.getAllUnbondingRecords(store)
}
// Returns all unbonding records that have been archived
func (k Keeper) GetAllArchivedUnbondingRecords(ctx sdk.Context) (unbondingRecords []types.UnbondingRecord) {
store := prefix.NewStore(ctx.KVStore(k.storeKey), types.UnbondingRecordsArchiveKeyPrefix)
return k.getAllUnbondingRecords(store)
}
// Returns all unbonding records for a specified store (either active or archive)
func (k Keeper) getAllUnbondingRecords(store prefix.Store) (unbondingRecords []types.UnbondingRecord) {
iterator := store.Iterator(nil, nil)
defer iterator.Close()
for ; iterator.Valid(); iterator.Next() {
unbondingRecord := types.UnbondingRecord{}
k.cdc.MustUnmarshal(iterator.Value(), &unbondingRecord)
unbondingRecords = append(unbondingRecords, unbondingRecord)
}
return unbondingRecords
}
// Returns all unbonding records with a specific status
// Searches only active records
func (k Keeper) GetAllUnbondingRecordsByStatus(ctx sdk.Context, status types.UnbondingRecordStatus) (unbondingRecords []types.UnbondingRecord) {
for _, unbondingRecord := range k.GetAllActiveUnbondingRecords(ctx) {
if unbondingRecord.Status == status {
unbondingRecords = append(unbondingRecords, unbondingRecord)
}
}
return unbondingRecords
}
// Gets the ACCUMULATING unbonding record (there should only be one)
func (k Keeper) GetAccumulatingUnbondingRecord(ctx sdk.Context) (unbondingRecord types.UnbondingRecord, err error) {
accumulatingRecord := k.GetAllUnbondingRecordsByStatus(ctx, types.ACCUMULATING_REDEMPTIONS)
if len(accumulatingRecord) == 0 {
return unbondingRecord, types.ErrBrokenUnbondingRecordInvariant.Wrap("no unbonding record in status ACCUMULATING")
}
if len(accumulatingRecord) != 1 {
return unbondingRecord, types.ErrBrokenUnbondingRecordInvariant.Wrap("more than one record in status ACCUMULATING")
}
return accumulatingRecord[0], nil
}
// Sets the unbonding record only if a record does not already exist for that ID
func (k Keeper) SafelySetUnbondingRecord(ctx sdk.Context, unbondingRecord types.UnbondingRecord) error {
if _, found := k.GetUnbondingRecord(ctx, unbondingRecord.Id); found {
return types.ErrUnbondingRecordAlreadyExists.Wrapf("unbonding record already exists for ID %d", unbondingRecord.Id)
}
k.SetUnbondingRecord(ctx, unbondingRecord)
return nil
}