Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

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}