Skip to content

Commit

Permalink
Module Wired up and created MsgSetValidatorSetPreference
Browse files Browse the repository at this point in the history
  • Loading branch information
stackman27 committed Sep 29, 2022
1 parent 76a99c7 commit 634f626
Show file tree
Hide file tree
Showing 17 changed files with 1,133 additions and 22 deletions.
56 changes: 34 additions & 22 deletions app/keepers/keepers.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ import (
"github.com/osmosis-labs/osmosis/v12/x/txfees"
txfeeskeeper "github.com/osmosis-labs/osmosis/v12/x/txfees/keeper"
txfeestypes "github.com/osmosis-labs/osmosis/v12/x/txfees/types"
validatorpreferencekeeper "github.com/osmosis-labs/osmosis/v12/x/validator-preference/keeper"
validatorpreferencetypes "github.com/osmosis-labs/osmosis/v12/x/validator-preference/types"
)

type AppKeepers struct {
Expand All @@ -89,28 +91,29 @@ type AppKeepers struct {
ScopedWasmKeeper capabilitykeeper.ScopedKeeper

// "Normal" keepers
AccountKeeper *authkeeper.AccountKeeper
BankKeeper *bankkeeper.BaseKeeper
AuthzKeeper *authzkeeper.Keeper
StakingKeeper *stakingkeeper.Keeper
DistrKeeper *distrkeeper.Keeper
SlashingKeeper *slashingkeeper.Keeper
IBCKeeper *ibckeeper.Keeper
ICAHostKeeper *icahostkeeper.Keeper
TransferKeeper *ibctransferkeeper.Keeper
EvidenceKeeper *evidencekeeper.Keeper
GAMMKeeper *gammkeeper.Keeper
TwapKeeper *twap.Keeper
LockupKeeper *lockupkeeper.Keeper
EpochsKeeper *epochskeeper.Keeper
IncentivesKeeper *incentiveskeeper.Keeper
MintKeeper *mintkeeper.Keeper
PoolIncentivesKeeper *poolincentiveskeeper.Keeper
TxFeesKeeper *txfeeskeeper.Keeper
SuperfluidKeeper *superfluidkeeper.Keeper
GovKeeper *govkeeper.Keeper
WasmKeeper *wasm.Keeper
TokenFactoryKeeper *tokenfactorykeeper.Keeper
AccountKeeper *authkeeper.AccountKeeper
BankKeeper *bankkeeper.BaseKeeper
AuthzKeeper *authzkeeper.Keeper
StakingKeeper *stakingkeeper.Keeper
DistrKeeper *distrkeeper.Keeper
SlashingKeeper *slashingkeeper.Keeper
IBCKeeper *ibckeeper.Keeper
ICAHostKeeper *icahostkeeper.Keeper
TransferKeeper *ibctransferkeeper.Keeper
EvidenceKeeper *evidencekeeper.Keeper
GAMMKeeper *gammkeeper.Keeper
TwapKeeper *twap.Keeper
LockupKeeper *lockupkeeper.Keeper
EpochsKeeper *epochskeeper.Keeper
IncentivesKeeper *incentiveskeeper.Keeper
MintKeeper *mintkeeper.Keeper
PoolIncentivesKeeper *poolincentiveskeeper.Keeper
TxFeesKeeper *txfeeskeeper.Keeper
SuperfluidKeeper *superfluidkeeper.Keeper
GovKeeper *govkeeper.Keeper
WasmKeeper *wasm.Keeper
TokenFactoryKeeper *tokenfactorykeeper.Keeper
ValidatorPreferenceKeeper *validatorpreferencekeeper.Keeper
// IBC modules
// transfer module
TransferModule transfer.AppModule
Expand Down Expand Up @@ -321,6 +324,14 @@ func (appKeepers *AppKeepers) InitNormalKeepers(
)
appKeepers.TokenFactoryKeeper = &tokenFactoryKeeper

validatorPreferenceKeeper := validatorpreferencekeeper.NewKeeper(
appKeepers.keys[validatorpreferencetypes.StoreKey],
appKeepers.GetSubspace(validatorpreferencetypes.ModuleName),
appKeepers.StakingKeeper,
)

appKeepers.ValidatorPreferenceKeeper = &validatorPreferenceKeeper

// The last arguments can contain custom message handlers, and custom query handlers,
// if we want to allow any custom callbacks
supportedFeatures := "iterator,staking,stargate,osmosis"
Expand Down Expand Up @@ -534,5 +545,6 @@ func KVStoreKeys() []string {
superfluidtypes.StoreKey,
wasm.StoreKey,
tokenfactorytypes.StoreKey,
validatorpreferencetypes.StoreKey,
}
}
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ require (
github.com/mattn/go-sqlite3 v1.14.15
github.com/ory/dockertest/v3 v3.9.1
github.com/osmosis-labs/go-mutesting v0.0.0-20220811235203-65a53b4ea8e3
github.com/osmosis-labs/osmosis/v11 v11.0.1
github.com/pkg/errors v0.9.1
github.com/rakyll/statik v0.1.7
github.com/spf13/cast v1.5.0
Expand Down
3 changes: 3 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -876,12 +876,15 @@ github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4
github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs=
github.com/ory/dockertest/v3 v3.9.1 h1:v4dkG+dlu76goxMiTT2j8zV7s4oPPEppKT8K8p2f1kY=
github.com/ory/dockertest/v3 v3.9.1/go.mod h1:42Ir9hmvaAPm0Mgibk6mBPi7SFvTXxEcnztDYOJ//uM=
github.com/osmosis-labs/bech32-ibc v0.3.0-rc1 h1:frHKHEdPfzoK2iMF2GeWKudLLzUXz+6GJcdZ/TMcs2k=
github.com/osmosis-labs/cosmos-sdk v0.45.1-0.20220921135931-3c4d30596acc h1:WPsgSEDb4RsdUxhy7qmKU++kZ07mMHFVMeSl8Hp808w=
github.com/osmosis-labs/cosmos-sdk v0.45.1-0.20220921135931-3c4d30596acc/go.mod h1:uUkGXyCWol+CHoaMxZA0nKglvlN5uHBCMbMSsZoGSAs=
github.com/osmosis-labs/go-mutesting v0.0.0-20220811235203-65a53b4ea8e3 h1:/imbKy8s1I+z7wx4FbRHOXK2v82xesUCz2EPUqfBDIg=
github.com/osmosis-labs/go-mutesting v0.0.0-20220811235203-65a53b4ea8e3/go.mod h1:lV6KnqXYD/ayTe7310MHtM3I2q8Z6bBfMAi+bhwPYtI=
github.com/osmosis-labs/iavl v0.17.3-osmo-v7 h1:6KcADC/WhL7yDmNQxUIJt2XmzNt4FfRmq9gRke45w74=
github.com/osmosis-labs/iavl v0.17.3-osmo-v7/go.mod h1:lJEOIlsd3sVO0JDyXWIXa9/Ur5FBscP26zJx0KxHjto=
github.com/osmosis-labs/osmosis/v11 v11.0.1 h1:xGuaDCcDtdrkJ6pISfipKw9/3T23QIH9GqOAz7ld/3M=
github.com/osmosis-labs/osmosis/v11 v11.0.1/go.mod h1:KoFJzMYRxK9a0+cQrR+FaODbzfgkQHiYnlX4pHm8vCs=
github.com/osmosis-labs/wasmd v0.28.0-osmo-v12.1 h1:CZJSa65banZjQNyDhp+nGPr9MRYrIfOU/aO3ww2V1Rg=
github.com/osmosis-labs/wasmd v0.28.0-osmo-v12.1/go.mod h1:7YWBfoD6zPuu6pmqnq/kMNpc+xqOaxEtolJ5/7xHzB8=
github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw=
Expand Down
16 changes: 16 additions & 0 deletions proto/osmosis/validator-preference/v1beta1/params.proto
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
syntax = "proto3";
package osmosis.validatorpreference.v1beta1;

import "gogoproto/gogo.proto";
import "osmosis/validator-preference/v1beta1/state.proto";

option go_package = "github.com/osmosis-labs/osmosis/v12/x/validator-preference/types";

// Params defines the parameters for the module.
message Params {
// the users validator-set, {valAddr, weight} to unstake the tokens from.
repeated ValidatorPreference preferences = 1 [
(gogoproto.moretags) = "yaml:\"preferences\"",
(gogoproto.nullable) = false
];
}
45 changes: 45 additions & 0 deletions x/validator-preference/keeper/ValidatorSet.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package keeper

import (
"fmt"

sdk "github.com/cosmos/cosmos-sdk/types"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
"github.com/osmosis-labs/osmosis/v12/x/validator-preference/types"
)

// ValidateValidator checks if the validator address is valid and the validator provided exists onchain.
func (k Keeper) ValidateValidator(ctx sdk.Context, valOperAddress string) (sdk.ValAddress, stakingtypes.Validator, error) {
valAddr, err := sdk.ValAddressFromBech32(valOperAddress)
if err != nil {
return nil, stakingtypes.Validator{}, fmt.Errorf("validator address not formatted")
}

validator, found := k.stakingKeeper.GetValidator(ctx, valAddr)
if !found {
return nil, stakingtypes.Validator{}, fmt.Errorf("validator not found %s", validator)
}

return valAddr, validator, nil
}

// ValidatePreferences checks if the sum of the validator set equals 1.
func (k Keeper) ValidatePreferences(ctx sdk.Context, preferences []types.ValidatorPreference) error {
total_weight := sdk.NewDec(0)
for _, val := range preferences {
// validation to check that the validator given is valid
_, _, err := k.ValidateValidator(ctx, val.ValOperAddress)
if err != nil {
return err
}

total_weight = total_weight.Add(val.Weight)
}

// check if the total validator distribution weights equal 1
if !total_weight.Equal(sdk.NewDec(1)) {
return fmt.Errorf("The weights allocated to the validators do not add up to 1, %d", total_weight)
}

return nil
}
57 changes: 57 additions & 0 deletions x/validator-preference/keeper/keeper.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package keeper

import (
"fmt"

"github.com/tendermint/tendermint/libs/log"

sdk "github.com/cosmos/cosmos-sdk/types"
paramtypes "github.com/cosmos/cosmos-sdk/x/params/types"
"github.com/gogo/protobuf/proto"
"github.com/osmosis-labs/osmosis/v12/osmoutils"
"github.com/osmosis-labs/osmosis/v12/x/validator-preference/types"
)

type Keeper struct {
storeKey sdk.StoreKey
paramSpace paramtypes.Subspace
stakingKeeper types.StakingInterface
}

func NewKeeper(storeKey sdk.StoreKey, paramSpace paramtypes.Subspace, stakingKeeper types.StakingInterface) Keeper {
if !paramSpace.HasKeyTable() {
paramSpace = paramSpace.WithKeyTable(types.ParamKeyTable())
}

return Keeper{
storeKey: storeKey,
paramSpace: paramSpace,
stakingKeeper: stakingKeeper,
}
}

func (k Keeper) Logger(ctx sdk.Context) log.Logger {
return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName))
}

