Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}