Skip to content

Commit

Permalink
Merge pull request #844 from persistenceOne/puneet/UpdateLiquidValida…
Browse files Browse the repository at this point in the history
…torSet

refactor: re-add UpdateLiquidValidatorSet to begin blocker
  • Loading branch information
puneet2019 authored May 30, 2024
2 parents aa89857 + f4aaf18 commit 867aec8
Show file tree
Hide file tree
Showing 11 changed files with 144 additions and 114 deletions.
20 changes: 20 additions & 0 deletions x/liquidstake/abci.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package liquidstake

import (
"time"

"github.com/cosmos/cosmos-sdk/telemetry"
sdk "github.com/cosmos/cosmos-sdk/types"

"github.com/persistenceOne/pstake-native/v2/x/liquidstake/keeper"
"github.com/persistenceOne/pstake-native/v2/x/liquidstake/types"
)

func BeginBlock(ctx sdk.Context, k keeper.Keeper) {
defer telemetry.ModuleMeasureSince(types.ModuleName, time.Now(), telemetry.MetricKeyBeginBlocker)

if !k.GetParams(ctx).ModulePaused {
// return value of UpdateLiquidValidatorSet is useful only in testing
_ = k.UpdateLiquidValidatorSet(ctx, false)
}
}
4 changes: 2 additions & 2 deletions x/liquidstake/keeper/genesis_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ func (s *KeeperTestSuite) TestImportExportGenesis() {
}
params.ModulePaused = false
k.SetParams(ctx, params)
k.UpdateLiquidValidatorSet(ctx)
k.UpdateLiquidValidatorSet(ctx, true)

