Skip to content

Commit

Permalink
feat: external incentive getter
Browse files Browse the repository at this point in the history
  • Loading branch information
r3v4s committed Apr 11, 2024
1 parent 8bba9a3 commit 3448c40
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 29 deletions.
71 changes: 56 additions & 15 deletions staker/_RPC_api_incentive.gno
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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())),
Expand All @@ -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)),
Expand All @@ -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 {
Expand Down
41 changes: 27 additions & 14 deletions staker/_TEST_/_TEST_staker_rpc_get_test.gn
Original file line number Diff line number Diff line change
@@ -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"
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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
Expand All @@ -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) {
Expand All @@ -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) {
Expand All @@ -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) {
Expand Down

0 comments on commit 3448c40

Please sign in to comment.