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