store.gno
9.73 Kb · 384 lines
1package staker
2
3import (
4 "strconv"
5
6 "gno.land/p/gnoswap/store"
7 bptree "gno.land/p/nt/bptree/v0"
8 ufmt "gno.land/p/nt/ufmt/v0"
9)
10
11// Storage key constants
12const (
13 // Basic configuration
14 StoreKeyUnDelegationLockupPeriod = "unDelegationLockupPeriod"
15 StoreKeyTotalDelegatedAmount = "totalDelegatedAmount"
16 StoreKeyTotalLockedAmount = "totalLockedAmount"
17
18 // Counters
19 StoreKeyDelegationNextID = "delegationNextID"
20
21 // Complex data structures
22 StoreKeyDelegations = "delegations" // BPTree of delegations
23 StoreKeyTotalDelegationHistory = "totalDelegationHistory" // UintTree: timestamp -> int64 (cumulative total)
24 StoreKeyUserDelegationHistory = "userDelegationHistory" // BPTree: address -> *UintTree[timestamp -> int64]
25
26 // Manager states
27 StoreKeyEmissionRewardManager = "emissionRewardManager"
28 StoreKeyProtocolFeeRewardManager = "protocolFeeRewardManager"
29 StoreKeyDelegationManager = "delegationManager"
30 StoreKeyLaunchpadProjectDeposits = "launchpadProjectDeposits"
31)
32
33// govStakerStore is the concrete implementation of IGovStakerStore
34type govStakerStore struct {
35 kvStore store.KVStore
36}
37
38var _ IGovStakerStore = (*govStakerStore)(nil)
39
40// NewGovStakerStore creates a new governance staker store instance
41func NewGovStakerStore(kvStore store.KVStore) IGovStakerStore {
42 return &govStakerStore{
43 kvStore: kvStore,
44 }
45}
46
47// Basic configuration methods
48func (s *govStakerStore) HasUnDelegationLockupPeriodStoreKey() bool {
49 return s.kvStore.Has(StoreKeyUnDelegationLockupPeriod)
50}
51
52func (s *govStakerStore) GetUnDelegationLockupPeriod() int64 {
53 result, err := s.kvStore.Get(StoreKeyUnDelegationLockupPeriod)
54 if err != nil {
55 panic(err)
56 }
57
58 period, ok := result.(int64)
59 if !ok {
60 panic(ufmt.Sprintf("failed to cast result to int64: %T", result))
61 }
62
63 return period
64}
65
66func (s *govStakerStore) SetUnDelegationLockupPeriod(_ int, rlm realm, period int64) error {
67 if !rlm.IsCurrent() {
68 return ErrSpoofedRealm
69 }
70
71 return s.kvStore.Set(0, rlm, StoreKeyUnDelegationLockupPeriod, period)
72}
73
74func (s *govStakerStore) HasTotalDelegatedAmountStoreKey() bool {
75 return s.kvStore.Has(StoreKeyTotalDelegatedAmount)
76}
77
78func (s *govStakerStore) GetTotalDelegatedAmount() int64 {
79 result, err := s.kvStore.Get(StoreKeyTotalDelegatedAmount)
80 if err != nil {
81 panic(err)
82 }
83
84 amount, ok := result.(int64)
85 if !ok {
86 panic(ufmt.Sprintf("failed to cast result to int64: %T", result))
87 }
88
89 return amount
90}
91
92func (s *govStakerStore) SetTotalDelegatedAmount(_ int, rlm realm, amount int64) error {
93 if !rlm.IsCurrent() {
94 return ErrSpoofedRealm
95 }
96
97 return s.kvStore.Set(0, rlm, StoreKeyTotalDelegatedAmount, amount)
98}
99
100func (s *govStakerStore) HasTotalLockedAmountStoreKey() bool {
101 return s.kvStore.Has(StoreKeyTotalLockedAmount)
102}
103
104func (s *govStakerStore) GetTotalLockedAmount() int64 {
105 result, err := s.kvStore.Get(StoreKeyTotalLockedAmount)
106 if err != nil {
107 panic(err)
108 }
109
110 amount, ok := result.(int64)
111 if !ok {
112 panic(ufmt.Sprintf("failed to cast result to int64: %T", result))
113 }
114
115 return amount
116}
117
118func (s *govStakerStore) SetTotalLockedAmount(_ int, rlm realm, amount int64) error {
119 if !rlm.IsCurrent() {
120 return ErrSpoofedRealm
121 }
122
123 return s.kvStore.Set(0, rlm, StoreKeyTotalLockedAmount, amount)
124}
125
126// Delegation management methods
127func (s *govStakerStore) HasDelegationsStoreKey() bool {
128 return s.kvStore.Has(StoreKeyDelegations)
129}
130
131func (s *govStakerStore) SetDelegations(_ int, rlm realm, delegations *bptree.BPTree) error {
132 if !rlm.IsCurrent() {
133 return ErrSpoofedRealm
134 }
135
136 return s.kvStore.Set(0, rlm, StoreKeyDelegations, delegations)
137}
138
139func (s *govStakerStore) HasDelegation(id int64) bool {
140 delegations := s.GetAllDelegations()
141 _, exists := delegations.Get(int64ToString(id))
142 return exists
143}
144
145func (s *govStakerStore) GetDelegation(id int64) (*Delegation, bool) {
146 delegations := s.GetAllDelegations()
147
148 result, exists := delegations.Get(int64ToString(id))
149 if !exists {
150 return nil, false
151 }
152
153 delegation, ok := result.(*Delegation)
154 if !ok {
155 panic(ufmt.Sprintf("failed to cast result to *Delegation: %T", result))
156 }
157
158 return delegation, true
159}
160
161func (s *govStakerStore) SetDelegation(_ int, rlm realm, id int64, delegation *Delegation) error {
162 if !rlm.IsCurrent() {
163 return ErrSpoofedRealm
164 }
165
166 delegations := s.GetAllDelegations()
167
168 delegations.Set(int64ToString(id), delegation)
169 return s.kvStore.Set(0, rlm, StoreKeyDelegations, delegations)
170}
171
172func (s *govStakerStore) RemoveDelegation(_ int, rlm realm, id int64) error {
173 if !rlm.IsCurrent() {
174 return ErrSpoofedRealm
175 }
176
177 delegations := s.GetAllDelegations()
178
179 delegations.Remove(int64ToString(id))
180 return s.kvStore.Set(0, rlm, StoreKeyDelegations, delegations)
181}
182
183func (s *govStakerStore) GetAllDelegations() *bptree.BPTree {
184 result, err := s.kvStore.Get(StoreKeyDelegations)
185 if err != nil {
186 panic(err)
187 }
188
189 delegations, ok := result.(*bptree.BPTree)
190 if !ok {
191 panic(ufmt.Sprintf("failed to cast result to *bptree.BPTree: %T", result))
192 }
193
194 return delegations
195}
196
197func (s *govStakerStore) HasDelegationCounterStoreKey() bool {
198 return s.kvStore.Has(StoreKeyDelegationNextID)
199}
200
201func (s *govStakerStore) GetDelegationCounter() *Counter {
202 result, err := s.kvStore.Get(StoreKeyDelegationNextID)
203 if err != nil {
204 panic(err)
205 }
206
207 counter, ok := result.(*Counter)
208 if !ok {
209 panic(ufmt.Sprintf("failed to cast result to Counter: %T", result))
210 }
211
212 return counter
213}
214
215func (s *govStakerStore) SetDelegationCounter(_ int, rlm realm, counter *Counter) error {
216 if !rlm.IsCurrent() {
217 return ErrSpoofedRealm
218 }
219
220 return s.kvStore.Set(0, rlm, StoreKeyDelegationNextID, counter)
221}
222
223// Total delegation history methods (timestamp -> int64)
224func (s *govStakerStore) HasTotalDelegationHistoryStoreKey() bool {
225 return s.kvStore.Has(StoreKeyTotalDelegationHistory)
226}
227
228func (s *govStakerStore) GetTotalDelegationHistory() *UintTree {
229 result, err := s.kvStore.Get(StoreKeyTotalDelegationHistory)
230 if err != nil {
231 panic(err)
232 }
233
234 history, ok := result.(*UintTree)
235 if !ok {
236 panic(ufmt.Sprintf("failed to cast result to *UintTree: %T", result))
237 }
238
239 return history
240}
241
242func (s *govStakerStore) SetTotalDelegationHistory(_ int, rlm realm, history *UintTree) error {
243 if !rlm.IsCurrent() {
244 return ErrSpoofedRealm
245 }
246
247 return s.kvStore.Set(0, rlm, StoreKeyTotalDelegationHistory, history)
248}
249
250// User delegation history methods (address -> *UintTree[timestamp -> int64])
251func (s *govStakerStore) HasUserDelegationHistoryStoreKey() bool {
252 return s.kvStore.Has(StoreKeyUserDelegationHistory)
253}
254
255func (s *govStakerStore) GetUserDelegationHistory() *bptree.BPTree {
256 result, err := s.kvStore.Get(StoreKeyUserDelegationHistory)
257 if err != nil {
258 panic(err)
259 }
260
261 history, ok := result.(*bptree.BPTree)
262 if !ok {
263 panic(ufmt.Sprintf("failed to cast result to *bptree.BPTree: %T", result))
264 }
265
266 return history
267}
268
269func (s *govStakerStore) SetUserDelegationHistory(_ int, rlm realm, history *bptree.BPTree) error {
270 if !rlm.IsCurrent() {
271 return ErrSpoofedRealm
272 }
273
274 return s.kvStore.Set(0, rlm, StoreKeyUserDelegationHistory, history)
275}
276
277func (s *govStakerStore) HasEmissionRewardManagerStoreKey() bool {
278 return s.kvStore.Has(StoreKeyEmissionRewardManager)
279}
280
281func (s *govStakerStore) GetEmissionRewardManager() *EmissionRewardManager {
282 result, err := s.kvStore.Get(StoreKeyEmissionRewardManager)
283 if err != nil {
284 panic(err)
285 }
286
287 manager, ok := result.(*EmissionRewardManager)
288 if !ok {
289 panic(ufmt.Sprintf("failed to cast result to *EmissionRewardManager: %T", result))
290 }
291
292 return manager
293}
294
295func (s *govStakerStore) SetEmissionRewardManager(_ int, rlm realm, manager *EmissionRewardManager) error {
296 if !rlm.IsCurrent() {
297 return ErrSpoofedRealm
298 }
299
300 return s.kvStore.Set(0, rlm, StoreKeyEmissionRewardManager, manager)
301}
302
303func (s *govStakerStore) HasProtocolFeeRewardManagerStoreKey() bool {
304 return s.kvStore.Has(StoreKeyProtocolFeeRewardManager)
305}
306
307func (s *govStakerStore) GetProtocolFeeRewardManager() *ProtocolFeeRewardManager {
308 result, err := s.kvStore.Get(StoreKeyProtocolFeeRewardManager)
309 if err != nil {
310 panic(err)
311 }
312
313 manager, ok := result.(*ProtocolFeeRewardManager)
314 if !ok {
315 panic(ufmt.Sprintf("failed to cast result to *ProtocolFeeRewardManager: %T", result))
316 }
317
318 return manager
319}
320
321func (s *govStakerStore) SetProtocolFeeRewardManager(_ int, rlm realm, manager *ProtocolFeeRewardManager) error {
322 if !rlm.IsCurrent() {
323 return ErrSpoofedRealm
324 }
325
326 return s.kvStore.Set(0, rlm, StoreKeyProtocolFeeRewardManager, manager)
327}
328
329func (s *govStakerStore) HasDelegationManagerStoreKey() bool {
330 return s.kvStore.Has(StoreKeyDelegationManager)
331}
332
333func (s *govStakerStore) GetDelegationManager() *DelegationManager {
334 result, err := s.kvStore.Get(StoreKeyDelegationManager)
335 if err != nil {
336 panic(err)
337 }
338
339 manager, ok := result.(*DelegationManager)
340 if !ok {
341 panic(ufmt.Sprintf("failed to cast result to *DelegationManager: %T", result))
342 }
343
344 return manager
345}
346
347func (s *govStakerStore) SetDelegationManager(_ int, rlm realm, manager *DelegationManager) error {
348 if !rlm.IsCurrent() {
349 return ErrSpoofedRealm
350 }
351
352 return s.kvStore.Set(0, rlm, StoreKeyDelegationManager, manager)
353}
354
355func (s *govStakerStore) HasLaunchpadProjectDepositsStoreKey() bool {
356 return s.kvStore.Has(StoreKeyLaunchpadProjectDeposits)
357}
358
359func (s *govStakerStore) GetLaunchpadProjectDeposits() *LaunchpadProjectDeposits {
360 result, err := s.kvStore.Get(StoreKeyLaunchpadProjectDeposits)
361 if err != nil {
362 panic(err)
363 }
364
365 deposits, ok := result.(*LaunchpadProjectDeposits)
366 if !ok {
367 panic(ufmt.Sprintf("failed to cast result to *LaunchpadProjectDeposits: %T", result))
368 }
369
370 return deposits
371}
372
373func (s *govStakerStore) SetLaunchpadProjectDeposits(_ int, rlm realm, deposits *LaunchpadProjectDeposits) error {
374 if !rlm.IsCurrent() {
375 return ErrSpoofedRealm
376 }
377
378 return s.kvStore.Set(0, rlm, StoreKeyLaunchpadProjectDeposits, deposits)
379}
380
381// Helper functions
382func int64ToString(n int64) string {
383 return strconv.FormatInt(n, 10)
384}