Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

store.gno

9.83 Kb · 378 lines
  1package staker
  2
  3import (
  4	"errors"
  5	"gno.land/p/gnoswap/store"
  6	"gno.land/p/gnoswap/utils"
  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 errors.New(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 errors.New(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 errors.New(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 errors.New(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	return delegations.Get(utils.Int64ToString(id)) != nil
142}
143
144func (s *govStakerStore) GetDelegation(id int64) (*Delegation, bool) {
145	delegations := s.GetAllDelegations()
146
147	result := delegations.Get(utils.Int64ToString(id))
148	if result == nil {
149		return nil, false
150	}
151
152	delegation, ok := result.(*Delegation)
153	if !ok {
154		panic(ufmt.Sprintf("failed to cast result to *Delegation: %T", result))
155	}
156
157	return delegation, true
158}
159
160func (s *govStakerStore) SetDelegation(_ int, rlm realm, id int64, delegation *Delegation) error {
161	if !rlm.IsCurrent() {
162		return errors.New(ErrSpoofedRealm)
163	}
164
165	delegations := s.GetAllDelegations()
166
167	delegations.Set(utils.Int64ToString(id), delegation)
168	return s.kvStore.Set(0, rlm, StoreKeyDelegations, delegations)
169}
170
171func (s *govStakerStore) RemoveDelegation(_ int, rlm realm, id int64) error {
172	if !rlm.IsCurrent() {
173		return errors.New(ErrSpoofedRealm)
174	}
175
176	delegations := s.GetAllDelegations()
177
178	delegations.Remove(utils.Int64ToString(id))
179	return s.kvStore.Set(0, rlm, StoreKeyDelegations, delegations)
180}
181
182func (s *govStakerStore) GetAllDelegations() *bptree.BPTree {
183	result, err := s.kvStore.Get(StoreKeyDelegations)
184	if err != nil {
185		panic(err)
186	}
187
188	delegations, ok := result.(*bptree.BPTree)
189	if !ok {
190		panic(ufmt.Sprintf("failed to cast result to *bptree.BPTree: %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(_ int, rlm realm, counter *Counter) error {
215	if !rlm.IsCurrent() {
216		return errors.New(ErrSpoofedRealm)
217	}
218
219	return s.kvStore.Set(0, rlm, StoreKeyDelegationNextID, counter)
220}
221
222// Total delegation history methods (timestamp -> int64)
223func (s *govStakerStore) HasTotalDelegationHistoryStoreKey() bool {
224	return s.kvStore.Has(StoreKeyTotalDelegationHistory)
225}
226
227func (s *govStakerStore) GetTotalDelegationHistory() *UintTree {
228	result, err := s.kvStore.Get(StoreKeyTotalDelegationHistory)
229	if err != nil {
230		panic(err)
231	}
232
233	history, ok := result.(*UintTree)
234	if !ok {
235		panic(ufmt.Sprintf("failed to cast result to *UintTree: %T", result))
236	}
237
238	return history
239}
240
241func (s *govStakerStore) SetTotalDelegationHistory(_ int, rlm realm, history *UintTree) error {
242	if !rlm.IsCurrent() {
243		return errors.New(ErrSpoofedRealm)
244	}
245
246	return s.kvStore.Set(0, rlm, StoreKeyTotalDelegationHistory, history)
247}
248
249// User delegation history methods (address -> *UintTree[timestamp -> int64])
250func (s *govStakerStore) HasUserDelegationHistoryStoreKey() bool {
251	return s.kvStore.Has(StoreKeyUserDelegationHistory)
252}
253
254func (s *govStakerStore) GetUserDelegationHistory() *bptree.BPTree {
255	result, err := s.kvStore.Get(StoreKeyUserDelegationHistory)
256	if err != nil {
257		panic(err)
258	}
259
260	history, ok := result.(*bptree.BPTree)
261	if !ok {
262		panic(ufmt.Sprintf("failed to cast result to *bptree.BPTree: %T", result))
263	}
264
265	return history
266}
267
268func (s *govStakerStore) SetUserDelegationHistory(_ int, rlm realm, history *bptree.BPTree) error {
269	if !rlm.IsCurrent() {
270		return errors.New(ErrSpoofedRealm)
271	}
272
273	return s.kvStore.Set(0, rlm, StoreKeyUserDelegationHistory, history)
274}
275
276func (s *govStakerStore) HasEmissionRewardManagerStoreKey() bool {
277	return s.kvStore.Has(StoreKeyEmissionRewardManager)
278}
279
280func (s *govStakerStore) GetEmissionRewardManager() *EmissionRewardManager {
281	result, err := s.kvStore.Get(StoreKeyEmissionRewardManager)
282	if err != nil {
283		panic(err)
284	}
285
286	manager, ok := result.(*EmissionRewardManager)
287	if !ok {
288		panic(ufmt.Sprintf("failed to cast result to *EmissionRewardManager: %T", result))
289	}
290
291	return manager
292}
293
294func (s *govStakerStore) SetEmissionRewardManager(_ int, rlm realm, manager *EmissionRewardManager) error {
295	if !rlm.IsCurrent() {
296		return errors.New(ErrSpoofedRealm)
297	}
298
299	return s.kvStore.Set(0, rlm, StoreKeyEmissionRewardManager, manager)
300}
301
302func (s *govStakerStore) HasProtocolFeeRewardManagerStoreKey() bool {
303	return s.kvStore.Has(StoreKeyProtocolFeeRewardManager)
304}
305
306func (s *govStakerStore) GetProtocolFeeRewardManager() *ProtocolFeeRewardManager {
307	result, err := s.kvStore.Get(StoreKeyProtocolFeeRewardManager)
308	if err != nil {
309		panic(err)
310	}
311
312	manager, ok := result.(*ProtocolFeeRewardManager)
313	if !ok {
314		panic(ufmt.Sprintf("failed to cast result to *ProtocolFeeRewardManager: %T", result))
315	}
316
317	return manager
318}
319
320func (s *govStakerStore) SetProtocolFeeRewardManager(_ int, rlm realm, manager *ProtocolFeeRewardManager) error {
321	if !rlm.IsCurrent() {
322		return errors.New(ErrSpoofedRealm)
323	}
324
325	return s.kvStore.Set(0, rlm, StoreKeyProtocolFeeRewardManager, manager)
326}
327
328func (s *govStakerStore) HasDelegationManagerStoreKey() bool {
329	return s.kvStore.Has(StoreKeyDelegationManager)
330}
331
332func (s *govStakerStore) GetDelegationManager() *DelegationManager {
333	result, err := s.kvStore.Get(StoreKeyDelegationManager)
334	if err != nil {
335		panic(err)
336	}
337
338	manager, ok := result.(*DelegationManager)
339	if !ok {
340		panic(ufmt.Sprintf("failed to cast result to *DelegationManager: %T", result))
341	}
342
343	return manager
344}
345
346func (s *govStakerStore) SetDelegationManager(_ int, rlm realm, manager *DelegationManager) error {
347	if !rlm.IsCurrent() {
348		return errors.New(ErrSpoofedRealm)
349	}
350
351	return s.kvStore.Set(0, rlm, StoreKeyDelegationManager, manager)
352}
353
354func (s *govStakerStore) HasLaunchpadProjectDepositsStoreKey() bool {
355	return s.kvStore.Has(StoreKeyLaunchpadProjectDeposits)
356}
357
358func (s *govStakerStore) GetLaunchpadProjectDeposits() *LaunchpadProjectDeposits {
359	result, err := s.kvStore.Get(StoreKeyLaunchpadProjectDeposits)
360	if err != nil {
361		panic(err)
362	}
363
364	deposits, ok := result.(*LaunchpadProjectDeposits)
365	if !ok {
366		panic(ufmt.Sprintf("failed to cast result to *LaunchpadProjectDeposits: %T", result))
367	}
368
369	return deposits
370}
371
372func (s *govStakerStore) SetLaunchpadProjectDeposits(_ int, rlm realm, deposits *LaunchpadProjectDeposits) error {
373	if !rlm.IsCurrent() {
374		return errors.New(ErrSpoofedRealm)
375	}
376
377	return s.kvStore.Set(0, rlm, StoreKeyLaunchpadProjectDeposits, deposits)
378}