Skip to content

Commit 03a623a

Browse files
authored
fix(launchpad): transfer launchpad deposit reward (#995)
* fix(launchpad): transfer launchpad deposit reward * test: check collect reward balance changes
1 parent 1250793 commit 03a623a

File tree

3 files changed

+316
-22
lines changed

3 files changed

+316
-22
lines changed

contract/r/gnoswap/launchpad/v1/launchpad_reward.gno

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"time"
77

88
"gno.land/r/gnoswap/access"
9+
"gno.land/r/gnoswap/common"
910
"gno.land/r/gnoswap/halt"
1011
)
1112

@@ -29,11 +30,17 @@ func (lp *launchpadV1) CollectRewardByDepositId(depositID string) int64 {
2930
deposit := lp.mustGetDeposit(depositID)
3031
currentHeight := runtime.ChainHeight()
3132
currentTime := time.Now().Unix()
32-
rewardAmount, err := lp.collectDepositReward(deposit, currentHeight, currentTime)
33+
34+
rewardTokenPath, rewardAmount, err := lp.collectDepositReward(deposit, currentHeight, currentTime)
3335
if err != nil {
3436
panic(err)
3537
}
3638

39+
// Transfer reward token to depositor
40+
if rewardAmount > 0 {
41+
common.SafeGRC20Transfer(cross, rewardTokenPath, deposit.Depositor(), rewardAmount)
42+
}
43+
3744
chain.Emit(
3845
"CollectRewardByDepositId",
3946
"prevAddr", previousRealm.Address().String(),
@@ -46,33 +53,39 @@ func (lp *launchpadV1) CollectRewardByDepositId(depositID string) int64 {
4653
}
4754

4855
// collectDepositReward calculates and collects the reward for a deposit.
49-
func (lp *launchpadV1) collectDepositReward(deposit *Deposit, currentHeight, currentTime int64) (int64, error) {
56+
func (lp *launchpadV1) collectDepositReward(deposit *Deposit, currentHeight, currentTime int64) (string, int64, error) {
5057
if currentTime <= 0 {
51-
return 0, makeErrorWithDetails(errInvalidTime, "currentTime must be positive")
58+
return "", 0, makeErrorWithDetails(errInvalidTime, "currentTime must be positive")
59+
}
60+
61+
// Get project and tier data
62+
project, err := lp.getProject(deposit.ProjectID())
63+
if err != nil {
64+
return "", 0, err
5265
}
5366

54-
// Get project tier and reward manager
55-
projectTier, err := lp.getProjectTier(deposit.ProjectID(), deposit.Tier())
67+
projectTier, err := project.getTier(deposit.Tier())
5668
if err != nil {
57-
return 0, err
69+
return "", 0, err
5870
}
5971

72+
// Get reward manager
6073
rewardManager, err := lp.getProjectTierRewardManager(projectTier.ID())
6174
if err != nil {
62-
return 0, err
75+
return "", 0, err
6376
}
6477

6578
// Update reward state before collection
6679
err = rewardManager.updateRewardPerDepositX128(projectTier.CurrentDepositAmount(), currentHeight, currentTime)
6780
if err != nil {
68-
return 0, err
81+
return "", 0, err
6982
}
7083

7184
// Collect reward
7285
rewardAmount, err := rewardManager.collectReward(deposit.ID(), currentTime)
7386
if err != nil {
74-
return 0, err
87+
return "", 0, err
7588
}
7689

77-
return rewardAmount, nil
90+
return project.TokenPath(), rewardAmount, nil
7891
}

contract/r/gnoswap/launchpad/v1/launchpad_reward_test.gno

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ import (
44
"chain/runtime"
55
"testing"
66

7+
u256 "gno.land/p/gnoswap/uint256"
78
"gno.land/p/nt/avl"
89
"gno.land/p/nt/uassert"
9-
u256 "gno.land/p/gnoswap/uint256"
1010
)
1111

1212
func TestLaunchpadReward_CollectDepositReward(t *testing.T) {
@@ -66,8 +66,9 @@ func TestLaunchpadReward_CollectDepositReward(t *testing.T) {
6666
// Create project with tier but without reward manager
6767
projects := getTestProjects()
6868
project := &Project{
69-
id: "project_1",
70-
tiers: make(map[int64]*ProjectTier),
69+
id: "project_1",
70+
tokenPath: GNS_PATH,
71+
tiers: make(map[int64]*ProjectTier),
7172
}
7273
projectTier := &ProjectTier{
7374
id: "project_1:30",
@@ -100,8 +101,9 @@ func TestLaunchpadReward_CollectDepositReward(t *testing.T) {
100101
// Create project with tier
101102
projects := getTestProjects()
102103
project := &Project{
103-
id: "project_1",
104-
tiers: make(map[int64]*ProjectTier),
104+
id: "project_1",
105+
tokenPath: GNS_PATH,
106+
tiers: make(map[int64]*ProjectTier),
105107
}
106108
projectTier := &ProjectTier{
107109
id: "project_1:30",
@@ -164,8 +166,9 @@ func TestLaunchpadReward_CollectDepositReward(t *testing.T) {
164166
// Create project with tier
165167
projects := getTestProjects()
166168
project := &Project{
167-
id: "project_1",
168-
tiers: make(map[int64]*ProjectTier),
169+
id: "project_1",
170+
tokenPath: GNS_PATH,
171+
tiers: make(map[int64]*ProjectTier),
169172
}
170173
projectTier := &ProjectTier{
171174
id: "project_1:30",
@@ -232,8 +235,9 @@ func TestLaunchpadReward_CollectDepositReward(t *testing.T) {
232235
// Create project with tier
233236
projects := getTestProjects()
234237
project := &Project{
235-
id: "project_1",
236-
tiers: make(map[int64]*ProjectTier),
238+
id: "project_1",
239+
tokenPath: GNS_PATH,
240+
tiers: make(map[int64]*ProjectTier),
237241
}
238242
projectTier := &ProjectTier{
239243
id: "project_1:30",
@@ -284,14 +288,15 @@ func TestLaunchpadReward_CollectDepositReward(t *testing.T) {
284288
deposit = tt.deposit
285289
}
286290

287-
amount, err := lp.collectDepositReward(deposit, runtime.ChainHeight(), tt.currentTime)
291+
rewardTokenPath, amount, err := lp.collectDepositReward(deposit, runtime.ChainHeight(), tt.currentTime)
288292

289293
if tt.expectedError != "" {
290294
uassert.Error(t, err)
291295
uassert.Equal(t, tt.expectedError, err.Error())
292296
} else {
293297
uassert.NoError(t, err)
294298
uassert.Equal(t, tt.expectedAmount, amount)
299+
uassert.Equal(t, GNS_PATH, rewardTokenPath)
295300
}
296301
})
297302
}
@@ -404,15 +409,15 @@ func TestLaunchpadReward_CollectDepositRewardTimeBoundaries(t *testing.T) {
404409
setTestProjectTierRewardManagers(rewardManagers)
405410

406411
// Collect reward
407-
amount, err := lp.collectDepositReward(deposit, 150, tt.currentTime)
412+
rewardTokenPath, amount, err := lp.collectDepositReward(deposit, 150, tt.currentTime)
408413
if tt.expectedError != "" {
409414
uassert.Error(t, err)
410415
uassert.Equal(t, tt.expectedError, err.Error())
411416
return
412417
}
413418

414419
uassert.NoError(t, err)
415-
420+
uassert.Equal(t, "gno.land/r/onbloc/obl", rewardTokenPath)
416421
// Verify reward
417422
if amount < (tt.expectedReward-5) || amount > (tt.expectedReward+5) {
418423
t.Errorf("%s: expected ~%d, got %d", tt.description, tt.expectedReward, amount)

0 commit comments

Comments
 (0)