Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Sync with launchpad code of gnoswap repo and add launchpad test code #13

Merged
merged 3 commits into from
Oct 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@ import (

"gno.land/r/onbloc/obl"

"gno.land/r/onbloc/usdc"

"gno.land/r/gnoswap/v2/gns"

"gno.land/r/gnoswap/v2/consts"
Expand Down Expand Up @@ -120,19 +122,31 @@ type GNSToken struct{}
func (GNSToken) Transfer() func(to pusers.AddressOrName, amount uint64) {
return gns.Transfer
}

func (GNSToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) {
return gns.TransferFrom
}

func (GNSToken) BalanceOf() func(owner pusers.AddressOrName) uint64 {
return gns.BalanceOf
}

func (GNSToken) Approve() func(spender pusers.AddressOrName, amount uint64) {
return gns.Approve
}

type USDCToken struct{}

func (USDCToken) Transfer() func(to pusers.AddressOrName, amount uint64) {
return usdc.Transfer
}
func (USDCToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) {
return usdc.TransferFrom
}
func (USDCToken) BalanceOf() func(owner pusers.AddressOrName) uint64 {
return usdc.BalanceOf
}
func (USDCToken) Approve() func(spender pusers.AddressOrName, amount uint64) {
return usdc.Approve
}

func init() {
std.TestSetRealm(std.NewUserRealm(consts.TOKEN_REGISTER))

Expand All @@ -144,6 +158,7 @@ func init() {
pf.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{})
pf.RegisterGRC20Interface("gno.land/r/onbloc/obl", OBLToken{})
pf.RegisterGRC20Interface("gno.land/r/gnoswap/v2/gns", GNSToken{})
pf.RegisterGRC20Interface("gno.land/r/onbloc/usdc", USDCToken{})

// gov_staker
gs.RegisterGRC20Interface("gno.land/r/onbloc/bar", BarToken{})
Expand All @@ -153,6 +168,7 @@ func init() {
gs.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{})
gs.RegisterGRC20Interface("gno.land/r/onbloc/obl", OBLToken{})
gs.RegisterGRC20Interface("gno.land/r/gnoswap/v2/gns", GNSToken{})
gs.RegisterGRC20Interface("gno.land/r/onbloc/usdc", USDCToken{})

RegisterGRC20Interface("gno.land/r/onbloc/bar", BarToken{})
RegisterGRC20Interface("gno.land/r/onbloc/foo", FooToken{})
Expand All @@ -161,4 +177,5 @@ func init() {
RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{})
RegisterGRC20Interface("gno.land/r/onbloc/obl", OBLToken{})
RegisterGRC20Interface("gno.land/r/gnoswap/v2/gns", GNSToken{})
RegisterGRC20Interface("gno.land/r/onbloc/usdc", USDCToken{})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package launchpad

import (
"std"
"testing"
"time"

"gno.land/p/demo/testutils"

"gno.land/r/gnoswap/v2/consts"
"gno.land/r/gnoswap/v2/gns"
gov_staker "gno.land/r/gnoswap/v2/gov/staker"
xgns "gno.land/r/gnoswap/v2/gov/xgns"
"gno.land/r/onbloc/obl"
"gno.land/r/onbloc/usdc"
)

var (
projectAddr = testutils.TestAddress("projectAddr")
user01 = testutils.TestAddress("user01")

projectRealm = std.NewUserRealm(projectAddr)
user01Realm = std.NewUserRealm(user01)
)

func init() {
println("test_init")
}

func TestCreateProject(t *testing.T) {
var allocationTokenAmount uint64 = 1_000_000_000_000 // 1000000000000
std.TestSetRealm(gsaRealm)

obl.Approve(a2u(consts.LAUNCHPAD_ADDR), allocationTokenAmount)
std.TestSkipHeights(1)

projectId := CreateProject(
oblPath,
projectAddr,
allocationTokenAmount,
"gno.land/r/gnoswap/v2/gov/xgns*PAD*gno.land/r/onbloc/usdc",
"100000000*PAD*200000000",
uint64(50), // 50%
uint64(30), // 30%
uint64(20), // 20%
uint64(time.Now().Unix()+10), // 10s later
)
shouldEQ(t, projectId, `gno.land/r/onbloc/obl:124`)
std.TestSkipHeights(1)
}

func TestMockProtocolFee(t *testing.T) {
std.TestSetRealm(gsaRealm)
usdc.Transfer(a2u(consts.PROTOCOL_FEE_ADDR), 1_000_000_000)
gns.Transfer(a2u(consts.PROTOCOL_FEE_ADDR), 2_500_000_000)

shouldEQ(t, usdc.BalanceOf(a2u(consts.PROTOCOL_FEE_ADDR)), uint64(1_000_000_000))
shouldEQ(t, usdc.BalanceOf(a2u(consts.DEV_OPS)), uint64(0))
shouldEQ(t, usdc.BalanceOf(a2u(consts.GOV_STAKER_ADDR)), uint64(0))

shouldEQ(t, gns.BalanceOf(a2u(consts.PROTOCOL_FEE_ADDR)), uint64(2_500_000_000))
shouldEQ(t, gns.BalanceOf(a2u(consts.DEV_OPS)), uint64(0))
shouldEQ(t, gns.BalanceOf(a2u(consts.GOV_STAKER_ADDR)), uint64(0))
}

func TestDepositGnsToTier30Failure(t *testing.T) {
var usdcConditionAmount uint64 = 200_000_000
var oblDepositAmount uint64 = 1_000_000
std.TestSetRealm(gsaRealm)
usdc.Transfer(a2u(user01), usdcConditionAmount)
std.TestSetRealm(user01Realm)
gns.Approve(a2u(consts.LAUNCHPAD_ADDR), oblDepositAmount)

std.TestSkipHeights(4)
shouldPanicWithMsg(
t,
func() {
DepositGns("gno.land/r/onbloc/obl:124:30", oblDepositAmount)
},
`insufficient balance(0) for token(gno.land/r/gnoswap/v2/gov/xgns)`,
)
std.TestSkipHeights(1)
}

func TestDepositGnsToTier30WithCondition(t *testing.T) {
var xGNSConditionAmount uint64 = 100_000_000
var gnsDepositAmount uint64 = 1_000_000
std.TestSetRealm(gsaRealm)
gns.Transfer(a2u(user01), xGNSConditionAmount+gnsDepositAmount)
shouldEQ(t, gns.BalanceOf(a2u(user01)), xGNSConditionAmount+gnsDepositAmount) // admin has initial gns
shouldEQ(t, xgns.BalanceOf(a2u(user01)), uint64(0))

std.TestSetRealm(user01Realm)
gns.Approve(a2u(consts.GOV_STAKER_ADDR), xGNSConditionAmount)
gov_staker.Delegate(user01, xGNSConditionAmount)
shouldEQ(t, xgns.BalanceOf(a2u(user01)), xGNSConditionAmount)
std.TestSkipHeights(4)

var beforeDepositGns uint64 = gns.BalanceOf(a2u(consts.LAUNCHPAD_ADDR))
DepositGns("gno.land/r/onbloc/obl:124:30", gnsDepositAmount)
shouldEQ(t, gns.BalanceOf(a2u(consts.LAUNCHPAD_ADDR)), beforeDepositGns+gnsDepositAmount)
std.TestSkipHeights(1)
}
29 changes: 14 additions & 15 deletions examples/gno.land/r/gnoswap/v2/launchpad/launchpad_deposit.gno
Original file line number Diff line number Diff line change
Expand Up @@ -240,8 +240,6 @@ func CollectDepositGnsByProjectId(projectId string) uint64 {

calculateDepositReward()

prevAddr, prevRealm := getPrev()

gnsToUser := uint64(0)
for _, depositId := range depositIds {
deposit := deposits[depositId]
Expand Down Expand Up @@ -284,12 +282,10 @@ func CollectDepositGnsByProjectId(projectId string) uint64 {

// emit event for each deposit
std.Emit(
"CollectDepositGnsByProjectId",
"prevAddr", prevAddr,
"prevRealm", prevRealm,
"projectId", projectId,
"internal_depositId", depositId,
"internal_amount", ufmt.Sprintf("%d", deposit.amount),
"CollectDepositGns",
"m_prevRealm", prevRealm(),
"depositId", depositId,
"amount", ufmt.Sprintf("%d", deposit.amount),
)
}

Expand Down Expand Up @@ -359,13 +355,11 @@ func CollectDepositGnsByDepositId(depositId string) uint64 {
projects[deposit.projectId] = project

// emit event for each deposit
prevAddr, prevRealm := getPrev()
std.Emit(
"CollectDepositGnsByDepositId",
"prevAddr", prevAddr,
"prevRealm", prevRealm,
"depositId", depositId,
"internal_amount", ufmt.Sprintf("%d", deposit.amount),
"CollectDepositGns",
"m_prevRealm", prevRealm(),
"p_depositId", depositId,
"amount", ufmt.Sprintf("%d", deposit.amount),
)

if deposit.amount > 0 {
Expand Down Expand Up @@ -409,7 +403,12 @@ func checkDepositConditions(project Project) {
continue
} else {
// check balance
balance := balanceOfByRegisterCall(condition.tokenPath, std.PrevRealm().Addr())
var balance uint64
if condition.tokenPath == consts.GOV_XGNS_PATH {
balance = xgns.BalanceOf(a2u(std.PrevRealm().Addr()))
} else {
balance = balanceOfByRegisterCall(condition.tokenPath, std.PrevRealm().Addr())
}
if balance < condition.minAmount {
panic(ufmt.Sprintf("insufficient balance(%d) for token(%s)", balance, condition.tokenPath))
}
Expand Down
49 changes: 27 additions & 22 deletions examples/gno.land/r/gnoswap/v2/launchpad/launchpad_init.gno
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ func CreateProject(
if strings.Contains(conditionsToken, "*PAD*") {
tokensToCheck := strings.Split(conditionsToken, "*PAD*")
for _, token := range tokensToCheck {
if token == consts.GOV_XGNS_PATH {
continue
}
if _, exist := registered[token]; !exist {
panic(ufmt.Sprintf("condition token(%s) not registered", token))
}
Expand Down Expand Up @@ -178,28 +181,30 @@ func CreateProject(
prevAddr, prevRealm := getPrev()
std.Emit(
"CreateProject",
"prevAddr", prevAddr,
"prevRealm", prevRealm,
"tokenPath", tokenPath,
"recipient", recipient.String(),
"depositAmount", ufmt.Sprintf("%d", depositAmount),
"conditionsToken", conditionsToken,
"conditionsAmount", conditionsAmount,
"tier30Ratio", ufmt.Sprintf("%d", tier30Ratio),
"tier90Ratio", ufmt.Sprintf("%d", tier90Ratio),
"tier180Ratio", ufmt.Sprintf("%d", tier180Ratio),
"startTime", ufmt.Sprintf("%d", startTime),
"internal_startHeight", ufmt.Sprintf("%d", startHeight),
"internal_projectId", projectId,
"internal_tier30Amount", ufmt.Sprintf("%d", tier30Amount),
"internal_tier30EndHeight", ufmt.Sprintf("%d", tier30EndHeight),
"internal_tier30AmountPerBlockX96", tier30AmountPerBlockX96.ToString(),
"internal_tier90Amount", ufmt.Sprintf("%d", tier90Amount),
"internal_tier90EndHeight", ufmt.Sprintf("%d", tier90EndHeight),
"internal_tier90AmountPerBlockX96", tier90AmountPerBlockX96.ToString(),
"internal_tier180Amount", ufmt.Sprintf("%d", tier180Amount),
"internal_tier180EndHeight", ufmt.Sprintf("%d", tier180EndHeight),
"internal_tier180AmountPerBlockX96", tier180AmountPerBlockX96.ToString(),
"m_prevRealm", prevRealm(),
"p_tokenPath", tokenPath,
"p_recipient", recipient.String(),
"p_depositAmount", ufmt.Sprintf("%d", depositAmount),
"p_conditionsToken", conditionsToken,
"p_conditionsAmount", conditionsAmount,
"p_tier30Ratio", ufmt.Sprintf("%d", tier30Ratio),
"p_tier90Ratio", ufmt.Sprintf("%d", tier90Ratio),
"p_tier180Ratio", ufmt.Sprintf("%d", tier180Ratio),
"p_startTime", ufmt.Sprintf("%d", startTime),
"startHeight", ufmt.Sprintf("%d", startHeight),
"projectId", projectId,

"tier30Amount", ufmt.Sprintf("%d", tier30Amount),
"tier30EndHeight", ufmt.Sprintf("%d", tier30EndHeight),
"tier30AmountPerBlockX96", tier30AmountPerBlockX96.ToString(),

"tier90Amount", ufmt.Sprintf("%d", tier90Amount),
"tier90EndHeight", ufmt.Sprintf("%d", tier90EndHeight),
"tier90AmountPerBlockX96", tier90AmountPerBlockX96.ToString(),

"tier180Amount", ufmt.Sprintf("%d", tier180Amount),
"tier180EndHeight", ufmt.Sprintf("%d", tier180EndHeight),
"tier180AmountPerBlockX96", tier180AmountPerBlockX96.ToString(),
)

return projectId
Expand Down
13 changes: 6 additions & 7 deletions examples/gno.land/r/gnoswap/v2/launchpad/launchpad_reward.gno
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ func CollectRewardByProjectId(projectId string) uint64 {
}

if uint64(std.GetHeight()) < collectableAfter {
println("NOT CLAIMABLE YET")
println("NOT CLAIMABLE YET", std.GetHeight(), "<", collectableAfter)
continue
}

Expand All @@ -93,11 +93,10 @@ func CollectRewardByProjectId(projectId string) uint64 {

std.Emit(
"CollectRewardByProjectId",
"prevAddr", prevAddr,
"prevRealm", prevRealm,
"projectId", projectId,
"internal_depositId", depositId,
"internal_amount", ufmt.Sprintf("%d", deposit.rewardAmount),
"m_prevRealm", prevRealm(),
"p_projectId", projectId,
"depositId", depositId,
"amount", ufmt.Sprintf("%d", deposit.rewardAmount),
)
}

Expand Down Expand Up @@ -160,7 +159,7 @@ func CollectRewardByDepositId(depositId string) uint64 {
}

if uint64(std.GetHeight()) < collectableAfter {
println("NOT CLAIMABLE YET")
println("NOT CLAIMABLE YET", std.GetHeight(), "<", collectableAfter)
return 0
}

Expand Down