1
1
package keeper
2
2
3
3
import (
4
- "fmt"
5
-
6
4
sdk "github.com/cosmos/cosmos-sdk/types"
7
5
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
8
6
9
7
"github.com/bandprotocol/chain/v2/x/tss/types"
10
8
)
11
9
12
- // SetDEQueue sets the DEQueue for a given address in the context's KVStore.
13
- func (k Keeper ) SetDEQueue (ctx sdk.Context , deQueue types.DEQueue ) {
14
- address := sdk .MustAccAddressFromBech32 (deQueue .Address )
15
- ctx .KVStore (k .storeKey ).Set (types .DEQueueKeyStoreKey (address ), k .cdc .MustMarshal (& deQueue ))
10
+ // SetDECount sets the number of existing DE for a given address.
11
+ func (k Keeper ) SetDECount (ctx sdk.Context , address sdk.AccAddress , count uint64 ) {
12
+ ctx .KVStore (k .storeKey ).Set (types .DECountStoreKey (address ), sdk .Uint64ToBigEndian (count ))
16
13
}
17
14
18
- // GetDEQueue retrieves the DEQueue for a given address from the context's KVStore.
19
- func (k Keeper ) GetDEQueue (ctx sdk.Context , address sdk.AccAddress ) types.DEQueue {
20
- bz := ctx .KVStore (k .storeKey ).Get (types .DEQueueKeyStoreKey (address ))
21
- if bz == nil {
22
- return types.DEQueue {
23
- Address : address .String (),
24
- Head : 0 ,
25
- Tail : 0 ,
26
- }
27
- }
28
- var deQueue types.DEQueue
29
- k .cdc .MustUnmarshal (bz , & deQueue )
30
- return deQueue
15
+ // GetDECount retrieves the number of existing DE for a given address.
16
+ func (k Keeper ) GetDECount (ctx sdk.Context , address sdk.AccAddress ) uint64 {
17
+ return sdk .BigEndianToUint64 (ctx .KVStore (k .storeKey ).Get (types .DECountStoreKey (address )))
31
18
}
32
19
33
- // GetDEQueueIterator function gets an iterator over all de queue from the context's KVStore .
34
- func (k Keeper ) GetDEQueueIterator (ctx sdk.Context ) sdk.Iterator {
35
- return sdk .KVStorePrefixIterator (ctx .KVStore (k .storeKey ), types .DEQueueStoreKeyPrefix )
20
+ // GetDEByAddressIterator function gets an iterator over the DEs of the given address .
21
+ func (k Keeper ) GetDEByAddressIterator (ctx sdk.Context , addr sdk. AccAddress ) sdk.Iterator {
22
+ return sdk .KVStorePrefixIterator (ctx .KVStore (k .storeKey ), types .DEStoreKeyPerAddressPrefix ( addr ) )
36
23
}
37
24
38
- // GetDEQueues retrieves all DEQueues from the context's KVStore.
39
- func (k Keeper ) GetDEQueues (ctx sdk.Context ) []types.DEQueue {
40
- var deQueues []types.DEQueue
41
- iterator := k .GetDEQueueIterator (ctx )
42
- defer iterator .Close ()
43
- for ; iterator .Valid (); iterator .Next () {
44
- var deQueue types.DEQueue
45
- k .cdc .MustUnmarshal (iterator .Value (), & deQueue )
46
- deQueues = append (deQueues , deQueue )
47
- }
48
- return deQueues
49
- }
50
-
51
- // GetDECount retrieves the current count of DE for a given address from the context's KVStore.
52
- func (k Keeper ) GetDECount (ctx sdk.Context , address sdk.AccAddress ) uint64 {
53
- deQueue := k .GetDEQueue (ctx , address )
54
- if deQueue .Head <= deQueue .Tail {
55
- return deQueue .Tail - deQueue .Head
56
- }
57
-
58
- return k .GetParams (ctx ).MaxDESize - (deQueue .Head - deQueue .Tail )
25
+ // HasDE checks if a DE object exists in the context's KVStore.
26
+ func (k Keeper ) HasDE (ctx sdk.Context , address sdk.AccAddress , de types.DE ) bool {
27
+ return ctx .KVStore (k .storeKey ).Has (types .DEStoreKey (address , de ))
59
28
}
60
29
61
- // SetDE sets a DE object in the context's KVStore for a given address and index .
62
- func (k Keeper ) SetDE (ctx sdk.Context , address sdk.AccAddress , index uint64 , de types.DE ) {
63
- ctx .KVStore (k .storeKey ).Set (types .DEIndexStoreKey (address , index ), k . cdc . MustMarshal ( & de ) )
30
+ // SetDE sets a DE object in the context's KVStore for a given address.
31
+ func (k Keeper ) SetDE (ctx sdk.Context , address sdk.AccAddress , de types.DE ) {
32
+ ctx .KVStore (k .storeKey ).Set (types .DEStoreKey (address , de ), [] byte { 1 } )
64
33
}
65
34
66
- // GetDE retrieves a DE object from the context's KVStore for a given address and index .
35
+ // GetFirstDE retrieves a DE object from the context's KVStore for a given address.
67
36
// Returns an error if DE is not found.
68
- func (k Keeper ) GetDE (ctx sdk.Context , address sdk.AccAddress , index uint64 ) (types.DE , error ) {
69
- bz := ctx .KVStore (k .storeKey ).Get (types .DEIndexStoreKey (address , index ))
70
- if bz == nil {
71
- return types.DE {}, types .ErrDENotFound .Wrapf (
72
- "failed to get DE with address %s index %d" ,
73
- address ,
74
- index ,
75
- )
37
+ func (k Keeper ) GetFirstDE (ctx sdk.Context , address sdk.AccAddress ) (types.DE , error ) {
38
+ iterator := k .GetDEByAddressIterator (ctx , address )
39
+ defer iterator .Close ()
40
+
41
+ if ! iterator .Valid () {
42
+ return types.DE {}, types .ErrDENotFound .Wrapf ("failed to get DE with address %s" , address )
76
43
}
77
- var de types. DE
78
- k . cdc . MustUnmarshal ( bz , & de )
44
+
45
+ _ , de := types . ExtractValueFromDEStoreKey ( iterator . Key () )
79
46
return de , nil
80
47
}
81
48
82
49
// DeleteDE removes a DE object from the context's KVStore for a given address and index.
83
- func (k Keeper ) DeleteDE (ctx sdk.Context , address sdk.AccAddress , index uint64 ) {
84
- ctx .KVStore (k .storeKey ).Delete (types .DEIndexStoreKey (address , index ))
50
+ func (k Keeper ) DeleteDE (ctx sdk.Context , address sdk.AccAddress , de types. DE ) {
51
+ ctx .KVStore (k .storeKey ).Delete (types .DEStoreKey (address , de ))
85
52
}
86
53
87
54
// GetDEIterator function gets an iterator over all de from the context's KVStore
@@ -94,10 +61,9 @@ func (k Keeper) GetDEsGenesis(ctx sdk.Context) []types.DEGenesis {
94
61
var des []types.DEGenesis
95
62
iterator := k .GetDEIterator (ctx )
96
63
defer iterator .Close ()
64
+
97
65
for ; iterator .Valid (); iterator .Next () {
98
- var de types.DE
99
- k .cdc .MustUnmarshal (iterator .Value (), & de )
100
- address , _ := types .AddressAndIndexFromDEStoreKey (iterator .Key ())
66
+ address , de := types .ExtractValueFromDEStoreKey (iterator .Key ())
101
67
des = append (des , types.DEGenesis {
102
68
Address : address .String (),
103
69
DE : de ,
@@ -106,45 +72,38 @@ func (k Keeper) GetDEsGenesis(ctx sdk.Context) []types.DEGenesis {
106
72
return des
107
73
}
108
74
109
- // NextQueueValue returns next value of head/tail for DE queue
110
- func (k Keeper ) NextQueueValue (ctx sdk.Context , val uint64 ) uint64 {
111
- nextVal := (val + 1 ) % k .GetParams (ctx ).MaxDESize
112
- return nextVal
113
- }
114
-
115
75
// HandleSetDEs sets multiple DE objects for a given address in the context's KVStore,
116
- // if tail reaches to head , return err as DE is full
76
+ // if the given DEs reach maximum limit , return err as DE will be over the limit.
117
77
func (k Keeper ) HandleSetDEs (ctx sdk.Context , address sdk.AccAddress , des []types.DE ) error {
118
- deQueue := k .GetDEQueue (ctx , address )
119
-
78
+ added := uint64 (0 )
120
79
for _ , de := range des {
121
- k .SetDE (ctx , address , deQueue .Tail , de )
122
- deQueue .Tail = k .NextQueueValue (ctx , deQueue .Tail )
123
-
124
- if deQueue .Tail == deQueue .Head {
125
- return types .ErrDEQueueFull .Wrap (fmt .Sprintf ("DE size exceeds %d" , k .GetParams (ctx ).MaxDESize ))
80
+ if k .HasDE (ctx , address , de ) {
81
+ continue
126
82
}
127
- }
128
83
129
- k .SetDEQueue (ctx , deQueue )
84
+ k .SetDE (ctx , address , de )
85
+ added ++
86
+ }
130
87
88
+ cnt := k .GetDECount (ctx , address )
89
+ if cnt + added > k .GetParams (ctx ).MaxDESize {
90
+ return types .ErrDEReachMaximumLimit .Wrapf ("DE size exceeds %d" , k .GetParams (ctx ).MaxDESize )
91
+ }
92
+ k .SetDECount (ctx , address , cnt + uint64 (len (des )))
131
93
return nil
132
94
}
133
95
134
- // PollDE retrieves and removes the DE object at the head of the DEQueue for a given address,
135
- // then increments the head index in the DEQueue.
136
- // Returns an error if the DE object could not be retrieved.
96
+ // PollDE retrieves and removes the first DE object being retrieved from the iterator of
97
+ // the given address. Returns an error if the DE object could not be retrieved.
137
98
func (k Keeper ) PollDE (ctx sdk.Context , address sdk.AccAddress ) (types.DE , error ) {
138
- deQueue := k .GetDEQueue (ctx , address )
139
- de , err := k .GetDE (ctx , address , deQueue .Head )
99
+ de , err := k .GetFirstDE (ctx , address )
140
100
if err != nil {
141
101
return types.DE {}, err
142
102
}
143
103
144
- k .DeleteDE (ctx , address , deQueue .Head )
145
-
146
- deQueue .Head = k .NextQueueValue (ctx , deQueue .Head )
147
- k .SetDEQueue (ctx , deQueue )
104
+ cnt := k .GetDECount (ctx , address )
105
+ k .SetDECount (ctx , address , cnt - 1 )
106
+ k .DeleteDE (ctx , address , de )
148
107
149
108
return de , nil
150
109
}
0 commit comments