diff --git a/staker/_TEST_/_TEST_0_INIT_FAUCET_test.gno b/staker/_TEST_/_TEST_0_INIT_FAUCET_test.gno deleted file mode 100644 index 3bc62ddd..00000000 --- a/staker/_TEST_/_TEST_0_INIT_FAUCET_test.gno +++ /dev/null @@ -1,28 +0,0 @@ -package staker - -import ( - "std" - - "gno.land/r/demo/bar" - "gno.land/r/demo/baz" - "gno.land/r/demo/foo" - "gno.land/r/demo/obl" - "gno.land/r/demo/qux" - - _ "gno.land/p/demo/users" -) - -func init() { - std.TestSetPrevAddr(test1) - - // GIVE 10_000_000_000(u) ≈ 10_000 - // 10000000000 - for i := 0; i < 100; i++ { - foo.Faucet() - bar.Faucet() - baz.Faucet() - qux.Faucet() - obl.Faucet() - //gns.Faucet() - } -} diff --git a/staker/_TEST_/_TEST_0_INIT_VARIABLE_AND_HELPER_test.gno b/staker/_TEST_/_TEST_0_INIT_VARIABLE_AND_HELPER_test.gno deleted file mode 100644 index 7783d719..00000000 --- a/staker/_TEST_/_TEST_0_INIT_VARIABLE_AND_HELPER_test.gno +++ /dev/null @@ -1,75 +0,0 @@ -package staker - -import ( - "std" - "testing" - - "gno.land/r/demo/gnoswap/consts" -) - -var ( - gsa std.Address = consts.GNOSWAP_ADMIN - test1 std.Address = std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5") - - fooPath string = "gno.land/r/demo/foo" - barPath string = "gno.land/r/demo/bar" - bazPath string = "gno.land/r/demo/baz" - quxPath string = "gno.land/r/demo/qux" - - oblPath string = "gno.land/r/demo/obl" - // wugnotPath string = "gno.land/r/demo/wugnot" // from consts - // gnsPath string = "gno.land/r/demo/gns" // from consts - - fee100 uint32 = 100 - fee500 uint32 = 500 - fee3000 uint32 = 3000 - - max_timeout int64 = 9999999999 -) - -/* HELPER */ -func shouldEQ(t *testing.T, got, expected interface{}) { - if got != expected { - t.Errorf("got %v, expected %v", got, expected) - } -} - -func shouldNEQ(t *testing.T, got, expected interface{}) { - if got == expected { - t.Errorf("got %v, didn't expected %v", got, expected) - } -} - -func shouldGT(t *testing.T, l, r interface{}) { - if !(l < r) { - t.Errorf("expected %v < %v", l, r) - } -} - -func shouldLT(t *testing.T, l, r interface{}) { - if !(l > r) { - t.Errorf("expected %v > %v", l, r) - } -} - -func shouldPanic(t *testing.T, f func()) { - defer func() { - if r := recover(); r == nil { - t.Errorf("expected panic") - } - }() - f() -} - -func shouldPanicWithMsg(t *testing.T, f func(), msg string) { - defer func() { - if r := recover(); r == nil { - t.Errorf("The code did not panic") - } else { - if r != msg { - t.Errorf("excepted panic(%v), got(%v)", msg, r) - } - } - }() - f() -} diff --git a/staker/_TEST_/_TEST_staker_collect_reward_test.gn b/staker/_TEST_/_TEST_staker_collect_reward_test.gn deleted file mode 100644 index 1d7ad6fb..00000000 --- a/staker/_TEST_/_TEST_staker_collect_reward_test.gn +++ /dev/null @@ -1,204 +0,0 @@ -package staker - -import ( - "std" - "testing" - - "gno.land/r/demo/gnoswap/consts" - - pl "gno.land/r/demo/pool" - pn "gno.land/r/demo/position" - - "gno.land/r/demo/gnft" - - "gno.land/r/demo/bar" - "gno.land/r/demo/qux" - - "gno.land/r/demo/gns" - "gno.land/r/demo/obl" -) - -func init() { - // init pool tiers - // tier 1 - poolTiers["gno.land/r/demo/bar:gno.land/r/demo/qux:500"] = 1 // DEV - - // tier 2 - poolTiers["GNS/USDT_500"] = 2 - poolTiers["ATOM/GNS_500"] = 2 - - // tier 3 - poolTiers["ATOM/GNOT_500"] = 3 - poolTiers["ATOM/USDT_500"] = 3 - poolTiers["ATOM/WETH_500"] = 3 -} - -func TestPoolInitCreatePool(t *testing.T) { - std.TestSetPrevAddr(test1) - for i := 0; i < (5 * 1); i++ { - gns.Faucet() - } - gns.Approve(a2u(consts.POOL_ADDR), consts.POOL_CREATION_FEE) - - pl.CreatePool(barPath, quxPath, 500, "130621891405341611593710811006") // tick 10_000 ≈ x2.7 - std.TestSkipHeights(1) -} - -func TestPositionMint01(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - qux.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - lpTokenId, liquidity, amount0, amount1 := pn.Mint( - barPath, // token0 - quxPath, // token1 - uint16(500), // fee - int32(9000), // tickLower - int32(11000), // tickUpper - "1000", // amount0Desired - "1000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, // deadline - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, lpTokenId, 1) - shouldEQ(t, gnft.OwnerOf(tid(lpTokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "368") - shouldEQ(t, amount1, "999") - - // approve nft to staker - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(lpTokenId)) - std.TestSkipHeights(1) -} - -func TestPositionMint02(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - qux.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - lpTokenId, liquidity, amount0, amount1 := pn.Mint( - barPath, // token0 - quxPath, // token1 - uint16(500), // fee - int32(9100), // tickLower - int32(12000), // tickUpper - "5000", // amount0Desired - "5000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, // deadline - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, lpTokenId, 2) - shouldEQ(t, gnft.OwnerOf(tid(lpTokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "3979") - shouldEQ(t, amount1, "4999") - - // approve nft to staker - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(lpTokenId)) - std.TestSkipHeights(1) -} - -func TestCreateExternalIncentive(t *testing.T) { - std.TestSetPrevAddr(test1) - obl.Approve(a2u(consts.STAKER_ADDR), uint64(10_000_000_000)) - std.TestSkipHeights(1) - - CreateExternalIncentive( - "gno.land/r/demo/bar:gno.land/r/demo/qux:500", // targetPoolPath - "gno.land/r/demo/obl", // rewardToken - "1000000000", // rewardAmount 10_000_000_000 - 1234569600, // startTimestamp - 1234569600+TIMESTAMP_90DAYS, // endTimestamp - ) - std.TestSkipHeights(1) - - obl.Approve(a2u(consts.STAKER_ADDR), uint64(10_000_000_000)) - std.TestSkipHeights(1) - - CreateExternalIncentive("gno.land/r/demo/bar:gno.land/r/demo/qux:500", "gno.land/r/demo/obl", "1000000000", 1234569600, 1234569600+TIMESTAMP_90DAYS) - std.TestSkipHeights(1) -} - -func TestStakeToken01(t *testing.T) { - std.TestSetPrevAddr(test1) - StakeToken(1) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(1)), GetOrigPkgAddr()) // staker - shouldEQ(t, len(deposits), 1) -} - -func TestStakeToken02(t *testing.T) { - std.TestSetPrevAddr(test1) - StakeToken(2) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(2)), GetOrigPkgAddr()) // staker - shouldEQ(t, len(deposits), 2) -} - -func TestCollectReward(t *testing.T) { - std.TestSetPrevAddr(consts.INTERNAL_REWARD_ACCOUNT) - gns.Approve(a2u(consts.STAKER_ADDR), consts.UINT64_MAX) // internal reward distribution - std.TestSkipHeights(1) - - // before claim - gnsOld := gns.BalanceOf(a2u(test1)) - std.TestSkipHeights(1) - shouldEQ(t, gnsOld, 0) - - std.TestSetPrevRealm(consts.STAKER_PATH) - std.TestSetOrigCaller(test1) - CollectReward(1) // GNFT tokenId - std.TestSkipHeights(1) - - gnsNew := gns.BalanceOf(a2u(test1)) - std.TestSkipHeights(1) - shouldEQ(t, gnsNew, 24502) -} - -func TestUnstakeToken01(t *testing.T) { - std.TestSetPrevAddr(test1) - std.TestSkipHeights(400) // spend more time - - UnstakeToken(1) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(1)), test1) - - // check reward - shouldEQ(t, gns.BalanceOf(a2u(test1)), 2487004) // internal - shouldEQ(t, obl.BalanceOf(a2u(test1)), 8000004851) // external -} - -func TestUnstakeToken02(t *testing.T) { - std.TestSetPrevAddr(test1) - UnstakeToken(2) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(2)), test1) - - // check reward - shouldEQ(t, gns.BalanceOf(a2u(test1)), 19067029) // internal - shouldEQ(t, obl.BalanceOf(a2u(test1)), 8000037608) // external -} - -func TestEndExternalIncentive(t *testing.T) { - std.TestSetPrevAddr(test1) - std.TestSkipHeights(9999999) - EndExternalIncentive(std.GetOrigCaller().String(), "gno.land/r/demo/bar:gno.land/r/demo/qux:500", "gno.land/r/demo/obl") // use same parameter as CreateExternalIncentive() - std.TestSkipHeights(1) - - shouldEQ(t, len(incentives), 0) - shouldEQ(t, len(poolIncentives["gno.land/r/demo/bar:gno.land/r/demo/qux:500"]), 0) -} diff --git a/staker/_TEST_/_TEST_staker_get_test.gn b/staker/_TEST_/_TEST_staker_get_test.gn deleted file mode 100644 index ea758b80..00000000 --- a/staker/_TEST_/_TEST_staker_get_test.gn +++ /dev/null @@ -1,139 +0,0 @@ -package staker - -import ( - "std" - "testing" - - "gno.land/r/demo/gnoswap/consts" - - pl "gno.land/r/demo/pool" - pn "gno.land/r/demo/position" - - "gno.land/r/demo/gnft" - - "gno.land/r/demo/bar" - "gno.land/r/demo/qux" - - "gno.land/r/demo/gns" - "gno.land/r/demo/obl" -) - -func TestPoolInitCreatePool(t *testing.T) { - std.TestSetPrevAddr(test1) - for i := 0; i < (5 * 1); i++ { - gns.Faucet() - } - gns.Approve(a2u(consts.POOL_ADDR), consts.POOL_CREATION_FEE) - std.TestSkipHeights(2) - - pl.CreatePool(barPath, quxPath, 500, "130621891405341611593710811006") // tick 10_000 ≈ x2.7 - std.TestSkipHeights(1) -} - -func TestPositionMint01(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - qux.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - lpTokenId, liquidity, amount0, amount1 := pn.Mint( - barPath, // token0 - quxPath, // token1 - uint16(500), // fee - int32(9000), // tickLower - int32(11000), // tickUpper - "1000", // amount0Desired - "1000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, // deadline - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, lpTokenId, 1) - shouldEQ(t, gnft.OwnerOf(tid(lpTokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "368") - shouldEQ(t, amount1, "999") - - // approve nft to staker - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(lpTokenId)) - std.TestSkipHeights(1) -} - -func TestPositionMint02(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - qux.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - lpTokenId, liquidity, amount0, amount1 := pn.Mint( - barPath, // token0 - quxPath, // token1 - uint16(500), // fee - int32(9100), // tickLower - int32(12000), // tickUpper - "5000", // amount0Desired - "5000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, // deadline - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, lpTokenId, 2) - shouldEQ(t, gnft.OwnerOf(tid(lpTokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "3979") - shouldEQ(t, amount1, "4999") - - // approve nft to staker - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(lpTokenId)) - std.TestSkipHeights(1) -} - -func TestCreateExternalIncentive(t *testing.T) { - std.TestSetPrevAddr(test1) - obl.Approve(a2u(consts.STAKER_ADDR), uint64(10_000_000_000)) - std.TestSkipHeights(1) - - CreateExternalIncentive( - "gno.land/r/demo/bar:gno.land/r/demo/qux:500", // targetPoolPath - "gno.land/r/demo/obl", // rewardToken - "1000000000", // rewardAmount - 1234569600, // startTimestamp - 1234569600+TIMESTAMP_90DAYS, // endTimestamp - ) - std.TestSkipHeights(1) - - obl.Approve(a2u(consts.STAKER_ADDR), uint64(10_000_000_000)) - std.TestSkipHeights(1) - - CreateExternalIncentive("gno.land/r/demo/bar:gno.land/r/demo/qux:500", "gno.land/r/demo/obl", "1000000000", 1234569600, 1234569600+TIMESTAMP_90DAYS) - std.TestSkipHeights(1) -} - -func TestStakeToken01(t *testing.T) { - std.TestSetPrevAddr(test1) - StakeToken(1) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(1)), GetOrigPkgAddr()) // staker - shouldEQ(t, len(deposits), 1) -} - -// func TestStakeToken02(t *testing.T) { -// std.TestSetPrevAddr(test1) -// StakeToken(2) // GNFT tokenId -// std.TestSkipHeights(1) - -// shouldEQ(t, gnft.OwnerOf(tid(2)), GetOrigPkgAddr()) // staker -// shouldEQ(t, len(deposits), 2) -// } - -func TestIsStaked(t *testing.T) { - shouldEQ(t, IsStaked(1), true) - shouldEQ(t, IsStaked(2), false) -} diff --git a/staker/_TEST_/_TEST_staker_internal_external_test.gn b/staker/_TEST_/_TEST_staker_internal_external_test.gn deleted file mode 100644 index 2c059805..00000000 --- a/staker/_TEST_/_TEST_staker_internal_external_test.gn +++ /dev/null @@ -1,270 +0,0 @@ -package staker - -import ( - "std" - "testing" - - "gno.land/r/demo/gnoswap/consts" - - pl "gno.land/r/demo/pool" - pn "gno.land/r/demo/position" - - "gno.land/r/demo/bar" - "gno.land/r/demo/baz" - "gno.land/r/demo/foo" - "gno.land/r/demo/gns" - "gno.land/r/demo/obl" - "gno.land/r/demo/qux" - - "gno.land/r/demo/gnft" -) - -func init() { - // init pool tiers - // tier 1 - poolTiers["gno.land/r/demo/bar:gno.land/r/demo/qux:500"] = 1 - - // tier 2 - poolTiers["gno.land/r/demo/bar:gno.land/r/demo/baz:100"] = 2 - poolTiers["ATOM/GNS_500"] = 2 - - // tier 3 - poolTiers["ATOM/GNOT_500"] = 3 - poolTiers["ATOM/USDT_500"] = 3 - poolTiers["ATOM/WETH_500"] = 3 -} - -func TestPoolInitCreatePool(t *testing.T) { - std.TestSetPrevAddr(test1) - for i := 0; i < (5 * 3); i++ { - gns.Faucet() - } - gns.Approve(a2u(consts.POOL_ADDR), consts.POOL_CREATION_FEE*3) - std.TestSkipHeights(1) - - pl.CreatePool(barPath, quxPath, 500, "130621891405341611593710811006") // internal, tier 1 // tick 10_000 ≈ x2.7 - pl.CreatePool(barPath, bazPath, 100, "79228162514264337593543950337") // internal, tier 2 // tick 0 ≈ x1 - pl.CreatePool(fooPath, quxPath, 500, "79228162514264337593543950337") // external // tick 0 ≈ x1 - std.TestSkipHeights(3) -} - -func TestMintBarQux500(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - qux.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - tokenId, liquidity, amount0, amount1 := pn.Mint( - barPath, // token0 - quxPath, // token1 - fee500, // fee - int32(9000), // tickLower - int32(11000), // tickUpper - "100000", // amount0Desired - "100000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, tokenId, 1) - shouldEQ(t, gnft.OwnerOf(tid(tokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "36790") - shouldEQ(t, amount1, "99999") -} - -func TestMintBarBaz100(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - baz.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - tokenId, liquidity, amount0, amount1 := pn.Mint( - barPath, // token0 - bazPath, // token1 - fee100, // fee - int32(-1000), // tickLower - int32(1000), // tickUpper - "100000", // amount0Desired - "100000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, tokenId, 2) - shouldEQ(t, gnft.OwnerOf(tid(tokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "100000") - shouldEQ(t, amount1, "99999") -} - -func TestMintFooQux500(t *testing.T) { - std.TestSetPrevAddr(test1) - foo.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - qux.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - tokenId, liquidity, amount0, amount1 := pn.Mint( - fooPath, // token0 - quxPath, // token1 - fee500, // fee - int32(-1000), // tickLower - int32(1000), // tickUpper - "100000", // amount0Desired - "100000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, tokenId, 3) - shouldEQ(t, gnft.OwnerOf(tid(tokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "100000") - shouldEQ(t, amount1, "99999") -} - -func TestCreateExternalIncentive(t *testing.T) { - std.TestSetPrevAddr(test1) - obl.Approve(a2u(consts.STAKER_ADDR), uint64(100_000_000)) - std.TestSkipHeights(1) - - CreateExternalIncentive( - "gno.land/r/demo/foo:gno.land/r/demo/qux:500", // targetPoolPath - "gno.land/r/demo/obl", // rewardToken - "100000000", // rewardAmount - 1234569600, // startTimestamp - 1234569600+TIMESTAMP_90DAYS, // endTimestamp - ) - std.TestSkipHeights(1) -} - -func TestStakeInternalTier1(t *testing.T) { - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(1)) - StakeToken(1) - std.TestSkipHeights(2) - - shouldEQ(t, gnft.OwnerOf(tid(1)), GetOrigPkgAddr()) - shouldEQ(t, len(deposits), 1) -} - -func TestStakeInternalTier2(t *testing.T) { - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(2)) - StakeToken(2) - std.TestSkipHeights(2) - - shouldEQ(t, gnft.OwnerOf(tid(2)), GetOrigPkgAddr()) - shouldEQ(t, len(deposits), 2) -} - -func TestStakeExternal(t *testing.T) { - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(3)) - StakeToken(3) - std.TestSkipHeights(2) - - shouldEQ(t, gnft.OwnerOf(tid(3)), GetOrigPkgAddr()) - shouldEQ(t, len(deposits), 3) -} - -func TestCollectRewardToken1(t *testing.T) { - std.TestSetPrevAddr(consts.INTERNAL_REWARD_ACCOUNT) - gns.Approve(a2u(consts.STAKER_ADDR), consts.UINT64_MAX) // internal reward distribution - std.TestSkipHeights(1) - - // before claim - gnsOld := gns.BalanceOf(a2u(test1)) - shouldEQ(t, gnsOld, 0) - - std.TestSetPrevAddr(test1) - CollectReward(1) - std.TestSkipHeights(1) - - gnsNew := gns.BalanceOf(a2u(test1)) - shouldEQ(t, gnsNew, 285863) -} - -func TestCollectRewardToken2(t *testing.T) { - std.TestSetPrevAddr(test1) - - // before claim - gnsOld := gns.BalanceOf(a2u(test1)) - shouldEQ(t, gnsOld, 285863) - - CollectReward(2) - std.TestSkipHeights(1) - - gnsNew := gns.BalanceOf(a2u(test1)) - shouldEQ(t, gnsNew, 432878) -} - -func TestCollectRewardToken1Again(t *testing.T) { - std.TestSetPrevAddr(test1) - - // before claim - gnsOld := gns.BalanceOf(a2u(test1)) - shouldEQ(t, gnsOld, 432878) - - // ACCELERATE TIME - std.TestSkipHeights(1000) - - CollectReward(1) - std.TestSkipHeights(1) - - gnsNew := gns.BalanceOf(a2u(test1)) - shouldEQ(t, gnsNew, 41352053) -} - -func TestCollectExternalReward(t *testing.T) { - std.TestSetPrevAddr(test1) - - // before claim - oblOld := obl.BalanceOf(a2u(test1)) - shouldEQ(t, oblOld, 9900000000) - - CollectReward(3) - std.TestSkipHeights(1) - - oblNew := obl.BalanceOf(a2u(test1)) - shouldEQ(t, oblNew, 9900014200) -} - -func TestCollectAll(t *testing.T) { - std.TestSetPrevAddr(test1) - - CollectReward(1) - CollectReward(2) - CollectReward(3) - std.TestSkipHeights(3) - // claimed all remaining reward -} - -func TestUnstakeToken1(t *testing.T) { - std.TestSetPrevAddr(test1) - gnsOld := gns.BalanceOf(a2u(test1)) - oblOld := obl.BalanceOf(a2u(test1)) - shouldEQ(t, gnsOld, 66009736) - shouldEQ(t, oblOld, 9900014221) - - std.TestSkipHeights(100000) - UnstakeToken(1) - gnsNew := gns.BalanceOf(a2u(test1)) - shouldEQ(t, gnsNew, 6899988399) - - UnstakeToken(2) - gnsNew = gns.BalanceOf(a2u(test1)) - shouldEQ(t, gnsNew, 11000342927) - - UnstakeToken(3) - oblNew := obl.BalanceOf(a2u(test1)) - shouldEQ(t, oblNew, 9903488806) - - std.TestSkipHeights(1) -} diff --git a/staker/_TEST_/_TEST_staker_manage_pool_tiers_test.gn b/staker/_TEST_/_TEST_staker_manage_pool_tiers_test.gn deleted file mode 100644 index febdbe78..00000000 --- a/staker/_TEST_/_TEST_staker_manage_pool_tiers_test.gn +++ /dev/null @@ -1,53 +0,0 @@ -package staker - -import ( - "std" - "testing" - - pl "gno.land/r/demo/pool" - - "gno.land/r/demo/gnoswap/consts" - - "gno.land/r/demo/gns" -) - -func TestPoolInitCreatePool(t *testing.T) { - std.TestSetPrevAddr(test1) - for i := 0; i < (5 * 1); i++ { - gns.Faucet() - } - gns.Approve(a2u(consts.POOL_ADDR), consts.POOL_CREATION_FEE) - std.TestSkipHeights(1) - - pl.CreatePool(fooPath, barPath, 500, "130621891405341611593710811006") // tick 10_000 ≈ x2.7 - std.TestSkipHeights(1) -} - -func TestSetPoolTier(t *testing.T) { - std.TestSetOrigCaller(consts.GNOSWAP_ADMIN) - SetPoolTier("gno.land/r/demo/bar:gno.land/r/demo/foo:500", 2) -} - -func TestGetPoolWithTiers(t *testing.T) { - poolTiers := GetPoolWithTiers() - if len(poolTiers) != 2 { - t.Error("Expected 2 pools") - } -} - -func TestChangePoolTier(t *testing.T) { - std.TestSetOrigCaller(consts.GNOSWAP_ADMIN) - ChangePoolTier("gno.land/r/demo/bar:gno.land/r/demo/foo:500", 3) - if poolTiers["gno.land/r/demo/bar:gno.land/r/demo/foo:500"] != 3 { - t.Error("Expected tier to be 3") - } -} - -func TestRemovePoolTier(t *testing.T) { - std.TestSetOrigCaller(consts.GNOSWAP_ADMIN) - RemovePoolTier("gno.land/r/demo/bar:gno.land/r/demo/foo:500") - if len(poolTiers) != 1 { - t.Error("Expected 1 pool") - } - -} diff --git a/staker/_TEST_/_TEST_staker_mint_and_stake_test.gn b/staker/_TEST_/_TEST_staker_mint_and_stake_test.gn deleted file mode 100644 index ed19a6e0..00000000 --- a/staker/_TEST_/_TEST_staker_mint_and_stake_test.gn +++ /dev/null @@ -1,92 +0,0 @@ -package staker - -import ( - "std" - "testing" - - pl "gno.land/r/demo/pool" - pn "gno.land/r/demo/position" - - "gno.land/r/demo/bar" - "gno.land/r/demo/gnft" - "gno.land/r/demo/gns" - "gno.land/r/demo/qux" - - "gno.land/r/demo/gnoswap/consts" -) - -func init() { - // init pool tiers - // tier 1 - poolTiers["gno.land/r/demo/bar:gno.land/r/demo/qux:500"] = 1 // DEV - - // tier 2 - poolTiers["GNS/USDT_500"] = 2 - poolTiers["ATOM/GNS_500"] = 2 - - // tier 3 - poolTiers["ATOM/GNOT_500"] = 3 - poolTiers["ATOM/USDT_500"] = 3 - poolTiers["ATOM/WETH_500"] = 3 -} - -func TestPoolInitCreatePool(t *testing.T) { - std.TestSetPrevAddr(test1) - for i := 0; i < (5 * 1); i++ { - gns.Faucet() - } - gns.Approve(a2u(consts.POOL_ADDR), consts.POOL_CREATION_FEE) - std.TestSkipHeights(1) - - pl.CreatePool(barPath, quxPath, 500, "130621891405341611593710811006") // tick 10_000 ≈ x2.7 - std.TestSkipHeights(1) -} - -func TestMintAndStake(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - qux.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - lpTokenId, liquidity, amount0, amount1, poolPath := MintAndStake( - barPath, // token0 - quxPath, // token1 - fee500, // fee - int32(9000), // tickLower - int32(11000), // tickUpper - "1000", // amount0Desired - "1000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, - ) - std.TestSkipHeights(1) -} - -func TestPositionCollectFee(t *testing.T) { - std.TestSetPrevAddr(test1) - pn.CollectFee(1) // lpTokenId - std.TestSkipHeights(1) -} - -func TestCollectReward(t *testing.T) { - // internal reward distribution - std.TestSetPrevAddr(consts.INTERNAL_REWARD_ACCOUNT) - gns.Approve(a2u(consts.STAKER_ADDR), consts.UINT64_MAX) - - std.TestSetPrevAddr(test1) - CollectReward(1) // lpTokenId - std.TestSkipHeights(1) -} - -func TestUnstakeToken(t *testing.T) { - ownerOfLp1 := gnft.OwnerOf(tid(1)) - shouldEQ(t, ownerOfLp1, a2u(consts.STAKER_ADDR)) - - std.TestSetPrevAddr(test1) - UnstakeToken(1) // lpTokenId - std.TestSkipHeights(1) - - ownerOfLp1 = gnft.OwnerOf(tid(1)) - shouldEQ(t, ownerOfLp1, a2u(test1)) -} diff --git a/staker/_TEST_/_TEST_staker_one_external_native_test.gn b/staker/_TEST_/_TEST_staker_one_external_native_test.gn deleted file mode 100644 index d083bacd..00000000 --- a/staker/_TEST_/_TEST_staker_one_external_native_test.gn +++ /dev/null @@ -1,191 +0,0 @@ -package staker - -import ( - "std" - "testing" - - pl "gno.land/r/demo/pool" - pn "gno.land/r/demo/position" - - "gno.land/r/demo/bar" - "gno.land/r/demo/foo" - "gno.land/r/demo/gns" - "gno.land/r/demo/wugnot" - - "gno.land/r/demo/gnft" - - "gno.land/r/demo/gnoswap/consts" -) - -func init() { - // init pool tiers - // tier 1 - poolTiers["gno.land/r/demo/bar:gno.land/r/demo/foo:500"] = 1 // DEV - - // tier 2 - poolTiers["GNS/USDT_500"] = 2 - poolTiers["ATOM/GNS_500"] = 2 - - // tier 3 - poolTiers["ATOM/GNOT_500"] = 3 - poolTiers["ATOM/USDT_500"] = 3 - poolTiers["ATOM/WETH_500"] = 3 -} - -func TestPoolInitCreatePool(t *testing.T) { - std.TestSetPrevAddr(test1) - for i := 0; i < (5 * 1); i++ { - gns.Faucet() - } - gns.Approve(a2u(consts.POOL_ADDR), consts.POOL_CREATION_FEE) - std.TestSkipHeights(1) - - pl.CreatePool(barPath, fooPath, 500, "130621891405341611593710811006") // tick 10_000 ≈ x2.7 - std.TestSkipHeights(1) -} - -func TestPositionMint01(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - foo.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - lpTokenId, liquidity, amount0, amount1 := pn.Mint( - barPath, // token0 - fooPath, // token1 - uint16(500), // fee - int32(9000), // tickLower - int32(11000), // tickUpper - "1000", // amount0Desired - "1000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, // deadline - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, lpTokenId, 1) - shouldEQ(t, gnft.OwnerOf(tid(lpTokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "368") - shouldEQ(t, amount1, "999") - - // approve nft to staker for staking - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(lpTokenId)) - std.TestSkipHeights(1) -} - -func TestPositionMint02(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - foo.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - lpTokenId, liquidity, amount0, amount1 := pn.Mint( - barPath, // token0 - fooPath, // token1 - uint16(500), // fee - int32(9100), // tickLower - int32(12000), // tickUpper - "5000", // amount0Desired - "5000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, // deadline - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, lpTokenId, 2) - shouldEQ(t, gnft.OwnerOf(tid(lpTokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "3979") - shouldEQ(t, amount1, "4999") - - // approve nft to staker - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(lpTokenId)) - std.TestSkipHeights(1) -} - -func TestCreateExternalIncentive(t *testing.T) { - std.TestSetPrevAddr(test1) - - // send - testBanker := std.GetBanker(std.BankerTypeRealmIssue) - testBanker.IssueCoin(test1, "ugnot", 10_000_000_000) - std.TestSetOrigSend(std.Coins{{"ugnot", 10_000_000_000}}, nil) - testBanker.RemoveCoin(std.GetOrigCaller(), "ugnot", 10_000_000_000) - - // Deposit(wrap) - wugnot.Deposit() - std.TestSkipHeights(1) - - wugnot.Approve(a2u(consts.STAKER_ADDR), 10_000_000_000) - std.TestSkipHeights(1) - - CreateExternalIncentive( - "gno.land/r/demo/bar:gno.land/r/demo/foo:500", // targetPoolPath - consts.WRAPPED_WUGNOT, // rewardToken - "10000000000", // rewardAmount - 1234569600, // startTimestamp - 1234569600+TIMESTAMP_90DAYS, // endTimestamp - ) - std.TestSkipHeights(1) -} - -func TestStakeToken01(t *testing.T) { - std.TestSetPrevAddr(test1) - StakeToken(1) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(1)), GetOrigPkgAddr()) // staker - shouldEQ(t, len(deposits), 1) -} - -func TestStakeToken02(t *testing.T) { - std.TestSetPrevAddr(test1) - StakeToken(2) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(2)), GetOrigPkgAddr()) // staker - shouldEQ(t, len(deposits), 2) -} - -func TestUnstakeToken01(t *testing.T) { - std.TestSetPrevAddr(consts.INTERNAL_REWARD_ACCOUNT) - gns.Approve(a2u(consts.STAKER_ADDR), consts.UINT64_MAX) // internal reward distribution - std.TestSkipHeights(335) // skip times - - std.TestSetPrevAddr(test1) - UnstakeToken(1) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(1)), test1) - - // check reward - shouldEQ(t, gns.BalanceOf(a2u(test1)), 2064336) // internal - shouldEQ(t, wugnot.BalanceOf(a2u(test1)), 2521) // external -} - -func TestUnstakeToken02(t *testing.T) { - std.TestSetPrevAddr(test1) - UnstakeToken(2) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(2)), test1) - - // check reward - shouldEQ(t, gns.BalanceOf(a2u(test1)), 15826574) // internal - shouldEQ(t, wugnot.BalanceOf(a2u(test1)), 21428) // external -} - -func TestEndExternalIncentive(t *testing.T) { - std.TestSetOrigCaller(test1) - std.TestSkipHeights(9999999) - EndExternalIncentive(std.GetOrigCaller().String(), "gno.land/r/demo/bar:gno.land/r/demo/foo:500", consts.WRAPPED_WUGNOT) // use same parameter as CreateExternalIncentive() - std.TestSkipHeights(1) - - shouldEQ(t, len(incentives), 0) - shouldEQ(t, len(poolIncentives["gno.land/r/demo/bar:gno.land/r/demo/foo:500"]), 0) -} diff --git a/staker/_TEST_/_TEST_staker_one_external_test.gn b/staker/_TEST_/_TEST_staker_one_external_test.gn deleted file mode 100644 index d8d0124b..00000000 --- a/staker/_TEST_/_TEST_staker_one_external_test.gn +++ /dev/null @@ -1,193 +0,0 @@ -package staker - -import ( - "std" - "testing" - - - pl "gno.land/r/demo/pool" - pn "gno.land/r/demo/position" - - "gno.land/r/demo/bar" - "gno.land/r/demo/foo" - "gno.land/r/demo/gns" - "gno.land/r/demo/obl" - - "gno.land/r/demo/gnft" - - "gno.land/r/demo/gnoswap/consts" -) - -func init() { - // init pool tiers - // tier 1 - poolTiers["gno.land/r/demo/bar:gno.land/r/demo/foo:500"] = 1 // DEV - - // tier 2 - poolTiers["GNS/USDT_500"] = 2 - poolTiers["ATOM/GNS_500"] = 2 - - // tier 3 - poolTiers["ATOM/GNOT_500"] = 3 - poolTiers["ATOM/USDT_500"] = 3 - poolTiers["ATOM/WETH_500"] = 3 -} - -func TestPoolInitCreatePool(t *testing.T) { - std.TestSetPrevAddr(test1) - for i := 0; i < (5 * 1); i++ { - gns.Faucet() - } - gns.Approve(a2u(consts.POOL_ADDR), consts.POOL_CREATION_FEE) - std.TestSkipHeights(1) - - pl.CreatePool(fooPath, barPath, 500, "130621891405341611593710811006") // tick 10_000 ≈ x2.7 - std.TestSkipHeights(1) -} - -func TestPositionMint01(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - foo.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - lpTokenId, liquidity, amount0, amount1 := pn.Mint( - fooPath, // token0 - barPath, // token1 - uint16(500), // fee - int32(9000), // tickLower - int32(11000), // tickUpper - "1000", // amount0Desired - "1000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, // deadline - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, lpTokenId, 1) - shouldEQ(t, gnft.OwnerOf(tid(lpTokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "1000") - shouldEQ(t, amount1, "367") - - // approve nft to staker for staking - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(lpTokenId)) - std.TestSkipHeights(1) -} - -func TestPositionMint02(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - foo.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - lpTokenId, liquidity, amount0, amount1 := pn.Mint( - fooPath, // token0 - barPath, // token1 - uint16(500), // fee - int32(9100), // tickLower - int32(12000), // tickUpper - "5000", // amount0Desired - "5000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, // deadline - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, lpTokenId, 2) - shouldEQ(t, gnft.OwnerOf(tid(lpTokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "5000") - shouldEQ(t, amount1, "3978") - - // approve nft to staker - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(lpTokenId)) - std.TestSkipHeights(1) -} - -func TestCreateExternalIncentive(t *testing.T) { - std.TestSetPrevAddr(test1) - obl.Approve(a2u(consts.STAKER_ADDR), 10_000_000_000) - std.TestSkipHeights(1) - - CreateExternalIncentive( - "gno.land/r/demo/bar:gno.land/r/demo/foo:500", // targetPoolPath - oblPath, // rewardToken - "10000000000", // rewardAmount - 1234569600, // startTimestamp - 1234569600+TIMESTAMP_90DAYS, // endTimestamp - ) - std.TestSkipHeights(1) -} - -func TestStakeToken01(t *testing.T) { - std.TestSetPrevAddr(test1) - StakeToken(1) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(1)), GetOrigPkgAddr()) // staker - shouldEQ(t, len(deposits), 1) -} - -func TestStakeToken02(t *testing.T) { - std.TestSetPrevAddr(test1) - StakeToken(2) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(2)), GetOrigPkgAddr()) // staker - shouldEQ(t, len(deposits), 2) -} - -// func TestApiGetStakes(t *testing.T) { -// gss := ApiGetStakes() -// jsonStr := gjson.Parse(gss) -// shouldEQ(t, len(jsonStr.Get("response").Array()), 2) -// } - -// func TestApiGetRewardTokens(t *testing.T) { -// grt := ApiGetRewardTokens() -// jsonStr := gjson.Parse(grt) -// shouldEQ(t, len(jsonStr.Get("response").Array()), 1) -// } - -func TestUnstakeToken01(t *testing.T) { - std.TestSetPrevAddr(consts.INTERNAL_REWARD_ACCOUNT) - gns.Approve(a2u(consts.STAKER_ADDR), consts.UINT64_MAX) // internal reward distribution - std.TestSkipHeights(330) - - std.TestSetPrevAddr(test1) - UnstakeToken(1) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(1)), test1) - - // check reward - shouldEQ(t, gns.BalanceOf(a2u(test1)), 2033707) // internal - shouldEQ(t, obl.BalanceOf(a2u(test1)), 630) // external -} - -func TestUnstakeToken02(t *testing.T) { - std.TestSetPrevAddr(test1) - UnstakeToken(2) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(2)), test1) - - // check reward - shouldEQ(t, gns.BalanceOf(a2u(test1)), 15591757) // internal - shouldEQ(t, obl.BalanceOf(a2u(test1)), 6932) // external -} - -func TestEndExternalIncentive(t *testing.T) { - std.TestSetOrigCaller(test1) - std.TestSkipHeights(9999999) - EndExternalIncentive(std.GetOrigCaller().String(), "gno.land/r/demo/bar:gno.land/r/demo/foo:500", "gno.land/r/demo/obl") // use same parameter as CreateExternalIncentive() - std.TestSkipHeights(1) - - shouldEQ(t, len(incentives), 0) - shouldEQ(t, len(poolIncentives["gno.land/r/demo/bar:gno.land/r/demo/foo:500"]), 0) -} diff --git a/staker/_TEST_/_TEST_staker_one_increase_external_test.gn b/staker/_TEST_/_TEST_staker_one_increase_external_test.gn deleted file mode 100644 index a4934530..00000000 --- a/staker/_TEST_/_TEST_staker_one_increase_external_test.gn +++ /dev/null @@ -1,225 +0,0 @@ -package staker - -import ( - "std" - "testing" - - "gno.land/p/demo/json" - - pl "gno.land/r/demo/pool" - pn "gno.land/r/demo/position" - - "gno.land/r/demo/bar" - "gno.land/r/demo/foo" - "gno.land/r/demo/gns" - "gno.land/r/demo/obl" - - "gno.land/r/demo/gnft" - "gno.land/r/demo/gnoswap/consts" -) - -func init() { - // init pool tiers - // tier 1 - poolTiers["gno.land/r/demo/bar:gno.land/r/demo/foo:500"] = 1 // DEV - - // tier 2 - poolTiers["GNS/USDT_500"] = 2 - poolTiers["ATOM/GNS_500"] = 2 - - // tier 3 - poolTiers["ATOM/GNOT_500"] = 3 - poolTiers["ATOM/USDT_500"] = 3 - poolTiers["ATOM/WETH_500"] = 3 -} - -func TestPoolCreatePool(t *testing.T) { - std.TestSetPrevAddr(test1) - for i := 0; i < (5 * 1); i++ { - gns.Faucet() - } - gns.Approve(a2u(consts.POOL_ADDR), consts.POOL_CREATION_FEE) - std.TestSkipHeights(1) - - pl.CreatePool(fooPath, barPath, 500, "130621891405341611593710811006") // tick 10_000 ≈ x2.7 - std.TestSkipHeights(1) -} - -func TestPositionMint01(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - foo.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - lpTokenId, liquidity, amount0, amount1 := pn.Mint( - fooPath, // token0 - barPath, // token1 - uint16(500), // fee - int32(9000), // tickLower - int32(11000), // tickUpper - "1000", // amount0Desired - "1000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, // deadline - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, lpTokenId, 1) - shouldEQ(t, gnft.OwnerOf(tid(lpTokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "1000") - shouldEQ(t, amount1, "367") - - // approve nft to staker for staking - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(lpTokenId)) - std.TestSkipHeights(1) -} - -func TestPositionMint02(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - foo.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - lpTokenId, liquidity, amount0, amount1 := pn.Mint( - fooPath, // token0 - barPath, // token1 - uint16(500), // fee - int32(9100), // tickLower - int32(12000), // tickUpper - "5000", // amount0Desired - "5000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, // deadline - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, lpTokenId, 2) - shouldEQ(t, gnft.OwnerOf(tid(lpTokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "5000") - shouldEQ(t, amount1, "3978") - - // approve nft to staker - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(lpTokenId)) - std.TestSkipHeights(1) -} - -func TestCreateExternalIncentive(t *testing.T) { - std.TestSetPrevAddr(test1) - obl.Approve(a2u(consts.STAKER_ADDR), 10_000_000_000) - std.TestSkipHeights(1) - - CreateExternalIncentive( - "gno.land/r/demo/bar:gno.land/r/demo/foo:500", // targetPoolPath - oblPath, // rewardToken - "1000000000", // rewardAmount - 1234569600, // startTimestamp - 1234569600+TIMESTAMP_90DAYS, // endTimestamp - ) - std.TestSkipHeights(1) - - obl.Approve(a2u(consts.STAKER_ADDR), 10_000_000_000) - std.TestSkipHeights(1) - CreateExternalIncentive("gno.land/r/demo/bar:gno.land/r/demo/foo:500", oblPath, "100000000", 1234569600, 1234569600+TIMESTAMP_90DAYS) - std.TestSkipHeights(1) -} - -func TestStakeToken01(t *testing.T) { - std.TestSetPrevAddr(test1) - StakeToken(1) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(1)), GetOrigPkgAddr()) // staker - shouldEQ(t, len(deposits), 1) -} - -func TestStakeToken02(t *testing.T) { - std.TestSetPrevAddr(test1) - StakeToken(2) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(2)), GetOrigPkgAddr()) // staker - shouldEQ(t, len(deposits), 2) -} - -func TestApiGetStakes(t *testing.T) { - gss := ApiGetStakes() - - root, err := json.Unmarshal([]byte(gss)) - if err != nil { - panic(err) - } - - response, err := root.GetKey("response") - if err != nil { - panic(err) - } - - shouldEQ(t, response.Size(), 2) -} - -func TestApiGetRewardTokens(t *testing.T) { - grt := ApiGetRewardTokens() - - root, err := json.Unmarshal([]byte(grt)) - if err != nil { - panic(err) - } - - response, err := root.GetKey("response") - if err != nil { - panic(err) - } - - shouldEQ(t, response.Size(), 1) -} - -func TestUnstakeToken01(t *testing.T) { - std.TestSetPrevAddr(consts.INTERNAL_REWARD_ACCOUNT) - gns.Approve(a2u(consts.STAKER_ADDR), consts.UINT64_MAX) // internal reward distribution - std.TestSkipHeights(350) - - std.TestSetPrevAddr(test1) - UnstakeToken(1) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(1)), test1) - - // check reward - shouldEQ(t, gns.BalanceOf(a2u(test1)), 2156220) // internal - shouldEQ(t, obl.BalanceOf(a2u(test1)), 8900000831) // external -} - -func TestUnstakeToken02(t *testing.T) { - std.TestSetPrevAddr(test1) - UnstakeToken(2) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(2)), test1) - - // check reward - shouldEQ(t, gns.BalanceOf(a2u(test1)), 16531020) // internal - shouldEQ(t, obl.BalanceOf(a2u(test1)), 8900006600) // external -} - -func TestEndExternalIncentive(t *testing.T) { - shouldEQ(t, len(incentives), 1) - - std.TestSetOrigCaller(test1) - - // incentive time isn't over yet - shouldPanicWithMsg(t, func() { - EndExternalIncentive(test1.String(), "gno.land/r/demo/bar:gno.land/r/demo/foo:500", "gno.land/r/demo/obl") - }, "[STAKER] staker.gno__EndExternalIncentive() || cannot end incentive before endTimestamp(1242345600), current(1234569730)") - - std.TestSkipHeights(9999999) - EndExternalIncentive(test1.String(), "gno.land/r/demo/bar:gno.land/r/demo/foo:500", "gno.land/r/demo/obl") // use same parameter as CreateExternalIncentive() - - shouldEQ(t, len(incentives), 0) - shouldEQ(t, len(poolIncentives["gno.land/r/demo/bar:gno.land/r/demo/foo:500"]), 0) -} diff --git a/staker/_TEST_/_TEST_staker_rpc_get_test.gn b/staker/_TEST_/_TEST_staker_rpc_get_test.gn deleted file mode 100644 index 0b1396b0..00000000 --- a/staker/_TEST_/_TEST_staker_rpc_get_test.gn +++ /dev/null @@ -1,245 +0,0 @@ -package staker - -import ( - "gno.land/p/demo/json" - "std" - "testing" - - pl "gno.land/r/demo/pool" - pn "gno.land/r/demo/position" - - "gno.land/r/demo/bar" - "gno.land/r/demo/gns" - "gno.land/r/demo/obl" - "gno.land/r/demo/qux" - - "gno.land/r/demo/gnft" - - "gno.land/r/demo/gnoswap/consts" -) - -func init() { - // init pool tiers - // tier 1 - poolTiers["gno.land/r/demo/bar:gno.land/r/demo/qux:500"] = 1 // DEV - - // tier 2 - poolTiers["GNS/USDT_500"] = 2 - poolTiers["ATOM/GNS_500"] = 2 - - // tier 3 - poolTiers["ATOM/GNOT_500"] = 3 - poolTiers["ATOM/USDT_500"] = 3 - poolTiers["ATOM/WETH_500"] = 3 -} - -func TestPoolCreatePool(t *testing.T) { - std.TestSetPrevAddr(test1) - for i := 0; i < (5 * 1); i++ { - gns.Faucet() - } - gns.Approve(a2u(consts.POOL_ADDR), consts.POOL_CREATION_FEE) - std.TestSkipHeights(1) - - pl.CreatePool(barPath, quxPath, 500, "130621891405341611593710811006") // tick 10_000 ≈ x2.7 - std.TestSkipHeights(1) -} - -func TestPositionMint01(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - qux.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - lpTokenId, liquidity, amount0, amount1 := pn.Mint( - barPath, // token0 - quxPath, // token1 - fee500, // fee - int32(9000), // tickLower - int32(11000), // tickUpper - "1000", // amount0Desired - "1000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, lpTokenId, 1) - shouldEQ(t, gnft.OwnerOf(tid(lpTokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "368") - shouldEQ(t, amount1, "999") - - // approve nft to staker for staking - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(lpTokenId)) - std.TestSkipHeights(1) -} - -func TestPositionMint02(t *testing.T) { - std.TestSetPrevAddr(test1) - bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - qux.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) - std.TestSkipHeights(2) - - lpTokenId, liquidity, amount0, amount1 := pn.Mint( - barPath, // token0 - quxPath, // token1 - fee500, // fee - int32(9100), // tickLower - int32(12000), // tickUpper - "5000", // amount0Desired - "5000", // amount1Desired - "1", // amount0Min - "1", // amount1Min - max_timeout, - test1.String(), - ) - std.TestSkipHeights(1) - - shouldEQ(t, lpTokenId, 2) - shouldEQ(t, gnft.OwnerOf(tid(lpTokenId)), std.GetOrigCaller()) // test1 - shouldEQ(t, amount0, "3979") - shouldEQ(t, amount1, "4999") - - // approve nft to staker - std.TestSetPrevAddr(test1) - gnft.Approve(a2u(GetOrigPkgAddr()), tid(lpTokenId)) - std.TestSkipHeights(1) -} - -func TestCreateExternalIncentive(t *testing.T) { - std.TestSetPrevAddr(test1) - obl.Approve(a2u(consts.STAKER_ADDR), 10_000_000_000) - std.TestSkipHeights(1) - - CreateExternalIncentive( - "gno.land/r/demo/bar:gno.land/r/demo/qux:500", // targetPoolPath - oblPath, // rewardToken - "1000000000", // rewardAmount - 1234569600, // startTimestamp - 1234569600+TIMESTAMP_90DAYS, // endTimestamp - ) - std.TestSkipHeights(1) - - obl.Approve(a2u(consts.STAKER_ADDR), 10_000_000_000) - std.TestSkipHeights(1) - CreateExternalIncentive("gno.land/r/demo/bar:gno.land/r/demo/qux:500", oblPath, "1000000000", 1234569600, 1234569600+TIMESTAMP_90DAYS) - std.TestSkipHeights(1) -} - -func TestStakeToken01(t *testing.T) { - std.TestSetPrevAddr(test1) - StakeToken(1) // GNFT tokenId - std.TestSkipHeights(500) - - shouldEQ(t, gnft.OwnerOf(tid(1)), GetOrigPkgAddr()) // staker - shouldEQ(t, len(deposits), 1) -} - -func TestStakeToken02(t *testing.T) { - std.TestSetPrevAddr(test1) - StakeToken(2) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(2)), GetOrigPkgAddr()) // staker - shouldEQ(t, len(deposits), 2) -} - -func TestApiGetRewards(t *testing.T) { - agrs := ApiGetRewards() - root, err := json.Unmarshal([]byte(agrs)) - if err != nil { - panic(err) - } - - response, err := root.GetKey("response") - if err != nil { - panic(err) - } - - shouldEQ(t, response.Size(), 2) // lpTokenId 1, 2 -} - -func TestApiGetStakes(t *testing.T) { - ags := ApiGetStakes() - root, err := json.Unmarshal([]byte(ags)) - if err != nil { - panic(err) - } - - response, err := root.GetKey("response") - if err != nil { - panic(err) - } - - shouldEQ(t, response.Size(), 2) // lpTokenId 1, 2 -} - -func TestApiGetIncentives(t *testing.T) { - agi := ApiGetIncentives() - root, err := json.Unmarshal([]byte(agi)) - if err != nil { - panic(err) - } - - response, err := root.GetKey("response") - if err != nil { - panic(err) - } - - shouldEQ(t, response.Size(), 1) // bar:qux:500, obl -} - -func TestCollectReward(t *testing.T) { - std.TestSetPrevAddr(consts.INTERNAL_REWARD_ACCOUNT) - gns.Approve(a2u(consts.STAKER_ADDR), consts.UINT64_MAX) // internal reward distribution - std.TestSkipHeights(1) - - // before claim - gnsOld := gns.BalanceOf(a2u(test1)) - shouldEQ(t, gnsOld, 0) - - std.TestSetPrevAddr(test1) - CollectReward(1) // GNFT tokenId - std.TestSkipHeights(1) - - gnsNew := gns.BalanceOf(a2u(test1)) - shouldEQ(t, gnsNew, 3075063) -} - -func TestUnstakeToken01(t *testing.T) { - std.TestSetPrevAddr(test1) - UnstakeToken(1) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(1)), test1) - - // check reward - shouldEQ(t, gns.BalanceOf(a2u(test1)), 3081190) // internal - shouldEQ(t, obl.BalanceOf(a2u(test1)), 8000011025) // external -} - -func TestUnstakeToken02(t *testing.T) { - std.TestSetPrevAddr(test1) - UnstakeToken(2) // GNFT tokenId - std.TestSkipHeights(1) - - shouldEQ(t, gnft.OwnerOf(tid(2)), test1) - - // check reward - shouldEQ(t, gns.BalanceOf(a2u(test1)), 3244540) - // internal - shouldEQ(t, obl.BalanceOf(a2u(test1)), 8000012705) // external -} - -func TestEndExternalIncentive(t *testing.T) { - std.TestSetOrigCaller(test1) - std.TestSkipHeights(9999999) - EndExternalIncentive(std.GetOrigCaller().String(), "gno.land/r/demo/bar:gno.land/r/demo/qux:500", "gno.land/r/demo/obl") // use same parameter as CreateExternalIncentive() - std.TestSkipHeights(1) - - shouldEQ(t, len(incentives), 0) - shouldEQ(t, len(poolIncentives["gno.land/r/demo/bar:gno.land/r/demo/qux:500"]), 0) -} diff --git a/staker/_TEST_/z1_one_increase_external_filetest.gno b/staker/_TEST_/z1_one_increase_external_filetest.gno new file mode 100644 index 00000000..22e0e70a --- /dev/null +++ b/staker/_TEST_/z1_one_increase_external_filetest.gno @@ -0,0 +1,323 @@ +package main + +import ( + "std" + "strconv" + "testing" + + "gno.land/r/demo/bar" + "gno.land/r/demo/baz" + "gno.land/r/demo/foo" + "gno.land/r/demo/gns" + "gno.land/r/demo/obl" + "gno.land/r/demo/qux" + "gno.land/r/demo/wugnot" + + "gno.land/p/demo/grc/grc721" + pusers "gno.land/p/demo/users" + + "gno.land/r/demo/gnoswap/common" + "gno.land/r/demo/gnoswap/consts" + + pl "gno.land/r/demo/pool" + pn "gno.land/r/demo/position" + rr "gno.land/r/demo/router" + sr "gno.land/r/demo/staker" + + "gno.land/r/demo/gnft" +) + +var ( + gsa std.Address = consts.GNOSWAP_ADMIN + test1 std.Address = std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5") + + fooPath string = "gno.land/r/demo/foo" + barPath string = "gno.land/r/demo/bar" + bazPath string = "gno.land/r/demo/baz" + quxPath string = "gno.land/r/demo/qux" + + oblPath string = "gno.land/r/demo/obl" + + fee100 uint32 = 100 + fee500 uint32 = 500 + fee3000 uint32 = 3000 + + max_timeout int64 = 9999999999 + + maxApprove uint64 = 18446744073709551615 + + TIMESTAMP_90DAYS int64 = 7776000 + + // TESTING + t *testing.T +) + +type FooToken struct{} + +func (FooToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return foo.Transfer +} +func (FooToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return foo.TransferFrom +} +func (FooToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return foo.BalanceOf +} +func (FooToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return foo.Approve +} + +type BarToken struct{} + +func (BarToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return bar.Transfer +} +func (BarToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return bar.TransferFrom +} +func (BarToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return bar.BalanceOf +} +func (BarToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return bar.Approve +} + +type BazToken struct{} + +func (BazToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return baz.Transfer +} +func (BazToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return baz.TransferFrom +} +func (BazToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return baz.BalanceOf +} +func (BazToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return baz.Approve +} + +type QuxToken struct{} + +func (QuxToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return qux.Transfer +} +func (QuxToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return qux.TransferFrom +} +func (QuxToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return qux.BalanceOf +} +func (QuxToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return qux.Approve +} + +type WugnotToken struct{} + +func (WugnotToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return wugnot.Transfer +} +func (WugnotToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return wugnot.TransferFrom +} +func (WugnotToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return wugnot.BalanceOf +} +func (WugnotToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return wugnot.Approve +} + +type OBLToken struct{} + +func (OBLToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return obl.Transfer +} +func (OBLToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return obl.TransferFrom +} +func (OBLToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return obl.BalanceOf +} +func (OBLToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return obl.Approve +} + +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 +} + +/* HELPER FUNCTIONS */ +func a2u(addr std.Address) pusers.AddressOrName { + return pusers.AddressOrName(addr) +} + +func tid(tokenId interface{}) grc721.TokenID { + switch tokenId.(type) { + case string: + return grc721.TokenID(tokenId.(string)) + case int: + return grc721.TokenID(strconv.Itoa(tokenId.(int))) + case uint64: + return grc721.TokenID(strconv.Itoa(int(tokenId.(uint64)))) + case grc721.TokenID: + return tokenId.(grc721.TokenID) + default: + panic("tid() || unsupported tokenId type") + } +} + +func ugnotBalanceOf(addr std.Address) uint64 { + testBanker := std.GetBanker(std.BankerTypeRealmIssue) + + coins := testBanker.GetCoins(addr) + if len(coins) == 0 { + return 0 + } + + return uint64(testBanker.GetCoins(addr)[0].Amount) +} + +func init() { + // FAUCET + std.TestSetPrevAddr(test1) + + for i := 0; i < 100; i++ { + foo.Faucet() + bar.Faucet() + baz.Faucet() + qux.Faucet() + obl.Faucet() + } + + // TOKEN REGISTER + std.TestSetPrevAddr(gsa) + pl.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) + + rr.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) + + sr.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) +} + +/* START TEST */ +func main() { + createPool() + mint01() + mint02() + createExternalIncentiveInit() + createExternalIncentiveIncrease() + stakeToken01() + stakeToken02() + +} + +func createPool() { + numPool := uint64(1) + + // call gns faucet to get creation fee + std.TestSetPrevAddr(test1) + for i := uint64(0); i < (5 * numPool); i++ { + gns.Faucet() + std.TestSkipHeights(1) + } + + gns.Approve(a2u(consts.POOL_ADDR), consts.POOL_CREATION_FEE*numPool) + std.TestSkipHeights(1) + + pl.CreatePool(barPath, fooPath, fee100, common.TickMathGetSqrtRatioAtTick(10_000).ToString()) +} + +func mint01() { + std.TestSetOrigCaller(test1) + + bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + foo.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + + std.TestSetPrevRealm(consts.STAKER_PATH) + pn.Mint(barPath, fooPath, fee100, 9000, 11000, "1000", "1000", "0", "0", max_timeout, test1.String()) +} + +func mint02() { + std.TestSetOrigCaller(test1) + + bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + foo.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + + std.TestSetPrevRealm(consts.STAKER_PATH) + pn.Mint(barPath, fooPath, fee100, 9100, 12000, "5000", "5000", "0", "0", max_timeout, test1.String()) +} + +func createExternalIncentiveInit() { + std.TestSetPrevAddr(test1) + obl.Approve(a2u(consts.STAKER_ADDR), 10_000_000_000) + std.TestSkipHeights(1) + + sr.CreateExternalIncentive( + "gno.land/r/demo/bar:gno.land/r/demo/foo:100", // targetPoolPath + oblPath, // rewardToken + "1000000000", // rewardAmount + 1234569600, // startTimestamp + 1234569600+TIMESTAMP_90DAYS, // endTimestamp + ) + std.TestSkipHeights(1) +} + +func createExternalIncentiveIncrease() { + std.TestSetPrevAddr(test1) + obl.Approve(a2u(consts.STAKER_ADDR), 10_000_000_000) + std.TestSkipHeights(1) + + sr.CreateExternalIncentive( + "gno.land/r/demo/bar:gno.land/r/demo/foo:100", // targetPoolPath + oblPath, // rewardToken + "1000000000", // rewardAmount + 1234569600, // startTimestamp + 1234569600+TIMESTAMP_90DAYS, // endTimestamp + ) + std.TestSkipHeights(1) +} + +func stakeToken01() { + std.TestSetPrevAddr(test1) + gnft.Approve(a2u(consts.STAKER_ADDR), tid(1)) + sr.StakeToken(1) + std.TestSkipHeights(2) +} + +func stakeToken02() { + std.TestSetPrevAddr(test1) + gnft.Approve(a2u(consts.STAKER_ADDR), tid(2)) + sr.StakeToken(2) + std.TestSkipHeights(2) +} diff --git a/staker/_TEST_/z2_one_external_filetest.gno b/staker/_TEST_/z2_one_external_filetest.gno new file mode 100644 index 00000000..1e5b0edb --- /dev/null +++ b/staker/_TEST_/z2_one_external_filetest.gno @@ -0,0 +1,345 @@ +package main + +import ( + "std" + "strconv" + "testing" + + "gno.land/r/demo/bar" + "gno.land/r/demo/baz" + "gno.land/r/demo/foo" + "gno.land/r/demo/gns" + "gno.land/r/demo/obl" + "gno.land/r/demo/qux" + "gno.land/r/demo/wugnot" + + "gno.land/r/demo/gnft" + + "gno.land/p/demo/grc/grc721" + pusers "gno.land/p/demo/users" + + "gno.land/r/demo/gnoswap/common" + "gno.land/r/demo/gnoswap/consts" + + pl "gno.land/r/demo/pool" + pn "gno.land/r/demo/position" + rr "gno.land/r/demo/router" + sr "gno.land/r/demo/staker" +) + +var ( + gsa std.Address = consts.GNOSWAP_ADMIN + test1 std.Address = std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5") + + fooPath string = "gno.land/r/demo/foo" + barPath string = "gno.land/r/demo/bar" + bazPath string = "gno.land/r/demo/baz" + quxPath string = "gno.land/r/demo/qux" + + oblPath string = "gno.land/r/demo/obl" + + fee100 uint32 = 100 + fee500 uint32 = 500 + fee3000 uint32 = 3000 + + max_timeout int64 = 9999999999 + + maxApprove uint64 = 18446744073709551615 + + TIMESTAMP_90DAYS int64 = 7776000 + + // TESTING + t *testing.T +) + +type FooToken struct{} + +func (FooToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return foo.Transfer +} +func (FooToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return foo.TransferFrom +} +func (FooToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return foo.BalanceOf +} +func (FooToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return foo.Approve +} + +type BarToken struct{} + +func (BarToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return bar.Transfer +} +func (BarToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return bar.TransferFrom +} +func (BarToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return bar.BalanceOf +} +func (BarToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return bar.Approve +} + +type BazToken struct{} + +func (BazToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return baz.Transfer +} +func (BazToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return baz.TransferFrom +} +func (BazToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return baz.BalanceOf +} +func (BazToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return baz.Approve +} + +type QuxToken struct{} + +func (QuxToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return qux.Transfer +} +func (QuxToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return qux.TransferFrom +} +func (QuxToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return qux.BalanceOf +} +func (QuxToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return qux.Approve +} + +type WugnotToken struct{} + +func (WugnotToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return wugnot.Transfer +} +func (WugnotToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return wugnot.TransferFrom +} +func (WugnotToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return wugnot.BalanceOf +} +func (WugnotToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return wugnot.Approve +} + +type OBLToken struct{} + +func (OBLToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return obl.Transfer +} +func (OBLToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return obl.TransferFrom +} +func (OBLToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return obl.BalanceOf +} +func (OBLToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return obl.Approve +} + +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 +} + +/* HELPER FUNCTIONS */ +func a2u(addr std.Address) pusers.AddressOrName { + return pusers.AddressOrName(addr) +} + +func tid(tokenId interface{}) grc721.TokenID { + switch tokenId.(type) { + case string: + return grc721.TokenID(tokenId.(string)) + case int: + return grc721.TokenID(strconv.Itoa(tokenId.(int))) + case uint64: + return grc721.TokenID(strconv.Itoa(int(tokenId.(uint64)))) + case grc721.TokenID: + return tokenId.(grc721.TokenID) + default: + panic("tid() || unsupported tokenId type") + } +} + +func ugnotBalanceOf(addr std.Address) uint64 { + testBanker := std.GetBanker(std.BankerTypeRealmIssue) + + coins := testBanker.GetCoins(addr) + if len(coins) == 0 { + return 0 + } + + return uint64(testBanker.GetCoins(addr)[0].Amount) +} + +func init() { + // FAUCET + std.TestSetPrevAddr(test1) + + for i := 0; i < 100; i++ { + foo.Faucet() + bar.Faucet() + baz.Faucet() + qux.Faucet() + obl.Faucet() + } + + // TOKEN REGISTER + std.TestSetPrevAddr(gsa) + pl.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) + + rr.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) + + sr.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) +} + +/* START TEST */ +func main() { + createPool() + mint01() + mint02() + createExternalIncentive() + stakeToken01() + stakeToken02() + unStakeToken01() + unStakeToken02() + endExternalIncentive() +} + +func createPool() { + numPool := uint64(1) + + // call gns faucet to get creation fee + std.TestSetPrevAddr(test1) + for i := uint64(0); i < (5 * numPool); i++ { + gns.Faucet() + std.TestSkipHeights(1) + } + + gns.Approve(a2u(consts.POOL_ADDR), consts.POOL_CREATION_FEE*numPool) + std.TestSkipHeights(1) + + pl.CreatePool(barPath, fooPath, fee100, common.TickMathGetSqrtRatioAtTick(10_000).ToString()) +} + +func mint01() { + std.TestSetOrigCaller(test1) + + bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + foo.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + + std.TestSetPrevRealm(consts.STAKER_PATH) + pn.Mint(barPath, fooPath, fee100, 9000, 11000, "1000", "1000", "0", "0", max_timeout, test1.String()) +} + +func mint02() { + std.TestSetOrigCaller(test1) + + bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + foo.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + + std.TestSetPrevRealm(consts.STAKER_PATH) + pn.Mint(barPath, fooPath, fee100, 9100, 12000, "5000", "5000", "0", "0", max_timeout, test1.String()) +} + +func createExternalIncentive() { + std.TestSetPrevAddr(test1) + obl.Approve(a2u(consts.STAKER_ADDR), 10_000_000_000) + std.TestSkipHeights(1) + + sr.CreateExternalIncentive( + "gno.land/r/demo/bar:gno.land/r/demo/foo:100", // targetPoolPath + oblPath, // rewardToken + "1000000000", // rewardAmount + 1234569600, // startTimestamp + 1234569600+TIMESTAMP_90DAYS, // endTimestamp + ) + std.TestSkipHeights(1) +} + +func stakeToken01() { + std.TestSetPrevAddr(test1) + gnft.Approve(a2u(consts.STAKER_ADDR), tid(1)) + sr.StakeToken(1) + std.TestSkipHeights(2) +} + +func stakeToken02() { + std.TestSetPrevAddr(test1) + gnft.Approve(a2u(consts.STAKER_ADDR), tid(2)) + sr.StakeToken(2) + std.TestSkipHeights(2) +} + +func unStakeToken01() { + std.TestSetPrevAddr(consts.INTERNAL_REWARD_ACCOUNT) + gns.Approve(a2u(consts.STAKER_ADDR), consts.UINT64_MAX) // internal reward distribution + std.TestSkipHeights(360) + + std.TestSetPrevAddr(test1) + sr.UnstakeToken(1) // GNFT tokenId + std.TestSkipHeights(1) + + gnsBal := gns.BalanceOf(a2u(test1)) // 0 + oblBal := obl.BalanceOf(a2u(test1)) + if oblBal != 9000000945 { + panic("oblBal != 9000000945") + } +} + +func unStakeToken02() { + std.TestSetPrevAddr(test1) + sr.UnstakeToken(2) // GNFT tokenId + std.TestSkipHeights(1) + + gnsBal := gns.BalanceOf(a2u(test1)) // 0 + oblBal := obl.BalanceOf(a2u(test1)) + if oblBal != 9000007455 { + panic("oblBal != 9000007455") + } +} + +func endExternalIncentive() { + std.TestSetOrigCaller(test1) + std.TestSkipHeights(9999999) + + sr.EndExternalIncentive(std.GetOrigCaller().String(), "gno.land/r/demo/bar:gno.land/r/demo/foo:100", "gno.land/r/demo/obl") // use same parameter as CreateExternalIncentive() + std.TestSkipHeights(1) +} diff --git a/staker/_TEST_/z3_internal_external_filetest.gno b/staker/_TEST_/z3_internal_external_filetest.gno new file mode 100644 index 00000000..572d95f2 --- /dev/null +++ b/staker/_TEST_/z3_internal_external_filetest.gno @@ -0,0 +1,397 @@ +package main + +import ( + "std" + "strconv" + "testing" + + "gno.land/r/demo/bar" + "gno.land/r/demo/baz" + "gno.land/r/demo/foo" + "gno.land/r/demo/gns" + "gno.land/r/demo/obl" + "gno.land/r/demo/qux" + "gno.land/r/demo/wugnot" + + "gno.land/r/demo/gnft" + + "gno.land/p/demo/grc/grc721" + pusers "gno.land/p/demo/users" + + "gno.land/r/demo/gnoswap/common" + "gno.land/r/demo/gnoswap/consts" + + pl "gno.land/r/demo/pool" + pn "gno.land/r/demo/position" + rr "gno.land/r/demo/router" + sr "gno.land/r/demo/staker" +) + +var ( + gsa std.Address = consts.GNOSWAP_ADMIN + test1 std.Address = std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5") + + fooPath string = "gno.land/r/demo/foo" + barPath string = "gno.land/r/demo/bar" + bazPath string = "gno.land/r/demo/baz" + quxPath string = "gno.land/r/demo/qux" + + oblPath string = "gno.land/r/demo/obl" + + fee100 uint32 = 100 + fee500 uint32 = 500 + fee3000 uint32 = 3000 + + maxTimeout int64 = 9999999999 + + maxApprove uint64 = 18446744073709551615 + + TIMESTAMP_90DAYS int64 = 7776000 + + // TESTING + t *testing.T +) + +type FooToken struct{} + +func (FooToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return foo.Transfer +} +func (FooToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return foo.TransferFrom +} +func (FooToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return foo.BalanceOf +} +func (FooToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return foo.Approve +} + +type BarToken struct{} + +func (BarToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return bar.Transfer +} +func (BarToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return bar.TransferFrom +} +func (BarToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return bar.BalanceOf +} +func (BarToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return bar.Approve +} + +type BazToken struct{} + +func (BazToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return baz.Transfer +} +func (BazToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return baz.TransferFrom +} +func (BazToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return baz.BalanceOf +} +func (BazToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return baz.Approve +} + +type QuxToken struct{} + +func (QuxToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return qux.Transfer +} +func (QuxToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return qux.TransferFrom +} +func (QuxToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return qux.BalanceOf +} +func (QuxToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return qux.Approve +} + +type WugnotToken struct{} + +func (WugnotToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return wugnot.Transfer +} +func (WugnotToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return wugnot.TransferFrom +} +func (WugnotToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return wugnot.BalanceOf +} +func (WugnotToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return wugnot.Approve +} + +type OBLToken struct{} + +func (OBLToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return obl.Transfer +} +func (OBLToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return obl.TransferFrom +} +func (OBLToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return obl.BalanceOf +} +func (OBLToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return obl.Approve +} + +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 +} + +/* HELPER FUNCTIONS */ +func a2u(addr std.Address) pusers.AddressOrName { + return pusers.AddressOrName(addr) +} + +func tid(tokenId interface{}) grc721.TokenID { + switch tokenId.(type) { + case string: + return grc721.TokenID(tokenId.(string)) + case int: + return grc721.TokenID(strconv.Itoa(tokenId.(int))) + case uint64: + return grc721.TokenID(strconv.Itoa(int(tokenId.(uint64)))) + case grc721.TokenID: + return tokenId.(grc721.TokenID) + default: + panic("tid() || unsupported tokenId type") + } +} + +func ugnotBalanceOf(addr std.Address) uint64 { + testBanker := std.GetBanker(std.BankerTypeRealmIssue) + + coins := testBanker.GetCoins(addr) + if len(coins) == 0 { + return 0 + } + + return uint64(testBanker.GetCoins(addr)[0].Amount) +} + +func init() { + // FAUCET + std.TestSetPrevAddr(test1) + + for i := 0; i < 100; i++ { + foo.Faucet() + bar.Faucet() + baz.Faucet() + qux.Faucet() + obl.Faucet() + } + + // TOKEN REGISTER + std.TestSetPrevAddr(gsa) + pl.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) + + rr.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) + + sr.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) +} + +/* START TEST */ +func main() { + createPool() + setPoolTier() + mintBarQux() + mintBarBaz() + mintFooQux() + createExternalIncentive() + stakeTier01() + stakeTier02() + stakeExternal() + collectReward01() + collectReward01Again() + collectExternalReward() +} + +func createPool() { + numPool := uint64(4) + + // call gns faucet to get creation fee + std.TestSetPrevAddr(test1) + for i := uint64(0); i < (5 * numPool); i++ { + gns.Faucet() + std.TestSkipHeights(1) + } + + gns.Approve(a2u(consts.POOL_ADDR), consts.POOL_CREATION_FEE*numPool) + std.TestSkipHeights(1) + + pl.CreatePool(barPath, quxPath, fee500, common.TickMathGetSqrtRatioAtTick(10_000).ToString()) + pl.CreatePool(barPath, bazPath, fee100, common.TickMathGetSqrtRatioAtTick(0).ToString()) + pl.CreatePool(fooPath, quxPath, fee500, common.TickMathGetSqrtRatioAtTick(0).ToString()) + std.TestSkipHeights(3) +} + +func setPoolTier() { + std.TestSetPrevAddr(consts.GNOSWAP_ADMIN) + sr.SetPoolTier("gno.land/r/demo/bar:gno.land/r/demo/qux:500", 1) + sr.SetPoolTier("gno.land/r/demo/bar:gno.land/r/demo/baz:100", 1) + + sr.SetPoolTier("gno.land/r/demo/foo:gno.land/r/demo/qux:500", 2) +} + +func mintBarQux() { + std.TestSetPrevAddr(test1) + + bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + qux.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + + std.TestSetPrevRealm(consts.STAKER_PATH) + pn.Mint(barPath, quxPath, fee500, 9000, 11000, "100000", "100000", "0", "0", maxTimeout, test1.String()) +} + +func mintBarBaz() { + std.TestSetPrevAddr(test1) + + bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + baz.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + + std.TestSetPrevRealm(consts.STAKER_PATH) + pn.Mint(barPath, bazPath, fee100, -1000, 1000, "100000", "100000", "0", "0", maxTimeout, test1.String()) +} + +func mintFooQux() { + std.TestSetPrevAddr(test1) + + foo.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + qux.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + + std.TestSetPrevRealm(consts.STAKER_PATH) + pn.Mint(fooPath, quxPath, fee500, -1000, 11000, "100000", "100000", "0", "0", maxTimeout, test1.String()) +} + +func createExternalIncentive() { + std.TestSetPrevAddr(test1) + obl.Approve(a2u(consts.STAKER_ADDR), 10_000_000_000) + std.TestSkipHeights(1) + + sr.CreateExternalIncentive( + "gno.land/r/demo/foo:gno.land/r/demo/qux:500", // targetPoolPath + oblPath, // rewardToken + "1000000000", // rewardAmount + 1234569600, // startTimestamp + 1234569600+TIMESTAMP_90DAYS, // endTimestamp + ) + std.TestSkipHeights(1) +} + +func stakeTier01() { + std.TestSetPrevAddr(test1) + gnft.Approve(a2u(consts.STAKER_ADDR), tid(1)) + sr.StakeToken(1) + + std.TestSkipHeights(2) +} + +func stakeTier02() { + std.TestSetPrevAddr(test1) + gnft.Approve(a2u(consts.STAKER_ADDR), tid(2)) + sr.StakeToken(2) + + std.TestSkipHeights(2) +} + +func stakeExternal() { + std.TestSetPrevAddr(test1) + gnft.Approve(a2u(consts.STAKER_ADDR), tid(3)) + sr.StakeToken(3) + + std.TestSkipHeights(2) +} + +func collectReward01() { + std.TestSetPrevAddr(consts.INTERNAL_REWARD_ACCOUNT) + gns.Approve(a2u(consts.STAKER_ADDR), consts.UINT64_MAX) // internal reward distribution + std.TestSkipHeights(1) + + gnsBal := gns.BalanceOf(a2u(test1)) + if gnsBal != 500000000 { + panic("collectReward01() || gnsBal != 500000000") + } + + std.TestSetPrevAddr(test1) + sr.CollectReward(1) + + gnsBal = gns.BalanceOf(a2u(test1)) + if gnsBal != 500266805 { + panic("collectReward01() || gnsBal != 500266805") + } +} + +func collectReward01Again() { + std.TestSetPrevAddr(test1) + + gnsBal := gns.BalanceOf(a2u(test1)) + if gnsBal != 500266805 { + panic("collectReward01Again() || gnsBal != 500266805") + } + + // ACCELERATE TIME + std.TestSkipHeights(1000) + + sr.CollectReward(1) + std.TestSkipHeights(1) + + gnsBal = gns.BalanceOf(a2u(test1)) + if gnsBal != 538381805 { + panic("collectReward01() || gnsBal != 538381805") + } +} + +func collectExternalReward() { + std.TestSetPrevAddr(test1) + + oblBal := obl.BalanceOf(a2u(test1)) + if oblBal != 9000000000 { + panic("collectExternalReward() || oblBal != 9000000000") + } + + sr.CollectReward(3) + oblBal = obl.BalanceOf(a2u(test1)) + if oblBal != 9000145306 { + panic("collectExternalReward() || oblBal != 9000145306") + } +} diff --git a/staker/_TEST_/_TEST_0_INIT_TOKEN_REGISTER_test.gno b/staker/_TEST_/z4_mint_and_stake_filetest.gno similarity index 50% rename from staker/_TEST_/_TEST_0_INIT_TOKEN_REGISTER_test.gno rename to staker/_TEST_/z4_mint_and_stake_filetest.gno index f181db81..3d2b4b88 100644 --- a/staker/_TEST_/_TEST_0_INIT_TOKEN_REGISTER_test.gno +++ b/staker/_TEST_/z4_mint_and_stake_filetest.gno @@ -1,27 +1,53 @@ -package staker +package main import ( "std" + "strconv" + "testing" + "gno.land/r/demo/bar" + "gno.land/r/demo/baz" "gno.land/r/demo/foo" + "gno.land/r/demo/gns" + "gno.land/r/demo/obl" + "gno.land/r/demo/qux" + "gno.land/r/demo/wugnot" - "gno.land/r/demo/bar" + "gno.land/p/demo/grc/grc721" + pusers "gno.land/p/demo/users" - "gno.land/r/demo/baz" + "gno.land/r/demo/gnoswap/common" + "gno.land/r/demo/gnoswap/consts" - "gno.land/r/demo/qux" + pl "gno.land/r/demo/pool" + pn "gno.land/r/demo/position" + rr "gno.land/r/demo/router" + sr "gno.land/r/demo/staker" +) - "gno.land/r/demo/wugnot" +var ( + gsa std.Address = consts.GNOSWAP_ADMIN + test1 std.Address = std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5") - "gno.land/r/demo/obl" + fooPath string = "gno.land/r/demo/foo" + barPath string = "gno.land/r/demo/bar" + bazPath string = "gno.land/r/demo/baz" + quxPath string = "gno.land/r/demo/qux" - "gno.land/r/demo/gns" + oblPath string = "gno.land/r/demo/obl" - "gno.land/r/demo/gnoswap/consts" + fee100 uint32 = 100 + fee500 uint32 = 500 + fee3000 uint32 = 3000 - pusers "gno.land/p/demo/users" + maxTimeout int64 = 9999999999 - pl "gno.land/r/demo/pool" + maxApprove uint64 = 18446744073709551615 + + TIMESTAMP_90DAYS int64 = 7776000 + + // TESTING + t *testing.T ) type FooToken struct{} @@ -132,24 +158,126 @@ func (GNSToken) Approve() func(spender pusers.AddressOrName, amount uint64) { return gns.Approve } +/* HELPER FUNCTIONS */ +func a2u(addr std.Address) pusers.AddressOrName { + return pusers.AddressOrName(addr) +} + +func tid(tokenId interface{}) grc721.TokenID { + switch tokenId.(type) { + case string: + return grc721.TokenID(tokenId.(string)) + case int: + return grc721.TokenID(strconv.Itoa(tokenId.(int))) + case uint64: + return grc721.TokenID(strconv.Itoa(int(tokenId.(uint64)))) + case grc721.TokenID: + return tokenId.(grc721.TokenID) + default: + panic("tid() || unsupported tokenId type") + } +} + +func ugnotBalanceOf(addr std.Address) uint64 { + testBanker := std.GetBanker(std.BankerTypeRealmIssue) + + coins := testBanker.GetCoins(addr) + if len(coins) == 0 { + return 0 + } + + return uint64(testBanker.GetCoins(addr)[0].Amount) +} + func init() { - std.TestSetOrigCaller(consts.GNOSWAP_ADMIN) + // FAUCET + std.TestSetPrevAddr(test1) - // POOL - pl.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + for i := 0; i < 100; i++ { + foo.Faucet() + bar.Faucet() + baz.Faucet() + qux.Faucet() + obl.Faucet() + } + + // TOKEN REGISTER + std.TestSetPrevAddr(gsa) pl.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) pl.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) pl.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) - pl.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) pl.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) pl.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) - // STAKER - RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) - RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) - RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) - RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) - RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) - RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) - RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) + + sr.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) +} + +/* START TEST */ +func main() { + createPool() + mintAndStake() + collectFee() + collectReward() + unstakeToken() +} + +func createPool() { + numPool := uint64(1) + + // call gns faucet to get creation fee + std.TestSetPrevAddr(test1) + for i := uint64(0); i < (5 * numPool); i++ { + gns.Faucet() + std.TestSkipHeights(1) + } + + gns.Approve(a2u(consts.POOL_ADDR), consts.POOL_CREATION_FEE*numPool) + std.TestSkipHeights(1) + + pl.CreatePool(barPath, quxPath, fee500, common.TickMathGetSqrtRatioAtTick(10_000).ToString()) + std.TestSkipHeights(1) +} + +func mintAndStake() { + std.TestSetPrevAddr(test1) + + bar.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + qux.Approve(a2u(consts.POOL_ADDR), consts.UINT64_MAX) + + sr.MintAndStake(barPath, quxPath, fee500, 9000, 11000, "100000", "100000", "0", "0", maxTimeout) +} + +func collectFee() { + std.TestSetPrevAddr(test1) + pn.CollectFee(1) +} + +func collectReward() { + // internal reward distribution + std.TestSetPrevAddr(consts.INTERNAL_REWARD_ACCOUNT) + gns.Approve(a2u(consts.STAKER_ADDR), consts.UINT64_MAX) + + std.TestSetPrevAddr(test1) + sr.CollectReward(1) +} + +func unstakeToken() { + std.TestSetPrevAddr(test1) + sr.UnstakeToken(1) } diff --git a/staker/_TEST_/z5_manage_pool_tier_filetest.gno b/staker/_TEST_/z5_manage_pool_tier_filetest.gno new file mode 100644 index 00000000..e83c4121 --- /dev/null +++ b/staker/_TEST_/z5_manage_pool_tier_filetest.gno @@ -0,0 +1,283 @@ +package main + +import ( + "std" + "strconv" + "testing" + + "gno.land/r/demo/bar" + "gno.land/r/demo/baz" + "gno.land/r/demo/foo" + "gno.land/r/demo/gns" + "gno.land/r/demo/obl" + "gno.land/r/demo/qux" + "gno.land/r/demo/wugnot" + + "gno.land/p/demo/grc/grc721" + pusers "gno.land/p/demo/users" + + "gno.land/r/demo/gnoswap/common" + "gno.land/r/demo/gnoswap/consts" + + pl "gno.land/r/demo/pool" + rr "gno.land/r/demo/router" + sr "gno.land/r/demo/staker" +) + +var ( + gsa std.Address = consts.GNOSWAP_ADMIN + test1 std.Address = std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5") + + fooPath string = "gno.land/r/demo/foo" + barPath string = "gno.land/r/demo/bar" + bazPath string = "gno.land/r/demo/baz" + quxPath string = "gno.land/r/demo/qux" + + oblPath string = "gno.land/r/demo/obl" + + fee100 uint32 = 100 + fee500 uint32 = 500 + fee3000 uint32 = 3000 + + maxTimeout int64 = 9999999999 + + maxApprove uint64 = 18446744073709551615 + + TIMESTAMP_90DAYS int64 = 7776000 + + // TESTING + t *testing.T +) + +type FooToken struct{} + +func (FooToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return foo.Transfer +} +func (FooToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return foo.TransferFrom +} +func (FooToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return foo.BalanceOf +} +func (FooToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return foo.Approve +} + +type BarToken struct{} + +func (BarToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return bar.Transfer +} +func (BarToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return bar.TransferFrom +} +func (BarToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return bar.BalanceOf +} +func (BarToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return bar.Approve +} + +type BazToken struct{} + +func (BazToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return baz.Transfer +} +func (BazToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return baz.TransferFrom +} +func (BazToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return baz.BalanceOf +} +func (BazToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return baz.Approve +} + +type QuxToken struct{} + +func (QuxToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return qux.Transfer +} +func (QuxToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return qux.TransferFrom +} +func (QuxToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return qux.BalanceOf +} +func (QuxToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return qux.Approve +} + +type WugnotToken struct{} + +func (WugnotToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return wugnot.Transfer +} +func (WugnotToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return wugnot.TransferFrom +} +func (WugnotToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return wugnot.BalanceOf +} +func (WugnotToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return wugnot.Approve +} + +type OBLToken struct{} + +func (OBLToken) Transfer() func(to pusers.AddressOrName, amount uint64) { + return obl.Transfer +} +func (OBLToken) TransferFrom() func(from, to pusers.AddressOrName, amount uint64) { + return obl.TransferFrom +} +func (OBLToken) BalanceOf() func(owner pusers.AddressOrName) uint64 { + return obl.BalanceOf +} +func (OBLToken) Approve() func(spender pusers.AddressOrName, amount uint64) { + return obl.Approve +} + +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 +} + +/* HELPER FUNCTIONS */ +func a2u(addr std.Address) pusers.AddressOrName { + return pusers.AddressOrName(addr) +} + +func tid(tokenId interface{}) grc721.TokenID { + switch tokenId.(type) { + case string: + return grc721.TokenID(tokenId.(string)) + case int: + return grc721.TokenID(strconv.Itoa(tokenId.(int))) + case uint64: + return grc721.TokenID(strconv.Itoa(int(tokenId.(uint64)))) + case grc721.TokenID: + return tokenId.(grc721.TokenID) + default: + panic("tid() || unsupported tokenId type") + } +} + +func ugnotBalanceOf(addr std.Address) uint64 { + testBanker := std.GetBanker(std.BankerTypeRealmIssue) + + coins := testBanker.GetCoins(addr) + if len(coins) == 0 { + return 0 + } + + return uint64(testBanker.GetCoins(addr)[0].Amount) +} + +func init() { + // FAUCET + std.TestSetPrevAddr(test1) + + for i := 0; i < 100; i++ { + foo.Faucet() + bar.Faucet() + baz.Faucet() + qux.Faucet() + obl.Faucet() + } + + // TOKEN REGISTER + std.TestSetPrevAddr(gsa) + pl.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) + pl.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) + + rr.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) + rr.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) + + sr.RegisterGRC20Interface("gno.land/r/demo/foo", FooToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/bar", BarToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/baz", BazToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/qux", QuxToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/obl", OBLToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/wugnot", WugnotToken{}) + sr.RegisterGRC20Interface("gno.land/r/demo/gns", GNSToken{}) +} + +/* START TEST */ +func main() { + createPool() + setPoolTier() + changePoolTier() + removePoolTier() +} + +func createPool() { + numPool := uint64(1) + + // call gns faucet to get creation fee + std.TestSetPrevAddr(test1) + for i := uint64(0); i < (5 * numPool); i++ { + gns.Faucet() + std.TestSkipHeights(1) + } + + gns.Approve(a2u(consts.POOL_ADDR), consts.POOL_CREATION_FEE*numPool) + std.TestSkipHeights(1) + + pl.CreatePool(barPath, quxPath, fee500, common.TickMathGetSqrtRatioAtTick(10_000).ToString()) + std.TestSkipHeights(1) +} + +func setPoolTier() { + std.TestSetPrevAddr(consts.GNOSWAP_ADMIN) + sr.SetPoolTier("gno.land/r/demo/bar:gno.land/r/demo/qux:500", 2) + + poolTier := sr.GetPoolWithTiers()["gno.land/r/demo/bar:gno.land/r/demo/qux:500"] + if poolTier != 2 { + panic("pool tier not set") + } +} + +func changePoolTier() { + std.TestSetPrevAddr(consts.GNOSWAP_ADMIN) + sr.ChangePoolTier("gno.land/r/demo/bar:gno.land/r/demo/qux:500", 3) + + poolTier := sr.GetPoolWithTiers()["gno.land/r/demo/bar:gno.land/r/demo/qux:500"] + if poolTier != 3 { + panic("pool tier not updated") + } +} + +func removePoolTier() { + std.TestSetPrevAddr(consts.GNOSWAP_ADMIN) + sr.RemovePoolTier("gno.land/r/demo/bar:gno.land/r/demo/qux:500") + + _, exist := sr.GetPoolWithTiers()["gno.land/r/demo/bar:gno.land/r/demo/qux:500"] + if exist { + panic("pool tier not removed") + } +}