reward_state.gno
1.95 Kb ยท 74 lines
1package v1
2
3import (
4 "gno.land/r/gnoswap/launchpad"
5
6 u256 "gno.land/p/gnoswap/uint256"
7)
8
9// Helper functions for RewardState
10
11func isRewardStateClaimable(r *launchpad.RewardState, currentTime int64) bool {
12 return currentTime >= r.ClaimableTime()
13}
14
15// calculateReward calculates the total reward amount based on
16// the accumulated reward per deposit.
17// Returns the total reward amount.
18func calculateReward(r *launchpad.RewardState, accumRewardPerDepositX128 *u256.Uint) int64 {
19 if accumRewardPerDepositX128 == nil || r.PriceDebtX128() == nil {
20 return 0
21 }
22
23 actualRewardPerDepositX128 := u256.Zero().Sub(accumRewardPerDepositX128, r.PriceDebtX128())
24 if actualRewardPerDepositX128.IsZero() {
25 return 0
26 }
27
28 reward, overflow := u256.Zero().MulOverflow(actualRewardPerDepositX128, u256.NewUintFromInt64(r.DepositAmount()))
29 if overflow {
30 panic(errOverflow)
31 }
32 reward = reward.Rsh(reward, 128)
33 return safeConvertToInt64(reward)
34}
35
36// calculateClaimableReward calculates the amount of reward that can be claimed
37// based on the current accumulated reward per deposit.
38// Returns the amount of reward that can be claimed.
39func calculateClaimableReward(r *launchpad.RewardState, accumRewardPerDepositX128 *u256.Uint) int64 {
40 if accumRewardPerDepositX128 == nil {
41 return 0
42 }
43
44 // Return 0 if accumulated reward is less than price debt
45 if accumRewardPerDepositX128.Lt(r.PriceDebtX128()) {
46 return 0
47 }
48
49 reward := calculateReward(r, accumRewardPerDepositX128)
50 claimedAmount := r.ClaimedAmount()
51
52 if reward <= claimedAmount {
53 return 0
54 }
55
56 return reward - claimedAmount
57}
58
59// NewRewardState returns a pointer to a new RewardState with the given values.
60func newRewardState(
61 accumulatedRewardPerDepositX128 *u256.Uint,
62 depositAmount,
63 distributeStartTime,
64 distributeEndTime int64,
65 claimableTime int64,
66) *launchpad.RewardState {
67 return launchpad.NewRewardState(
68 accumulatedRewardPerDepositX128,
69 depositAmount,
70 distributeStartTime,
71 distributeEndTime,
72 claimableTime,
73 )
74}