Search Apps Documentation Source Content File Folder Download Copy Actions Download

protocol_fee_reward_manager.gno

4.41 Kb · 122 lines
  1package staker
  2
  3import (
  4	bptree "gno.land/p/nt/bptree/v0"
  5	ufmt "gno.land/p/nt/ufmt/v0"
  6
  7	u256 "gno.land/p/gnoswap/uint256"
  8)
  9
 10// ProtocolFeeRewardManager manages the distribution of protocol fee rewards to stakers.
 11// Unlike emission rewards, protocol fees can come from multiple tokens, requiring
 12// separate tracking and distribution mechanisms for each token type.
 13type ProtocolFeeRewardManager struct {
 14	// rewardStates maps address to ProtocolFeeRewardState for tracking individual staker rewards
 15	rewardStates *bptree.BPTree // address -> ProtocolFeeRewardState
 16
 17	// accumulatedProtocolFeeX128PerStake maps token path to accumulated fee per stake with 128-bit precision
 18	accumulatedProtocolFeeX128PerStake map[string]*u256.Uint
 19	// protocolFeeAmounts maps token path to total distributed protocol fee amounts
 20	protocolFeeAmounts map[string]int64
 21	// accumulatedTimestamp tracks the last timestamp when fees were accumulated
 22	accumulatedTimestamp int64
 23	// totalStakedAmount tracks the total amount of tokens staked in the system
 24	totalStakedAmount int64
 25}
 26
 27// NewProtocolFeeRewardManager creates a new instance of ProtocolFeeRewardManager.
 28// This factory function initializes all tracking structures for multi-token protocol fee reward management.
 29//
 30// Returns:
 31//   - *ProtocolFeeRewardManager: new protocol fee reward manager instance
 32func NewProtocolFeeRewardManager() *ProtocolFeeRewardManager {
 33	return &ProtocolFeeRewardManager{
 34		rewardStates:                       bptree.NewBPTreeN(16),
 35		protocolFeeAmounts:                 make(map[string]int64),
 36		accumulatedProtocolFeeX128PerStake: make(map[string]*u256.Uint),
 37		accumulatedTimestamp:               0,
 38		totalStakedAmount:                  0,
 39	}
 40}
 41
 42/* Getters */
 43
 44func (p *ProtocolFeeRewardManager) GetRewardState(addr string) (*ProtocolFeeRewardState, bool, error) {
 45	ri, ok := p.rewardStates.Get(addr)
 46	if !ok {
 47		return nil, false, nil
 48	}
 49	rs, castOk := ri.(*ProtocolFeeRewardState)
 50	if !castOk {
 51		return nil, false, ufmt.Errorf(errFailedToCastRewardState, ri)
 52	}
 53	return rs, true, nil
 54}
 55
 56// GetAccumulatedProtocolFeeX128PerStake returns the accumulated protocol fee per stake for a specific token.
 57//
 58// Parameters:
 59//   - token: token path to get accumulated fee for
 60//
 61// Returns:
 62//   - *u256.Uint: accumulated protocol fee per stake for the token (scaled by 2^128)
 63func (p *ProtocolFeeRewardManager) GetAccumulatedProtocolFeeX128PerStake(token string) *u256.Uint {
 64	return p.accumulatedProtocolFeeX128PerStake[token]
 65}
 66
 67func (p *ProtocolFeeRewardManager) GetProtocolFeeAmounts() map[string]int64 {
 68	return p.protocolFeeAmounts
 69}
 70
 71// GetAccumulatedTimestamp returns the last timestamp when protocol fees were accumulated.
 72//
 73// Returns:
 74//   - int64: last accumulated timestamp
 75func (p *ProtocolFeeRewardManager) GetAccumulatedTimestamp() int64 {
 76	return p.accumulatedTimestamp
 77}
 78
 79func (p *ProtocolFeeRewardManager) GetTotalStakedAmount() int64 {
 80	return p.totalStakedAmount
 81}
 82
 83/* Setters */
 84
 85func (p *ProtocolFeeRewardManager) SetRewardStates(rewardStates *bptree.BPTree) {
 86	p.rewardStates = rewardStates
 87}
 88
 89func (p *ProtocolFeeRewardManager) SetAccumulatedProtocolFeeX128PerStake(accumulatedProtocolFeeX128PerStake map[string]*u256.Uint) {
 90	copied := make(map[string]*u256.Uint, len(accumulatedProtocolFeeX128PerStake))
 91	for token, value := range accumulatedProtocolFeeX128PerStake {
 92		copied[token] = u256.Zero().Set(value)
 93	}
 94	p.accumulatedProtocolFeeX128PerStake = copied
 95}
 96
 97func (p *ProtocolFeeRewardManager) SetProtocolFeeAmounts(protocolFeeAmounts map[string]int64) {
 98	p.protocolFeeAmounts = protocolFeeAmounts
 99}
100
101func (p *ProtocolFeeRewardManager) SetAccumulatedTimestamp(accumulatedTimestamp int64) {
102	p.accumulatedTimestamp = accumulatedTimestamp
103}
104
105func (p *ProtocolFeeRewardManager) SetTotalStakedAmount(totalStakedAmount int64) {
106	p.totalStakedAmount = totalStakedAmount
107}
108
109// GetAllAccumulatedProtocolFeeX128PerStake returns all accumulated protocol fees per stake
110func (p *ProtocolFeeRewardManager) GetAllAccumulatedProtocolFeeX128PerStake() map[string]*u256.Uint {
111	return p.accumulatedProtocolFeeX128PerStake
112}
113
114// GetProtocolFeeAmount returns the protocol fee amount for a specific token
115func (p *ProtocolFeeRewardManager) GetProtocolFeeAmount(token string) int64 {
116	return p.protocolFeeAmounts[token]
117}
118
119// SetRewardState sets the reward state for a specific address
120func (p *ProtocolFeeRewardManager) SetRewardState(address string, rewardState *ProtocolFeeRewardState) {
121	p.rewardStates.Set(address, rewardState)
122}