From 3448c40ec98bf42cc7405f4e27118e91ad34bad5 Mon Sep 17 00:00:00 2001 From: n3wbie Date: Thu, 11 Apr 2024 11:10:37 +0900 Subject: [PATCH] feat: external incentive getter --- staker/_RPC_api_incentive.gno | 71 +++++++++++++++++----- staker/_TEST_/_TEST_staker_rpc_get_test.gn | 41 ++++++++----- 2 files changed, 83 insertions(+), 29 deletions(-) diff --git a/staker/_RPC_api_incentive.gno b/staker/_RPC_api_incentive.gno index 39edadc6..00f7ffd7 100644 --- a/staker/_RPC_api_incentive.gno +++ b/staker/_RPC_api_incentive.gno @@ -17,9 +17,13 @@ type RewardToken struct { RewardsTokenList []string `json:"rewardsTokenList"` } -type ResponseRewardTokens struct { - Stat ResponseQueryBase `json:"stat"` - Response []RewardToken `json:"response"` +type ApiIncentive struct { + PoolPath string `json:"poolPath"` + RewardToken string `json:"rewardToken"` + RewardAmount string `json:"rewardAmount"` + StartTimestamp int64 `json:"startTimestamp"` + EndTimestamp int64 `json:"endTimestamp"` + Refundee string `json:"refundee"` } func ApiGetRewardTokens() string { @@ -46,17 +50,6 @@ func ApiGetRewardTokens() string { }) } - // JSON - qb := ResponseQueryBase{ - Height: std.GetHeight(), - Timestamp: time.Now().Unix(), - } - - r := ResponseRewardTokens{ - Stat: qb, - Response: rewardTokens, - } - // STAT NODE _stat := json.ObjectNode("", map[string]*json.Node{ "height": json.NumberNode("height", float64(std.GetHeight())), @@ -65,7 +58,7 @@ func ApiGetRewardTokens() string { // RESPONSE (ARRAY) NODE responses := json.ArrayNode("", []*json.Node{}) - for i, rewardToken := range r.Response { + for i, rewardToken := range rewardTokens { _rewardTokenNode := json.ObjectNode("", map[string]*json.Node{ "poolPath": json.StringNode("poolPath", rewardToken.PoolPath), "tokens": json.ArrayNode("tokens", makeRewardTokensArray(rewardToken.RewardsTokenList)), @@ -86,6 +79,54 @@ func ApiGetRewardTokens() string { return string(b) } +func ApiGetIncentives() string { + apiIncentives := []ApiIncentive{} + + for _, incentive := range incentives { + apiIncentives = append(apiIncentives, ApiIncentive{ + PoolPath: incentive.targetPoolPath, + RewardToken: incentive.rewardToken, + RewardAmount: incentive.rewardAmount.ToString(), + StartTimestamp: incentive.startTimestamp, + EndTimestamp: incentive.endTimestamp, + Refundee: incentive.refundee.String(), + }) + } + + // STAT NODE + _stat := json.ObjectNode("", map[string]*json.Node{ + "height": json.NumberNode("height", float64(std.GetHeight())), + "timestamp": json.NumberNode("timestamp", float64(time.Now().Unix())), + }) + + // RESPONSE (ARRAY) NODE + responses := json.ArrayNode("", []*json.Node{}) + for _, incentive := range apiIncentives { + _incentiveNode := json.ObjectNode("", map[string]*json.Node{ + "poolPath": json.StringNode("poolPath", incentive.PoolPath), + "rewardToken": json.StringNode("rewardToken", incentive.RewardToken), + "rewardAmount": json.StringNode("rewardAmount", incentive.RewardAmount), + "startTimestamp": json.NumberNode("startTimestamp", float64(incentive.StartTimestamp)), + "endTimestamp": json.NumberNode("endTimestamp", float64(incentive.EndTimestamp)), + "refundee": json.StringNode("refundee", incentive.Refundee), + }) + responses.AppendArray(_incentiveNode) + } + + // RETURN + node := json.ObjectNode("", map[string]*json.Node{ + "stat": _stat, + "response": responses, + }) + + b, err := json.Marshal(node) + if err != nil { + panic(ufmt.Sprintf("[STAKER] _RPC_api_stake.gno__ApiGetIncentives() || json marshal error: %s", err.Error())) + } + + return string(b) +} + func makeRewardTokensArray(rewardsTokenList []string) []*json.Node { rewardsTokenArray := make([]*json.Node, len(rewardsTokenList)) for i, rewardToken := range rewardsTokenList { diff --git a/staker/_TEST_/_TEST_staker_rpc_get_test.gn b/staker/_TEST_/_TEST_staker_rpc_get_test.gn index a2ce9226..c2e7f854 100644 --- a/staker/_TEST_/_TEST_staker_rpc_get_test.gn +++ b/staker/_TEST_/_TEST_staker_rpc_get_test.gn @@ -1,11 +1,9 @@ package staker import ( + "gno.land/p/demo/json" "std" "testing" - "time" - - "gno.land/p/demo/json" pl "gno.land/r/demo/pool" pn "gno.land/r/demo/position" @@ -118,23 +116,23 @@ func TestCreateExternalIncentive(t *testing.T) { CreateExternalIncentive( "gno.land/r/demo/bar:gno.land/r/demo/qux:500", // targetPoolPath - oblPath, // rewardToken - "1000000000", // rewardAmount - time.Now().Unix(), // startTimestamp - time.Now().Unix()+TIMESTAMP_90DAYS, // endTimestamp + 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", time.Now().Unix(), time.Now().Unix()+TIMESTAMP_90DAYS) + 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(1) + std.TestSkipHeights(500) shouldEQ(t, gnft.OwnerOf(tid(1)), GetOrigPkgAddr()) // staker shouldEQ(t, len(deposits), 1) @@ -179,6 +177,21 @@ func TestApiGetStakes(t *testing.T) { 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 @@ -193,7 +206,7 @@ func TestCollectReward(t *testing.T) { std.TestSkipHeights(1) gnsNew := gns.BalanceOf(a2u(test1)) - shouldEQ(t, gnsNew, 18377) + shouldEQ(t, gnsNew, 3075063) } func TestUnstakeToken01(t *testing.T) { @@ -204,8 +217,8 @@ func TestUnstakeToken01(t *testing.T) { shouldEQ(t, gnft.OwnerOf(tid(1)), test1) // check reward - shouldEQ(t, gns.BalanceOf(a2u(test1)), 24503) // internal - shouldEQ(t, obl.BalanceOf(a2u(test1)), 8000000253) // external + shouldEQ(t, gns.BalanceOf(a2u(test1)), 3081190) // internal + shouldEQ(t, obl.BalanceOf(a2u(test1)), 8000011025) // external } func TestUnstakeToken02(t *testing.T) { @@ -216,9 +229,9 @@ func TestUnstakeToken02(t *testing.T) { shouldEQ(t, gnft.OwnerOf(tid(2)), test1) // check reward - shouldEQ(t, gns.BalanceOf(a2u(test1)), 187853) + shouldEQ(t, gns.BalanceOf(a2u(test1)), 3244540) // internal - shouldEQ(t, obl.BalanceOf(a2u(test1)), 8000001933) // external + shouldEQ(t, obl.BalanceOf(a2u(test1)), 8000012705) // external } func TestEndExternalIncentive(t *testing.T) {