-
Notifications
You must be signed in to change notification settings - Fork 6
/
store.go
114 lines (99 loc) · 3.68 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
package v2
import (
"encoding/binary"
"fmt"
"github.com/chain4energy/c4e-chain/v2/x/cfeminter/migrations/v1"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/store/prefix"
storetypes "github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
)
var MinterStateHistoryKeyPrefix = []byte{0x03}
func getOldMinterStateAndDelete(store sdk.KVStore, cdc codec.BinaryCodec) (oldMinterState v1.MinterState, err error) {
b := store.Get(v1.MinterStateKey)
if b == nil {
return oldMinterState, fmt.Errorf("stored minter state should not have been nil")
}
err = cdc.Unmarshal(b, &oldMinterState)
if err != nil {
return oldMinterState, err
}
store.Delete(v1.MinterStateKey)
return
}
func setNewMinterState(store sdk.KVStore, cdc codec.BinaryCodec, oldMinterState v1.MinterState) error {
newMinterState := MinterState{
SequenceId: uint32(oldMinterState.Position),
AmountMinted: oldMinterState.AmountMinted,
LastMintBlockTime: oldMinterState.LastMintBlockTime,
RemainderFromPreviousPeriod: oldMinterState.RemainderFromPreviousPeriod,
RemainderToMint: oldMinterState.RemainderToMint,
}
av, err := cdc.Marshal(&newMinterState)
if err != nil {
return err
}
store.Set(v1.MinterStateKey, av)
return nil
}
func migrateMinterState(store sdk.KVStore, cdc codec.BinaryCodec) error {
oldMinterState, err := getOldMinterStateAndDelete(store, cdc)
if err != nil {
return err
}
return setNewMinterState(store, cdc, oldMinterState)
}
func getOldMinterStateHistoryAndDelete(store sdk.KVStore, cdc codec.BinaryCodec) (oldMinterStateHistoryList []*v1.MinterState, err error) {
prefixStore := prefix.NewStore(store, v1.MinterStateHistoryKeyPrefix)
iterator := sdk.KVStorePrefixIterator(prefixStore, []byte{})
defer iterator.Close()
for ; iterator.Valid(); iterator.Next() {
var val v1.MinterState
err := cdc.Unmarshal(iterator.Value(), &val)
if err != nil {
return nil, err
}
oldMinterStateHistoryList = append(oldMinterStateHistoryList, &val)
prefixStore.Delete(iterator.Key())
}
return
}
func setNewMinterStateHistory(store sdk.KVStore, cdc codec.BinaryCodec, oldMinterStateHistory []*v1.MinterState) error {
prefixStore := prefix.NewStore(store, MinterStateHistoryKeyPrefix)
for _, oldMinterState := range oldMinterStateHistory {
newMinterState := MinterState{
SequenceId: uint32(oldMinterState.Position),
AmountMinted: oldMinterState.AmountMinted,
LastMintBlockTime: oldMinterState.LastMintBlockTime,
RemainderFromPreviousPeriod: oldMinterState.RemainderFromPreviousPeriod,
RemainderToMint: oldMinterState.RemainderToMint,
}
av, err := cdc.Marshal(&newMinterState)
if err != nil {
return err
}
bs := make([]byte, 4)
binary.LittleEndian.PutUint32(bs, newMinterState.SequenceId)
prefixStore.Set(bs, av)
}
return nil
}
func migrateMinterStateHistory(store sdk.KVStore, cdc codec.BinaryCodec) error {
oldMinterState, err := getOldMinterStateHistoryAndDelete(store, cdc)
if err != nil {
return err
}
return setNewMinterStateHistory(store, cdc, oldMinterState)
}
// MigrateStore performs in-place store migrations from v1.0.1 to v1.1.0
// The migration includes:
// - MinterState change type of Position from int32 to uint32.
// - MinterState rename Position to SequenceId.
// - History of minter states in KvStore is now identified by SequenceId and its key is set in different way
func MigrateStore(ctx sdk.Context, storeKey storetypes.StoreKey, cdc codec.BinaryCodec) error {
store := ctx.KVStore(storeKey)
if err := migrateMinterStateHistory(store, cdc); err != nil {
return err
}
return migrateMinterState(store, cdc)
}