stakingAmt := math.NewInt(100000000)
s.Require().NoError(s.liquidStaking(s.delAddrs[0], stakingAmt))
Expand Down Expand Up @@ -55,7 +55,7 @@ func (s *KeeperTestSuite) TestImportExportGenesis() {
func (s *KeeperTestSuite) TestImportExportGenesisEmpty() {
k, ctx := s.keeper, s.ctx
k.SetParams(ctx, types.DefaultParams())
k.UpdateLiquidValidatorSet(ctx)
k.UpdateLiquidValidatorSet(ctx, true)
genState := k.ExportGenesis(ctx)

var genState2 types.GenesisState
Expand Down
4 changes: 2 additions & 2 deletions x/liquidstake/keeper/grpc_query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func (s *KeeperTestSuite) TestGRPCQueries() {
params := s.keeper.GetParams(s.ctx)
params.MinLiquidStakeAmount = math.NewInt(50000)
s.keeper.SetParams(s.ctx, params)
s.keeper.UpdateLiquidValidatorSet(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx, true)

// add active validator
params.WhitelistedValidators = []types.WhitelistedValidator{
Expand All @@ -30,7 +30,7 @@ func (s *KeeperTestSuite) TestGRPCQueries() {
{ValidatorAddress: valOpers[2].String(), TargetWeight: math.NewInt(3333)},
}
s.keeper.SetParams(s.ctx, params)
s.keeper.UpdateLiquidValidatorSet(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx, true)

// Test LiquidValidators grpc query
res := s.keeper.GetAllLiquidValidatorStates(s.ctx)
Expand Down
2 changes: 1 addition & 1 deletion x/liquidstake/keeper/hooks.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ func (k Keeper) BeforeEpochStart(ctx sdk.Context, epochIdentifier string, _ int6

if epochIdentifier == liquidstake.RebalanceEpoch {
// return value of UpdateLiquidValidatorSet is useful only in testing
_ = k.UpdateLiquidValidatorSet(ctx)
_ = k.UpdateLiquidValidatorSet(ctx, true)
}
}

Expand Down
2 changes: 1 addition & 1 deletion x/liquidstake/keeper/keeper_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func (s *KeeperTestSuite) SetupTest() {
params.UnstakeFeeRate = sdk.ZeroDec()
params.AutocompoundFeeRate = types.DefaultAutocompoundFeeRate
s.Require().NoError(s.keeper.SetParams(s.ctx, params))
s.keeper.UpdateLiquidValidatorSet(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx, true)
// call mint.BeginBlocker for init k.SetLastBlockTime(ctx, ctx.BlockTime())
mint.BeginBlocker(s.ctx, s.app.MintKeeper, minttypes.DefaultInflationCalculationFn)
}
Expand Down
20 changes: 10 additions & 10 deletions x/liquidstake/keeper/liquidstake_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ func (s *KeeperTestSuite) TestLiquidStake() {
params.MinLiquidStakeAmount = math.NewInt(50000)
params.ModulePaused = false
s.keeper.SetParams(s.ctx, params)
s.keeper.UpdateLiquidValidatorSet(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx, true)

stakingAmt := params.MinLiquidStakeAmount

Expand All @@ -38,7 +38,7 @@ func (s *KeeperTestSuite) TestLiquidStake() {
{ValidatorAddress: valOpers[2].String(), TargetWeight: math.NewInt(2000)},
}
s.keeper.SetParams(s.ctx, params)
s.keeper.UpdateLiquidValidatorSet(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx, true)

res := s.keeper.GetAllLiquidValidatorStates(s.ctx)
s.Require().Equal(params.WhitelistedValidators[0].ValidatorAddress,
Expand Down Expand Up @@ -254,7 +254,7 @@ func (s *KeeperTestSuite) TestLiquidStakeFromVestingAccount() {
}
params.ModulePaused = false
s.keeper.SetParams(s.ctx, params)
s.keeper.UpdateLiquidValidatorSet(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx, true)

from := s.delAddrs[0]
vestingAmt := s.app.BankKeeper.GetAllBalances(s.ctx, from)
Expand Down Expand Up @@ -294,7 +294,7 @@ func (s *KeeperTestSuite) TestLiquidStakeFromVestingAccount() {
func (s *KeeperTestSuite) TestLiquidStakeEdgeCases() {
_, valOpers, _ := s.CreateValidators([]int64{1000000, 2000000, 3000000})
params := s.keeper.GetParams(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx, true)
stakingAmt := math.NewInt(5000000)

// add active validator
Expand All @@ -305,7 +305,7 @@ func (s *KeeperTestSuite) TestLiquidStakeEdgeCases() {
}
params.ModulePaused = false
s.keeper.SetParams(s.ctx, params)
s.keeper.UpdateLiquidValidatorSet(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx, true)

// fail Invalid BondDenom case
_, err := s.keeper.LiquidStake(s.ctx, types.LiquidStakeProxyAcc, s.delAddrs[0], sdk.NewCoin("bad", stakingAmt))
Expand All @@ -318,7 +318,7 @@ func (s *KeeperTestSuite) TestLiquidStakeEdgeCases() {
s.Require().NoError(s.liquidStaking(s.delAddrs[0], hugeAmt))
s.Require().NoError(s.liquidUnstaking(s.delAddrs[0], math.NewInt(10), true))
s.Require().NoError(s.liquidUnstaking(s.delAddrs[0], hugeAmt, true))
s.keeper.UpdateLiquidValidatorSet(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx, true)
s.completeRedelegationUnbonding()
states := s.keeper.GetNetAmountState(s.ctx)
states.TotalLiquidTokens.Equal(hugeAmt)
Expand All @@ -333,7 +333,7 @@ func (s *KeeperTestSuite) TestLiquidUnstakeEdgeCases() {

_, valOpers, _ := s.CreateValidators([]int64{1000000, 2000000, 3000000})
params := s.keeper.GetParams(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx, true)
stakingAmt := math.NewInt(5000000)

// add active validator
Expand All @@ -344,7 +344,7 @@ func (s *KeeperTestSuite) TestLiquidUnstakeEdgeCases() {
}
params.ModulePaused = false
s.Require().NoError(s.keeper.SetParams(s.ctx, params))
s.keeper.UpdateLiquidValidatorSet(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx, true)

// success liquid stake
s.Require().NoError(s.liquidStaking(s.delAddrs[0], stakingAmt))
Expand Down Expand Up @@ -379,7 +379,7 @@ func (s *KeeperTestSuite) TestLiquidUnstakeEdgeCases() {
// set empty whitelisted, active liquid validator
params.WhitelistedValidators = []types.WhitelistedValidator{}
s.keeper.SetParams(s.ctx, params)
s.keeper.UpdateLiquidValidatorSet(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx, true)

// error case where there is a quantity that are unbonding balance or remaining rewards that is not re-stake or withdrawn in netAmount.
// NOT APPLICABLE since we do not validator unbond if validator goes inactive.
Expand Down Expand Up @@ -413,7 +413,7 @@ func (s *KeeperTestSuite) TestShareInflation() {
}
params.ModulePaused = false
s.keeper.SetParams(s.ctx, params)
s.keeper.UpdateLiquidValidatorSet(s.ctx)
s.keeper.UpdateLiquidValidatorSet(s.ctx, true)

initialStakingAmt := math.NewInt(1) // little amount
initializingStakingAmt := math.NewInt(10000) // normal amount
Expand Down
25 changes: 14 additions & 11 deletions x/liquidstake/keeper/rebalancing.go
Original file line number Diff line number Diff line change
Expand Up @@ -149,7 +149,7 @@ func (k Keeper) Rebalance(
return redelegations
}

func (k Keeper) UpdateLiquidValidatorSet(ctx sdk.Context) (redelegations []types.Redelegation) {
func (k Keeper) UpdateLiquidValidatorSet(ctx sdk.Context, redelegate bool) (redelegations []types.Redelegation) {
params := k.GetParams(ctx)
liquidValidators := k.GetAllLiquidValidators(ctx)
liquidValsMap := liquidValidators.Map()
Expand Down Expand Up @@ -177,18 +177,21 @@ func (k Keeper) UpdateLiquidValidatorSet(ctx sdk.Context) (redelegations []types

// rebalancing based updated liquid validators status with threshold, try by cachedCtx
// tombstone status also handled on Rebalance
redelegations = k.Rebalance(
ctx,
types.LiquidStakeProxyAcc,
liquidValidators,
whitelistedValsMap,
types.RebalancingTrigger,
)
if redelegate {
redelegations = k.Rebalance(
ctx,
types.LiquidStakeProxyAcc,
liquidValidators,
whitelistedValsMap,
types.RebalancingTrigger,
)

// if there are inactive liquid validators, do not unbond,
// instead let validator selection and rebalancing take care of it.
// if there are inactive liquid validators, do not unbond,
// instead let validator selection and rebalancing take care of it.

return redelegations
return redelegations
}
return nil
}

// AutocompoundStakingRewards withdraws staking rewards and re-stakes when over threshold.
Expand Down
Loading

0 comments on commit 867aec8

Please sign in to comment.