Skip to content

Commit

Permalink
refactor: deposit refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
onlyhyde committed Jan 16, 2025
1 parent cc10169 commit 19d58c4
Show file tree
Hide file tree
Showing 8 changed files with 742 additions and 195 deletions.
334 changes: 194 additions & 140 deletions launchpad/deposit.gno

Large diffs are not rendered by default.

149 changes: 148 additions & 1 deletion launchpad/deposit_test.gno
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ import (
"gno.land/p/demo/testutils"
"gno.land/p/demo/uassert"
"gno.land/p/demo/ufmt"
pusers "gno.land/p/demo/users"

"gno.land/r/gnoswap/v1/common"
"gno.land/r/gnoswap/v1/consts"

"gno.land/r/gnoswap/v1/gns"
"gno.land/r/gnoswap/v1/gov/xgns"
)

// Mock data structs
Expand Down Expand Up @@ -635,3 +636,149 @@ func TestProcessCollectedDeposits_BalanceChanges(t *testing.T) {

xgnsCheckTotalSupply(t, mockXGNS, 1000)
}

func TestCollectDepositGnsByDepositId_ClaimableCheck(t *testing.T) {
_, depositor := setupTestDeposit(t)
std.TestSkipHeights(10)
project := createTestProject(t)
projects[project.id] = project

// TierInfo
now := uint64(time.Now().Unix())
height := uint64(std.GetHeight())
info := ProjectTierInfo{
Project: project,
Tier: project.tiers[30],
TierStr: "30",
Height: height,
CurrentTime: now,
}

std.TestSkipHeights(10)
deposit, err := createDeposit(info, 100)
if err != nil {
t.Fatalf("failed create deposit: %v", err)
}

updateDepositIndices(deposit, &DepositState{
Deposits: deposits,
DepositsByProject: depositsByProject,
DepositsByUser: depositsByUser,
DepositsByUserProject: depositsByUserByProject,
})

t.Run("Collect early => Should panic", func(t *testing.T) {
std.TestSetRealm(std.NewUserRealm(depositor))

defer func() {
if r := recover(); r == nil {
t.Errorf("expected panic but did not occur")
}
}()
CollectDepositGnsByDepositId(deposit.id)
})
}

func TestCollectDepositGnsByDepositId_OtherOwner(t *testing.T) {
_, userA := setupTestDeposit(t)
userB := testutils.TestAddress("userB")

project := createTestProject(t)
projects[project.id] = project

// deposit 생성 (owner= userA)
now := uint64(time.Now().Unix())
height := uint64(std.GetHeight())
info := ProjectTierInfo{
Project: project,
Tier: project.tiers[30],
TierStr: "30",
Height: height,
CurrentTime: now,
}

deposit, err := createDeposit(info, 100)
if err != nil {
t.Fatalf("failed to create deposit: %v", err)
}

updateDepositIndices(deposit, &DepositState{
Deposits: deposits,
DepositsByProject: depositsByProject,
DepositsByUser: depositsByUser,
DepositsByUserProject: depositsByUserByProject,
})

t.Run("UserB tries to collect userA's deposit => panic expected", func(t *testing.T) {
std.TestSetRealm(std.NewUserRealm(userB))
defer func() {
if r := recover(); r == nil {
t.Errorf("expected panic but did not occur")
} else {
uassert.Equal(t, "[GNOSWAP-LAUNCHPAD-007] invalid input data || user has no deposits in any project", r.(string))
}
}()
CollectDepositGnsByDepositId(deposit.id)
})
}

func TestCollectDepositGnsByDepositId_ExactClaimable(t *testing.T) {
_, userA := setupTestDeposit(t)
project := createTestProject(t)
projects[project.id] = project

now := uint64(time.Now().Unix())
initialHeight := uint64(std.GetHeight())

info := ProjectTierInfo{
Project: project,
Tier: project.tiers[30],
TierStr: "30",
Height: initialHeight,
CurrentTime: now,
}

std.TestSetRealm(std.NewUserRealm(userA))
// deposit
deposit, err := createDeposit(info, 200)
if err != nil {
t.Fatalf("failed create deposit: %v", err)
}
deposit.claimableHeight = initialHeight + 10
deposit.claimableTime = now + 60

updateDepositIndices(deposit, &DepositState{
Deposits: deposits,
DepositsByProject: depositsByProject,
DepositsByUser: depositsByUser,
DepositsByUserProject: depositsByUserByProject,
})

std.TestSetRealm(std.NewCodeRealm(consts.EMISSION_PATH))
std.TestSkipHeights(int64(10))
gns.MintGns(a2u(consts.LAUNCHPAD_ADDR))
std.TestSkipHeights(int64(10))

std.TestSetRealm(std.NewUserRealm(userA))
gns.Approve(a2u(std.Address(consts.LAUNCHPAD_ADDR)), 1000)
token, _ := setupXGNSTest(t)

std.TestSetRealm(std.NewCodeRealm(consts.LAUNCHPAD_PATH))
std.TestSetOrigCaller(std.Address(consts.LAUNCHPAD_PATH))
xgnsMint(t, token, pusers.AddressOrName(consts.LAUNCHPAD_ADDR), 1000)

std.TestSetRealm(std.NewUserRealm(consts.LAUNCHPAD_ADDR))
xgns.Mint(
a2u(std.Address(consts.LAUNCHPAD_ADDR)),
1000,
)

skipCount := deposit.claimableHeight - uint64(std.GetHeight())
if skipCount > 0 {
std.TestSkipHeights(int64(skipCount))
}

std.TestSetRealm(std.NewUserRealm(userA))
collected := CollectDepositGnsByDepositId(deposit.id)
uassert.Equal(t, uint64(200), collected, "should collect the deposit fully after claimableHeight/time")
}
40 changes: 24 additions & 16 deletions launchpad/errors.gno
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,30 @@ import (
)

