emission_reward_manager.gno
3.36 Kb ยท 97 lines
1package staker
2
3import (
4 "gno.land/p/nt/avl"
5 "gno.land/p/nt/ufmt"
6
7 u256 "gno.land/p/gnoswap/uint256"
8)
9
10var errFailedToCastRewardState = "failed to cast rewardStates's element to *EmissionRewardState: %T"
11
12// EmissionRewardManager manages the distribution of emission rewards to stakers.
13type EmissionRewardManager struct {
14 // rewardStates maps address to EmissionRewardState for tracking individual staker rewards
15 rewardStates *avl.Tree // address -> EmissionRewardState
16
17 // accumulatedRewardX128PerStake tracks the cumulative reward per unit of stake with 128-bit precision
18 accumulatedRewardX128PerStake *u256.Uint
19 // distributedAmount tracks the total amount of rewards distributed
20 distributedAmount int64
21 // accumulatedTimestamp tracks the last timestamp when rewards were accumulated
22 accumulatedTimestamp int64
23 // totalStakedAmount tracks the total amount of tokens staked in the system
24 totalStakedAmount int64
25}
26
27// NewEmissionRewardManager creates a new instance of EmissionRewardManager.
28// This factory function initializes all tracking structures for emission reward management.
29// NewEmissionRewardManager creates new emission reward manager instance.
30func NewEmissionRewardManager() *EmissionRewardManager {
31 return &EmissionRewardManager{
32 accumulatedRewardX128PerStake: u256.NewUint(0),
33 accumulatedTimestamp: 0,
34 totalStakedAmount: 0,
35 distributedAmount: 0,
36 rewardStates: avl.NewTree(),
37 }
38}
39
40// GetAccumulatedRewardX128PerStake returns the accumulated reward per stake with 128-bit precision.
41func (e *EmissionRewardManager) GetAccumulatedRewardX128PerStake() *u256.Uint {
42 return e.accumulatedRewardX128PerStake
43}
44
45// GetAccumulatedTimestamp returns the last timestamp when rewards were accumulated.
46func (e *EmissionRewardManager) GetAccumulatedTimestamp() int64 {
47 return e.accumulatedTimestamp
48}
49
50// GetTotalStakedAmount returns the total amount of tokens staked in the system.
51func (e *EmissionRewardManager) GetTotalStakedAmount() int64 {
52 return e.totalStakedAmount
53}
54
55// GetDistributedAmount returns the total amount of rewards distributed.
56func (e *EmissionRewardManager) GetDistributedAmount() int64 {
57 return e.distributedAmount
58}
59
60func (e *EmissionRewardManager) GetRewardState(addr string) (*EmissionRewardState, bool, error) {
61 ri, ok := e.rewardStates.Get(addr)
62 if !ok {
63 return nil, false, nil
64 }
65 rs, castOk := ri.(*EmissionRewardState)
66 if !castOk {
67 return nil, false, ufmt.Errorf(errFailedToCastRewardState, ri)
68 }
69 return rs, true, nil
70}
71
72/* Setters */
73
74func (e *EmissionRewardManager) SetRewardStates(rewardStates *avl.Tree) {
75 e.rewardStates = rewardStates
76}
77
78func (e *EmissionRewardManager) SetAccumulatedRewardX128PerStake(accumulatedRewardX128PerStake *u256.Uint) {
79 e.accumulatedRewardX128PerStake = accumulatedRewardX128PerStake
80}
81
82func (e *EmissionRewardManager) SetDistributedAmount(distributedAmount int64) {
83 e.distributedAmount = distributedAmount
84}
85
86func (e *EmissionRewardManager) SetAccumulatedTimestamp(accumulatedTimestamp int64) {
87 e.accumulatedTimestamp = accumulatedTimestamp
88}
89
90func (e *EmissionRewardManager) SetTotalStakedAmount(totalStakedAmount int64) {
91 e.totalStakedAmount = totalStakedAmount
92}
93
94// SetRewardState sets the reward state for a specific address
95func (e *EmissionRewardManager) SetRewardState(address string, rewardState *EmissionRewardState) {
96 e.rewardStates.Set(address, rewardState)
97}