func (k Keeper) SetValidatorSetPreferences(ctx sdk.Context, delegator string, validators types.ValidatorSetPreferences) {
store := ctx.KVStore(k.storeKey)
osmoutils.MustSet(store, []byte(delegator), &validators)
}

func (k Keeper) GetValidatorSetPreference(ctx sdk.Context, delegator string) (types.ValidatorSetPreferences, bool) {
validatorSet := types.ValidatorSetPreferences{}

store := ctx.KVStore(k.storeKey)
b := store.Get([]byte(delegator))
if b == nil {
return types.ValidatorSetPreferences{}, false
}

err := proto.Unmarshal(b, &validatorSet)
if err != nil {
return types.ValidatorSetPreferences{}, false
}

return validatorSet, true
}
67 changes: 67 additions & 0 deletions x/validator-preference/keeper/keeper_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package keeper_test

import (
"testing"

sdk "github.com/cosmos/cosmos-sdk/types"
stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types"
"github.com/osmosis-labs/osmosis/v12/app/apptesting"
"github.com/osmosis-labs/osmosis/v12/x/validator-preference/types"
"github.com/stretchr/testify/suite"
)

type KeeperTestSuite struct {
apptesting.KeeperTestHelper

cleanup func()
}

func (suite *KeeperTestSuite) SetupTest() {
suite.Setup()
}

