Search Apps Documentation Source Content File Folder Download Copy Actions Download

type.gno

4.94 Kb · 138 lines
  1package v1
  2
  3import (
  4	sr "gno.land/r/gnoswap/staker"
  5)
  6
  7type ExternalIncentiveResolver struct {
  8	*sr.ExternalIncentive
  9}
 10
 11// isActive checks if the incentive is currently active at the given timestamp
 12func (self *ExternalIncentiveResolver) isActive(currentTimestamp int64) bool {
 13	return currentTimestamp >= self.StartTimestamp() && currentTimestamp <= self.EndTimestamp()
 14}
 15
 16func (self *ExternalIncentiveResolver) IsEnded(currentTimestamp int64) bool {
 17	return currentTimestamp > self.EndTimestamp()
 18}
 19
 20func (self *ExternalIncentiveResolver) IsStarted(currentTimestamp int64) bool {
 21	return currentTimestamp >= self.StartTimestamp()
 22}
 23
 24// addDistributedRewardAmount adds the given amount to the distributed reward amount.
 25// This function is used to add the distributed reward amount when the incentive is un-staked and refunded.
 26func (self *ExternalIncentiveResolver) addDistributedRewardAmount(amount int64) {
 27	distributedRewardAmount := safeAddInt64(self.DistributedRewardAmount(), amount)
 28	self.SetDistributedRewardAmount(distributedRewardAmount)
 29}
 30
 31// addAccumulatedPenaltyAmount adds the given amount to the accumulated penalty amount.
 32// Called during CollectReward to track warmup penalties for later collection.
 33func (self *ExternalIncentiveResolver) addAccumulatedPenaltyAmount(amount int64) {
 34	accumulatedPenaltyAmount := safeAddInt64(self.AccumulatedPenaltyAmount(), amount)
 35	self.SetAccumulatedPenaltyAmount(accumulatedPenaltyAmount)
 36}
 37
 38// NewExternalIncentive creates a new external incentive
 39func NewExternalIncentiveResolver(
 40	externalIncentive *sr.ExternalIncentive,
 41) *ExternalIncentiveResolver {
 42	return &ExternalIncentiveResolver{
 43		ExternalIncentive: externalIncentive,
 44	}
 45}
 46
 47type DepositResolver struct {
 48	*sr.Deposit
 49}
 50
 51// InternalRewardLastCollectTime returns the last collect time for the internal reward.
 52// If the last collect time is 0, it returns the staked time.
 53func (self *DepositResolver) InternalRewardLastCollectTime() int64 {
 54	if self.Deposit.InternalRewardLastCollectTime() == 0 {
 55		return self.Deposit.StakeTime()
 56	}
 57
 58	return self.Deposit.InternalRewardLastCollectTime()
 59}
 60
 61// ExternalRewardLastCollectTime returns the last collect time for the external reward for the given incentive ID.
 62// If the last collect time is 0, it returns the staked time.
 63func (self *DepositResolver) ExternalRewardLastCollectTime(incentiveID string) int64 {
 64	lastCollectTime, exists := self.Deposit.GetExternalRewardLastCollectTime(incentiveID)
 65	if !exists || lastCollectTime == 0 {
 66		return self.Deposit.StakeTime()
 67	}
 68
 69	return lastCollectTime
 70}
 71
 72func (self *DepositResolver) CollectedExternalReward(incentiveID string) int64 {
 73	collectedExternalReward, exists := self.Deposit.GetCollectedExternalReward(incentiveID)
 74	if !exists {
 75		return 0
 76	}
 77
 78	return collectedExternalReward
 79}
 80
 81func (self *DepositResolver) addCollectedInternalReward(reward int64) {
 82	self.SetCollectedInternalReward(safeAddInt64(self.CollectedInternalReward(), reward))
 83}
 84
 85func (self *DepositResolver) addCollectedExternalReward(incentiveID string, reward int64) {
 86	collectedExternalReward := safeAddInt64(self.CollectedExternalReward(incentiveID), reward)
 87	self.SetCollectedExternalReward(incentiveID, collectedExternalReward)
 88}
 89
 90// updateInternalRewardLastCollectTime updates the last collect time for the internal reward.
 91// It returns an error if the current time is less than the last collect time for the internal reward.
 92func (self *DepositResolver) updateInternalRewardLastCollectTime(currentTime int64) error {
 93	if self.InternalRewardLastCollectTime() > currentTime {
 94		return makeErrorWithDetails(errNotAvailableUpdateCollectTime, "currentTime must be greater than internal reward last collect time")
 95	}
 96
 97	self.SetInternalRewardLastCollectTime(currentTime)
 98
 99	return nil
100}
101
102// updateExternalRewardLastCollectTime lazily updates the last collect time for the external reward for the given incentive ID.
103// It returns an error if the current time is less than the last collect time for the external reward for the given incentive ID.
104func (self *DepositResolver) updateExternalRewardLastCollectTime(incentiveID string, currentTime int64) error {
105	if self.ExternalRewardLastCollectTimes() == nil {
106		self.SetExternalRewardLastCollectTimes(make(map[string]int64))
107	}
108
109	externalLastCollectTime, exists := self.Deposit.GetExternalRewardLastCollectTime(incentiveID)
110	if exists && externalLastCollectTime > currentTime {
111		return makeErrorWithDetails(errNotAvailableUpdateCollectTime, "currentTime must be greater than external reward last collect time")
112	}
113
114	self.Deposit.SetExternalRewardLastCollectTime(incentiveID, currentTime)
115
116	return nil
117}
118
119func (self *DepositResolver) FindWarmup(currentTime int64) int {
120	for i, warmup := range self.Warmups() {
121		if currentTime < warmup.NextWarmupTime {
122			return i
123		}
124	}
125	return len(self.Warmups()) - 1
126}
127
128func (self *DepositResolver) GetWarmup(index int) sr.Warmup {
129	return self.Warmups()[index]
130}
131
132func NewDepositResolver(
133	deposit *sr.Deposit,
134) *DepositResolver {
135	return &DepositResolver{
136		Deposit: deposit,
137	}
138}