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