func (suite *KeeperTestSuite) Cleanup() {
suite.cleanup()
}

func (suite *KeeperTestSuite) SetupValidators(bondStatuses []stakingtypes.BondStatus) []sdk.ValAddress {
valAddrs := []sdk.ValAddress{}
for _, status := range bondStatuses {
valAddr := suite.SetupValidator(status)
valAddrs = append(valAddrs, valAddr)
}
return valAddrs
}

// SetupMultipleValidators setups "numValidator" validators and returns their address in string
func (suite *KeeperTestSuite) SetupMultipleValidators(numValidator int) []string {
valAddrs := []string{}
for i := 0; i < numValidator; i++ {
valAddr := suite.SetupValidators([]stakingtypes.BondStatus{stakingtypes.Bonded})
valAddrs = append(valAddrs, valAddr[0].String())
}
return valAddrs
}

func (suite *KeeperTestSuite) PrepareDelegateToValidatorSet() []types.ValidatorPreference {
valAddrs := suite.SetupMultipleValidators(3)
valPreferences := []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),
},
}
return valPreferences
}

func TestKeeperTestSuite(t *testing.T) {
suite.Run(t, new(KeeperTestSuite))
}
60 changes: 60 additions & 0 deletions x/validator-preference/keeper/msg_server.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
package keeper

