diff --git a/PENDING.md b/PENDING.md index 908e98abf..8b442d065 100644 --- a/PENDING.md +++ b/PENDING.md @@ -22,6 +22,7 @@ BREAKING CHANGES * SDK * [stake] \#2513 Validator power type from Dec -> Int + * [stake] \#3233 key and value now contain duplicate fields to simplify code * [\#3064](https://github.com/cosmos/cosmos-sdk/issues/3064) Sanitize `sdk.Coin` denom. Coins denoms are now case insensitive, i.e. 100fooToken equals to 100FOOTOKEN. * Tendermint diff --git a/x/stake/client/cli/query.go b/x/stake/client/cli/query.go index 40598fcf8..488ea5b04 100644 --- a/x/stake/client/cli/query.go +++ b/x/stake/client/cli/query.go @@ -36,7 +36,7 @@ func GetCmdQueryValidator(storeName string, cdc *codec.Codec) *cobra.Command { return fmt.Errorf("No validator found with address %s", args[0]) } - validator := types.MustUnmarshalValidator(cdc, addr, res) + validator := types.MustUnmarshalValidator(cdc, res) switch viper.Get(cli.OutputFlag) { case "text": @@ -81,8 +81,7 @@ func GetCmdQueryValidators(storeName string, cdc *codec.Codec) *cobra.Command { // parse out the validators var validators []stake.Validator for _, kv := range resKVs { - addr := kv.Key[1:] - validator := types.MustUnmarshalValidator(cdc, addr, kv.Value) + validator := types.MustUnmarshalValidator(cdc, kv.Value) validators = append(validators, validator) } @@ -209,8 +208,7 @@ func GetCmdQueryDelegation(storeName string, cdc *codec.Codec) *cobra.Command { } // parse out the delegation - - delegation, err := types.UnmarshalDelegation(cdc, key, res) + delegation, err := types.UnmarshalDelegation(cdc, res) if err != nil { return err } @@ -267,7 +265,7 @@ func GetCmdQueryDelegations(storeName string, cdc *codec.Codec) *cobra.Command { // parse out the validators var delegations []stake.Delegation for _, kv := range resKVs { - delegation := types.MustUnmarshalDelegation(cdc, kv.Key, kv.Value) + delegation := types.MustUnmarshalDelegation(cdc, kv.Value) delegations = append(delegations, delegation) } @@ -347,7 +345,7 @@ func GetCmdQueryUnbondingDelegation(storeName string, cdc *codec.Codec) *cobra.C } // parse out the unbonding delegation - ubd := types.MustUnmarshalUBD(cdc, key, res) + ubd := types.MustUnmarshalUBD(cdc, res) switch viper.Get(cli.OutputFlag) { case "text": @@ -401,7 +399,7 @@ func GetCmdQueryUnbondingDelegations(storeName string, cdc *codec.Codec) *cobra. // parse out the unbonding delegations var ubds []stake.UnbondingDelegation for _, kv := range resKVs { - ubd := types.MustUnmarshalUBD(cdc, kv.Key, kv.Value) + ubd := types.MustUnmarshalUBD(cdc, kv.Value) ubds = append(ubds, ubd) } @@ -451,7 +449,7 @@ func GetCmdQueryRedelegation(storeName string, cdc *codec.Codec) *cobra.Command } // parse out the unbonding delegation - red := types.MustUnmarshalRED(cdc, key, res) + red := types.MustUnmarshalRED(cdc, res) switch viper.Get(cli.OutputFlag) { case "text": @@ -505,7 +503,7 @@ func GetCmdQueryRedelegations(storeName string, cdc *codec.Codec) *cobra.Command // parse out the validators var reds []stake.Redelegation for _, kv := range resKVs { - red := types.MustUnmarshalRED(cdc, kv.Key, kv.Value) + red := types.MustUnmarshalRED(cdc, kv.Value) reds = append(reds, red) } diff --git a/x/stake/client/cli/utils.go b/x/stake/client/cli/utils.go index 848e1725d..8a83e5314 100644 --- a/x/stake/client/cli/utils.go +++ b/x/stake/client/cli/utils.go @@ -52,7 +52,7 @@ func getShares( return sharesAmount, errors.Errorf("cannot find delegation to determine percent Error: %v", err) } - delegation, err := types.UnmarshalDelegation(cdc, key, resQuery) + delegation, err := types.UnmarshalDelegation(cdc, resQuery) if err != nil { return sdk.ZeroDec(), err } diff --git a/x/stake/keeper/delegation.go b/x/stake/keeper/delegation.go index 926d5274a..a1f26e307 100644 --- a/x/stake/keeper/delegation.go +++ b/x/stake/keeper/delegation.go @@ -20,7 +20,7 @@ func (k Keeper) GetDelegation(ctx sdk.Context, return delegation, false } - delegation = types.MustUnmarshalDelegation(k.cdc, key, value) + delegation = types.MustUnmarshalDelegation(k.cdc, value) return delegation, true } @@ -31,7 +31,7 @@ func (k Keeper) GetAllDelegations(ctx sdk.Context) (delegations []types.Delegati defer iterator.Close() for ; iterator.Valid(); iterator.Next() { - delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Key(), iterator.Value()) + delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Value()) delegations = append(delegations, delegation) } return delegations @@ -44,7 +44,7 @@ func (k Keeper) GetValidatorDelegations(ctx sdk.Context, valAddr sdk.ValAddress) defer iterator.Close() for ; iterator.Valid(); iterator.Next() { - delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Key(), iterator.Value()) + delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Value()) if delegation.GetValidatorAddr().Equals(valAddr) { delegations = append(delegations, delegation) } @@ -65,7 +65,7 @@ func (k Keeper) GetDelegatorDelegations(ctx sdk.Context, delegator sdk.AccAddres i := 0 for ; iterator.Valid() && i < int(maxRetrieve); iterator.Next() { - delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Key(), iterator.Value()) + delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Value()) delegations[i] = delegation i++ } @@ -101,7 +101,7 @@ func (k Keeper) GetUnbondingDelegations(ctx sdk.Context, delegator sdk.AccAddres i := 0 for ; iterator.Valid() && i < int(maxRetrieve); iterator.Next() { - unbondingDelegation := types.MustUnmarshalUBD(k.cdc, iterator.Key(), iterator.Value()) + unbondingDelegation := types.MustUnmarshalUBD(k.cdc, iterator.Value()) unbondingDelegations[i] = unbondingDelegation i++ } @@ -119,7 +119,7 @@ func (k Keeper) GetUnbondingDelegation(ctx sdk.Context, return ubd, false } - ubd = types.MustUnmarshalUBD(k.cdc, key, value) + ubd = types.MustUnmarshalUBD(k.cdc, value) return ubd, true } @@ -132,7 +132,7 @@ func (k Keeper) GetUnbondingDelegationsFromValidator(ctx sdk.Context, valAddr sd for ; iterator.Valid(); iterator.Next() { key := GetUBDKeyFromValIndexKey(iterator.Key()) value := store.Get(key) - ubd := types.MustUnmarshalUBD(k.cdc, key, value) + ubd := types.MustUnmarshalUBD(k.cdc, value) ubds = append(ubds, ubd) } return ubds @@ -145,7 +145,7 @@ func (k Keeper) IterateUnbondingDelegations(ctx sdk.Context, fn func(index int64 defer iterator.Close() for i := int64(0); iterator.Valid(); iterator.Next() { - ubd := types.MustUnmarshalUBD(k.cdc, iterator.Key(), iterator.Value()) + ubd := types.MustUnmarshalUBD(k.cdc, iterator.Value()) if stop := fn(i, ubd); stop { break } @@ -235,7 +235,7 @@ func (k Keeper) GetRedelegations(ctx sdk.Context, delegator sdk.AccAddress, i := 0 for ; iterator.Valid() && i < int(maxRetrieve); iterator.Next() { - redelegation := types.MustUnmarshalRED(k.cdc, iterator.Key(), iterator.Value()) + redelegation := types.MustUnmarshalRED(k.cdc, iterator.Value()) redelegations[i] = redelegation i++ } @@ -253,7 +253,7 @@ func (k Keeper) GetRedelegation(ctx sdk.Context, return red, false } - red = types.MustUnmarshalRED(k.cdc, key, value) + red = types.MustUnmarshalRED(k.cdc, value) return red, true } @@ -266,7 +266,7 @@ func (k Keeper) GetRedelegationsFromValidator(ctx sdk.Context, valAddr sdk.ValAd for ; iterator.Valid(); iterator.Next() { key := GetREDKeyFromValSrcIndexKey(iterator.Key()) value := store.Get(key) - red := types.MustUnmarshalRED(k.cdc, key, value) + red := types.MustUnmarshalRED(k.cdc, value) reds = append(reds, red) } return reds @@ -305,7 +305,7 @@ func (k Keeper) IterateRedelegations(ctx sdk.Context, fn func(index int64, red t defer iterator.Close() for i := int64(0); iterator.Valid(); iterator.Next() { - red := types.MustUnmarshalRED(k.cdc, iterator.Key(), iterator.Value()) + red := types.MustUnmarshalRED(k.cdc, iterator.Value()) if stop := fn(i, red); stop { break } diff --git a/x/stake/keeper/query_utils.go b/x/stake/keeper/query_utils.go index 699ae8ccf..aef7bad47 100644 --- a/x/stake/keeper/query_utils.go +++ b/x/stake/keeper/query_utils.go @@ -17,8 +17,7 @@ func (k Keeper) GetDelegatorValidators(ctx sdk.Context, delegatorAddr sdk.AccAdd i := 0 for ; iterator.Valid() && i < int(maxRetrieve); iterator.Next() { - addr := iterator.Key() - delegation := types.MustUnmarshalDelegation(k.cdc, addr, iterator.Value()) + delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Value()) validator, found := k.GetValidator(ctx, delegation.ValidatorAddr) if !found { @@ -59,7 +58,7 @@ func (k Keeper) GetAllDelegatorDelegations(ctx sdk.Context, delegator sdk.AccAdd i := 0 for ; iterator.Valid(); iterator.Next() { - delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Key(), iterator.Value()) + delegation := types.MustUnmarshalDelegation(k.cdc, iterator.Value()) delegations = append(delegations, delegation) i++ } @@ -77,7 +76,7 @@ func (k Keeper) GetAllUnbondingDelegations(ctx sdk.Context, delegator sdk.AccAdd i := 0 for ; iterator.Valid(); iterator.Next() { - unbondingDelegation := types.MustUnmarshalUBD(k.cdc, iterator.Key(), iterator.Value()) + unbondingDelegation := types.MustUnmarshalUBD(k.cdc, iterator.Value()) unbondingDelegations = append(unbondingDelegations, unbondingDelegation) i++ } @@ -95,7 +94,7 @@ func (k Keeper) GetAllRedelegations(ctx sdk.Context, delegator sdk.AccAddress, s dstValFilter := !(dstValAddress.Empty() || dstValAddress == nil) for ; iterator.Valid(); iterator.Next() { - redelegation := types.MustUnmarshalRED(k.cdc, iterator.Key(), iterator.Value()) + redelegation := types.MustUnmarshalRED(k.cdc, iterator.Value()) if srcValFilter && !(srcValAddress.Equals(redelegation.ValidatorSrcAddr)) { continue } diff --git a/x/stake/keeper/sdk_types.go b/x/stake/keeper/sdk_types.go index dcef5c6d6..316ca79ff 100644 --- a/x/stake/keeper/sdk_types.go +++ b/x/stake/keeper/sdk_types.go @@ -16,8 +16,7 @@ func (k Keeper) IterateValidators(ctx sdk.Context, fn func(index int64, validato iterator := sdk.KVStorePrefixIterator(store, ValidatorsKey) i := int64(0) for ; iterator.Valid(); iterator.Next() { - addr := iterator.Key()[1:] - validator := types.MustUnmarshalValidator(k.cdc, addr, iterator.Value()) + validator := types.MustUnmarshalValidator(k.cdc, iterator.Value()) stop := fn(i, validator) // XXX is this safe will the validator unexposed fields be able to get written to? if stop { break @@ -136,7 +135,7 @@ func (k Keeper) IterateDelegations(ctx sdk.Context, delAddr sdk.AccAddress, delegatorPrefixKey := GetDelegationsKey(delAddr) iterator := sdk.KVStorePrefixIterator(store, delegatorPrefixKey) //smallest to largest for i := int64(0); iterator.Valid(); iterator.Next() { - del := types.MustUnmarshalDelegation(k.cdc, iterator.Key(), iterator.Value()) + del := types.MustUnmarshalDelegation(k.cdc, iterator.Value()) stop := fn(i, del) if stop { break diff --git a/x/stake/keeper/validator.go b/x/stake/keeper/validator.go index c69a7e63c..f5795bd4a 100644 --- a/x/stake/keeper/validator.go +++ b/x/stake/keeper/validator.go @@ -36,7 +36,7 @@ func (k Keeper) GetValidator(ctx sdk.Context, addr sdk.ValAddress) (validator ty } // amino bytes weren't found in cache, so amino unmarshal and add it to the cache - validator = types.MustUnmarshalValidator(k.cdc, addr, value) + validator = types.MustUnmarshalValidator(k.cdc, value) cachedVal := cachedValidator{validator, strValue} k.validatorCache[strValue] = cachedValidator{validator, strValue} k.validatorCacheList.PushBack(cachedVal) @@ -47,7 +47,7 @@ func (k Keeper) GetValidator(ctx sdk.Context, addr sdk.ValAddress) (validator ty delete(k.validatorCache, valToRemove.marshalled) } - validator = types.MustUnmarshalValidator(k.cdc, addr, value) + validator = types.MustUnmarshalValidator(k.cdc, value) return validator, true } @@ -217,8 +217,7 @@ func (k Keeper) GetAllValidators(ctx sdk.Context) (validators []types.Validator) defer iterator.Close() for ; iterator.Valid(); iterator.Next() { - addr := iterator.Key()[1:] - validator := types.MustUnmarshalValidator(k.cdc, addr, iterator.Value()) + validator := types.MustUnmarshalValidator(k.cdc, iterator.Value()) validators = append(validators, validator) } return validators @@ -234,8 +233,7 @@ func (k Keeper) GetValidators(ctx sdk.Context, maxRetrieve uint16) (validators [ i := 0 for ; iterator.Valid() && i < int(maxRetrieve); iterator.Next() { - addr := iterator.Key()[1:] - validator := types.MustUnmarshalValidator(k.cdc, addr, iterator.Value()) + validator := types.MustUnmarshalValidator(k.cdc, iterator.Value()) validators[i] = validator i++ } diff --git a/x/stake/types/delegation.go b/x/stake/types/delegation.go index 0d49b1db5..46fb74e1d 100644 --- a/x/stake/types/delegation.go +++ b/x/stake/types/delegation.go @@ -35,50 +35,24 @@ type Delegation struct { Shares sdk.Dec `json:"shares"` } -type delegationValue struct { - Shares sdk.Dec -} - -// return the delegation without fields contained within the key for the store +// return the delegation func MustMarshalDelegation(cdc *codec.Codec, delegation Delegation) []byte { - val := delegationValue{ - delegation.Shares, - } - return cdc.MustMarshalBinaryLengthPrefixed(val) + return cdc.MustMarshalBinaryLengthPrefixed(delegation) } -// return the delegation without fields contained within the key for the store -func MustUnmarshalDelegation(cdc *codec.Codec, key, value []byte) Delegation { - delegation, err := UnmarshalDelegation(cdc, key, value) +// return the delegation +func MustUnmarshalDelegation(cdc *codec.Codec, value []byte) Delegation { + delegation, err := UnmarshalDelegation(cdc, value) if err != nil { panic(err) } return delegation } -// return the delegation without fields contained within the key for the store -func UnmarshalDelegation(cdc *codec.Codec, key, value []byte) (delegation Delegation, err error) { - var storeValue delegationValue - err = cdc.UnmarshalBinaryLengthPrefixed(value, &storeValue) - if err != nil { - err = fmt.Errorf("%v: %v", ErrNoDelegation(DefaultCodespace).Data(), err) - return - } - - addrs := key[1:] // remove prefix bytes - if len(addrs) != 2*sdk.AddrLen { - err = fmt.Errorf("%v", ErrBadDelegationAddr(DefaultCodespace).Data()) - return - } - - delAddr := sdk.AccAddress(addrs[:sdk.AddrLen]) - valAddr := sdk.ValAddress(addrs[sdk.AddrLen:]) - - return Delegation{ - DelegatorAddr: delAddr, - ValidatorAddr: valAddr, - Shares: storeValue.Shares, - }, nil +// return the delegation +func UnmarshalDelegation(cdc *codec.Codec, value []byte) (delegation Delegation, err error) { + err = cdc.UnmarshalBinaryLengthPrefixed(value, &delegation) + return delegation, err } // nolint @@ -118,57 +92,24 @@ type UnbondingDelegation struct { Balance sdk.Coin `json:"balance"` // atoms to receive at completion } -type ubdValue struct { - CreationHeight int64 - MinTime time.Time - InitialBalance sdk.Coin - Balance sdk.Coin -} - -// return the unbonding delegation without fields contained within the key for the store +// return the unbonding delegation func MustMarshalUBD(cdc *codec.Codec, ubd UnbondingDelegation) []byte { - val := ubdValue{ - ubd.CreationHeight, - ubd.MinTime, - ubd.InitialBalance, - ubd.Balance, - } - return cdc.MustMarshalBinaryLengthPrefixed(val) + return cdc.MustMarshalBinaryLengthPrefixed(ubd) } -// unmarshal a unbonding delegation from a store key and value -func MustUnmarshalUBD(cdc *codec.Codec, key, value []byte) UnbondingDelegation { - ubd, err := UnmarshalUBD(cdc, key, value) +// unmarshal a unbonding delegation from a store value +func MustUnmarshalUBD(cdc *codec.Codec, value []byte) UnbondingDelegation { + ubd, err := UnmarshalUBD(cdc, value) if err != nil { panic(err) } return ubd } -// unmarshal a unbonding delegation from a store key and value -func UnmarshalUBD(cdc *codec.Codec, key, value []byte) (ubd UnbondingDelegation, err error) { - var storeValue ubdValue - err = cdc.UnmarshalBinaryLengthPrefixed(value, &storeValue) - if err != nil { - return - } - - addrs := key[1:] // remove prefix bytes - if len(addrs) != 2*sdk.AddrLen { - err = fmt.Errorf("%v", ErrBadDelegationAddr(DefaultCodespace).Data()) - return - } - delAddr := sdk.AccAddress(addrs[:sdk.AddrLen]) - valAddr := sdk.ValAddress(addrs[sdk.AddrLen:]) - - return UnbondingDelegation{ - DelegatorAddr: delAddr, - ValidatorAddr: valAddr, - CreationHeight: storeValue.CreationHeight, - MinTime: storeValue.MinTime, - InitialBalance: storeValue.InitialBalance, - Balance: storeValue.Balance, - }, nil +// unmarshal a unbonding delegation from a store value +func UnmarshalUBD(cdc *codec.Codec, value []byte) (ubd UnbondingDelegation, err error) { + err = cdc.UnmarshalBinaryLengthPrefixed(value, &ubd) + return ubd, err } // nolint @@ -206,65 +147,24 @@ type Redelegation struct { SharesDst sdk.Dec `json:"shares_dst"` // amount of destination shares redelegating } -type redValue struct { - CreationHeight int64 - MinTime time.Time - InitialBalance sdk.Coin - Balance sdk.Coin - SharesSrc sdk.Dec - SharesDst sdk.Dec -} - -// return the redelegation without fields contained within the key for the store +// return the redelegation func MustMarshalRED(cdc *codec.Codec, red Redelegation) []byte { - val := redValue{ - red.CreationHeight, - red.MinTime, - red.InitialBalance, - red.Balance, - red.SharesSrc, - red.SharesDst, - } - return cdc.MustMarshalBinaryLengthPrefixed(val) + return cdc.MustMarshalBinaryLengthPrefixed(red) } -// unmarshal a redelegation from a store key and value -func MustUnmarshalRED(cdc *codec.Codec, key, value []byte) Redelegation { - red, err := UnmarshalRED(cdc, key, value) +// unmarshal a redelegation from a store value +func MustUnmarshalRED(cdc *codec.Codec, value []byte) Redelegation { + red, err := UnmarshalRED(cdc, value) if err != nil { panic(err) } return red } -// unmarshal a redelegation from a store key and value -func UnmarshalRED(cdc *codec.Codec, key, value []byte) (red Redelegation, err error) { - var storeValue redValue - err = cdc.UnmarshalBinaryLengthPrefixed(value, &storeValue) - if err != nil { - return - } - - addrs := key[1:] // remove prefix bytes - if len(addrs) != 3*sdk.AddrLen { - err = fmt.Errorf("%v", ErrBadRedelegationAddr(DefaultCodespace).Data()) - return - } - delAddr := sdk.AccAddress(addrs[:sdk.AddrLen]) - valSrcAddr := sdk.ValAddress(addrs[sdk.AddrLen : 2*sdk.AddrLen]) - valDstAddr := sdk.ValAddress(addrs[2*sdk.AddrLen:]) - - return Redelegation{ - DelegatorAddr: delAddr, - ValidatorSrcAddr: valSrcAddr, - ValidatorDstAddr: valDstAddr, - CreationHeight: storeValue.CreationHeight, - MinTime: storeValue.MinTime, - InitialBalance: storeValue.InitialBalance, - Balance: storeValue.Balance, - SharesSrc: storeValue.SharesSrc, - SharesDst: storeValue.SharesDst, - }, nil +// unmarshal a redelegation from a store value +func UnmarshalRED(cdc *codec.Codec, value []byte) (red Redelegation, err error) { + err = cdc.UnmarshalBinaryLengthPrefixed(value, &red) + return red, err } // nolint diff --git a/x/stake/types/validator.go b/x/stake/types/validator.go index 065e4d42b..eddce185e 100644 --- a/x/stake/types/validator.go +++ b/x/stake/types/validator.go @@ -55,71 +55,24 @@ func NewValidator(operator sdk.ValAddress, pubKey crypto.PubKey, description Des } } -// what's kept in the store value -type validatorValue struct { - ConsPubKey crypto.PubKey - Jailed bool - Status sdk.BondStatus - Tokens sdk.Int - DelegatorShares sdk.Dec - Description Description - BondHeight int64 - UnbondingHeight int64 - UnbondingMinTime time.Time - Commission Commission -} - -// return the redelegation without fields contained within the key for the store +// return the redelegation func MustMarshalValidator(cdc *codec.Codec, validator Validator) []byte { - val := validatorValue{ - ConsPubKey: validator.ConsPubKey, - Jailed: validator.Jailed, - Status: validator.Status, - Tokens: validator.Tokens, - DelegatorShares: validator.DelegatorShares, - Description: validator.Description, - BondHeight: validator.BondHeight, - UnbondingHeight: validator.UnbondingHeight, - UnbondingMinTime: validator.UnbondingMinTime, - Commission: validator.Commission, - } - return cdc.MustMarshalBinaryLengthPrefixed(val) + return cdc.MustMarshalBinaryLengthPrefixed(validator) } -// unmarshal a redelegation from a store key and value -func MustUnmarshalValidator(cdc *codec.Codec, operatorAddr, value []byte) Validator { - validator, err := UnmarshalValidator(cdc, operatorAddr, value) +// unmarshal a redelegation from a store value +func MustUnmarshalValidator(cdc *codec.Codec, value []byte) Validator { + validator, err := UnmarshalValidator(cdc, value) if err != nil { panic(err) } return validator } -// unmarshal a redelegation from a store key and value -func UnmarshalValidator(cdc *codec.Codec, operatorAddr, value []byte) (validator Validator, err error) { - if len(operatorAddr) != sdk.AddrLen { - err = fmt.Errorf("%v", ErrBadValidatorAddr(DefaultCodespace).Data()) - return - } - var storeValue validatorValue - err = cdc.UnmarshalBinaryLengthPrefixed(value, &storeValue) - if err != nil { - return - } - - return Validator{ - OperatorAddr: operatorAddr, - ConsPubKey: storeValue.ConsPubKey, - Jailed: storeValue.Jailed, - Tokens: storeValue.Tokens, - Status: storeValue.Status, - DelegatorShares: storeValue.DelegatorShares, - Description: storeValue.Description, - BondHeight: storeValue.BondHeight, - UnbondingHeight: storeValue.UnbondingHeight, - UnbondingMinTime: storeValue.UnbondingMinTime, - Commission: storeValue.Commission, - }, nil +// unmarshal a redelegation from a store value +func UnmarshalValidator(cdc *codec.Codec, value []byte) (validator Validator, err error) { + err = cdc.UnmarshalBinaryLengthPrefixed(value, &validator) + return validator, err } // HumanReadableString returns a human readable string representation of a