var (
errNoLeftReward = errors.New("[GNOSWAP-LAUNCHPAD-001] no left reward")
errInvalidAddress = errors.New("[GNOSWAP-LAUNCHPAD-002] invalid address")
errDataNotFound = errors.New("[GNOSWAP-LAUNCHPAD-003] requested data not found")
errActiveProject = errors.New("[GNOSWAP-LAUNCHPAD-004] project is active")
errInactiveProject = errors.New("[GNOSWAP-LAUNCHPAD-005] project is inactive")
errInactiveTier = errors.New("[GNOSWAP-LAUNCHPAD-006] pool is inactive")
errInvalidInput = errors.New("[GNOSWAP-LAUNCHPAD-007] invalid input data")
errDuplicateProject = errors.New("[GNOSWAP-LAUNCHPAD-008] can not create same project in same block")
errInvalidTier = errors.New("[GNOSWAP-LAUNCHPAD-009] invalid pool")
errInvalidTierRatio = errors.New("[GNOSWAP-LAUNCHPAD-010] invalid pool ratio")
errInvalidLength = errors.New("[GNOSWAP-LAUNCHPAD-011] invalid length")
errNotEnoughBalance = errors.New("[GNOSWAP-LAUNCHPAD-012] not enough balance")
errInvalidCondition = errors.New("[GNOSWAP-LAUNCHPAD-013] invalid transfer condition")
errConvertFail = errors.New("[GNOSWAP-LAUNCHPAD-014] convert fail")
errNotUserCaller = errors.New("[GNOSWAP-LAUNCHPAD-015] only user caller")
errInvalidProjectTier = errors.New("[GNOSWAP-LAUNCHPAD-016] invalid project tier")
errNoLeftReward = errors.New("[GNOSWAP-LAUNCHPAD-001] no left reward")
errInvalidAddress = errors.New("[GNOSWAP-LAUNCHPAD-002] invalid address")
errDataNotFound = errors.New("[GNOSWAP-LAUNCHPAD-003] requested data not found")
errActiveProject = errors.New("[GNOSWAP-LAUNCHPAD-004] project is active")
errInactiveProject = errors.New("[GNOSWAP-LAUNCHPAD-005] project is inactive")
errInactiveTier = errors.New("[GNOSWAP-LAUNCHPAD-006] pool is inactive")
errInvalidInput = errors.New("[GNOSWAP-LAUNCHPAD-007] invalid input data")
errDuplicateProject = errors.New("[GNOSWAP-LAUNCHPAD-008] can not create same project in same block")
errInvalidTier = errors.New("[GNOSWAP-LAUNCHPAD-009] invalid pool")
errInvalidTierRatio = errors.New("[GNOSWAP-LAUNCHPAD-010] invalid pool ratio")
errInvalidLength = errors.New("[GNOSWAP-LAUNCHPAD-011] invalid length")
errNotEnoughBalance = errors.New("[GNOSWAP-LAUNCHPAD-012] not enough balance")
errInvalidCondition = errors.New("[GNOSWAP-LAUNCHPAD-013] invalid transfer condition")
errConvertFail = errors.New("[GNOSWAP-LAUNCHPAD-014] convert fail")
errNotUserCaller = errors.New("[GNOSWAP-LAUNCHPAD-015] only user caller")
errInvalidProjectTier = errors.New("[GNOSWAP-LAUNCHPAD-016] invalid project tier")
errZeroAmount = errors.New("[GNOSWAP-LAUNCHPAD-017] zero amount")
errDuplicateDeposit = errors.New("[GNOSWAP-LAUNCHPAD-018] duplicate deposit")
errInvalidRewardState = errors.New("[GNOSWAP-LAUNCHPAD-019] invalid reward state")
errNotExistDeposit = errors.New("[GNOSWAP-LAUNCHPAD-020] not exist deposit")
errAlreadyExistDeposit = errors.New("[GNOSWAP-LAUNCHPAD-021] already exist deposit")
errInvalidProjectId = errors.New("[GNOSWAP-LAUNCHPAD-022] invalid project id")
errAlreadyCollected = errors.New("[GNOSWAP-LAUNCHPAD-023] already collected")
errNotYetClaimReward = errors.New("[GNOSWAP-LAUNCHPAD-024] not yet claim reward")
)

func addDetailToError(err error, detail string) string {
Expand Down
2 changes: 2 additions & 0 deletions launchpad/launchpad.gno
Original file line number Diff line number Diff line change
Expand Up @@ -467,6 +467,8 @@ func validateTransferLeft(project Project, recipient std.Address, height uint64)
return nil
}

// TODO:
// tier30 + 90 + 180 = depositAmount ??
// calculateLeftReward calculates the remaining reward amount for each tier
func calculateLeftReward(project Project) uint64 {
tier30 := project.tiers[30]
Expand Down
Loading

0 comments on commit 19d58c4

Please sign in to comment.