Skip to content

Commit

Permalink
test join staking and fix trading reward counter
Browse files Browse the repository at this point in the history
  • Loading branch information
faneaatiku committed Apr 20, 2024
1 parent 3eb65d3 commit ddb39dc
Show file tree
Hide file tree
Showing 2 changed files with 217 additions and 3 deletions.
213 changes: 213 additions & 0 deletions x/rewards/keeper/msg_server_join_staking_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,213 @@
package keeper_test

import (
"github.com/bze-alphateam/bze/testutil/simapp"
"github.com/bze-alphateam/bze/x/rewards/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
)

func (suite *IntegrationTestSuite) TestMsgJoinStaking_InvalidRequest() {
goCtx := sdk.WrapSDKContext(suite.ctx)

_, err := suite.msgServer.JoinStaking(goCtx, nil)
suite.Require().Error(err)
suite.Require().ErrorIs(err, sdkerrors.ErrInvalidRequest)
}

func (suite *IntegrationTestSuite) TestMsgJoinStaking_InvalidCreator() {
//dependencies
goCtx := sdk.WrapSDKContext(suite.ctx)
msg := types.MsgJoinStaking{
Creator: "",
RewardId: "",
Amount: "",
}

_, err := suite.msgServer.JoinStaking(goCtx, &msg)
suite.Require().Error(err)
}

func (suite *IntegrationTestSuite) TestMsgJoinStaking_MissingStakingReward() {
//dependencies
goCtx := sdk.WrapSDKContext(suite.ctx)
addr1 := sdk.AccAddress("addr1_______________")
msg := types.MsgJoinStaking{
Creator: addr1.String(),
RewardId: "0001",
Amount: "",
}

_, err := suite.msgServer.JoinStaking(goCtx, &msg)
suite.Require().Error(err)
suite.Require().ErrorContains(err, "reward with provided id not found")
}

func (suite *IntegrationTestSuite) TestMsgJoinStaking_AmountLowerThanMinStake() {
//dependencies
goCtx := sdk.WrapSDKContext(suite.ctx)
addr1 := sdk.AccAddress("addr1_______________")
sr := types.StakingReward{
RewardId: "01",
PrizeDenom: denomBze,
StakedAmount: "50",
DistributedStake: "5",
Lock: 100,
StakingDenom: denomBze,
Duration: 100,
Payouts: 5,
MinStake: 1000,
}
suite.k.SetStakingReward(suite.ctx, sr)

msg := types.MsgJoinStaking{
Creator: addr1.String(),
RewardId: sr.RewardId,
Amount: "1",
}

_, err := suite.msgServer.JoinStaking(goCtx, &msg)
suite.Require().Error(err)
suite.Require().ErrorContains(err, "amount is smaller than staking reward min stake")
}

func (suite *IntegrationTestSuite) TestMsgJoinStaking_NotEnoughBalance() {
//dependencies
goCtx := sdk.WrapSDKContext(suite.ctx)
addr1 := sdk.AccAddress("addr1_______________")
sr := types.StakingReward{
RewardId: "01",
PrizeDenom: denomBze,
StakedAmount: "50",
DistributedStake: "5",
Lock: 100,
StakingDenom: denomBze,
Duration: 100,
Payouts: 5,
MinStake: 1,
}
suite.k.SetStakingReward(suite.ctx, sr)

//test and assertions
msg := types.MsgJoinStaking{
Creator: addr1.String(),
RewardId: sr.RewardId,
Amount: "10",
}

_, err := suite.msgServer.JoinStaking(goCtx, &msg)
suite.Require().Error(err)
suite.Require().ErrorContains(err, "user balance is too low")
}

func (suite *IntegrationTestSuite) TestMsgJoinStaking_Success_NewParticipant() {
//dependencies
goCtx := sdk.WrapSDKContext(suite.ctx)
addr1 := sdk.AccAddress("addr1_______________")

balances := sdk.NewCoins(sdk.NewInt64Coin("ubze", 10000))
suite.Require().NoError(simapp.FundAccount(suite.app.BankKeeper, suite.ctx, addr1, balances))

sr := types.StakingReward{
RewardId: "01",
PrizeDenom: denomBze,
StakedAmount: "0",
DistributedStake: "0",
Lock: 100,
StakingDenom: denomBze,
Duration: 100,
Payouts: 5,
MinStake: 1,
}
suite.k.SetStakingReward(suite.ctx, sr)

//test and assertions
msg := types.MsgJoinStaking{
Creator: addr1.String(),
RewardId: sr.RewardId,
Amount: "10",
}

_, err := suite.msgServer.JoinStaking(goCtx, &msg)
suite.Require().NoError(err)

part, f := suite.k.GetStakingRewardParticipant(suite.ctx, msg.Creator, sr.RewardId)
suite.Require().True(f)
suite.Require().EqualValues(part.JoinedAt, sr.DistributedStake)
suite.Require().EqualValues(part.Address, msg.Creator)
suite.Require().EqualValues(part.Amount, msg.Amount)
suite.Require().EqualValues(part.RewardId, msg.RewardId)

storageSr, f := suite.k.GetStakingReward(suite.ctx, sr.RewardId)
suite.Require().True(f)
suite.Require().EqualValues(storageSr.StakedAmount, "10")

creatorBalance := suite.app.BankKeeper.GetAllBalances(suite.ctx, addr1)
//check the user retrieves the unclaimed rewards first
suite.Require().EqualValues(creatorBalance.AmountOf(denomBze).String(), "9990")

//check balances were subtracted from module
moduleAddr := suite.app.AccountKeeper.GetModuleAddress(types.ModuleName)
newBalances := suite.app.BankKeeper.GetAllBalances(suite.ctx, moduleAddr)
suite.Require().EqualValues(newBalances.AmountOf(denomBze).String(), "10")
}

