Search Apps Documentation Source Content File Folder Download Copy Actions Download

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}