Skip to content

Commit d5b172a

Browse files
committed
test: file tests to test scenarios
1 parent 7b3e789 commit d5b172a

19 files changed

+4920
-0
lines changed
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
// PKGPATH: gno.land/r/gnoswap/v1/staker_test
2+
3+
// POOLs:
4+
// 1. gnot:gns:3000
5+
6+
// POSITIONs:
7+
// 1. in-range ( will be unstaked )
8+
9+
// REWARDs:
10+
// - internal tier 1 ( gnot:gns:3000 )
11+
// - halving changes
12+
13+
package staker_test
14+
15+
import (
16+
"std"
17+
"strconv"
18+
19+
"gno.land/p/demo/grc/grc721"
20+
"gno.land/p/demo/testutils"
21+
22+
"gno.land/r/gnoswap/v1/common"
23+
"gno.land/r/gnoswap/v1/consts"
24+
25+
"gno.land/r/demo/wugnot"
26+
"gno.land/r/gnoswap/v1/gns"
27+
28+
"gno.land/r/gnoswap/v1/gnft"
29+
30+
pl "gno.land/r/gnoswap/v1/pool"
31+
pn "gno.land/r/gnoswap/v1/position"
32+
sr "gno.land/r/gnoswap/v1/staker"
33+
)
34+
35+
var (
36+
adminAddr = consts.ADMIN
37+
adminUser = common.AddrToUser(adminAddr)
38+
adminRealm = std.NewUserRealm(adminAddr)
39+
40+
// g1v4u8getjdeskcsmjv4shgmmjta047h6lua7mup
41+
externalCreatorAddr = testutils.TestAddress("externalCreator")
42+
externalCreatorUser = common.AddrToUser(externalCreatorAddr)
43+
externalCreatorRealm = std.NewUserRealm(externalCreatorAddr)
44+
45+
stakerAddr = consts.STAKER_ADDR
46+
stakerUser = common.AddrToUser(stakerAddr)
47+
stakerRealm = std.NewCodeRealm(consts.STAKER_PATH)
48+
49+
wugnotAddr = consts.WUGNOT_ADDR
50+
51+
fooPath = "gno.land/r/onbloc/foo"
52+
barPath = "gno.land/r/onbloc/bar"
53+
bazPath = "gno.land/r/onbloc/baz"
54+
quxPath = "gno.land/r/onbloc/qux"
55+
oblPath = "gno.land/r/onbloc/obl"
56+
57+
gnsPath = "gno.land/r/gnoswap/v1/gns"
58+
wugnotPath = "gno.land/r/demo/wugnot"
59+
60+
fee100 uint32 = 100
61+
fee500 uint32 = 500
62+
fee3000 uint32 = 3000
63+
64+
max_timeout int64 = 9999999999
65+
66+
// external incentive deposit fee
67+
depositGnsAmount uint64 = 1_000_000_000 // 1_000 GNS
68+
69+
TIMESTAMP_90DAYS int64 = 90 * 24 * 60 * 60
70+
TIMESTAMP_180DAYS int64 = 180 * 24 * 60 * 60
71+
TIMESTAMP_365DAYS int64 = 365 * 24 * 60 * 60
72+
73+
poolPath = "gno.land/r/demo/wugnot:gno.land/r/gnoswap/v1/gns:3000"
74+
)
75+
76+
func main() {
77+
testInit()
78+
testCreatePool()
79+
testMintWugnotGnsPos01()
80+
testStakeTokenPos01()
81+
testGnsAvgBlockTime()
82+
}
83+
84+
func testInit() {
85+
std.TestSetRealm(adminRealm)
86+
87+
// short warm-up period
88+
sr.SetWarmUp(100, 901)
89+
sr.SetWarmUp(70, 301)
90+
sr.SetWarmUp(50, 151)
91+
sr.SetWarmUp(30, 1)
92+
93+
// prepare wugnot
94+
std.TestIssueCoins(adminAddr, std.Coins{{"ugnot", 100_000_000_000_000}})
95+
banker := std.GetBanker(std.BankerTypeRealmSend)
96+
banker.SendCoins(adminAddr, wugnotAddr, std.Coins{{"ugnot", 50_000_000_000_000}})
97+
std.TestSetOrigSend(std.Coins{{"ugnot", 50_000_000_000_000}}, nil)
98+
wugnot.Deposit()
99+
std.TestSetOrigSend(nil, nil)
100+
}
101+
102+
func testCreatePool() {
103+
std.TestSetRealm(adminRealm)
104+
105+
pl.SetPoolCreationFeeByAdmin(0)
106+
107+
std.TestSkipHeights(1)
108+
pl.CreatePool(
109+
wugnotPath,
110+
gnsPath,
111+
fee3000,
112+
common.TickMathGetSqrtRatioAtTick(0).ToString(), // 79228162514264337593543950337
113+
)
114+
}
115+
116+
func testMintWugnotGnsPos01() {
117+
std.TestSetRealm(adminRealm)
118+
119+
wugnot.Approve(common.AddrToUser(consts.POOL_ADDR), consts.UINT64_MAX)
120+
gns.Approve(common.AddrToUser(consts.POOL_ADDR), consts.UINT64_MAX)
121+
122+
std.TestSkipHeights(1)
123+
pn.Mint(
124+
wugnotPath,
125+
gnsPath,
126+
fee3000,
127+
int32(-60),
128+
int32(60),
129+
"50",
130+
"50",
131+
"1",
132+
"1",
133+
max_timeout,
134+
adminAddr,
135+
adminAddr,
136+
)
137+
}
138+
139+
func testStakeTokenPos01() {
140+
std.TestSetRealm(adminRealm)
141+
142+
// stake
143+
gnft.Approve(consts.STAKER_ADDR, tokenIdFrom(1))
144+
sr.StakeToken(1)
145+
146+
/*
147+
std.TestSkipHeights(100)
148+
149+
TODO: (after fixing unit test) check collected reward
150+
- position-01 has 100 blocks of reward
151+
*/
152+
}
153+
154+
func testGnsAvgBlockTime() {
155+
std.TestSetRealm(adminRealm)
156+
157+
std.TestSkipHeights(1)
158+
gns.SetAvgBlockTimeInMsByAdmin(4000) // orig block time was 2000ms(2s), change it to 4s
159+
160+
/*
161+
std.TestSkipHeights(100)
162+
163+
TODO: (after fixing unit test) check collected reward
164+
- avg block time has changed
165+
- meaning emission amount per block changes
166+
- position-01 has..
167+
- 1. 100 blocks of reward when avg block time was 2000ms(2s)
168+
- 2. 50 blocks of reward when avg block time was 4000ms(4s)
169+
*/
170+
}
171+
172+
func tokenIdFrom(tokenId interface{}) grc721.TokenID {
173+
if tokenId == nil {
174+
panic("tokenId is nil")
175+
}
176+
177+
switch tokenId.(type) {
178+
case string:
179+
return grc721.TokenID(tokenId.(string))
180+
case int:
181+
return grc721.TokenID(strconv.Itoa(tokenId.(int)))
182+
case uint64:
183+
return grc721.TokenID(strconv.Itoa(int(tokenId.(uint64))))
184+
case grc721.TokenID:
185+
return tokenId.(grc721.TokenID)
186+
default:
187+
panic("unsupported tokenId type")
188+
}
189+
}
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
// PKGPATH: gno.land/r/gnoswap/v1/staker_test
2+
3+
// POOLs:
4+
// 1. gnot:gns:3000
5+
6+
// POSITIONs:
7+
// 1. in-range ( will be unstaked )
8+
9+
// REWARDs:
10+
// - internal tier 1 ( gnot:gns:3000 )
11+
// - external bar ( gnot:gns:3000 )
12+
13+
package staker_test
14+
15+
import (
16+
"std"
17+
"strconv"
18+
19+
"gno.land/p/demo/grc/grc721"
20+
"gno.land/p/demo/testutils"
21+
22+
"gno.land/r/gnoswap/v1/common"
23+
"gno.land/r/gnoswap/v1/consts"
24+
25+
"gno.land/r/demo/wugnot"
26+
"gno.land/r/gnoswap/v1/gns"
27+
28+
"gno.land/r/gnoswap/v1/gnft"
29+
30+
pl "gno.land/r/gnoswap/v1/pool"
31+
pn "gno.land/r/gnoswap/v1/position"
32+
sr "gno.land/r/gnoswap/v1/staker"
33+
)
34+
35+
var (
36+
adminAddr = consts.ADMIN
37+
adminUser = common.AddrToUser(adminAddr)
38+
adminRealm = std.NewUserRealm(adminAddr)
39+
40+
// g1v4u8getjdeskcsmjv4shgmmjta047h6lua7mup
41+
externalCreatorAddr = testutils.TestAddress("externalCreator")
42+
externalCreatorUser = common.AddrToUser(externalCreatorAddr)
43+
externalCreatorRealm = std.NewUserRealm(externalCreatorAddr)
44+
45+
stakerAddr = consts.STAKER_ADDR
46+
stakerUser = common.AddrToUser(stakerAddr)
47+
stakerRealm = std.NewCodeRealm(consts.STAKER_PATH)
48+
49+
wugnotAddr = consts.WUGNOT_ADDR
50+
51+
fooPath = "gno.land/r/onbloc/foo"
52+
barPath = "gno.land/r/onbloc/bar"
53+
bazPath = "gno.land/r/onbloc/baz"
54+
quxPath = "gno.land/r/onbloc/qux"
55+
oblPath = "gno.land/r/onbloc/obl"
56+
57+
gnsPath = "gno.land/r/gnoswap/v1/gns"
58+
wugnotPath = "gno.land/r/demo/wugnot"
59+
60+
fee100 uint32 = 100
61+
fee500 uint32 = 500
62+
fee3000 uint32 = 3000
63+
64+
max_timeout int64 = 9999999999
65+
66+
// external incentive deposit fee
67+
depositGnsAmount uint64 = 1_000_000_000 // 1_000 GNS
68+
69+
TIMESTAMP_90DAYS int64 = 90 * 24 * 60 * 60
70+
TIMESTAMP_180DAYS int64 = 180 * 24 * 60 * 60
71+
TIMESTAMP_365DAYS int64 = 365 * 24 * 60 * 60
72+
73+
poolPath = "gno.land/r/demo/wugnot:gno.land/r/gnoswap/v1/gns:3000"
74+
)
75+
76+
func main() {
77+
testInit()
78+
testCreatePool()
79+
testMintWugnotGnsPos01()
80+
testStakeTokenPos01()
81+
82+
testUnstakePos01()
83+
}
84+
85+
func testInit() {
86+
std.TestSetRealm(adminRealm)
87+
88+
// short warm-up period
89+
sr.SetWarmUp(100, 901)
90+
sr.SetWarmUp(70, 301)
91+
sr.SetWarmUp(50, 151)
92+
sr.SetWarmUp(30, 1)
93+
94+
// prepare wugnot
95+
std.TestIssueCoins(adminAddr, std.Coins{{"ugnot", 100_000_000_000_000}})
96+
banker := std.GetBanker(std.BankerTypeRealmSend)
97+
banker.SendCoins(adminAddr, wugnotAddr, std.Coins{{"ugnot", 50_000_000_000_000}})
98+
std.TestSetOrigSend(std.Coins{{"ugnot", 50_000_000_000_000}}, nil)
99+
wugnot.Deposit()
100+
std.TestSetOrigSend(nil, nil)
101+
}
102+
103+
func testCreatePool() {
104+
std.TestSetRealm(adminRealm)
105+
106+
pl.SetPoolCreationFeeByAdmin(0)
107+
108+
std.TestSkipHeights(1)
109+
pl.CreatePool(
110+
wugnotPath,
111+
gnsPath,
112+
fee3000,
113+
common.TickMathGetSqrtRatioAtTick(0).ToString(), // 79228162514264337593543950337
114+
)
115+
}
116+
117+
func testMintWugnotGnsPos01() {
118+
std.TestSetRealm(adminRealm)
119+
120+
wugnot.Approve(common.AddrToUser(consts.POOL_ADDR), consts.UINT64_MAX)
121+
gns.Approve(common.AddrToUser(consts.POOL_ADDR), consts.UINT64_MAX)
122+
123+
std.TestSkipHeights(1)
124+
pn.Mint(
125+
wugnotPath,
126+
gnsPath,
127+
fee3000,
128+
int32(-60),
129+
int32(60),
130+
"50",
131+
"50",
132+
"1",
133+
"1",
134+
max_timeout,
135+
adminAddr,
136+
adminAddr,
137+
)
138+
}
139+
140+
func testStakeTokenPos01() {
141+
std.TestSetRealm(adminRealm)
142+
143+
// stake
144+
gnft.Approve(consts.STAKER_ADDR, tokenIdFrom(1))
145+
sr.StakeToken(1)
146+
}
147+
148+
func testUnstakePos01() {
149+
std.TestSetRealm(adminRealm)
150+
151+
std.TestSkipHeights(1)
152+
sr.UnstakeToken(1, false)
153+
154+
/*
155+
std.TestSkipHeights(1)
156+
157+
TODO: (after fixing unit test) check collected reward
158+
- no positions staked at gnot:gns:3000
159+
- community_pool will receive empty pool's reward
160+
*/
161+
}
162+
163+
func tokenIdFrom(tokenId interface{}) grc721.TokenID {
164+
if tokenId == nil {
165+
panic("tokenId is nil")
166+
}
167+
168+
switch tokenId.(type) {
169+
case string:
170+
return grc721.TokenID(tokenId.(string))
171+
case int:
172+
return grc721.TokenID(strconv.Itoa(tokenId.(int)))
173+
case uint64:
174+
return grc721.TokenID(strconv.Itoa(int(tokenId.(uint64))))
175+
case grc721.TokenID:
176+
return tokenId.(grc721.TokenID)
177+
default:
178+
panic("unsupported tokenId type")
179+
}
180+
}

0 commit comments

Comments
 (0)