|
| 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 | +} |
0 commit comments