func (suite *IntegrationTestSuite) TestMsgJoinStaking_Success_ExistingParticipant() {
//dependencies
goCtx := sdk.WrapSDKContext(suite.ctx)
addr1 := sdk.AccAddress("addr1_______________")

balances := sdk.NewCoins(sdk.NewInt64Coin("ubze", 10000))
suite.Require().NoError(simapp.FundAccount(suite.app.BankKeeper, suite.ctx, addr1, balances))

sr := types.StakingReward{
RewardId: "01",
PrizeDenom: denomBze,
StakedAmount: "50",
DistributedStake: "0",
Lock: 100,
StakingDenom: denomBze,
Duration: 100,
Payouts: 0,
MinStake: 10,
}
suite.k.SetStakingReward(suite.ctx, sr)

srp := types.StakingRewardParticipant{
Address: addr1.String(),
RewardId: sr.RewardId,
Amount: "50",
JoinedAt: "0",
}
suite.k.SetStakingRewardParticipant(suite.ctx, srp)

//test and assertions
msg := types.MsgJoinStaking{
Creator: addr1.String(),
RewardId: sr.RewardId,
Amount: "10",
}

_, err := suite.msgServer.JoinStaking(goCtx, &msg)
suite.Require().NoError(err)

part, f := suite.k.GetStakingRewardParticipant(suite.ctx, msg.Creator, sr.RewardId)
suite.Require().True(f)
suite.Require().EqualValues(part.JoinedAt, sr.DistributedStake)
suite.Require().EqualValues(part.Address, msg.Creator)
suite.Require().EqualValues(part.Amount, "60")
suite.Require().EqualValues(part.RewardId, msg.RewardId)

storageSr, f := suite.k.GetStakingReward(suite.ctx, sr.RewardId)
suite.Require().True(f)
suite.Require().EqualValues(storageSr.StakedAmount, "60")

creatorBalance := suite.app.BankKeeper.GetAllBalances(suite.ctx, addr1)
//check the user retrieves the unclaimed rewards first
suite.Require().EqualValues(creatorBalance.AmountOf(denomBze).String(), "9990")

//check balances were subtracted from module
moduleAddr := suite.app.AccountKeeper.GetModuleAddress(types.ModuleName)
newBalances := suite.app.BankKeeper.GetAllBalances(suite.ctx, moduleAddr)
suite.Require().EqualValues(newBalances.AmountOf(denomBze).String(), "10")
}
7 changes: 4 additions & 3 deletions x/rewards/keeper/trading_reward.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ func (k Keeper) getPendingTradingRewardStore(ctx sdk.Context) prefix.Store {
return prefix.NewStore(ctx.KVStore(k.storeKey), types.KeyPrefix(types.PendingTradingRewardKeyPrefix))
}

func (k Keeper) setTradingReward(store prefix.Store, tradingReward types.TradingReward) {
func (k Keeper) setTradingReward(ctx sdk.Context, store prefix.Store, tradingReward types.TradingReward) {
b := k.cdc.MustMarshal(&tradingReward)
store.Set(types.TradingRewardKey(tradingReward.RewardId), b)
k.incrementTradingRewardsCounter(ctx)
}

func (k Keeper) getTradingReward(store prefix.Store, rewardId string) (val types.TradingReward, found bool) {
Expand Down Expand Up @@ -52,7 +53,7 @@ func (k Keeper) getAllTradingReward(store prefix.Store) (list []types.TradingRew
// SetPendingTradingReward set a specific tradingReward in the store from its index
func (k Keeper) SetPendingTradingReward(ctx sdk.Context, tradingReward types.TradingReward) {
store := k.getPendingTradingRewardStore(ctx)
k.setTradingReward(store, tradingReward)
k.setTradingReward(ctx, store, tradingReward)
}

// GetPendingTradingReward returns a tradingReward from its index
Expand All @@ -78,7 +79,7 @@ func (k Keeper) GetAllPendingTradingReward(ctx sdk.Context) []types.TradingRewar
// SetActiveTradingReward set a specific tradingReward in the store from its index
func (k Keeper) SetActiveTradingReward(ctx sdk.Context, tradingReward types.TradingReward) {
store := k.getActiveTradingRewardStore(ctx)
k.setTradingReward(store, tradingReward)
k.setTradingReward(ctx, store, tradingReward)
}

// GetActiveTradingReward returns a tradingReward from its index
Expand Down

0 comments on commit ddb39dc

Please sign in to comment.