reward_state.gno
1.50 Kb · 54 lines
1package launchpad
2
3import (
4 "errors"
5 "gno.land/r/gnoswap/launchpad"
6
7 gnsmath "gno.land/p/gnoswap/gnsmath"
8 u256 "gno.land/p/gnoswap/uint256"
9)
10
11// Helper functions for RewardState
12
13func isRewardStateClaimable(r *launchpad.RewardState, currentTime int64) bool {
14 return currentTime >= r.ClaimableTime()
15}
16
17// calculateReward calculates the total reward amount based on
18// the accumulated reward per deposit.
19// Returns the total reward amount.
20func calculateReward(r *launchpad.RewardState, accumRewardPerDepositX128 *u256.Uint) int64 {
21 if accumRewardPerDepositX128 == nil || r.PriceDebtX128() == nil {
22 return 0
23 }
24
25 actualRewardPerDepositX128 := u256.Zero().Sub(accumRewardPerDepositX128, r.PriceDebtX128())
26 if actualRewardPerDepositX128.IsZero() {
27 return 0
28 }
29
30 reward, overflow := u256.Zero().MulOverflow(actualRewardPerDepositX128, u256.NewUintFromInt64(r.DepositAmount()))
31 if overflow {
32 panic(errors.New(errOverflow))
33 }
34 reward = reward.Rsh(reward, 128)
35 return gnsmath.SafeConvertToInt64(reward)
36}
37
38// calculateClaimableReward calculates the amount of reward that can be claimed
39// based on the current accumulated reward per deposit.
40// Returns the amount of reward that can be claimed.
41func calculateClaimableReward(r *launchpad.RewardState, accumRewardPerDepositX128 *u256.Uint) int64 {
42 if accumRewardPerDepositX128 == nil {
43 return 0
44 }
45
46 reward := calculateReward(r, accumRewardPerDepositX128)
47 claimedAmount := r.ClaimedAmount()
48
49 if reward <= claimedAmount {
50 return 0
51 }
52
53 return reward - claimedAmount
54}