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}