import (
"context"

sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/osmosis-labs/osmosis/v12/x/validator-preference/types"
)

type msgServer struct {
keeper *Keeper
}

// NewMsgServerImpl returns an implementation of the MsgServer interface
// for the provided Keeper.
func NewMsgServerImpl(keeper *Keeper) types.MsgServer {
return &msgServer{
keeper: keeper,
}
}

var _ types.MsgServer = msgServer{}

func (server msgServer) SetValidatorSetPreference(goCtx context.Context, msg *types.MsgSetValidatorSetPreference) (*types.MsgSetValidatorSetPreferenceResponse, error) {
ctx := sdk.UnwrapSDKContext(goCtx)

preferences := msg.Preferences

// check if a user already have a validator-set created
existingValidator, found := server.keeper.GetValidatorSetPreference(ctx, msg.Delegator)
if found {
preferences = existingValidator.Preferences
}

// check if the distribution weights equals 1
err := server.keeper.ValidatePreferences(ctx, preferences)
if err != nil {
return nil, err
}

// update the validator-set based on what user provides
setMsg := types.ValidatorSetPreferences{
Preferences: msg.Preferences,
}

server.keeper.SetValidatorSetPreferences(ctx, msg.Delegator, setMsg)
return &types.MsgSetValidatorSetPreferenceResponse{}, nil
}

func (server msgServer) DelegateToValidatorSet(goCtx context.Context, msg *types.MsgDelegateToValidatorSet) (*types.MsgDelegateToValidatorSetResponse, error) {
return &types.MsgDelegateToValidatorSetResponse{}, nil
}

func (server msgServer) UndelegateFromValidatorSet(goCtx context.Context, msg *types.MsgUndelegateFromValidatorSet) (*types.MsgUndelegateFromValidatorSetResponse, error) {
return &types.MsgUndelegateFromValidatorSetResponse{}, nil
}

func (server msgServer) WithdrawDelegationRewards(goCtx context.Context, msg *types.MsgWithdrawDelegationRewards) (*types.MsgWithdrawDelegationRewardsResponse, error) {
return &types.MsgWithdrawDelegationRewardsResponse{}, nil
}
Loading

0 comments on commit 634f626

Please sign in to comment.