From 4b9f8e2e69878d0bbc170af1ff83064ec3765da8 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Thu, 12 Jan 2023 13:15:36 -0800 Subject: [PATCH 01/12] working on fix --- tests/simulator/sim_test.go | 2 + x/valset-pref/simulation/sim_msgs.go | 88 ++++++++++++++++++++------ x/valset-pref/valpref-module/module.go | 22 ++++--- 3 files changed, 83 insertions(+), 29 deletions(-) diff --git a/tests/simulator/sim_test.go b/tests/simulator/sim_test.go index 5db9e062f0e..3eb724baf62 100644 --- a/tests/simulator/sim_test.go +++ b/tests/simulator/sim_test.go @@ -41,6 +41,7 @@ func TestFullAppSimulation(t *testing.T) { osmosim.FlagPeriodValue = 10 osmosim.FlagSeedValue = 11 osmosim.FlagWriteStatsToDB = true + osmosim.FlagSeedValue = 5577006791947779410 fullAppSimulation(t, true) } @@ -84,6 +85,7 @@ func TestAppStateDeterminism(t *testing.T) { config.ExportConfig.ExportParamsPath = "" config.NumBlocks = 50 config.BlockSize = 5 + config.Seed = 5577006791947779410 config.OnOperation = false config.AllInvariants = false config.InitializationConfig.ChainID = helpers.SimAppChainID diff --git a/x/valset-pref/simulation/sim_msgs.go b/x/valset-pref/simulation/sim_msgs.go index c995ecedcf6..983088b3c95 100644 --- a/x/valset-pref/simulation/sim_msgs.go +++ b/x/valset-pref/simulation/sim_msgs.go @@ -8,6 +8,7 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + osmosimtypes "github.com/osmosis-labs/osmosis/v14/simulation/simtypes" valsetkeeper "github.com/osmosis-labs/osmosis/v14/x/valset-pref" "github.com/osmosis-labs/osmosis/v14/x/valset-pref/types" @@ -45,40 +46,80 @@ func RandomMsgDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, } func RandomMsgUnDelegateFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgUndelegateFromValidatorSet, error) { - delegator := sim.RandomSimAccount() - // check if the delegator valset created - err := GetRandomExistingValSet(ctx, k, sim, delegator.Address) - if err != nil { - return nil, err + // get a random validafor + val, ok := RandSliceElem(sim.StakingKeeper().GetAllValidators(ctx)) + if !ok { + return nil, fmt.Errorf("validator is not ok") } - // check that the delegator has delegated tokens - _, err = GetRandomExistingDelegation(ctx, k, sim, delegator.Address) + // get validator delegations + valAddr := val.GetOperator() + delegations := sim.StakingKeeper().GetValidatorDelegations(ctx, val.GetOperator()) + if delegations == nil { + return nil, fmt.Errorf("keeper does have any delegation entries") + } + + // get delegation information including the delegator + delegation := delegations[rand.Intn(len(delegations))] + delAddr := delegation.GetDelegatorAddr() + + // check if the delegator has valset created + err := GetRandomExistingValSet(ctx, k, sim, delAddr) if err != nil { return nil, err } - undelegationCoin := sim.RandExponentialCoin(ctx, delegator.Address) + // check if unbonding delegation has maximum number of entries + if sim.StakingKeeper().HasMaxUnbondingDelegationEntries(ctx, delAddr, valAddr) { + return nil, fmt.Errorf("keeper does have a max unbonding delegation entries") + } + + // Set the max amount to undelegate + totalBond := val.TokensFromShares(delegation.GetShares()).TruncateInt() + if !totalBond.IsPositive() { + return nil, fmt.Errorf("total bond is negative") + } + + // unbond a random amount form 0 to totalBond(maxAmt) + unbondAmt := rand.Intn(int(totalBond.Int64())) + if unbondAmt == 0 { + return nil, fmt.Errorf("unbond amount is zero") + } + return &types.MsgUndelegateFromValidatorSet{ - Delegator: delegator.Address.String(), - Coin: undelegationCoin, + Delegator: delAddr.String(), + Coin: sdk.NewCoin(sim.StakingKeeper().BondDenom(ctx), totalBond), }, nil } func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgRedelegateValidatorSet, error) { - delegator := sim.RandomSimAccount() // check if the delegator valset created - err := GetRandomExistingValSet(ctx, k, sim, delegator.Address) - if err != nil { - return nil, err + // err := GetRandomExistingValSet(ctx, k, sim, delegator.Address) + // if err != nil { + // return nil, err + // } + + valSource, ok := RandSliceElem(sim.StakingKeeper().GetAllValidators(ctx)) + if !ok { + return nil, fmt.Errorf("validator is not ok") } - // check that the delegator has delegated tokens - _, err = GetRandomExistingDelegation(ctx, k, sim, delegator.Address) - if err != nil { - return nil, err + srcAddr := valSource.GetOperator() + delegations := sim.StakingKeeper().GetValidatorDelegations(ctx, srcAddr) + if delegations == nil { + return nil, fmt.Errorf("keeper does have any delegation entries") } + // get random delegator from src validator + delegation := delegations[rand.Intn(len(delegations))] + delAddr := delegation.GetDelegatorAddr() + + if sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, srcAddr) { + return nil, fmt.Errorf("receveing redelegation is not allowed") + } + + // Destination validators + // TODO: might want to check that the destination validators are fine to redelegate to remainingWeight := sdk.NewDec(1) preferences, err := GetRandomValAndWeights(ctx, k, sim, remainingWeight) if err != nil { @@ -86,7 +127,7 @@ func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx } return &types.MsgRedelegateValidatorSet{ - Delegator: delegator.Address.String(), + Delegator: delAddr.String(), Preferences: preferences, }, nil } @@ -188,3 +229,12 @@ func RandomWeight(maxVal sdk.Dec) (sdk.Dec, error) { return sdk.MustNewDecFromStr(valWeightStr), nil } + +func RandSliceElem[E any](elems []E) (E, bool) { + if len(elems) == 0 { + var e E + return e, false + } + + return elems[rand.Intn(len(elems))], true +} diff --git a/x/valset-pref/valpref-module/module.go b/x/valset-pref/valpref-module/module.go index 0e0352cb616..3261bed5143 100644 --- a/x/valset-pref/valpref-module/module.go +++ b/x/valset-pref/valpref-module/module.go @@ -17,11 +17,13 @@ import ( "github.com/spf13/cobra" abci "github.com/tendermint/tendermint/abci/types" + "github.com/osmosis-labs/osmosis/v14/simulation/simtypes" keeper "github.com/osmosis-labs/osmosis/v14/x/valset-pref" validatorprefclient "github.com/osmosis-labs/osmosis/v14/x/valset-pref/client" valsetprefcli "github.com/osmosis-labs/osmosis/v14/x/valset-pref/client/cli" "github.com/osmosis-labs/osmosis/v14/x/valset-pref/client/grpc" "github.com/osmosis-labs/osmosis/v14/x/valset-pref/client/queryproto" + "github.com/osmosis-labs/osmosis/v14/x/valset-pref/simulation" "github.com/osmosis-labs/osmosis/v14/x/valset-pref/types" ) @@ -169,13 +171,13 @@ func (AppModule) ConsensusVersion() uint64 { return 1 } // func (am AppModule) GenerateGenesisState(simState *module.SimulationState, s *simtypes.SimCtx) { // } -// // WeightedOperations returns the all the valset module operations with their respective weights. -// func (am AppModule) Actions() []simtypes.Action { -// return []simtypes.Action{ -// simtypes.NewMsgBasedAction("SetValidatorSetPreference", am.keeper, simulation.RandomMsgSetValSetPreference), -// simtypes.NewMsgBasedAction("MsgDelegateToValidatorSet", am.keeper, simulation.RandomMsgDelegateToValSet), -// simtypes.NewMsgBasedAction("MsgUndelegateFromValidatorSet", am.keeper, simulation.RandomMsgUnDelegateFromValSet), -// simtypes.NewMsgBasedAction("MsgRedelegateValSet", am.keeper, simulation.RandomMsgReDelegateToValSet), -// simtypes.NewMsgBasedAction("MsgWithdrawDelegationRewards", am.keeper, simulation.RandomMsgWithdrawRewardsFromValSet), -// } -// } +// WeightedOperations returns the all the valset module operations with their respective weights. +func (am AppModule) Actions() []simtypes.Action { + return []simtypes.Action{ + simtypes.NewMsgBasedAction("SetValidatorSetPreference", am.keeper, simulation.RandomMsgSetValSetPreference), + simtypes.NewMsgBasedAction("MsgDelegateToValidatorSet", am.keeper, simulation.RandomMsgDelegateToValSet), + simtypes.NewMsgBasedAction("MsgUndelegateFromValidatorSet", am.keeper, simulation.RandomMsgUnDelegateFromValSet), + simtypes.NewMsgBasedAction("MsgRedelegateValSet", am.keeper, simulation.RandomMsgReDelegateToValSet), + simtypes.NewMsgBasedAction("MsgWithdrawDelegationRewards", am.keeper, simulation.RandomMsgWithdrawRewardsFromValSet), + } +} From 740e1ce35456981b1b3d2e54afa5a40c34198b40 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Sun, 15 Jan 2023 23:26:41 -0800 Subject: [PATCH 02/12] sim undelegate fix --- x/valset-pref/simulation/sim_msgs.go | 92 ++++++++------------------ x/valset-pref/valpref-module/module.go | 2 +- 2 files changed, 30 insertions(+), 64 deletions(-) diff --git a/x/valset-pref/simulation/sim_msgs.go b/x/valset-pref/simulation/sim_msgs.go index 983088b3c95..5b3ce7851da 100644 --- a/x/valset-pref/simulation/sim_msgs.go +++ b/x/valset-pref/simulation/sim_msgs.go @@ -2,7 +2,6 @@ package simulation import ( "fmt" - "math" "math/rand" "time" @@ -32,7 +31,7 @@ func RandomMsgSetValSetPreference(k valsetkeeper.Keeper, sim *osmosimtypes.SimCt func RandomMsgDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgDelegateToValidatorSet, error) { delegator := sim.RandomSimAccount() // check if the delegator valset created - err := GetRandomExistingValSet(ctx, k, sim, delegator.Address) + _, err := GetRandomDelegations(ctx, k, sim, delegator.Address) if err != nil { return nil, err } @@ -46,59 +45,36 @@ func RandomMsgDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, } func RandomMsgUnDelegateFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgUndelegateFromValidatorSet, error) { - // get a random validafor - val, ok := RandSliceElem(sim.StakingKeeper().GetAllValidators(ctx)) - if !ok { - return nil, fmt.Errorf("validator is not ok") - } - - // get validator delegations - valAddr := val.GetOperator() - delegations := sim.StakingKeeper().GetValidatorDelegations(ctx, val.GetOperator()) - if delegations == nil { - return nil, fmt.Errorf("keeper does have any delegation entries") - } - - // get delegation information including the delegator - delegation := delegations[rand.Intn(len(delegations))] - delAddr := delegation.GetDelegatorAddr() + // random delegator + delegator := sim.RandomSimAccount() - // check if the delegator has valset created - err := GetRandomExistingValSet(ctx, k, sim, delAddr) + // get a random validafor + validatorDelegations, err := GetRandomDelegations(ctx, k, sim, delegator.Address) if err != nil { return nil, err } - // check if unbonding delegation has maximum number of entries - if sim.StakingKeeper().HasMaxUnbondingDelegationEntries(ctx, delAddr, valAddr) { - return nil, fmt.Errorf("keeper does have a max unbonding delegation entries") + delegatorDels := sim.StakingKeeper().GetAllDelegatorDelegations(ctx, delegator.Address) + if len(delegatorDels) == 0 { + return nil, fmt.Errorf("number of delegators equal 0") } - // Set the max amount to undelegate - totalBond := val.TokensFromShares(delegation.GetShares()).TruncateInt() - if !totalBond.IsPositive() { - return nil, fmt.Errorf("total bond is negative") - } + for _, vals := range validatorDelegations { + dels := sim.StakingKeeper().GetValidatorDelegations(ctx, sdk.ValAddress(vals.ValOperAddress)) + if dels == nil { + return nil, fmt.Errorf("keeper does have any delegation entries") + } - // unbond a random amount form 0 to totalBond(maxAmt) - unbondAmt := rand.Intn(int(totalBond.Int64())) - if unbondAmt == 0 { - return nil, fmt.Errorf("unbond amount is zero") } + undelegationCoin := sim.RandExponentialCoin(ctx, delegator.Address) return &types.MsgUndelegateFromValidatorSet{ - Delegator: delAddr.String(), - Coin: sdk.NewCoin(sim.StakingKeeper().BondDenom(ctx), totalBond), + Delegator: delegator.Address.String(), + Coin: undelegationCoin, }, nil } func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgRedelegateValidatorSet, error) { - // check if the delegator valset created - // err := GetRandomExistingValSet(ctx, k, sim, delegator.Address) - // if err != nil { - // return nil, err - // } - valSource, ok := RandSliceElem(sim.StakingKeeper().GetAllValidators(ctx)) if !ok { return nil, fmt.Errorf("validator is not ok") @@ -114,6 +90,12 @@ func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx delegation := delegations[rand.Intn(len(delegations))] delAddr := delegation.GetDelegatorAddr() + // check if the delegator valset created + _, err := GetRandomDelegations(ctx, k, sim, delAddr) + if err != nil { + return nil, err + } + if sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, srcAddr) { return nil, fmt.Errorf("receveing redelegation is not allowed") } @@ -135,19 +117,13 @@ func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx func RandomMsgWithdrawRewardsFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgWithdrawDelegationRewards, error) { delegator := sim.RandomSimAccount() - err := GetRandomExistingValSet(ctx, k, sim, delegator.Address) - if err != nil { - return nil, err - } - - // check that the delegator has delegated tokens - delegations, err := GetRandomExistingDelegation(ctx, k, sim, delegator.Address) + delegations, err := GetRandomDelegations(ctx, k, sim, delegator.Address) if err != nil { return nil, err } delegation := delegations[rand.Intn(len(delegations))] - validator := sim.StakingKeeper().Validator(ctx, delegation.GetValidatorAddr()) + validator := sim.StakingKeeper().Validator(ctx, sdk.ValAddress(delegation.ValOperAddress)) if validator == nil { return nil, fmt.Errorf("validator not found") } @@ -196,24 +172,14 @@ func GetRandomValAndWeights(ctx sdk.Context, k valsetkeeper.Keeper, sim *osmosim } // TODO: Change this to user GetDelegations() once #3857 gets merged, issue created -func GetRandomExistingValSet(ctx sdk.Context, k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, delegatorAddr sdk.AccAddress) error { +func GetRandomDelegations(ctx sdk.Context, k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, delegatorAddr sdk.AccAddress) ([]types.ValidatorPreference, error) { // Get Valset delegations - _, found := k.GetValidatorSetPreference(ctx, delegatorAddr.String()) - if !found { - return fmt.Errorf("No val set preference") - } - - return nil -} - -func GetRandomExistingDelegation(ctx sdk.Context, k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, delegatorAddr sdk.AccAddress) ([]stakingtypes.Delegation, error) { - // gets the existing delegation - existingDelegations := sim.StakingKeeper().GetDelegatorDelegations(ctx, delegatorAddr, math.MaxUint16) - if len(existingDelegations) == 0 { - return nil, fmt.Errorf("No existing delegation") + delegations, err := k.GetDelegationPreferences(ctx, delegatorAddr.String()) + if err != nil { + return nil, fmt.Errorf("No delegations found") } - return existingDelegations, nil + return delegations.Preferences, err } // Random float point from 0-1 diff --git a/x/valset-pref/valpref-module/module.go b/x/valset-pref/valpref-module/module.go index 3261bed5143..f612e918cdd 100644 --- a/x/valset-pref/valpref-module/module.go +++ b/x/valset-pref/valpref-module/module.go @@ -177,7 +177,7 @@ func (am AppModule) Actions() []simtypes.Action { simtypes.NewMsgBasedAction("SetValidatorSetPreference", am.keeper, simulation.RandomMsgSetValSetPreference), simtypes.NewMsgBasedAction("MsgDelegateToValidatorSet", am.keeper, simulation.RandomMsgDelegateToValSet), simtypes.NewMsgBasedAction("MsgUndelegateFromValidatorSet", am.keeper, simulation.RandomMsgUnDelegateFromValSet), - simtypes.NewMsgBasedAction("MsgRedelegateValSet", am.keeper, simulation.RandomMsgReDelegateToValSet), + // simtypes.NewMsgBasedAction("MsgRedelegateValSet", am.keeper, simulation.RandomMsgReDelegateToValSet), simtypes.NewMsgBasedAction("MsgWithdrawDelegationRewards", am.keeper, simulation.RandomMsgWithdrawRewardsFromValSet), } } From 585d3dcaa857bd8ccb721bbb3810a0090ab96c04 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Sun, 15 Jan 2023 23:58:14 -0800 Subject: [PATCH 03/12] check redelegation logic --- x/valset-pref/simulation/sim_msgs.go | 93 +++++++++++++++----------- x/valset-pref/valpref-module/module.go | 4 -- 2 files changed, 53 insertions(+), 44 deletions(-) diff --git a/x/valset-pref/simulation/sim_msgs.go b/x/valset-pref/simulation/sim_msgs.go index 5b3ce7851da..7a6824dbc3c 100644 --- a/x/valset-pref/simulation/sim_msgs.go +++ b/x/valset-pref/simulation/sim_msgs.go @@ -74,45 +74,59 @@ func RandomMsgUnDelegateFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimC }, nil } -func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgRedelegateValidatorSet, error) { - valSource, ok := RandSliceElem(sim.StakingKeeper().GetAllValidators(ctx)) - if !ok { - return nil, fmt.Errorf("validator is not ok") - } - - srcAddr := valSource.GetOperator() - delegations := sim.StakingKeeper().GetValidatorDelegations(ctx, srcAddr) - if delegations == nil { - return nil, fmt.Errorf("keeper does have any delegation entries") - } - - // get random delegator from src validator - delegation := delegations[rand.Intn(len(delegations))] - delAddr := delegation.GetDelegatorAddr() - - // check if the delegator valset created - _, err := GetRandomDelegations(ctx, k, sim, delAddr) - if err != nil { - return nil, err - } - - if sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, srcAddr) { - return nil, fmt.Errorf("receveing redelegation is not allowed") - } - - // Destination validators - // TODO: might want to check that the destination validators are fine to redelegate to - remainingWeight := sdk.NewDec(1) - preferences, err := GetRandomValAndWeights(ctx, k, sim, remainingWeight) - if err != nil { - return nil, err - } - - return &types.MsgRedelegateValidatorSet{ - Delegator: delAddr.String(), - Preferences: preferences, - }, nil -} +// func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgRedelegateValidatorSet, error) { +// valSource, ok := RandSliceElem(sim.StakingKeeper().GetAllValidators(ctx)) +// if !ok { +// return nil, fmt.Errorf("validator is not ok") +// } + +// srcAddr := valSource.GetOperator() +// delegations := sim.StakingKeeper().GetValidatorDelegations(ctx, srcAddr) +// if delegations == nil { +// return nil, fmt.Errorf("keeper does have any delegation entries") +// } + +// // get random delegator from src validator +// delegation := delegations[rand.Intn(len(delegations))] +// delAddr := delegation.GetDelegatorAddr() + +// // check if the delegator valset created +// _, err := GetRandomDelegations(ctx, k, sim, delAddr) +// if err != nil { +// return nil, err +// } + +// if sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, srcAddr) { +// return nil, fmt.Errorf("receveing redelegation is not allowed") +// } + +// // Destination validators +// remainingWeight := sdk.NewDec(1) +// preferences, err := GetRandomValAndWeights(ctx, k, sim, remainingWeight) +// if err != nil { +// return nil, err +// } + +// for _, vals := range preferences { +// if srcAddr.String() == vals.ValOperAddress || sim.StakingKeeper().HasMaxRedelegationEntries(ctx, delAddr, srcAddr, sdk.ValAddress(vals.ValOperAddress)) { +// return nil, fmt.Errorf("checks failed") +// } + +// if sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, sdk.ValAddress(vals.ValOperAddress)) { +// return nil, fmt.Errorf("receveing redelegation is not allowed") +// } +// } + +// totalBond := valSource.TokensFromShares(delegation.GetShares()).TruncateInt() +// if !totalBond.IsPositive() { +// return nil, fmt.Errorf("total bond is negative") +// } + +// return &types.MsgRedelegateValidatorSet{ +// Delegator: delAddr.String(), +// Preferences: preferences, +// }, nil +// } func RandomMsgWithdrawRewardsFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgWithdrawDelegationRewards, error) { delegator := sim.RandomSimAccount() @@ -171,7 +185,6 @@ func GetRandomValAndWeights(ctx sdk.Context, k valsetkeeper.Keeper, sim *osmosim return preferences, nil } -// TODO: Change this to user GetDelegations() once #3857 gets merged, issue created func GetRandomDelegations(ctx sdk.Context, k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, delegatorAddr sdk.AccAddress) ([]types.ValidatorPreference, error) { // Get Valset delegations delegations, err := k.GetDelegationPreferences(ctx, delegatorAddr.String()) diff --git a/x/valset-pref/valpref-module/module.go b/x/valset-pref/valpref-module/module.go index f612e918cdd..e3aaab04611 100644 --- a/x/valset-pref/valpref-module/module.go +++ b/x/valset-pref/valpref-module/module.go @@ -167,10 +167,6 @@ func (AppModule) ConsensusVersion() uint64 { return 1 } // AppModuleSimulation functions -// // GenerateGenesisState creates a randomized GenState of the valset module. -// func (am AppModule) GenerateGenesisState(simState *module.SimulationState, s *simtypes.SimCtx) { -// } - // WeightedOperations returns the all the valset module operations with their respective weights. func (am AppModule) Actions() []simtypes.Action { return []simtypes.Action{ From a05cca31006632451a36e5c669483aa803ee229d Mon Sep 17 00:00:00 2001 From: stackman27 Date: Tue, 17 Jan 2023 15:44:43 -0800 Subject: [PATCH 04/12] sim progress --- x/valset-pref/simulation/sim_msgs.go | 104 ++++++++++++------------- x/valset-pref/valpref-module/module.go | 6 +- 2 files changed, 52 insertions(+), 58 deletions(-) diff --git a/x/valset-pref/simulation/sim_msgs.go b/x/valset-pref/simulation/sim_msgs.go index 7a6824dbc3c..bccce0dde01 100644 --- a/x/valset-pref/simulation/sim_msgs.go +++ b/x/valset-pref/simulation/sim_msgs.go @@ -2,6 +2,7 @@ package simulation import ( "fmt" + "math" "math/rand" "time" @@ -36,11 +37,16 @@ func RandomMsgDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, return nil, err } - delegationCoin := sim.RandExponentialCoin(ctx, delegator.Address) + amount := sim.BankKeeper().GetBalance(ctx, delegator.Address, sdk.DefaultBondDenom).Amount + if !amount.IsPositive() { + return nil, fmt.Errorf(" balance is negative") + } + + delegationCoin := rand.Intn(int(amount.Int64())) return &types.MsgDelegateToValidatorSet{ Delegator: delegator.Address.String(), - Coin: delegationCoin, + Coin: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(int64(delegationCoin))), }, nil } @@ -74,59 +80,47 @@ func RandomMsgUnDelegateFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimC }, nil } -// func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgRedelegateValidatorSet, error) { -// valSource, ok := RandSliceElem(sim.StakingKeeper().GetAllValidators(ctx)) -// if !ok { -// return nil, fmt.Errorf("validator is not ok") -// } - -// srcAddr := valSource.GetOperator() -// delegations := sim.StakingKeeper().GetValidatorDelegations(ctx, srcAddr) -// if delegations == nil { -// return nil, fmt.Errorf("keeper does have any delegation entries") -// } - -// // get random delegator from src validator -// delegation := delegations[rand.Intn(len(delegations))] -// delAddr := delegation.GetDelegatorAddr() - -// // check if the delegator valset created -// _, err := GetRandomDelegations(ctx, k, sim, delAddr) -// if err != nil { -// return nil, err -// } - -// if sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, srcAddr) { -// return nil, fmt.Errorf("receveing redelegation is not allowed") -// } - -// // Destination validators -// remainingWeight := sdk.NewDec(1) -// preferences, err := GetRandomValAndWeights(ctx, k, sim, remainingWeight) -// if err != nil { -// return nil, err -// } - -// for _, vals := range preferences { -// if srcAddr.String() == vals.ValOperAddress || sim.StakingKeeper().HasMaxRedelegationEntries(ctx, delAddr, srcAddr, sdk.ValAddress(vals.ValOperAddress)) { -// return nil, fmt.Errorf("checks failed") -// } - -// if sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, sdk.ValAddress(vals.ValOperAddress)) { -// return nil, fmt.Errorf("receveing redelegation is not allowed") -// } -// } - -// totalBond := valSource.TokensFromShares(delegation.GetShares()).TruncateInt() -// if !totalBond.IsPositive() { -// return nil, fmt.Errorf("total bond is negative") -// } - -// return &types.MsgRedelegateValidatorSet{ -// Delegator: delAddr.String(), -// Preferences: preferences, -// }, nil -// } +func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgRedelegateValidatorSet, error) { + + delegator := sim.RandomSimAccount() + delAddr := delegator.Address + + // source validator + _, err := GetRandomDelegations(ctx, k, sim, delAddr) + if err != nil { + return nil, err + } + + // gets the existing delegation + existingDelegations := sim.StakingKeeper().GetDelegatorDelegations(ctx, delAddr, math.MaxUint16) + if len(existingDelegations) == 0 { + return nil, fmt.Errorf("No existing delegation") + } + + for _, exVals := range existingDelegations { + if len(sim.StakingKeeper().GetRedelegationsFromSrcValidator(ctx, exVals.GetValidatorAddr())) != 0 || sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, exVals.GetValidatorAddr()) { + return nil, fmt.Errorf("receveing redelegation is not allowed for source validators") + } + } + + // Destination validators + remainingWeight := sdk.NewDec(1) + preferences, err := GetRandomValAndWeights(ctx, k, sim, remainingWeight) + if err != nil { + return nil, err + } + + for _, vals := range preferences { + if len(sim.StakingKeeper().GetRedelegationsFromSrcValidator(ctx, sdk.ValAddress(vals.ValOperAddress))) != 0 || sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, sdk.ValAddress(vals.ValOperAddress)) { + return nil, fmt.Errorf("receveing redelegation is not allowed for target validators") + } + } + + return &types.MsgRedelegateValidatorSet{ + Delegator: delAddr.String(), + Preferences: preferences, + }, nil +} func RandomMsgWithdrawRewardsFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgWithdrawDelegationRewards, error) { delegator := sim.RandomSimAccount() diff --git a/x/valset-pref/valpref-module/module.go b/x/valset-pref/valpref-module/module.go index e3aaab04611..eaf3da0616b 100644 --- a/x/valset-pref/valpref-module/module.go +++ b/x/valset-pref/valpref-module/module.go @@ -172,8 +172,8 @@ func (am AppModule) Actions() []simtypes.Action { return []simtypes.Action{ simtypes.NewMsgBasedAction("SetValidatorSetPreference", am.keeper, simulation.RandomMsgSetValSetPreference), simtypes.NewMsgBasedAction("MsgDelegateToValidatorSet", am.keeper, simulation.RandomMsgDelegateToValSet), - simtypes.NewMsgBasedAction("MsgUndelegateFromValidatorSet", am.keeper, simulation.RandomMsgUnDelegateFromValSet), - // simtypes.NewMsgBasedAction("MsgRedelegateValSet", am.keeper, simulation.RandomMsgReDelegateToValSet), - simtypes.NewMsgBasedAction("MsgWithdrawDelegationRewards", am.keeper, simulation.RandomMsgWithdrawRewardsFromValSet), + //simtypes.NewMsgBasedAction("MsgUndelegateFromValidatorSet", am.keeper, simulation.RandomMsgUnDelegateFromValSet), + simtypes.NewMsgBasedAction("MsgRedelegateValSet", am.keeper, simulation.RandomMsgReDelegateToValSet), + //simtypes.NewMsgBasedAction("MsgWithdrawDelegationRewards", am.keeper, simulation.RandomMsgWithdrawRewardsFromValSet), } } From e565836b3a7e18a4745d06221ee60178b006e051 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Thu, 19 Jan 2023 15:12:56 -0800 Subject: [PATCH 05/12] fixed redel and undel --- tests/simulator/sim_test.go | 2 - x/valset-pref/simulation/sim_msgs.go | 76 ++++++++++++++------------ x/valset-pref/valpref-module/module.go | 3 +- 3 files changed, 42 insertions(+), 39 deletions(-) diff --git a/tests/simulator/sim_test.go b/tests/simulator/sim_test.go index 3eb724baf62..5db9e062f0e 100644 --- a/tests/simulator/sim_test.go +++ b/tests/simulator/sim_test.go @@ -41,7 +41,6 @@ func TestFullAppSimulation(t *testing.T) { osmosim.FlagPeriodValue = 10 osmosim.FlagSeedValue = 11 osmosim.FlagWriteStatsToDB = true - osmosim.FlagSeedValue = 5577006791947779410 fullAppSimulation(t, true) } @@ -85,7 +84,6 @@ func TestAppStateDeterminism(t *testing.T) { config.ExportConfig.ExportParamsPath = "" config.NumBlocks = 50 config.BlockSize = 5 - config.Seed = 5577006791947779410 config.OnOperation = false config.AllInvariants = false config.InitializationConfig.ChainID = helpers.SimAppChainID diff --git a/x/valset-pref/simulation/sim_msgs.go b/x/valset-pref/simulation/sim_msgs.go index bccce0dde01..92a4610632c 100644 --- a/x/valset-pref/simulation/sim_msgs.go +++ b/x/valset-pref/simulation/sim_msgs.go @@ -51,37 +51,60 @@ func RandomMsgDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, } func RandomMsgUnDelegateFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgUndelegateFromValidatorSet, error) { - // random delegator - delegator := sim.RandomSimAccount() + val, ok := RandSliceElem(sim.StakingKeeper().GetAllValidators(ctx)) + if !ok { + return nil, fmt.Errorf("validator is not ok") + } + + // check if validator has delegation entries + delegations := sim.StakingKeeper().GetValidatorDelegations(ctx, val.GetOperator()) + if delegations == nil { + return nil, fmt.Errorf("keeper does have any delegation entries") + } + + // get a random delegator that has delegations + delegation := delegations[rand.Intn(len(delegations))] + delAddr := delegation.GetDelegatorAddr() + + // gets the existing delegation + existingDelegations := sim.StakingKeeper().GetDelegatorDelegations(ctx, delAddr, math.MaxUint16) + if len(existingDelegations) == 0 { + return nil, fmt.Errorf("No existing delegation") + } - // get a random validafor - validatorDelegations, err := GetRandomDelegations(ctx, k, sim, delegator.Address) + // get the delegations in valset format + validatorDelegations, err := GetRandomDelegations(ctx, k, sim, delAddr) if err != nil { return nil, err } - delegatorDels := sim.StakingKeeper().GetAllDelegatorDelegations(ctx, delegator.Address) - if len(delegatorDels) == 0 { - return nil, fmt.Errorf("number of delegators equal 0") - } + // check for each validator in valset that they have delegations and enough delegated tokens + for _, valDels := range validatorDelegations { + // check if the validator contains delegation from the delegator + dels := sim.StakingKeeper().GetValidatorDelegations(ctx, sdk.ValAddress(valDels.ValOperAddress)) + if len(dels) == 0 { + return nil, fmt.Errorf("validator doesnot have delegations") + } - for _, vals := range validatorDelegations { - dels := sim.StakingKeeper().GetValidatorDelegations(ctx, sdk.ValAddress(vals.ValOperAddress)) - if dels == nil { - return nil, fmt.Errorf("keeper does have any delegation entries") + if sim.StakingKeeper().HasMaxUnbondingDelegationEntries(ctx, delAddr, sdk.ValAddress(valDels.ValOperAddress)) { + return nil, fmt.Errorf("keeper does have a max unbonding delegation entries") } + } + totalBond := val.TokensFromShares(delegation.GetShares()).TruncateInt() + if !totalBond.IsPositive() { + return nil, fmt.Errorf("total bond is negative") } - undelegationCoin := sim.RandExponentialCoin(ctx, delegator.Address) + unDelegationCoin := rand.Intn(int(totalBond.Int64())) + return &types.MsgUndelegateFromValidatorSet{ - Delegator: delegator.Address.String(), - Coin: undelegationCoin, + Delegator: delAddr.String(), + Coin: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(int64(unDelegationCoin))), }, nil } func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgRedelegateValidatorSet, error) { - delegator := sim.RandomSimAccount() delAddr := delegator.Address @@ -97,6 +120,7 @@ func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx return nil, fmt.Errorf("No existing delegation") } + // check if existing validators aren't already involved in redelegation for _, exVals := range existingDelegations { if len(sim.StakingKeeper().GetRedelegationsFromSrcValidator(ctx, exVals.GetValidatorAddr())) != 0 || sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, exVals.GetValidatorAddr()) { return nil, fmt.Errorf("receveing redelegation is not allowed for source validators") @@ -110,6 +134,7 @@ func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx return nil, err } + // check if redelegation is possible to new validators for _, vals := range preferences { if len(sim.StakingKeeper().GetRedelegationsFromSrcValidator(ctx, sdk.ValAddress(vals.ValOperAddress))) != 0 || sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, sdk.ValAddress(vals.ValOperAddress)) { return nil, fmt.Errorf("receveing redelegation is not allowed for target validators") @@ -122,25 +147,6 @@ func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx }, nil } -func RandomMsgWithdrawRewardsFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgWithdrawDelegationRewards, error) { - delegator := sim.RandomSimAccount() - - delegations, err := GetRandomDelegations(ctx, k, sim, delegator.Address) - if err != nil { - return nil, err - } - - delegation := delegations[rand.Intn(len(delegations))] - validator := sim.StakingKeeper().Validator(ctx, sdk.ValAddress(delegation.ValOperAddress)) - if validator == nil { - return nil, fmt.Errorf("validator not found") - } - - return &types.MsgWithdrawDelegationRewards{ - Delegator: delegator.Address.String(), - }, nil -} - func RandomValidator(ctx sdk.Context, sim *osmosimtypes.SimCtx) *stakingtypes.Validator { rand.Seed(time.Now().UnixNano()) diff --git a/x/valset-pref/valpref-module/module.go b/x/valset-pref/valpref-module/module.go index eaf3da0616b..db49752761f 100644 --- a/x/valset-pref/valpref-module/module.go +++ b/x/valset-pref/valpref-module/module.go @@ -172,8 +172,7 @@ func (am AppModule) Actions() []simtypes.Action { return []simtypes.Action{ simtypes.NewMsgBasedAction("SetValidatorSetPreference", am.keeper, simulation.RandomMsgSetValSetPreference), simtypes.NewMsgBasedAction("MsgDelegateToValidatorSet", am.keeper, simulation.RandomMsgDelegateToValSet), - //simtypes.NewMsgBasedAction("MsgUndelegateFromValidatorSet", am.keeper, simulation.RandomMsgUnDelegateFromValSet), + simtypes.NewMsgBasedAction("MsgUndelegateFromValidatorSet", am.keeper, simulation.RandomMsgUnDelegateFromValSet), simtypes.NewMsgBasedAction("MsgRedelegateValSet", am.keeper, simulation.RandomMsgReDelegateToValSet), - //simtypes.NewMsgBasedAction("MsgWithdrawDelegationRewards", am.keeper, simulation.RandomMsgWithdrawRewardsFromValSet), } } From 972186272537c2ad567581950163ab7125d8c90a Mon Sep 17 00:00:00 2001 From: stackman27 Date: Thu, 19 Jan 2023 18:09:45 -0800 Subject: [PATCH 06/12] sim fix --- x/valset-pref/keeper.go | 1 - x/valset-pref/keeper_test.go | 26 ++-- x/valset-pref/msg_server_test.go | 180 ++++++++++++++++----------- x/valset-pref/simulation/sim_msgs.go | 87 ++++++++----- x/valset-pref/validator_set.go | 6 +- 5 files changed, 182 insertions(+), 118 deletions(-) diff --git a/x/valset-pref/keeper.go b/x/valset-pref/keeper.go index b740f209b2c..482c2d4a162 100644 --- a/x/valset-pref/keeper.go +++ b/x/valset-pref/keeper.go @@ -98,7 +98,6 @@ func (k Keeper) GetExistingStakingDelegations(ctx sdk.Context, delAddr sdk.AccAd } existingTotalShares := sdk.NewDec(0) - // calculate total shares that currently exists for _, existingDelegation := range existingDelegations { existingTotalShares = existingTotalShares.Add(existingDelegation.Shares) diff --git a/x/valset-pref/keeper_test.go b/x/valset-pref/keeper_test.go index 75c1215d5c7..af0dbcf9a47 100644 --- a/x/valset-pref/keeper_test.go +++ b/x/valset-pref/keeper_test.go @@ -33,20 +33,20 @@ func (suite *KeeperTestSuite) PrepareDelegateToValidatorSet() []types.ValidatorP valPreferences := []types.ValidatorPreference{ { ValOperAddress: valAddrs[0], - Weight: sdk.NewDecWithPrec(2, 1), // 0.2 - }, - { - ValOperAddress: valAddrs[1], - Weight: sdk.NewDecWithPrec(332, 3), // 0.33 - }, - { - ValOperAddress: valAddrs[2], - Weight: sdk.NewDecWithPrec(12, 2), // 0.12 - }, - { - ValOperAddress: valAddrs[3], - Weight: sdk.NewDecWithPrec(348, 3), // 0.35 + Weight: sdk.OneDec(), // 0.2 }, + // { + // ValOperAddress: valAddrs[1], + // Weight: sdk.NewDecWithPrec(332, 3), // 0.33 + // }, + // { + // ValOperAddress: valAddrs[2], + // Weight: sdk.NewDecWithPrec(12, 2), // 0.12 + // }, + // { + // ValOperAddress: valAddrs[3], + // Weight: sdk.NewDecWithPrec(348, 3), // 0.35 + // }, } return valPreferences diff --git a/x/valset-pref/msg_server_test.go b/x/valset-pref/msg_server_test.go index 47267c85c49..194f75e4123 100644 --- a/x/valset-pref/msg_server_test.go +++ b/x/valset-pref/msg_server_test.go @@ -1,6 +1,8 @@ package keeper_test import ( + "fmt" + sdk "github.com/cosmos/cosmos-sdk/types" appParams "github.com/osmosis-labs/osmosis/v14/app/params" @@ -409,91 +411,128 @@ func (suite *KeeperTestSuite) TestRedelegateToValidatorSet() { name: "redelegate to a new set of validators", delegator: sdk.AccAddress([]byte("addr1---------------")), newPreferences: []types.ValidatorPreference{ - { - ValOperAddress: valAddrs[0], - Weight: sdk.NewDecWithPrec(2, 1), - }, { ValOperAddress: valAddrs[1], - Weight: sdk.NewDecWithPrec(2, 1), + Weight: sdk.NewDecWithPrec(62, 2), }, { ValOperAddress: valAddrs[2], - Weight: sdk.NewDecWithPrec(6, 1), - }, - }, - amountToDelegate: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(20_000_000)), - expectedShares: []sdk.Dec{sdk.NewDec(4_000_000), sdk.NewDec(4_000_000), sdk.NewDec(12_000_000)}, - setExistingValSetDelegation: true, - expectPass: true, // addr1 successfully redelegates to (valAddr0, valAddr1, valAddr2) - }, - { - name: "redelegate to same set of validators", - delegator: sdk.AccAddress([]byte("addr1---------------")), - newPreferences: []types.ValidatorPreference{ - { - ValOperAddress: valAddrs[0], - Weight: sdk.NewDecWithPrec(3, 1), - }, - { - ValOperAddress: valAddrs[1], - Weight: sdk.NewDecWithPrec(2, 1), - }, - { - ValOperAddress: valAddrs[2], - Weight: sdk.NewDecWithPrec(5, 1), - }, - }, - amountToDelegate: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(20_000_000)), - expectPass: false, // first redelegation already in progress so must end that first - }, - { - name: "redelegate to new set, but one validator from old set", - delegator: sdk.AccAddress([]byte("addr1---------------")), - newPreferences: []types.ValidatorPreference{ - { - ValOperAddress: valAddrs[4], - Weight: sdk.NewDecWithPrec(5, 1), - }, - { - ValOperAddress: valAddrs[1], - Weight: sdk.NewDecWithPrec(3, 1), + Weight: sdk.NewDecWithPrec(2, 2), }, { ValOperAddress: valAddrs[3], - Weight: sdk.NewDecWithPrec(2, 1), - }, - }, - amountToDelegate: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(20_000_000)), - expectedShares: []sdk.Dec{sdk.NewDec(10_000_000), sdk.NewDec(6_000_000), sdk.NewDec(4_000_000)}, - expectPass: false, // this fails because valAddrs[1] is being redelegated to in first test - }, - { - name: "Redelegate to new valset with one existing delegation validator", - delegator: sdk.AccAddress([]byte("addr2---------------")), - newPreferences: []types.ValidatorPreference{ - { - ValOperAddress: valAddrs[0], // validator that has existing delegation - Weight: sdk.NewDecWithPrec(5, 1), + Weight: sdk.NewDecWithPrec(34, 2), }, { - ValOperAddress: valAddrs[1], - Weight: sdk.NewDecWithPrec(3, 1), - }, - { - ValOperAddress: valAddrs[2], - Weight: sdk.NewDecWithPrec(2, 1), + ValOperAddress: valAddrs[4], + Weight: sdk.NewDecWithPrec(2, 2), }, }, - amountToDelegate: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10_000_000)), - expectedShares: []sdk.Dec{sdk.NewDec(5_000_000), sdk.NewDec(3_000_000), sdk.NewDec(2_000_000)}, - setExistingDelegation: true, - expectPass: true, + coinToStake: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(177_385_809_083)), + expectedShares: []sdk.Dec{sdk.NewDec(109979201631), sdk.NewDec(3547716181), sdk.NewDec(60311175088), sdk.NewDec(3547716181)}, + expectPass: true, }, + // { + // name: "redelegate to the same set of validators with different weights, same delegator", + // delegator: sdk.AccAddress([]byte("addr1---------------")), + // newPreferences: []types.ValidatorPreference{ + // { + // ValOperAddress: valAddrs[0], + // Weight: sdk.NewDecWithPrec(5, 1), + // }, + // { + // ValOperAddress: valAddrs[1], + // Weight: sdk.NewDecWithPrec(3, 1), + // }, + // { + // ValOperAddress: valAddrs[2], + // Weight: sdk.NewDecWithPrec(2, 1), + // }, + // }, + // coinToStake: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(20_000_000)), + // expectedShares: []sdk.Dec{sdk.NewDec(10_000_000), sdk.NewDec(6_000_000), sdk.NewDec(4_000_000)}, + // expectPass: false, + // delegationExist: true, + // }, + // { + // name: "redelegate to the different set of validators different weights, same delegator", + // delegator: sdk.AccAddress([]byte("addr1---------------")), + // newPreferences: []types.ValidatorPreference{ + // { + // ValOperAddress: valAddrs[3], + // Weight: sdk.NewDecWithPrec(5, 1), + // }, + // { + // ValOperAddress: valAddrs[4], + // Weight: sdk.NewDecWithPrec(3, 1), + // }, + // { + // ValOperAddress: valAddrs[5], + // Weight: sdk.NewDecWithPrec(2, 1), + // }, + // }, + // coinToStake: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(20_000_000)), + // expectedShares: []sdk.Dec{sdk.NewDec(10_000_000), sdk.NewDec(6_000_000), sdk.NewDec(4_000_000)}, + // expectPass: true, + // }, + // { + // name: "redelegate to new set, but one validator from old set with different delegator", + // delegator: sdk.AccAddress([]byte("addr2---------------")), + // newPreferences: []types.ValidatorPreference{ + // { + // ValOperAddress: valAddrs[2], + // Weight: sdk.NewDecWithPrec(2, 1), + // }, + // { + // ValOperAddress: valAddrs[3], + // Weight: sdk.NewDecWithPrec(2, 1), + // }, + // { + // ValOperAddress: valAddrs[4], + // Weight: sdk.NewDecWithPrec(6, 1), + // }, + // }, + // coinToStake: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(20_000_000)), + // expectedShares: []sdk.Dec{sdk.NewDec(4_000_000), sdk.NewDec(4_000_000), sdk.NewDec(12_000_000)}, + // expectPass: true, + // }, + // { + // name: "redelegate to new set of validators", + // delegator: sdk.AccAddress([]byte("addr3---------------")), + // newPreferences: []types.ValidatorPreference{ + // { + // ValOperAddress: valAddrs[4], + // Weight: sdk.NewDecWithPrec(2, 1), + // }, + // { + // ValOperAddress: valAddrs[5], + // Weight: sdk.NewDecWithPrec(2, 1), + // }, + // { + // ValOperAddress: valAddrs[6], + // Weight: sdk.NewDecWithPrec(2, 1), + // }, + // { + // ValOperAddress: valAddrs[7], + // Weight: sdk.NewDecWithPrec(1, 1), + // }, + // { + // ValOperAddress: valAddrs[8], + // Weight: sdk.NewDecWithPrec(3, 1), + // }, + // }, + // coinToStake: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(50_000_000)), + // expectedShares: []sdk.Dec{sdk.NewDec(10_000_000), sdk.NewDec(10_000_000), sdk.NewDec(10_000_000), sdk.NewDec(5_000_000), sdk.NewDec(15_000_000)}, + // expectPass: true, + // }, } for _, test := range tests { suite.Run(test.name, func() { + + // fund the account that is trying to delegate + suite.FundAcc(test.delegator, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 100_000_000_000_000)}) + // setup message server msgServer := valPref.NewMsgServerImpl(suite.App.ValidatorSetPreferenceKeeper) c := sdk.WrapSDKContext(suite.Ctx) @@ -522,13 +561,14 @@ func (suite *KeeperTestSuite) TestRedelegateToValidatorSet() { suite.Require().NoError(err) // check if the validator have recieved the correct amount of tokens - for i, val := range test.newPreferences { + for _, val := range test.newPreferences { valAddr, err := sdk.ValAddressFromBech32(val.ValOperAddress) suite.Require().NoError(err) // guarantees that the delegator exists because we check it in DelegateToValidatorSet del, _ := suite.App.StakingKeeper.GetDelegation(suite.Ctx, test.delegator, valAddr) - suite.Require().Equal(del.Shares, test.expectedShares[i]) + fmt.Println(del.Shares) + //suite.Require().Equal(del.Shares, test.expectedShares[i]) } } else { suite.Require().Error(err) diff --git a/x/valset-pref/simulation/sim_msgs.go b/x/valset-pref/simulation/sim_msgs.go index 92a4610632c..880e6125ad9 100644 --- a/x/valset-pref/simulation/sim_msgs.go +++ b/x/valset-pref/simulation/sim_msgs.go @@ -2,7 +2,6 @@ package simulation import ( "fmt" - "math" "math/rand" "time" @@ -39,7 +38,7 @@ func RandomMsgDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, amount := sim.BankKeeper().GetBalance(ctx, delegator.Address, sdk.DefaultBondDenom).Amount if !amount.IsPositive() { - return nil, fmt.Errorf(" balance is negative") + return nil, fmt.Errorf("balance is negative") } delegationCoin := rand.Intn(int(amount.Int64())) @@ -56,37 +55,39 @@ func RandomMsgUnDelegateFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimC return nil, fmt.Errorf("validator is not ok") } - // check if validator has delegation entries + // get delegator with delegations delegations := sim.StakingKeeper().GetValidatorDelegations(ctx, val.GetOperator()) if delegations == nil { return nil, fmt.Errorf("keeper does have any delegation entries") } - // get a random delegator that has delegations + // get random delegator from validator delegation := delegations[rand.Intn(len(delegations))] delAddr := delegation.GetDelegatorAddr() - // gets the existing delegation - existingDelegations := sim.StakingKeeper().GetDelegatorDelegations(ctx, delAddr, math.MaxUint16) - if len(existingDelegations) == 0 { - return nil, fmt.Errorf("No existing delegation") - } - - // get the delegations in valset format - validatorDelegations, err := GetRandomDelegations(ctx, k, sim, delAddr) + // get delegator valset preferences + preferences, err := k.GetDelegationPreferences(ctx, delAddr.String()) if err != nil { - return nil, err + return nil, fmt.Errorf("no delegations found") } - // check for each validator in valset that they have delegations and enough delegated tokens - for _, valDels := range validatorDelegations { - // check if the validator contains delegation from the delegator - dels := sim.StakingKeeper().GetValidatorDelegations(ctx, sdk.ValAddress(valDels.ValOperAddress)) - if len(dels) == 0 { - return nil, fmt.Errorf("validator doesnot have delegations") + for _, valSet := range preferences.Preferences { + val, err := sdk.ValAddressFromBech32(valSet.ValOperAddress) + if err != nil { + return nil, fmt.Errorf("validator address not formatted") + } + + _, valfound := sim.StakingKeeper().GetValidator(ctx, val) + if !valfound { + return nil, fmt.Errorf("validator not found %s", val.String()) } - if sim.StakingKeeper().HasMaxUnbondingDelegationEntries(ctx, delAddr, sdk.ValAddress(valDels.ValOperAddress)) { + _, found := sim.StakingKeeper().GetDelegation(ctx, delAddr, val) + if !found { + return nil, fmt.Errorf("delegator delegation not found") + } + + if sim.StakingKeeper().HasMaxUnbondingDelegationEntries(ctx, delAddr, val) { return nil, fmt.Errorf("keeper does have a max unbonding delegation entries") } } @@ -105,29 +106,34 @@ func RandomMsgUnDelegateFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimC } func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgRedelegateValidatorSet, error) { + // random delegator account delegator := sim.RandomSimAccount() delAddr := delegator.Address - // source validator - _, err := GetRandomDelegations(ctx, k, sim, delAddr) + // existing delegations + delegations, err := k.GetDelegationPreferences(ctx, delAddr.String()) if err != nil { - return nil, err + return nil, fmt.Errorf("no delegations found") } - // gets the existing delegation - existingDelegations := sim.StakingKeeper().GetDelegatorDelegations(ctx, delAddr, math.MaxUint16) - if len(existingDelegations) == 0 { - return nil, fmt.Errorf("No existing delegation") - } + for _, dels := range delegations.Preferences { + val, err := sdk.ValAddressFromBech32(dels.ValOperAddress) + if err != nil { + return nil, fmt.Errorf("validator address not formatted") + } - // check if existing validators aren't already involved in redelegation - for _, exVals := range existingDelegations { - if len(sim.StakingKeeper().GetRedelegationsFromSrcValidator(ctx, exVals.GetValidatorAddr())) != 0 || sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, exVals.GetValidatorAddr()) { + if sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, val) { return nil, fmt.Errorf("receveing redelegation is not allowed for source validators") } + + // check if the user has delegated tokens to the valset + _, found := sim.StakingKeeper().GetDelegation(ctx, delAddr, val) + if !found { + return nil, fmt.Errorf("user hasn't delegated tokens to the validator, %s", val.String()) + } } - // Destination validators + // new delegations to redelegate to remainingWeight := sdk.NewDec(1) preferences, err := GetRandomValAndWeights(ctx, k, sim, remainingWeight) if err != nil { @@ -136,7 +142,12 @@ func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx // check if redelegation is possible to new validators for _, vals := range preferences { - if len(sim.StakingKeeper().GetRedelegationsFromSrcValidator(ctx, sdk.ValAddress(vals.ValOperAddress))) != 0 || sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, sdk.ValAddress(vals.ValOperAddress)) { + val, err := sdk.ValAddressFromBech32(vals.ValOperAddress) + if err != nil { + return nil, fmt.Errorf("validator address not formatted") + } + + if sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, val) { return nil, fmt.Errorf("receveing redelegation is not allowed for target validators") } } @@ -182,6 +193,16 @@ func GetRandomValAndWeights(ctx sdk.Context, k valsetkeeper.Keeper, sim *osmosim } } + totalWeight := sdk.ZeroDec() + // check if all the weights in preferences equal 1 + for _, prefs := range preferences { + totalWeight = totalWeight.Add(prefs.Weight) + } + + if !totalWeight.Equal(sdk.OneDec()) { + return nil, fmt.Errorf("generated weights donot equal 1 got: %d", totalWeight) + } + return preferences, nil } diff --git a/x/valset-pref/validator_set.go b/x/valset-pref/validator_set.go index ebe5a19ddca..adff740bffb 100644 --- a/x/valset-pref/validator_set.go +++ b/x/valset-pref/validator_set.go @@ -151,7 +151,7 @@ func (k Keeper) PreformRedelegation(ctx sdk.Context, delegator sdk.AccAddress, e // check if the user has delegated tokens to the valset delegation, found := k.stakingKeeper.GetDelegation(ctx, delegator, valAddr) if !found { - return fmt.Errorf("No delegation found") + return fmt.Errorf("user hasn't delegated tokens to the validator, %s", valAddr.String()) } tokenFromShares := validator.TokensFromShares(delegation.Shares) @@ -159,6 +159,7 @@ func (k Keeper) PreformRedelegation(ctx sdk.Context, delegator sdk.AccAddress, e existingValSet = append(existingValSet, existing_val) newValSet = append(newValSet, existing_val_zero_amount) totalTokenAmount = totalTokenAmount.Add(tokenFromShares) + //fmt.Println("EXISTING VAL: ", existingVals.ValOperAddress, tokenFromShares) } for _, newVals := range newSet { @@ -167,6 +168,7 @@ func (k Keeper) PreformRedelegation(ctx sdk.Context, delegator sdk.AccAddress, e new_val, new_val_zero_amount := k.GetValSetStruct(newVals, amountToDelegate) newValSet = append(newValSet, new_val) existingValSet = append(existingValSet, new_val_zero_amount) + //fmt.Println("NEW VAL: ", newVals.ValOperAddress, amountToDelegate) } // calculate the difference between two sets @@ -174,6 +176,7 @@ func (k Keeper) PreformRedelegation(ctx sdk.Context, delegator sdk.AccAddress, e for i, newVals := range existingValSet { diffAmount := newVals.amount.Sub(newValSet[i].amount) + //fmt.Println("Internal DIFF AMOUNT", newVals.valAddr, diffAmount) diff_val := valSet{ valAddr: newVals.valAddr, amount: diffAmount, @@ -308,6 +311,7 @@ func (k Keeper) getValAddrAndVal(ctx sdk.Context, valOperAddress string) (sdk.Va func (k Keeper) IsPreferenceValid(ctx sdk.Context, preferences []types.ValidatorPreference) ([]types.ValidatorPreference, bool) { var weightsRoundedValPrefList []types.ValidatorPreference for _, val := range preferences { + // round up weights valWeightStr := osmomath.SigFigRound(val.Weight, sdk.NewDec(10).Power(2).TruncateInt()) From d658c6dfb2d7f617ec536d65d1abdc4ce3f04db5 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Fri, 20 Jan 2023 13:25:03 -0800 Subject: [PATCH 07/12] rebased --- x/valset-pref/keeper_test.go | 26 ++--- x/valset-pref/msg_server_test.go | 176 ++++++++++++------------------- 2 files changed, 83 insertions(+), 119 deletions(-) diff --git a/x/valset-pref/keeper_test.go b/x/valset-pref/keeper_test.go index af0dbcf9a47..75c1215d5c7 100644 --- a/x/valset-pref/keeper_test.go +++ b/x/valset-pref/keeper_test.go @@ -33,20 +33,20 @@ func (suite *KeeperTestSuite) PrepareDelegateToValidatorSet() []types.ValidatorP valPreferences := []types.ValidatorPreference{ { ValOperAddress: valAddrs[0], - Weight: sdk.OneDec(), // 0.2 + Weight: sdk.NewDecWithPrec(2, 1), // 0.2 + }, + { + ValOperAddress: valAddrs[1], + Weight: sdk.NewDecWithPrec(332, 3), // 0.33 + }, + { + ValOperAddress: valAddrs[2], + Weight: sdk.NewDecWithPrec(12, 2), // 0.12 + }, + { + ValOperAddress: valAddrs[3], + Weight: sdk.NewDecWithPrec(348, 3), // 0.35 }, - // { - // ValOperAddress: valAddrs[1], - // Weight: sdk.NewDecWithPrec(332, 3), // 0.33 - // }, - // { - // ValOperAddress: valAddrs[2], - // Weight: sdk.NewDecWithPrec(12, 2), // 0.12 - // }, - // { - // ValOperAddress: valAddrs[3], - // Weight: sdk.NewDecWithPrec(348, 3), // 0.35 - // }, } return valPreferences diff --git a/x/valset-pref/msg_server_test.go b/x/valset-pref/msg_server_test.go index 194f75e4123..1b704ec033c 100644 --- a/x/valset-pref/msg_server_test.go +++ b/x/valset-pref/msg_server_test.go @@ -1,8 +1,6 @@ package keeper_test import ( - "fmt" - sdk "github.com/cosmos/cosmos-sdk/types" appParams "github.com/osmosis-labs/osmosis/v14/app/params" @@ -411,120 +409,87 @@ func (suite *KeeperTestSuite) TestRedelegateToValidatorSet() { name: "redelegate to a new set of validators", delegator: sdk.AccAddress([]byte("addr1---------------")), newPreferences: []types.ValidatorPreference{ + { + ValOperAddress: valAddrs[0], + Weight: sdk.NewDecWithPrec(2, 1), + }, { ValOperAddress: valAddrs[1], - Weight: sdk.NewDecWithPrec(62, 2), + Weight: sdk.NewDecWithPrec(2, 1), }, { ValOperAddress: valAddrs[2], - Weight: sdk.NewDecWithPrec(2, 2), + Weight: sdk.NewDecWithPrec(6, 1), }, + }, + amountToDelegate: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(20_000_000)), + expectedShares: []sdk.Dec{sdk.NewDec(4_000_000), sdk.NewDec(4_000_000), sdk.NewDec(12_000_000)}, + setExistingValSetDelegation: true, + expectPass: true, // addr1 successfully redelegates to (valAddr0, valAddr1, valAddr2) + }, + { + name: "redelegate to same set of validators", + delegator: sdk.AccAddress([]byte("addr1---------------")), + newPreferences: []types.ValidatorPreference{ { - ValOperAddress: valAddrs[3], - Weight: sdk.NewDecWithPrec(34, 2), + ValOperAddress: valAddrs[0], + Weight: sdk.NewDecWithPrec(3, 1), }, + { + ValOperAddress: valAddrs[1], + Weight: sdk.NewDecWithPrec(2, 1), + }, + { + ValOperAddress: valAddrs[2], + Weight: sdk.NewDecWithPrec(5, 1), + }, + }, + amountToDelegate: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(20_000_000)), + expectPass: false, // first redelegation already in progress so must end that first + }, + { + name: "redelegate to new set, but one validator from old set", + delegator: sdk.AccAddress([]byte("addr1---------------")), + newPreferences: []types.ValidatorPreference{ { ValOperAddress: valAddrs[4], - Weight: sdk.NewDecWithPrec(2, 2), + Weight: sdk.NewDecWithPrec(5, 1), + }, + { + ValOperAddress: valAddrs[1], + Weight: sdk.NewDecWithPrec(3, 1), + }, + { + ValOperAddress: valAddrs[3], + Weight: sdk.NewDecWithPrec(2, 1), }, }, - coinToStake: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(177_385_809_083)), - expectedShares: []sdk.Dec{sdk.NewDec(109979201631), sdk.NewDec(3547716181), sdk.NewDec(60311175088), sdk.NewDec(3547716181)}, - expectPass: true, + amountToDelegate: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(20_000_000)), + expectedShares: []sdk.Dec{sdk.NewDec(10_000_000), sdk.NewDec(6_000_000), sdk.NewDec(4_000_000)}, + expectPass: false, // this fails because valAddrs[1] is being redelegated to in first test + }, + { + name: "Redelegate to new valset with one existing delegation validator", + delegator: sdk.AccAddress([]byte("addr2---------------")), + newPreferences: []types.ValidatorPreference{ + { + ValOperAddress: valAddrs[0], // validator that has existing delegation + Weight: sdk.NewDecWithPrec(5, 1), + }, + { + ValOperAddress: valAddrs[1], + Weight: sdk.NewDecWithPrec(3, 1), + }, + { + ValOperAddress: valAddrs[2], + Weight: sdk.NewDecWithPrec(2, 1), + }, + }, + amountToDelegate: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(10_000_000)), + expectedShares: []sdk.Dec{sdk.NewDec(5_000_000), sdk.NewDec(3_000_000), sdk.NewDec(2_000_000)}, + setExistingDelegation: true, + expectPass: true, }, - // { - // name: "redelegate to the same set of validators with different weights, same delegator", - // delegator: sdk.AccAddress([]byte("addr1---------------")), - // newPreferences: []types.ValidatorPreference{ - // { - // ValOperAddress: valAddrs[0], - // Weight: sdk.NewDecWithPrec(5, 1), - // }, - // { - // ValOperAddress: valAddrs[1], - // Weight: sdk.NewDecWithPrec(3, 1), - // }, - // { - // ValOperAddress: valAddrs[2], - // Weight: sdk.NewDecWithPrec(2, 1), - // }, - // }, - // coinToStake: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(20_000_000)), - // expectedShares: []sdk.Dec{sdk.NewDec(10_000_000), sdk.NewDec(6_000_000), sdk.NewDec(4_000_000)}, - // expectPass: false, - // delegationExist: true, - // }, - // { - // name: "redelegate to the different set of validators different weights, same delegator", - // delegator: sdk.AccAddress([]byte("addr1---------------")), - // newPreferences: []types.ValidatorPreference{ - // { - // ValOperAddress: valAddrs[3], - // Weight: sdk.NewDecWithPrec(5, 1), - // }, - // { - // ValOperAddress: valAddrs[4], - // Weight: sdk.NewDecWithPrec(3, 1), - // }, - // { - // ValOperAddress: valAddrs[5], - // Weight: sdk.NewDecWithPrec(2, 1), - // }, - // }, - // coinToStake: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(20_000_000)), - // expectedShares: []sdk.Dec{sdk.NewDec(10_000_000), sdk.NewDec(6_000_000), sdk.NewDec(4_000_000)}, - // expectPass: true, - // }, - // { - // name: "redelegate to new set, but one validator from old set with different delegator", - // delegator: sdk.AccAddress([]byte("addr2---------------")), - // newPreferences: []types.ValidatorPreference{ - // { - // ValOperAddress: valAddrs[2], - // Weight: sdk.NewDecWithPrec(2, 1), - // }, - // { - // ValOperAddress: valAddrs[3], - // Weight: sdk.NewDecWithPrec(2, 1), - // }, - // { - // ValOperAddress: valAddrs[4], - // Weight: sdk.NewDecWithPrec(6, 1), - // }, - // }, - // coinToStake: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(20_000_000)), - // expectedShares: []sdk.Dec{sdk.NewDec(4_000_000), sdk.NewDec(4_000_000), sdk.NewDec(12_000_000)}, - // expectPass: true, - // }, - // { - // name: "redelegate to new set of validators", - // delegator: sdk.AccAddress([]byte("addr3---------------")), - // newPreferences: []types.ValidatorPreference{ - // { - // ValOperAddress: valAddrs[4], - // Weight: sdk.NewDecWithPrec(2, 1), - // }, - // { - // ValOperAddress: valAddrs[5], - // Weight: sdk.NewDecWithPrec(2, 1), - // }, - // { - // ValOperAddress: valAddrs[6], - // Weight: sdk.NewDecWithPrec(2, 1), - // }, - // { - // ValOperAddress: valAddrs[7], - // Weight: sdk.NewDecWithPrec(1, 1), - // }, - // { - // ValOperAddress: valAddrs[8], - // Weight: sdk.NewDecWithPrec(3, 1), - // }, - // }, - // coinToStake: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(50_000_000)), - // expectedShares: []sdk.Dec{sdk.NewDec(10_000_000), sdk.NewDec(10_000_000), sdk.NewDec(10_000_000), sdk.NewDec(5_000_000), sdk.NewDec(15_000_000)}, - // expectPass: true, - // }, } for _, test := range tests { @@ -561,14 +526,13 @@ func (suite *KeeperTestSuite) TestRedelegateToValidatorSet() { suite.Require().NoError(err) // check if the validator have recieved the correct amount of tokens - for _, val := range test.newPreferences { + for i, val := range test.newPreferences { valAddr, err := sdk.ValAddressFromBech32(val.ValOperAddress) suite.Require().NoError(err) // guarantees that the delegator exists because we check it in DelegateToValidatorSet del, _ := suite.App.StakingKeeper.GetDelegation(suite.Ctx, test.delegator, valAddr) - fmt.Println(del.Shares) - //suite.Require().Equal(del.Shares, test.expectedShares[i]) + suite.Require().Equal(del.Shares, test.expectedShares[i]) } } else { suite.Require().Error(err) From 8e6db84f0dae12a8c4c3cd53c0d296da9f214cdc Mon Sep 17 00:00:00 2001 From: stackman27 Date: Fri, 20 Jan 2023 13:28:24 -0800 Subject: [PATCH 08/12] cleanup --- x/valset-pref/msg_server_test.go | 4 ---- x/valset-pref/validator_set.go | 6 +----- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/x/valset-pref/msg_server_test.go b/x/valset-pref/msg_server_test.go index 1b704ec033c..47267c85c49 100644 --- a/x/valset-pref/msg_server_test.go +++ b/x/valset-pref/msg_server_test.go @@ -494,10 +494,6 @@ func (suite *KeeperTestSuite) TestRedelegateToValidatorSet() { for _, test := range tests { suite.Run(test.name, func() { - - // fund the account that is trying to delegate - suite.FundAcc(test.delegator, sdk.Coins{sdk.NewInt64Coin(sdk.DefaultBondDenom, 100_000_000_000_000)}) - // setup message server msgServer := valPref.NewMsgServerImpl(suite.App.ValidatorSetPreferenceKeeper) c := sdk.WrapSDKContext(suite.Ctx) diff --git a/x/valset-pref/validator_set.go b/x/valset-pref/validator_set.go index adff740bffb..ebe5a19ddca 100644 --- a/x/valset-pref/validator_set.go +++ b/x/valset-pref/validator_set.go @@ -151,7 +151,7 @@ func (k Keeper) PreformRedelegation(ctx sdk.Context, delegator sdk.AccAddress, e // check if the user has delegated tokens to the valset delegation, found := k.stakingKeeper.GetDelegation(ctx, delegator, valAddr) if !found { - return fmt.Errorf("user hasn't delegated tokens to the validator, %s", valAddr.String()) + return fmt.Errorf("No delegation found") } tokenFromShares := validator.TokensFromShares(delegation.Shares) @@ -159,7 +159,6 @@ func (k Keeper) PreformRedelegation(ctx sdk.Context, delegator sdk.AccAddress, e existingValSet = append(existingValSet, existing_val) newValSet = append(newValSet, existing_val_zero_amount) totalTokenAmount = totalTokenAmount.Add(tokenFromShares) - //fmt.Println("EXISTING VAL: ", existingVals.ValOperAddress, tokenFromShares) } for _, newVals := range newSet { @@ -168,7 +167,6 @@ func (k Keeper) PreformRedelegation(ctx sdk.Context, delegator sdk.AccAddress, e new_val, new_val_zero_amount := k.GetValSetStruct(newVals, amountToDelegate) newValSet = append(newValSet, new_val) existingValSet = append(existingValSet, new_val_zero_amount) - //fmt.Println("NEW VAL: ", newVals.ValOperAddress, amountToDelegate) } // calculate the difference between two sets @@ -176,7 +174,6 @@ func (k Keeper) PreformRedelegation(ctx sdk.Context, delegator sdk.AccAddress, e for i, newVals := range existingValSet { diffAmount := newVals.amount.Sub(newValSet[i].amount) - //fmt.Println("Internal DIFF AMOUNT", newVals.valAddr, diffAmount) diff_val := valSet{ valAddr: newVals.valAddr, amount: diffAmount, @@ -311,7 +308,6 @@ func (k Keeper) getValAddrAndVal(ctx sdk.Context, valOperAddress string) (sdk.Va func (k Keeper) IsPreferenceValid(ctx sdk.Context, preferences []types.ValidatorPreference) ([]types.ValidatorPreference, bool) { var weightsRoundedValPrefList []types.ValidatorPreference for _, val := range preferences { - // round up weights valWeightStr := osmomath.SigFigRound(val.Weight, sdk.NewDec(10).Power(2).TruncateInt()) From 4c447e698f075e1dd384df4a50141d314d564dab Mon Sep 17 00:00:00 2001 From: stackman27 Date: Fri, 20 Jan 2023 14:35:42 -0800 Subject: [PATCH 09/12] nit --- tests/simulator/sim_test.go | 1 + x/valset-pref/simulation/sim_msgs.go | 61 ++++++++++++---------------- 2 files changed, 28 insertions(+), 34 deletions(-) diff --git a/tests/simulator/sim_test.go b/tests/simulator/sim_test.go index 5db9e062f0e..2c20e8b2bda 100644 --- a/tests/simulator/sim_test.go +++ b/tests/simulator/sim_test.go @@ -41,6 +41,7 @@ func TestFullAppSimulation(t *testing.T) { osmosim.FlagPeriodValue = 10 osmosim.FlagSeedValue = 11 osmosim.FlagWriteStatsToDB = true + osmosim.FlagSeedValue = 5577006791947779410 fullAppSimulation(t, true) } diff --git a/x/valset-pref/simulation/sim_msgs.go b/x/valset-pref/simulation/sim_msgs.go index 880e6125ad9..13fae5773c3 100644 --- a/x/valset-pref/simulation/sim_msgs.go +++ b/x/valset-pref/simulation/sim_msgs.go @@ -50,20 +50,9 @@ func RandomMsgDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, } func RandomMsgUnDelegateFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, ctx sdk.Context) (*types.MsgUndelegateFromValidatorSet, error) { - val, ok := RandSliceElem(sim.StakingKeeper().GetAllValidators(ctx)) - if !ok { - return nil, fmt.Errorf("validator is not ok") - } - - // get delegator with delegations - delegations := sim.StakingKeeper().GetValidatorDelegations(ctx, val.GetOperator()) - if delegations == nil { - return nil, fmt.Errorf("keeper does have any delegation entries") - } - - // get random delegator from validator - delegation := delegations[rand.Intn(len(delegations))] - delAddr := delegation.GetDelegatorAddr() + // random delegator account + delegator := sim.RandomSimAccount() + delAddr := delegator.Address // get delegator valset preferences preferences, err := k.GetDelegationPreferences(ctx, delAddr.String()) @@ -71,37 +60,33 @@ func RandomMsgUnDelegateFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimC return nil, fmt.Errorf("no delegations found") } - for _, valSet := range preferences.Preferences { - val, err := sdk.ValAddressFromBech32(valSet.ValOperAddress) - if err != nil { - return nil, fmt.Errorf("validator address not formatted") - } - - _, valfound := sim.StakingKeeper().GetValidator(ctx, val) - if !valfound { - return nil, fmt.Errorf("validator not found %s", val.String()) - } + delegation := preferences.Preferences[rand.Intn(len(preferences.Preferences))] + val, err := sdk.ValAddressFromBech32(delegation.ValOperAddress) + if err != nil { + return nil, fmt.Errorf("validator address not formatted") + } - _, found := sim.StakingKeeper().GetDelegation(ctx, delAddr, val) - if !found { - return nil, fmt.Errorf("delegator delegation not found") - } + validator, found := sim.StakingKeeper().GetValidator(ctx, val) + if !found { + return nil, fmt.Errorf("Validatot not found") + } - if sim.StakingKeeper().HasMaxUnbondingDelegationEntries(ctx, delAddr, val) { - return nil, fmt.Errorf("keeper does have a max unbonding delegation entries") - } + // check if the user has delegated tokens to the valset + del, found := sim.StakingKeeper().GetDelegation(ctx, delAddr, val) + if !found { + return nil, fmt.Errorf("user hasn't delegated tokens to the validator, %s", val.String()) } - totalBond := val.TokensFromShares(delegation.GetShares()).TruncateInt() + totalBond := validator.TokensFromShares(del.GetShares()).TruncateInt() if !totalBond.IsPositive() { return nil, fmt.Errorf("total bond is negative") } - unDelegationCoin := rand.Intn(int(totalBond.Int64())) + undelegationCoin := rand.Intn(int(totalBond.Int64())) return &types.MsgUndelegateFromValidatorSet{ Delegator: delAddr.String(), - Coin: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(int64(unDelegationCoin))), + Coin: sdk.NewCoin(sdk.DefaultBondDenom, sdk.NewInt(int64(undelegationCoin))), }, nil } @@ -126,6 +111,10 @@ func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx return nil, fmt.Errorf("receveing redelegation is not allowed for source validators") } + if sim.StakingKeeper().HasMaxUnbondingDelegationEntries(ctx, delAddr, val) { + return nil, fmt.Errorf("keeper does have a max unbonding delegation entries") + } + // check if the user has delegated tokens to the valset _, found := sim.StakingKeeper().GetDelegation(ctx, delAddr, val) if !found { @@ -147,6 +136,10 @@ func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx return nil, fmt.Errorf("validator address not formatted") } + if sim.StakingKeeper().HasMaxUnbondingDelegationEntries(ctx, delAddr, val) { + return nil, fmt.Errorf("keeper does have a max unbonding delegation entries") + } + if sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, val) { return nil, fmt.Errorf("receveing redelegation is not allowed for target validators") } From a6dd51910de00d195fe33f3631c5b48b23bf2441 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Fri, 20 Jan 2023 14:36:23 -0800 Subject: [PATCH 10/12] nit --- tests/simulator/sim_test.go | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/simulator/sim_test.go b/tests/simulator/sim_test.go index 2c20e8b2bda..5db9e062f0e 100644 --- a/tests/simulator/sim_test.go +++ b/tests/simulator/sim_test.go @@ -41,7 +41,6 @@ func TestFullAppSimulation(t *testing.T) { osmosim.FlagPeriodValue = 10 osmosim.FlagSeedValue = 11 osmosim.FlagWriteStatsToDB = true - osmosim.FlagSeedValue = 5577006791947779410 fullAppSimulation(t, true) } From 0a4be192aa677015bff344a2cf0369eac89a2207 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Fri, 20 Jan 2023 23:43:18 -0800 Subject: [PATCH 11/12] adams feedback --- x/valset-pref/simulation/sim_msgs.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x/valset-pref/simulation/sim_msgs.go b/x/valset-pref/simulation/sim_msgs.go index 13fae5773c3..8851d8e5222 100644 --- a/x/valset-pref/simulation/sim_msgs.go +++ b/x/valset-pref/simulation/sim_msgs.go @@ -38,7 +38,7 @@ func RandomMsgDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx, amount := sim.BankKeeper().GetBalance(ctx, delegator.Address, sdk.DefaultBondDenom).Amount if !amount.IsPositive() { - return nil, fmt.Errorf("balance is negative") + return nil, fmt.Errorf("%s is not present", sdk.DefaultBondDenom) } delegationCoin := rand.Intn(int(amount.Int64())) @@ -68,7 +68,7 @@ func RandomMsgUnDelegateFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimC validator, found := sim.StakingKeeper().GetValidator(ctx, val) if !found { - return nil, fmt.Errorf("Validatot not found") + return nil, fmt.Errorf("Validator not found") } // check if the user has delegated tokens to the valset @@ -79,7 +79,7 @@ func RandomMsgUnDelegateFromValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimC totalBond := validator.TokensFromShares(del.GetShares()).TruncateInt() if !totalBond.IsPositive() { - return nil, fmt.Errorf("total bond is negative") + return nil, fmt.Errorf("%s is not present", sdk.DefaultBondDenom) } undelegationCoin := rand.Intn(int(totalBond.Int64())) From a4865b07d1f834faf270c0bcac160bca471b7db7 Mon Sep 17 00:00:00 2001 From: stackman27 Date: Sat, 21 Jan 2023 15:09:11 -0800 Subject: [PATCH 12/12] matts feedback --- x/valset-pref/simulation/sim_msgs.go | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/x/valset-pref/simulation/sim_msgs.go b/x/valset-pref/simulation/sim_msgs.go index 8851d8e5222..92705ae982d 100644 --- a/x/valset-pref/simulation/sim_msgs.go +++ b/x/valset-pref/simulation/sim_msgs.go @@ -108,7 +108,7 @@ func RandomMsgReDelegateToValSet(k valsetkeeper.Keeper, sim *osmosimtypes.SimCtx } if sim.StakingKeeper().HasReceivingRedelegation(ctx, delAddr, val) { - return nil, fmt.Errorf("receveing redelegation is not allowed for source validators") + return nil, fmt.Errorf("receiving redelegation is not allowed for source validators") } if sim.StakingKeeper().HasMaxUnbondingDelegationEntries(ctx, delAddr, val) { @@ -222,12 +222,3 @@ func RandomWeight(maxVal sdk.Dec) (sdk.Dec, error) { return sdk.MustNewDecFromStr(valWeightStr), nil } - -func RandSliceElem[E any](elems []E) (E, bool) { - if len(elems) == 0 { - var e E - return e, false - } - - return elems[rand.Intn(len(elems))], true -}