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 · 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}