working addressed bucky comments
This commit is contained in:
parent
d192dcf8a5
commit
26be2a231b
|
@ -409,7 +409,7 @@ func TestStakeMsgs(t *testing.T) {
|
||||||
require.True(t, found)
|
require.True(t, found)
|
||||||
require.Equal(t, addr1, validator.Address)
|
require.Equal(t, addr1, validator.Address)
|
||||||
require.Equal(t, sdk.Bonded, validator.Status)
|
require.Equal(t, sdk.Bonded, validator.Status)
|
||||||
require.True(sdk.RatEq(t, sdk.NewRat(10), validator.PShares.Bonded()))
|
require.True(sdk.RatEq(t, sdk.NewRat(10), validator.PoolShares.Bonded()))
|
||||||
|
|
||||||
// check the bond that should have been created as well
|
// check the bond that should have been created as well
|
||||||
bond, found := gapp.stakeKeeper.GetDelegation(ctxDeliver, addr1, addr1)
|
bond, found := gapp.stakeKeeper.GetDelegation(ctxDeliver, addr1, addr1)
|
||||||
|
|
|
@ -161,7 +161,7 @@ func GaiaAppGenState(cdc *wire.Codec, appGenTxs []json.RawMessage) (appState jso
|
||||||
if len(genTx.Name) > 0 {
|
if len(genTx.Name) > 0 {
|
||||||
desc := stake.NewDescription(genTx.Name, "", "", "")
|
desc := stake.NewDescription(genTx.Name, "", "", "")
|
||||||
validator := stake.NewValidator(genTx.Address, genTx.PubKey, desc)
|
validator := stake.NewValidator(genTx.Address, genTx.PubKey, desc)
|
||||||
validator.PShares = stake.NewBondedShares(sdk.NewRat(freeFermionVal))
|
validator.PoolShares = stake.NewBondedShares(sdk.NewRat(freeFermionVal))
|
||||||
stakeData.Validators = append(stakeData.Validators, validator)
|
stakeData.Validators = append(stakeData.Validators, validator)
|
||||||
|
|
||||||
// pool logic
|
// pool logic
|
||||||
|
|
|
@ -4,7 +4,7 @@ package types
|
||||||
type Handler func(ctx Context, msg Msg) Result
|
type Handler func(ctx Context, msg Msg) Result
|
||||||
|
|
||||||
// core function variable which application runs to handle fees
|
// core function variable which application runs to handle fees
|
||||||
type FeeHandler func(ctx Context, fee Coins)
|
type FeeHandler func(ctx Context, tx Tx, fee Coins)
|
||||||
|
|
||||||
// If newCtx.IsZero(), ctx is used instead.
|
// If newCtx.IsZero(), ctx is used instead.
|
||||||
type AnteHandler func(ctx Context, tx Tx) (newCtx Context, result Result, abort bool)
|
type AnteHandler func(ctx Context, tx Tx) (newCtx Context, result Result, abort bool)
|
||||||
|
|
|
@ -19,7 +19,7 @@ const (
|
||||||
// validator for a delegated proof of stake system
|
// validator for a delegated proof of stake system
|
||||||
type Validator interface {
|
type Validator interface {
|
||||||
GetStatus() BondStatus // status of the validator
|
GetStatus() BondStatus // status of the validator
|
||||||
GetAddress() Address // owner address to receive/return validators coins
|
GetOwner() Address // owner address to receive/return validators coins
|
||||||
GetPubKey() crypto.PubKey // validation pubkey
|
GetPubKey() crypto.PubKey // validation pubkey
|
||||||
GetPower() Rat // validation power
|
GetPower() Rat // validation power
|
||||||
GetBondHeight() int64 // height in which the validator became active
|
GetBondHeight() int64 // height in which the validator became active
|
||||||
|
|
|
@ -77,7 +77,7 @@ func NewAnteHandler(am sdk.AccountMapper, feeHandler sdk.FeeHandler) sdk.AnteHan
|
||||||
// TODO: min fee
|
// TODO: min fee
|
||||||
if !fee.Amount.IsZero() {
|
if !fee.Amount.IsZero() {
|
||||||
signerAcc, res = deductFees(signerAcc, fee)
|
signerAcc, res = deductFees(signerAcc, fee)
|
||||||
feeHandler(ctx, fee.Amount)
|
feeHandler(ctx, tx, fee.Amount)
|
||||||
if !res.IsOK() {
|
if !res.IsOK() {
|
||||||
return ctx, res, true
|
return ctx, res, true
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
// burn burn burn
|
// burn burn burn
|
||||||
func BurnFeeHandler(ctx sdk.Context, collectedFees sdk.Coins) {}
|
func BurnFeeHandler(ctx sdk.Context, _ sdk.Tx, collectedFees sdk.Coins) {}
|
||||||
|
|
||||||
//// Handle fee distribution to the validators and delegators
|
//// Handle fee distribution to the validators and delegators
|
||||||
//func (k Keeper) FeeHandler(ctx sdk.Context, collectedFees sdk.Coins) {
|
//func (k Keeper) FeeHandler(ctx sdk.Context, collectedFees sdk.Coins) {
|
||||||
|
|
|
@ -133,11 +133,11 @@ func delegate(ctx sdk.Context, k Keeper, delegatorAddr sdk.Address,
|
||||||
bondAmt sdk.Coin, validator Validator) (sdk.Tags, sdk.Error) {
|
bondAmt sdk.Coin, validator Validator) (sdk.Tags, sdk.Error) {
|
||||||
|
|
||||||
// Get or create the delegator bond
|
// Get or create the delegator bond
|
||||||
bond, found := k.GetDelegation(ctx, delegatorAddr, validator.Address)
|
bond, found := k.GetDelegation(ctx, delegatorAddr, validator.Owner)
|
||||||
if !found {
|
if !found {
|
||||||
bond = Delegation{
|
bond = Delegation{
|
||||||
DelegatorAddr: delegatorAddr,
|
DelegatorAddr: delegatorAddr,
|
||||||
ValidatorAddr: validator.Address,
|
ValidatorAddr: validator.Owner,
|
||||||
Shares: sdk.ZeroRat(),
|
Shares: sdk.ZeroRat(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -154,10 +154,10 @@ func delegate(ctx sdk.Context, k Keeper, delegatorAddr sdk.Address,
|
||||||
// Update bond height
|
// Update bond height
|
||||||
bond.Height = ctx.BlockHeight()
|
bond.Height = ctx.BlockHeight()
|
||||||
|
|
||||||
|
k.setPool(ctx, pool)
|
||||||
k.setDelegation(ctx, bond)
|
k.setDelegation(ctx, bond)
|
||||||
k.setValidator(ctx, validator)
|
k.setValidator(ctx, validator)
|
||||||
k.setPool(ctx, pool)
|
tags := sdk.NewTags("action", []byte("delegate"), "delegator", delegatorAddr.Bytes(), "validator", validator.Owner.Bytes())
|
||||||
tags := sdk.NewTags("action", []byte("delegate"), "delegator", delegatorAddr.Bytes(), "validator", validator.Address.Bytes())
|
|
||||||
return tags, nil
|
return tags, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,9 +168,6 @@ func handleMsgUnbond(ctx sdk.Context, msg MsgUnbond, k Keeper) sdk.Result {
|
||||||
if !found {
|
if !found {
|
||||||
return ErrNoDelegatorForAddress(k.codespace).Result()
|
return ErrNoDelegatorForAddress(k.codespace).Result()
|
||||||
}
|
}
|
||||||
if !bond.Shares.GT(sdk.ZeroRat()) { // bond shares < msg shares
|
|
||||||
return ErrInsufficientFunds(k.codespace).Result()
|
|
||||||
}
|
|
||||||
|
|
||||||
var delShares sdk.Rat
|
var delShares sdk.Rat
|
||||||
|
|
||||||
|
@ -214,7 +211,7 @@ func handleMsgUnbond(ctx sdk.Context, msg MsgUnbond, k Keeper) sdk.Result {
|
||||||
|
|
||||||
// if the bond is the owner of the validator then
|
// if the bond is the owner of the validator then
|
||||||
// trigger a revoke candidacy
|
// trigger a revoke candidacy
|
||||||
if bytes.Equal(bond.DelegatorAddr, validator.Address) &&
|
if bytes.Equal(bond.DelegatorAddr, validator.Owner) &&
|
||||||
validator.Status != sdk.Revoked {
|
validator.Status != sdk.Revoked {
|
||||||
revokeCandidacy = true
|
revokeCandidacy = true
|
||||||
}
|
}
|
||||||
|
@ -227,8 +224,8 @@ func handleMsgUnbond(ctx sdk.Context, msg MsgUnbond, k Keeper) sdk.Result {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add the coins
|
// Add the coins
|
||||||
p := k.GetPool(ctx)
|
pool := k.GetPool(ctx)
|
||||||
validator, p, returnAmount := validator.removeDelShares(p, delShares)
|
validator, pool, returnAmount := validator.removeDelShares(pool, delShares)
|
||||||
returnCoins := sdk.Coins{{k.GetParams(ctx).BondDenom, returnAmount}}
|
returnCoins := sdk.Coins{{k.GetParams(ctx).BondDenom, returnAmount}}
|
||||||
k.coinKeeper.AddCoins(ctx, bond.DelegatorAddr, returnCoins)
|
k.coinKeeper.AddCoins(ctx, bond.DelegatorAddr, returnCoins)
|
||||||
|
|
||||||
|
@ -240,7 +237,7 @@ func handleMsgUnbond(ctx sdk.Context, msg MsgUnbond, k Keeper) sdk.Result {
|
||||||
// change the share types to unbonded if they were not already
|
// change the share types to unbonded if they were not already
|
||||||
if validator.Status == sdk.Bonded {
|
if validator.Status == sdk.Bonded {
|
||||||
validator.Status = sdk.Unbonded
|
validator.Status = sdk.Unbonded
|
||||||
validator, p = validator.UpdateSharesLocation(p)
|
validator, pool = validator.UpdateSharesLocation(pool)
|
||||||
}
|
}
|
||||||
|
|
||||||
// lastly update the status
|
// lastly update the status
|
||||||
|
@ -249,11 +246,11 @@ func handleMsgUnbond(ctx sdk.Context, msg MsgUnbond, k Keeper) sdk.Result {
|
||||||
|
|
||||||
// deduct shares from the validator
|
// deduct shares from the validator
|
||||||
if validator.DelegatorShares.IsZero() {
|
if validator.DelegatorShares.IsZero() {
|
||||||
k.removeValidator(ctx, validator.Address)
|
k.removeValidator(ctx, validator.Owner)
|
||||||
} else {
|
} else {
|
||||||
k.setValidator(ctx, validator)
|
k.setValidator(ctx, validator)
|
||||||
}
|
}
|
||||||
k.setPool(ctx, p)
|
k.setPool(ctx, pool)
|
||||||
tags := sdk.NewTags("action", []byte("unbond"), "delegator", msg.DelegatorAddr.Bytes(), "validator", msg.ValidatorAddr.Bytes())
|
tags := sdk.NewTags("action", []byte("unbond"), "delegator", msg.DelegatorAddr.Bytes(), "validator", msg.ValidatorAddr.Bytes())
|
||||||
return sdk.Result{
|
return sdk.Result{
|
||||||
Tags: tags,
|
Tags: tags,
|
||||||
|
|
|
@ -46,7 +46,7 @@ func TestDuplicatesMsgDeclareCandidacy(t *testing.T) {
|
||||||
assert.Equal(t, sdk.Bonded, validator.Status)
|
assert.Equal(t, sdk.Bonded, validator.Status)
|
||||||
assert.Equal(t, validatorAddr, validator.Address)
|
assert.Equal(t, validatorAddr, validator.Address)
|
||||||
assert.Equal(t, pk, validator.PubKey)
|
assert.Equal(t, pk, validator.PubKey)
|
||||||
assert.Equal(t, sdk.NewRat(10), validator.PShares.Bonded())
|
assert.Equal(t, sdk.NewRat(10), validator.PoolShares.Bonded())
|
||||||
assert.Equal(t, sdk.NewRat(10), validator.DelegatorShares)
|
assert.Equal(t, sdk.NewRat(10), validator.DelegatorShares)
|
||||||
assert.Equal(t, Description{}, validator.Description)
|
assert.Equal(t, Description{}, validator.Description)
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ func TestIncrementsMsgDelegate(t *testing.T) {
|
||||||
require.True(t, found)
|
require.True(t, found)
|
||||||
require.Equal(t, sdk.Bonded, validator.Status)
|
require.Equal(t, sdk.Bonded, validator.Status)
|
||||||
assert.Equal(t, bondAmount, validator.DelegatorShares.Evaluate())
|
assert.Equal(t, bondAmount, validator.DelegatorShares.Evaluate())
|
||||||
assert.Equal(t, bondAmount, validator.PShares.Bonded().Evaluate(), "validator: %v", validator)
|
assert.Equal(t, bondAmount, validator.PoolShares.Bonded().Evaluate(), "validator: %v", validator)
|
||||||
|
|
||||||
_, found = keeper.GetDelegation(ctx, delegatorAddr, validatorAddr)
|
_, found = keeper.GetDelegation(ctx, delegatorAddr, validatorAddr)
|
||||||
require.False(t, found)
|
require.False(t, found)
|
||||||
|
@ -148,7 +148,7 @@ func TestIncrementsMsgUnbond(t *testing.T) {
|
||||||
validator, found := keeper.GetValidator(ctx, validatorAddr)
|
validator, found := keeper.GetValidator(ctx, validatorAddr)
|
||||||
require.True(t, found)
|
require.True(t, found)
|
||||||
assert.Equal(t, initBond*2, validator.DelegatorShares.Evaluate())
|
assert.Equal(t, initBond*2, validator.DelegatorShares.Evaluate())
|
||||||
assert.Equal(t, initBond*2, validator.PShares.Bonded().Evaluate())
|
assert.Equal(t, initBond*2, validator.PoolShares.Bonded().Evaluate())
|
||||||
|
|
||||||
// just send the same msgUnbond multiple times
|
// just send the same msgUnbond multiple times
|
||||||
// TODO use decimals here
|
// TODO use decimals here
|
||||||
|
|
|
@ -2,6 +2,7 @@ package stake
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/cosmos/cosmos-sdk/wire"
|
"github.com/cosmos/cosmos-sdk/wire"
|
||||||
|
@ -59,7 +60,7 @@ func (k Keeper) getAllValidators(ctx sdk.Context) (validators Validators) {
|
||||||
validators = append(validators, validator)
|
validators = append(validators, validator)
|
||||||
iterator.Next()
|
iterator.Next()
|
||||||
}
|
}
|
||||||
return validators[:i] // trim
|
return validators
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the set of all validators, retrieve a maxRetrieve number of records
|
// Get the set of all validators, retrieve a maxRetrieve number of records
|
||||||
|
@ -86,7 +87,7 @@ func (k Keeper) GetValidators(ctx sdk.Context, maxRetrieve int16) (validators Va
|
||||||
func (k Keeper) setValidator(ctx sdk.Context, validator Validator) Validator {
|
func (k Keeper) setValidator(ctx sdk.Context, validator Validator) Validator {
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
pool := k.getPool(store)
|
pool := k.getPool(store)
|
||||||
address := validator.Address
|
address := validator.Owner
|
||||||
|
|
||||||
// update the main list ordered by address before exiting
|
// update the main list ordered by address before exiting
|
||||||
defer func() {
|
defer func() {
|
||||||
|
@ -103,9 +104,9 @@ func (k Keeper) setValidator(ctx sdk.Context, validator Validator) Validator {
|
||||||
// TODO will need to implement this to have regard for "unrevoke" transaction however
|
// TODO will need to implement this to have regard for "unrevoke" transaction however
|
||||||
// it shouldn't return here under that transaction
|
// it shouldn't return here under that transaction
|
||||||
if oldValidator.Status == validator.Status &&
|
if oldValidator.Status == validator.Status &&
|
||||||
oldValidator.PShares.Equal(validator.PShares) {
|
oldValidator.PoolShares.Equal(validator.PoolShares) {
|
||||||
return validator
|
return validator
|
||||||
} else if oldValidator.PShares.Bonded().LT(validator.PShares.Bonded()) {
|
} else if oldValidator.PoolShares.Bonded().LT(validator.PoolShares.Bonded()) {
|
||||||
powerIncreasing = true
|
powerIncreasing = true
|
||||||
}
|
}
|
||||||
// delete the old record in the power ordered list
|
// delete the old record in the power ordered list
|
||||||
|
@ -141,7 +142,7 @@ func (k Keeper) setValidator(ctx sdk.Context, validator Validator) Validator {
|
||||||
}
|
}
|
||||||
|
|
||||||
// update the validator set for this validator
|
// update the validator set for this validator
|
||||||
nowBonded, retrieve := k.updateBondedValidators(ctx, store, pool, validator.Address)
|
nowBonded, retrieve := k.updateBondedValidators(ctx, store, pool, validator.Owner)
|
||||||
if nowBonded {
|
if nowBonded {
|
||||||
validator = retrieve
|
validator = retrieve
|
||||||
}
|
}
|
||||||
|
@ -252,7 +253,7 @@ func (k Keeper) updateBondedValidators(ctx sdk.Context, store sdk.KVStore, pool
|
||||||
var validator Validator
|
var validator Validator
|
||||||
k.cdc.MustUnmarshalBinary(bz, &validator)
|
k.cdc.MustUnmarshalBinary(bz, &validator)
|
||||||
|
|
||||||
addr := validator.Address
|
addr := validator.Owner
|
||||||
|
|
||||||
// iterator.Value is the validator object
|
// iterator.Value is the validator object
|
||||||
toKickOut[string(addr)] = iterator.Value()
|
toKickOut[string(addr)] = iterator.Value()
|
||||||
|
@ -273,28 +274,26 @@ func (k Keeper) updateBondedValidators(ctx sdk.Context, store sdk.KVStore, pool
|
||||||
var validator Validator
|
var validator Validator
|
||||||
k.cdc.MustUnmarshalBinary(bz, &validator)
|
k.cdc.MustUnmarshalBinary(bz, &validator)
|
||||||
|
|
||||||
_, found := toKickOut[string(validator.Address)]
|
_, found := toKickOut[string(validator.Owner)]
|
||||||
if found {
|
if found {
|
||||||
|
|
||||||
// remove from ToKickOut group
|
// remove from ToKickOut group
|
||||||
delete(toKickOut, string(validator.Address))
|
delete(toKickOut, string(validator.Owner))
|
||||||
|
|
||||||
|
// also add to the current validators group
|
||||||
|
store.Set(GetValidatorsBondedKey(validator.PubKey), bz)
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
// if it wasn't in the toKickOut group it means
|
// if it wasn't in the toKickOut group it means
|
||||||
// this wasn't a previously a validator, therefor
|
// this wasn't a previously a validator, therefor
|
||||||
// update the validator/to reflect this
|
// update the validator to enter the validator group
|
||||||
validator.Status = sdk.Bonded
|
validator = k.bondValidator(ctx, store, validator)
|
||||||
validator, pool = validator.UpdateSharesLocation(pool)
|
if bytes.Equal(validator.Owner, OptionalRetrieve) {
|
||||||
validator = k.bondValidator(ctx, store, validator, pool)
|
|
||||||
if bytes.Equal(validator.Address, OptionalRetrieve) {
|
|
||||||
retrieveBonded = true
|
retrieveBonded = true
|
||||||
retrieve = validator
|
retrieve = validator
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// also add to the current validators group
|
|
||||||
store.Set(GetValidatorsBondedKey(validator.PubKey), bz)
|
|
||||||
|
|
||||||
iterator.Next()
|
iterator.Next()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -314,25 +313,40 @@ func (k Keeper) updateBondedValidators(ctx sdk.Context, store sdk.KVStore, pool
|
||||||
func (k Keeper) unbondValidator(ctx sdk.Context, store sdk.KVStore, validator Validator) {
|
func (k Keeper) unbondValidator(ctx sdk.Context, store sdk.KVStore, validator Validator) {
|
||||||
pool := k.GetPool(ctx)
|
pool := k.GetPool(ctx)
|
||||||
|
|
||||||
|
// sanity check
|
||||||
|
if validator.Status == sdk.Unbonded {
|
||||||
|
panic(fmt.Sprintf("should not already be be unbonded, validator: %v\n", validator))
|
||||||
|
}
|
||||||
|
|
||||||
|
// first delete the old record in the pool
|
||||||
|
store.Delete(GetValidatorsBondedByPowerKey(validator, pool))
|
||||||
|
|
||||||
// set the status
|
// set the status
|
||||||
validator.Status = sdk.Unbonded
|
validator.Status = sdk.Unbonded
|
||||||
validator, pool = validator.UpdateSharesLocation(pool)
|
validator, pool = validator.UpdateSharesLocation(pool)
|
||||||
k.setPool(ctx, pool)
|
k.setPool(ctx, pool)
|
||||||
|
|
||||||
// save the now unbonded validator record
|
// save the now unbonded validator record
|
||||||
bz := k.cdc.MustMarshalBinary(validator)
|
bzVal := k.cdc.MustMarshalBinary(validator)
|
||||||
store.Set(GetValidatorKey(validator.Address), bz)
|
store.Set(GetValidatorKey(validator.Owner), bzVal)
|
||||||
|
store.Set(GetValidatorsBondedByPowerKey(validator, pool), bzVal)
|
||||||
|
|
||||||
// add to accumulated changes for tendermint
|
// add to accumulated changes for tendermint
|
||||||
bz = k.cdc.MustMarshalBinary(validator.abciValidatorZero(k.cdc))
|
bzABCI := k.cdc.MustMarshalBinary(validator.abciValidatorZero(k.cdc))
|
||||||
store.Set(GetTendermintUpdatesKey(validator.Address), bz)
|
store.Set(GetTendermintUpdatesKey(validator.Owner), bzABCI)
|
||||||
|
|
||||||
// also remove from the Bonded Validators Store
|
// also remove from the Bonded Validators Store
|
||||||
store.Delete(GetValidatorsBondedKey(validator.PubKey))
|
store.Delete(GetValidatorsBondedKey(validator.PubKey))
|
||||||
}
|
}
|
||||||
|
|
||||||
// perform all the store operations for when a validator status becomes bonded
|
// perform all the store operations for when a validator status becomes bonded
|
||||||
func (k Keeper) bondValidator(ctx sdk.Context, store sdk.KVStore, validator Validator, pool Pool) Validator {
|
func (k Keeper) bondValidator(ctx sdk.Context, store sdk.KVStore, validator Validator) Validator {
|
||||||
|
pool := k.GetPool(ctx)
|
||||||
|
|
||||||
|
// sanity check
|
||||||
|
if validator.Status == sdk.Bonded {
|
||||||
|
panic(fmt.Sprintf("should not already be be bonded, validator: %v\n", validator))
|
||||||
|
}
|
||||||
|
|
||||||
// first delete the old record in the pool
|
// first delete the old record in the pool
|
||||||
store.Delete(GetValidatorsBondedByPowerKey(validator, pool))
|
store.Delete(GetValidatorsBondedByPowerKey(validator, pool))
|
||||||
|
@ -344,13 +358,13 @@ func (k Keeper) bondValidator(ctx sdk.Context, store sdk.KVStore, validator Vali
|
||||||
|
|
||||||
// save the now bonded validator record to the three referened stores
|
// save the now bonded validator record to the three referened stores
|
||||||
bzVal := k.cdc.MustMarshalBinary(validator)
|
bzVal := k.cdc.MustMarshalBinary(validator)
|
||||||
store.Set(GetValidatorKey(validator.Address), bzVal)
|
store.Set(GetValidatorKey(validator.Owner), bzVal)
|
||||||
store.Set(GetValidatorsBondedByPowerKey(validator, pool), bzVal)
|
store.Set(GetValidatorsBondedByPowerKey(validator, pool), bzVal)
|
||||||
store.Set(GetValidatorsBondedKey(validator.PubKey), bzVal)
|
store.Set(GetValidatorsBondedKey(validator.PubKey), bzVal)
|
||||||
|
|
||||||
// add to accumulated changes for tendermint
|
// add to accumulated changes for tendermint
|
||||||
bzABCI := k.cdc.MustMarshalBinary(validator.abciValidator(k.cdc))
|
bzABCI := k.cdc.MustMarshalBinary(validator.abciValidator(k.cdc))
|
||||||
store.Set(GetTendermintUpdatesKey(validator.Address), bzABCI)
|
store.Set(GetTendermintUpdatesKey(validator.Owner), bzABCI)
|
||||||
|
|
||||||
return validator
|
return validator
|
||||||
}
|
}
|
||||||
|
@ -471,6 +485,10 @@ func (k Keeper) getParams(store sdk.KVStore) (params Params) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Need a distinct function because setParams depends on an existing previous
|
||||||
|
// record of params to exist (to check if maxValidators has changed) - and we
|
||||||
|
// panic on retrieval if it doesn't exist - hence if we use setParams for the very
|
||||||
|
// first params set it will panic.
|
||||||
func (k Keeper) setNewParams(ctx sdk.Context, params Params) {
|
func (k Keeper) setNewParams(ctx sdk.Context, params Params) {
|
||||||
store := ctx.KVStore(k.storeKey)
|
store := ctx.KVStore(k.storeKey)
|
||||||
b := k.cdc.MustMarshalBinary(params)
|
b := k.cdc.MustMarshalBinary(params)
|
||||||
|
|
|
@ -45,7 +45,7 @@ func GetValidatorsBondedByPowerKey(validator Validator, pool Pool) []byte {
|
||||||
return append(ValidatorsByPowerKey,
|
return append(ValidatorsByPowerKey,
|
||||||
append(powerBytes,
|
append(powerBytes,
|
||||||
append(heightBytes,
|
append(heightBytes,
|
||||||
append(counterBytes, validator.Address.Bytes()...)...)...)...)
|
append(counterBytes, validator.Owner.Bytes()...)...)...)...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// get the key for the accumulated update validators
|
// get the key for the accumulated update validators
|
||||||
|
|
|
@ -31,7 +31,7 @@ func TestSetValidator(t *testing.T) {
|
||||||
validator := NewValidator(addrVals[0], pks[0], Description{})
|
validator := NewValidator(addrVals[0], pks[0], Description{})
|
||||||
validator, pool, _ = validator.addTokensFromDel(pool, 10)
|
validator, pool, _ = validator.addTokensFromDel(pool, 10)
|
||||||
require.Equal(t, sdk.Unbonded, validator.Status)
|
require.Equal(t, sdk.Unbonded, validator.Status)
|
||||||
assert.True(sdk.RatEq(t, sdk.NewRat(10), validator.PShares.Unbonded()))
|
assert.True(sdk.RatEq(t, sdk.NewRat(10), validator.PoolShares.Unbonded()))
|
||||||
assert.True(sdk.RatEq(t, sdk.NewRat(10), validator.DelegatorShares))
|
assert.True(sdk.RatEq(t, sdk.NewRat(10), validator.DelegatorShares))
|
||||||
keeper.setPool(ctx, pool)
|
keeper.setPool(ctx, pool)
|
||||||
keeper.setValidator(ctx, validator)
|
keeper.setValidator(ctx, validator)
|
||||||
|
@ -40,9 +40,25 @@ func TestSetValidator(t *testing.T) {
|
||||||
validator, found := keeper.GetValidator(ctx, addrVals[0])
|
validator, found := keeper.GetValidator(ctx, addrVals[0])
|
||||||
require.True(t, found)
|
require.True(t, found)
|
||||||
require.Equal(t, sdk.Bonded, validator.Status)
|
require.Equal(t, sdk.Bonded, validator.Status)
|
||||||
assert.True(sdk.RatEq(t, sdk.NewRat(10), validator.PShares.Bonded()))
|
assert.True(sdk.RatEq(t, sdk.NewRat(10), validator.PoolShares.Bonded()))
|
||||||
assert.True(sdk.RatEq(t, sdk.NewRat(10), validator.DelegatorShares))
|
assert.True(sdk.RatEq(t, sdk.NewRat(10), validator.DelegatorShares))
|
||||||
|
|
||||||
|
// Check each store for being saved
|
||||||
|
resVal, found := keeper.GetValidator(ctx, addrVals[0])
|
||||||
|
assert.True(ValEq(t, validator, resVal))
|
||||||
|
|
||||||
|
resVals := keeper.GetValidatorsBonded(ctx)
|
||||||
|
require.Equal(t, 1, len(resVals))
|
||||||
|
assert.True(ValEq(t, validator, resVals[0]))
|
||||||
|
|
||||||
|
resVals = keeper.GetValidatorsBondedByPower(ctx)
|
||||||
|
require.Equal(t, 1, len(resVals))
|
||||||
|
assert.True(ValEq(t, validator, resVals[0]))
|
||||||
|
|
||||||
|
updates := keeper.getTendermintUpdates(ctx)
|
||||||
|
require.Equal(t, 1, len(updates))
|
||||||
|
assert.Equal(t, validator.abciValidator(keeper.cdc), updates[0])
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function tests setValidator, GetValidator, GetValidatorsBonded, removeValidator
|
// This function tests setValidator, GetValidator, GetValidatorsBonded, removeValidator
|
||||||
|
@ -55,8 +71,8 @@ func TestValidatorBasics(t *testing.T) {
|
||||||
amts := []int64{9, 8, 7}
|
amts := []int64{9, 8, 7}
|
||||||
for i, amt := range amts {
|
for i, amt := range amts {
|
||||||
validators[i] = NewValidator(addrVals[i], pks[i], Description{})
|
validators[i] = NewValidator(addrVals[i], pks[i], Description{})
|
||||||
validators[i].Status = sdk.Bonded
|
validators[i].Status = sdk.Unbonded
|
||||||
validators[i].PShares = NewBondedShares(sdk.ZeroRat())
|
validators[i].PoolShares = NewUnbondedShares(sdk.ZeroRat())
|
||||||
validators[i].addTokensFromDel(pool, amt)
|
validators[i].addTokensFromDel(pool, amt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -67,7 +83,7 @@ func TestValidatorBasics(t *testing.T) {
|
||||||
assert.Zero(t, len(resVals))
|
assert.Zero(t, len(resVals))
|
||||||
|
|
||||||
// set and retrieve a record
|
// set and retrieve a record
|
||||||
keeper.setValidator(ctx, validators[0])
|
validators[0] = keeper.setValidator(ctx, validators[0])
|
||||||
resVal, found := keeper.GetValidator(ctx, addrVals[0])
|
resVal, found := keeper.GetValidator(ctx, addrVals[0])
|
||||||
require.True(t, found)
|
require.True(t, found)
|
||||||
assert.True(ValEq(t, validators[0], resVal))
|
assert.True(ValEq(t, validators[0], resVal))
|
||||||
|
@ -77,9 +93,9 @@ func TestValidatorBasics(t *testing.T) {
|
||||||
assert.True(ValEq(t, validators[0], resVals[0]))
|
assert.True(ValEq(t, validators[0], resVals[0]))
|
||||||
|
|
||||||
// modify a records, save, and retrieve
|
// modify a records, save, and retrieve
|
||||||
validators[0].PShares = NewBondedShares(sdk.NewRat(10))
|
validators[0].PoolShares = NewBondedShares(sdk.NewRat(10))
|
||||||
validators[0].DelegatorShares = sdk.NewRat(10)
|
validators[0].DelegatorShares = sdk.NewRat(10)
|
||||||
keeper.setValidator(ctx, validators[0])
|
validators[0] = keeper.setValidator(ctx, validators[0])
|
||||||
resVal, found = keeper.GetValidator(ctx, addrVals[0])
|
resVal, found = keeper.GetValidator(ctx, addrVals[0])
|
||||||
require.True(t, found)
|
require.True(t, found)
|
||||||
assert.True(ValEq(t, validators[0], resVal))
|
assert.True(ValEq(t, validators[0], resVal))
|
||||||
|
@ -89,8 +105,8 @@ func TestValidatorBasics(t *testing.T) {
|
||||||
assert.True(ValEq(t, validators[0], resVals[0]))
|
assert.True(ValEq(t, validators[0], resVals[0]))
|
||||||
|
|
||||||
// add other validators
|
// add other validators
|
||||||
keeper.setValidator(ctx, validators[1])
|
validators[1] = keeper.setValidator(ctx, validators[1])
|
||||||
keeper.setValidator(ctx, validators[2])
|
validators[2] = keeper.setValidator(ctx, validators[2])
|
||||||
resVal, found = keeper.GetValidator(ctx, addrVals[1])
|
resVal, found = keeper.GetValidator(ctx, addrVals[1])
|
||||||
require.True(t, found)
|
require.True(t, found)
|
||||||
assert.True(ValEq(t, validators[1], resVal))
|
assert.True(ValEq(t, validators[1], resVal))
|
||||||
|
@ -120,7 +136,7 @@ func GetValidatorSortingUnmixed(t *testing.T) {
|
||||||
var validators [5]Validator
|
var validators [5]Validator
|
||||||
for i, amt := range amts {
|
for i, amt := range amts {
|
||||||
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
||||||
validators[i].PShares = NewBondedShares(sdk.NewRat(amt))
|
validators[i].PoolShares = NewBondedShares(sdk.NewRat(amt))
|
||||||
validators[i].DelegatorShares = sdk.NewRat(amt)
|
validators[i].DelegatorShares = sdk.NewRat(amt)
|
||||||
keeper.setValidator(ctx, validators[i])
|
keeper.setValidator(ctx, validators[i])
|
||||||
}
|
}
|
||||||
|
@ -128,11 +144,11 @@ func GetValidatorSortingUnmixed(t *testing.T) {
|
||||||
// first make sure everything made it in to the gotValidator group
|
// first make sure everything made it in to the gotValidator group
|
||||||
resValidators := keeper.GetValidatorsBondedByPower(ctx)
|
resValidators := keeper.GetValidatorsBondedByPower(ctx)
|
||||||
require.Equal(t, n, len(resValidators))
|
require.Equal(t, n, len(resValidators))
|
||||||
assert.Equal(t, sdk.NewRat(400), resValidators[0].PShares.Bonded(), "%v", resValidators)
|
assert.Equal(t, sdk.NewRat(400), resValidators[0].PoolShares.Bonded(), "%v", resValidators)
|
||||||
assert.Equal(t, sdk.NewRat(200), resValidators[1].PShares.Bonded(), "%v", resValidators)
|
assert.Equal(t, sdk.NewRat(200), resValidators[1].PoolShares.Bonded(), "%v", resValidators)
|
||||||
assert.Equal(t, sdk.NewRat(100), resValidators[2].PShares.Bonded(), "%v", resValidators)
|
assert.Equal(t, sdk.NewRat(100), resValidators[2].PoolShares.Bonded(), "%v", resValidators)
|
||||||
assert.Equal(t, sdk.NewRat(1), resValidators[3].PShares.Bonded(), "%v", resValidators)
|
assert.Equal(t, sdk.NewRat(1), resValidators[3].PoolShares.Bonded(), "%v", resValidators)
|
||||||
assert.Equal(t, sdk.NewRat(0), resValidators[4].PShares.Bonded(), "%v", resValidators)
|
assert.Equal(t, sdk.NewRat(0), resValidators[4].PoolShares.Bonded(), "%v", resValidators)
|
||||||
assert.Equal(t, validators[3].Address, resValidators[0].Address, "%v", resValidators)
|
assert.Equal(t, validators[3].Address, resValidators[0].Address, "%v", resValidators)
|
||||||
assert.Equal(t, validators[4].Address, resValidators[1].Address, "%v", resValidators)
|
assert.Equal(t, validators[4].Address, resValidators[1].Address, "%v", resValidators)
|
||||||
assert.Equal(t, validators[1].Address, resValidators[2].Address, "%v", resValidators)
|
assert.Equal(t, validators[1].Address, resValidators[2].Address, "%v", resValidators)
|
||||||
|
@ -140,14 +156,14 @@ func GetValidatorSortingUnmixed(t *testing.T) {
|
||||||
assert.Equal(t, validators[0].Address, resValidators[4].Address, "%v", resValidators)
|
assert.Equal(t, validators[0].Address, resValidators[4].Address, "%v", resValidators)
|
||||||
|
|
||||||
// test a basic increase in voting power
|
// test a basic increase in voting power
|
||||||
validators[3].PShares = NewBondedShares(sdk.NewRat(500))
|
validators[3].PoolShares = NewBondedShares(sdk.NewRat(500))
|
||||||
keeper.setValidator(ctx, validators[3])
|
keeper.setValidator(ctx, validators[3])
|
||||||
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
||||||
require.Equal(t, len(resValidators), n)
|
require.Equal(t, len(resValidators), n)
|
||||||
assert.True(ValEq(t, validators[3], resValidators[0]))
|
assert.True(ValEq(t, validators[3], resValidators[0]))
|
||||||
|
|
||||||
// test a decrease in voting power
|
// test a decrease in voting power
|
||||||
validators[3].PShares = NewBondedShares(sdk.NewRat(300))
|
validators[3].PoolShares = NewBondedShares(sdk.NewRat(300))
|
||||||
keeper.setValidator(ctx, validators[3])
|
keeper.setValidator(ctx, validators[3])
|
||||||
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
||||||
require.Equal(t, len(resValidators), n)
|
require.Equal(t, len(resValidators), n)
|
||||||
|
@ -155,7 +171,7 @@ func GetValidatorSortingUnmixed(t *testing.T) {
|
||||||
assert.True(ValEq(t, validators[4], resValidators[1]))
|
assert.True(ValEq(t, validators[4], resValidators[1]))
|
||||||
|
|
||||||
// test equal voting power, different age
|
// test equal voting power, different age
|
||||||
validators[3].PShares = NewBondedShares(sdk.NewRat(200))
|
validators[3].PoolShares = NewBondedShares(sdk.NewRat(200))
|
||||||
ctx = ctx.WithBlockHeight(10)
|
ctx = ctx.WithBlockHeight(10)
|
||||||
keeper.setValidator(ctx, validators[3])
|
keeper.setValidator(ctx, validators[3])
|
||||||
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
||||||
|
@ -174,8 +190,8 @@ func GetValidatorSortingUnmixed(t *testing.T) {
|
||||||
assert.True(ValEq(t, validators[4], resValidators[1]))
|
assert.True(ValEq(t, validators[4], resValidators[1]))
|
||||||
|
|
||||||
// change in voting power of both validators, both still in v-set, no age change
|
// change in voting power of both validators, both still in v-set, no age change
|
||||||
validators[3].PShares = NewBondedShares(sdk.NewRat(300))
|
validators[3].PoolShares = NewBondedShares(sdk.NewRat(300))
|
||||||
validators[4].PShares = NewBondedShares(sdk.NewRat(300))
|
validators[4].PoolShares = NewBondedShares(sdk.NewRat(300))
|
||||||
keeper.setValidator(ctx, validators[3])
|
keeper.setValidator(ctx, validators[3])
|
||||||
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
||||||
require.Equal(t, len(resValidators), n)
|
require.Equal(t, len(resValidators), n)
|
||||||
|
@ -204,11 +220,11 @@ func GetValidatorSortingMixed(t *testing.T) {
|
||||||
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
||||||
validators[i].DelegatorShares = sdk.NewRat(amt)
|
validators[i].DelegatorShares = sdk.NewRat(amt)
|
||||||
}
|
}
|
||||||
validators[0].PShares = NewUnbondedShares(sdk.NewRat(amts[0]))
|
validators[0].PoolShares = NewUnbondedShares(sdk.NewRat(amts[0]))
|
||||||
validators[1].PShares = NewUnbondedShares(sdk.NewRat(amts[1]))
|
validators[1].PoolShares = NewUnbondedShares(sdk.NewRat(amts[1]))
|
||||||
validators[2].PShares = NewUnbondedShares(sdk.NewRat(amts[2]))
|
validators[2].PoolShares = NewUnbondedShares(sdk.NewRat(amts[2]))
|
||||||
validators[3].PShares = NewBondedShares(sdk.NewRat(amts[3]))
|
validators[3].PoolShares = NewBondedShares(sdk.NewRat(amts[3]))
|
||||||
validators[4].PShares = NewBondedShares(sdk.NewRat(amts[4]))
|
validators[4].PoolShares = NewBondedShares(sdk.NewRat(amts[4]))
|
||||||
for i := range amts {
|
for i := range amts {
|
||||||
keeper.setValidator(ctx, validators[i])
|
keeper.setValidator(ctx, validators[i])
|
||||||
}
|
}
|
||||||
|
@ -231,11 +247,11 @@ func GetValidatorSortingMixed(t *testing.T) {
|
||||||
// first make sure everything made it in to the gotValidator group
|
// first make sure everything made it in to the gotValidator group
|
||||||
resValidators := keeper.GetValidatorsBondedByPower(ctx)
|
resValidators := keeper.GetValidatorsBondedByPower(ctx)
|
||||||
require.Equal(t, n, len(resValidators))
|
require.Equal(t, n, len(resValidators))
|
||||||
assert.Equal(t, sdk.NewRat(400), resValidators[0].PShares.Bonded(), "%v", resValidators)
|
assert.Equal(t, sdk.NewRat(400), resValidators[0].PoolShares.Bonded(), "%v", resValidators)
|
||||||
assert.Equal(t, sdk.NewRat(200), resValidators[1].PShares.Bonded(), "%v", resValidators)
|
assert.Equal(t, sdk.NewRat(200), resValidators[1].PoolShares.Bonded(), "%v", resValidators)
|
||||||
assert.Equal(t, sdk.NewRat(100), resValidators[2].PShares.Bonded(), "%v", resValidators)
|
assert.Equal(t, sdk.NewRat(100), resValidators[2].PoolShares.Bonded(), "%v", resValidators)
|
||||||
assert.Equal(t, sdk.NewRat(1), resValidators[3].PShares.Bonded(), "%v", resValidators)
|
assert.Equal(t, sdk.NewRat(1), resValidators[3].PoolShares.Bonded(), "%v", resValidators)
|
||||||
assert.Equal(t, sdk.NewRat(0), resValidators[4].PShares.Bonded(), "%v", resValidators)
|
assert.Equal(t, sdk.NewRat(0), resValidators[4].PoolShares.Bonded(), "%v", resValidators)
|
||||||
assert.Equal(t, validators[3].Address, resValidators[0].Address, "%v", resValidators)
|
assert.Equal(t, validators[3].Address, resValidators[0].Address, "%v", resValidators)
|
||||||
assert.Equal(t, validators[4].Address, resValidators[1].Address, "%v", resValidators)
|
assert.Equal(t, validators[4].Address, resValidators[1].Address, "%v", resValidators)
|
||||||
assert.Equal(t, validators[1].Address, resValidators[2].Address, "%v", resValidators)
|
assert.Equal(t, validators[1].Address, resValidators[2].Address, "%v", resValidators)
|
||||||
|
@ -246,6 +262,7 @@ func GetValidatorSortingMixed(t *testing.T) {
|
||||||
// TODO seperate out into multiple tests
|
// TODO seperate out into multiple tests
|
||||||
func TestGetValidatorsEdgeCases(t *testing.T) {
|
func TestGetValidatorsEdgeCases(t *testing.T) {
|
||||||
ctx, _, keeper := createTestInput(t, false, 0)
|
ctx, _, keeper := createTestInput(t, false, 0)
|
||||||
|
var found bool
|
||||||
|
|
||||||
// now 2 max resValidators
|
// now 2 max resValidators
|
||||||
params := keeper.GetParams(ctx)
|
params := keeper.GetParams(ctx)
|
||||||
|
@ -255,20 +272,14 @@ func TestGetValidatorsEdgeCases(t *testing.T) {
|
||||||
|
|
||||||
// initialize some validators into the state
|
// initialize some validators into the state
|
||||||
amts := []int64{0, 100, 400, 400}
|
amts := []int64{0, 100, 400, 400}
|
||||||
var validators [5]Validator
|
var validators [4]Validator
|
||||||
for i, amt := range amts {
|
for i, amt := range amts {
|
||||||
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
||||||
|
validators[i].PoolShares = NewUnbondedShares(sdk.NewRat(amt))
|
||||||
validators[i].DelegatorShares = sdk.NewRat(amt)
|
validators[i].DelegatorShares = sdk.NewRat(amt)
|
||||||
|
validators[i] = keeper.setValidator(ctx, validators[i])
|
||||||
}
|
}
|
||||||
validators[0].PShares = NewUnbondedShares(sdk.NewRat(amts[0]))
|
|
||||||
validators[1].PShares = NewUnbondedShares(sdk.NewRat(amts[1]))
|
|
||||||
validators[2].PShares = NewBondedShares(sdk.NewRat(amts[2]))
|
|
||||||
validators[3].PShares = NewBondedShares(sdk.NewRat(amts[3]))
|
|
||||||
for i := range amts {
|
for i := range amts {
|
||||||
keeper.setValidator(ctx, validators[i])
|
|
||||||
}
|
|
||||||
for i := range amts { // reload because each setValidator can affect the validators
|
|
||||||
var found bool
|
|
||||||
validators[i], found = keeper.GetValidator(ctx, validators[i].Address)
|
validators[i], found = keeper.GetValidator(ctx, validators[i].Address)
|
||||||
require.True(t, found)
|
require.True(t, found)
|
||||||
}
|
}
|
||||||
|
@ -276,7 +287,7 @@ func TestGetValidatorsEdgeCases(t *testing.T) {
|
||||||
assert.True(ValEq(t, validators[2], resValidators[0]))
|
assert.True(ValEq(t, validators[2], resValidators[0]))
|
||||||
assert.True(ValEq(t, validators[3], resValidators[1]))
|
assert.True(ValEq(t, validators[3], resValidators[1]))
|
||||||
|
|
||||||
validators[0].PShares = NewUnbondedShares(sdk.NewRat(500))
|
validators[0].PoolShares = NewUnbondedShares(sdk.NewRat(500))
|
||||||
validators[0] = keeper.setValidator(ctx, validators[0])
|
validators[0] = keeper.setValidator(ctx, validators[0])
|
||||||
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
||||||
require.Equal(t, nMax, uint16(len(resValidators)))
|
require.Equal(t, nMax, uint16(len(resValidators)))
|
||||||
|
@ -286,8 +297,13 @@ func TestGetValidatorsEdgeCases(t *testing.T) {
|
||||||
// A validator which leaves the gotValidator set due to a decrease in voting power,
|
// A validator which leaves the gotValidator set due to a decrease in voting power,
|
||||||
// then increases to the original voting power, does not get its spot back in the
|
// then increases to the original voting power, does not get its spot back in the
|
||||||
// case of a tie.
|
// case of a tie.
|
||||||
|
|
||||||
|
// validator 3 enters bonded validator set
|
||||||
ctx = ctx.WithBlockHeight(40)
|
ctx = ctx.WithBlockHeight(40)
|
||||||
validators[3].PShares = NewUnbondedShares(sdk.NewRat(401))
|
|
||||||
|
validators[3], found = keeper.GetValidator(ctx, validators[3].Address)
|
||||||
|
require.True(t, found)
|
||||||
|
validators[3].PoolShares = NewUnbondedShares(sdk.NewRat(401))
|
||||||
validators[3] = keeper.setValidator(ctx, validators[3])
|
validators[3] = keeper.setValidator(ctx, validators[3])
|
||||||
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
||||||
require.Equal(t, nMax, uint16(len(resValidators)))
|
require.Equal(t, nMax, uint16(len(resValidators)))
|
||||||
|
@ -295,7 +311,7 @@ func TestGetValidatorsEdgeCases(t *testing.T) {
|
||||||
assert.True(ValEq(t, validators[3], resValidators[1]))
|
assert.True(ValEq(t, validators[3], resValidators[1]))
|
||||||
|
|
||||||
// validator 3 kicked out temporarily
|
// validator 3 kicked out temporarily
|
||||||
validators[3].PShares = NewUnbondedShares(sdk.NewRat(200))
|
validators[3].PoolShares = NewBondedShares(sdk.NewRat(200))
|
||||||
validators[3] = keeper.setValidator(ctx, validators[3])
|
validators[3] = keeper.setValidator(ctx, validators[3])
|
||||||
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
||||||
require.Equal(t, nMax, uint16(len(resValidators)))
|
require.Equal(t, nMax, uint16(len(resValidators)))
|
||||||
|
@ -303,7 +319,7 @@ func TestGetValidatorsEdgeCases(t *testing.T) {
|
||||||
assert.True(ValEq(t, validators[2], resValidators[1]))
|
assert.True(ValEq(t, validators[2], resValidators[1]))
|
||||||
|
|
||||||
// validator 4 does not get spot back
|
// validator 4 does not get spot back
|
||||||
validators[3].PShares = NewBondedShares(sdk.NewRat(400))
|
validators[3].PoolShares = NewBondedShares(sdk.NewRat(400))
|
||||||
validators[3] = keeper.setValidator(ctx, validators[3])
|
validators[3] = keeper.setValidator(ctx, validators[3])
|
||||||
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
||||||
require.Equal(t, nMax, uint16(len(resValidators)))
|
require.Equal(t, nMax, uint16(len(resValidators)))
|
||||||
|
@ -325,13 +341,13 @@ func TestValidatorBondHeight(t *testing.T) {
|
||||||
// initialize some validators into the state
|
// initialize some validators into the state
|
||||||
var validators [3]Validator
|
var validators [3]Validator
|
||||||
validators[0] = NewValidator(addrs[0], pks[0], Description{})
|
validators[0] = NewValidator(addrs[0], pks[0], Description{})
|
||||||
validators[0].PShares = NewUnbondedShares(sdk.NewRat(200))
|
validators[0].PoolShares = NewUnbondedShares(sdk.NewRat(200))
|
||||||
validators[0].DelegatorShares = sdk.NewRat(200)
|
validators[0].DelegatorShares = sdk.NewRat(200)
|
||||||
validators[1] = NewValidator(addrs[1], pks[1], Description{})
|
validators[1] = NewValidator(addrs[1], pks[1], Description{})
|
||||||
validators[1].PShares = NewUnbondedShares(sdk.NewRat(100))
|
validators[1].PoolShares = NewUnbondedShares(sdk.NewRat(100))
|
||||||
validators[1].DelegatorShares = sdk.NewRat(100)
|
validators[1].DelegatorShares = sdk.NewRat(100)
|
||||||
validators[2] = NewValidator(addrs[2], pks[2], Description{})
|
validators[2] = NewValidator(addrs[2], pks[2], Description{})
|
||||||
validators[2].PShares = NewUnbondedShares(sdk.NewRat(100))
|
validators[2].PoolShares = NewUnbondedShares(sdk.NewRat(100))
|
||||||
validators[2].DelegatorShares = sdk.NewRat(100)
|
validators[2].DelegatorShares = sdk.NewRat(100)
|
||||||
|
|
||||||
validators[0] = keeper.setValidator(ctx, validators[0])
|
validators[0] = keeper.setValidator(ctx, validators[0])
|
||||||
|
@ -345,8 +361,8 @@ func TestValidatorBondHeight(t *testing.T) {
|
||||||
|
|
||||||
assert.True(ValEq(t, validators[0], resValidators[0]))
|
assert.True(ValEq(t, validators[0], resValidators[0]))
|
||||||
assert.True(ValEq(t, validators[1], resValidators[1]))
|
assert.True(ValEq(t, validators[1], resValidators[1]))
|
||||||
validators[1].PShares = NewUnbondedShares(sdk.NewRat(150))
|
validators[1].PoolShares = NewUnbondedShares(sdk.NewRat(150))
|
||||||
validators[2].PShares = NewUnbondedShares(sdk.NewRat(150))
|
validators[2].PoolShares = NewUnbondedShares(sdk.NewRat(150))
|
||||||
validators[2] = keeper.setValidator(ctx, validators[2])
|
validators[2] = keeper.setValidator(ctx, validators[2])
|
||||||
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
||||||
require.Equal(t, params.MaxValidators, uint16(len(resValidators)))
|
require.Equal(t, params.MaxValidators, uint16(len(resValidators)))
|
||||||
|
@ -367,7 +383,7 @@ func TestFullValidatorSetPowerChange(t *testing.T) {
|
||||||
var validators [5]Validator
|
var validators [5]Validator
|
||||||
for i, amt := range amts {
|
for i, amt := range amts {
|
||||||
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
||||||
validators[i].PShares = NewUnbondedShares(sdk.NewRat(amt))
|
validators[i].PoolShares = NewUnbondedShares(sdk.NewRat(amt))
|
||||||
validators[i].DelegatorShares = sdk.NewRat(amt)
|
validators[i].DelegatorShares = sdk.NewRat(amt)
|
||||||
keeper.setValidator(ctx, validators[i])
|
keeper.setValidator(ctx, validators[i])
|
||||||
}
|
}
|
||||||
|
@ -387,7 +403,7 @@ func TestFullValidatorSetPowerChange(t *testing.T) {
|
||||||
assert.True(ValEq(t, validators[3], resValidators[1]))
|
assert.True(ValEq(t, validators[3], resValidators[1]))
|
||||||
|
|
||||||
// test a swap in voting power
|
// test a swap in voting power
|
||||||
validators[0].PShares = NewBondedShares(sdk.NewRat(600))
|
validators[0].PoolShares = NewBondedShares(sdk.NewRat(600))
|
||||||
validators[0] = keeper.setValidator(ctx, validators[0])
|
validators[0] = keeper.setValidator(ctx, validators[0])
|
||||||
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
resValidators = keeper.GetValidatorsBondedByPower(ctx)
|
||||||
require.Equal(t, max, len(resValidators))
|
require.Equal(t, max, len(resValidators))
|
||||||
|
@ -403,7 +419,7 @@ func TestClearTendermintUpdates(t *testing.T) {
|
||||||
validators := make([]Validator, len(amts))
|
validators := make([]Validator, len(amts))
|
||||||
for i, amt := range amts {
|
for i, amt := range amts {
|
||||||
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
||||||
validators[i].PShares = NewBondedShares(sdk.NewRat(amt))
|
validators[i].PoolShares = NewBondedShares(sdk.NewRat(amt))
|
||||||
validators[i].DelegatorShares = sdk.NewRat(amt)
|
validators[i].DelegatorShares = sdk.NewRat(amt)
|
||||||
keeper.setValidator(ctx, validators[i])
|
keeper.setValidator(ctx, validators[i])
|
||||||
}
|
}
|
||||||
|
@ -422,7 +438,7 @@ func TestGetTendermintUpdatesAllNone(t *testing.T) {
|
||||||
var validators [2]Validator
|
var validators [2]Validator
|
||||||
for i, amt := range amts {
|
for i, amt := range amts {
|
||||||
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
||||||
validators[i].PShares = NewBondedShares(sdk.NewRat(amt))
|
validators[i].PoolShares = NewBondedShares(sdk.NewRat(amt))
|
||||||
validators[i].DelegatorShares = sdk.NewRat(amt)
|
validators[i].DelegatorShares = sdk.NewRat(amt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -460,7 +476,7 @@ func TestGetTendermintUpdatesIdentical(t *testing.T) {
|
||||||
var validators [2]Validator
|
var validators [2]Validator
|
||||||
for i, amt := range amts {
|
for i, amt := range amts {
|
||||||
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
||||||
validators[i].PShares = NewBondedShares(sdk.NewRat(amt))
|
validators[i].PoolShares = NewBondedShares(sdk.NewRat(amt))
|
||||||
validators[i].DelegatorShares = sdk.NewRat(amt)
|
validators[i].DelegatorShares = sdk.NewRat(amt)
|
||||||
}
|
}
|
||||||
validators[0] = keeper.setValidator(ctx, validators[0])
|
validators[0] = keeper.setValidator(ctx, validators[0])
|
||||||
|
@ -482,7 +498,7 @@ func TestGetTendermintUpdatesSingleValueChange(t *testing.T) {
|
||||||
var validators [2]Validator
|
var validators [2]Validator
|
||||||
for i, amt := range amts {
|
for i, amt := range amts {
|
||||||
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
||||||
validators[i].PShares = NewBondedShares(sdk.NewRat(amt))
|
validators[i].PoolShares = NewBondedShares(sdk.NewRat(amt))
|
||||||
validators[i].DelegatorShares = sdk.NewRat(amt)
|
validators[i].DelegatorShares = sdk.NewRat(amt)
|
||||||
}
|
}
|
||||||
validators[0] = keeper.setValidator(ctx, validators[0])
|
validators[0] = keeper.setValidator(ctx, validators[0])
|
||||||
|
@ -492,7 +508,7 @@ func TestGetTendermintUpdatesSingleValueChange(t *testing.T) {
|
||||||
|
|
||||||
// test single value change
|
// test single value change
|
||||||
// tendermintUpdate set: {} -> {c1'}
|
// tendermintUpdate set: {} -> {c1'}
|
||||||
validators[0].PShares = NewBondedShares(sdk.NewRat(600))
|
validators[0].PoolShares = NewBondedShares(sdk.NewRat(600))
|
||||||
validators[0] = keeper.setValidator(ctx, validators[0])
|
validators[0] = keeper.setValidator(ctx, validators[0])
|
||||||
|
|
||||||
updates := keeper.getTendermintUpdates(ctx)
|
updates := keeper.getTendermintUpdates(ctx)
|
||||||
|
@ -508,7 +524,7 @@ func TestGetTendermintUpdatesMultipleValueChange(t *testing.T) {
|
||||||
var validators [2]Validator
|
var validators [2]Validator
|
||||||
for i, amt := range amts {
|
for i, amt := range amts {
|
||||||
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
||||||
validators[i].PShares = NewBondedShares(sdk.NewRat(amt))
|
validators[i].PoolShares = NewBondedShares(sdk.NewRat(amt))
|
||||||
validators[i].DelegatorShares = sdk.NewRat(amt)
|
validators[i].DelegatorShares = sdk.NewRat(amt)
|
||||||
}
|
}
|
||||||
validators[0] = keeper.setValidator(ctx, validators[0])
|
validators[0] = keeper.setValidator(ctx, validators[0])
|
||||||
|
@ -518,8 +534,8 @@ func TestGetTendermintUpdatesMultipleValueChange(t *testing.T) {
|
||||||
|
|
||||||
// test multiple value change
|
// test multiple value change
|
||||||
// tendermintUpdate set: {c1, c3} -> {c1', c3'}
|
// tendermintUpdate set: {c1, c3} -> {c1', c3'}
|
||||||
validators[0].PShares = NewBondedShares(sdk.NewRat(200))
|
validators[0].PoolShares = NewBondedShares(sdk.NewRat(200))
|
||||||
validators[1].PShares = NewBondedShares(sdk.NewRat(100))
|
validators[1].PoolShares = NewBondedShares(sdk.NewRat(100))
|
||||||
validators[0] = keeper.setValidator(ctx, validators[0])
|
validators[0] = keeper.setValidator(ctx, validators[0])
|
||||||
validators[1] = keeper.setValidator(ctx, validators[1])
|
validators[1] = keeper.setValidator(ctx, validators[1])
|
||||||
|
|
||||||
|
@ -536,7 +552,7 @@ func TestGetTendermintUpdatesInserted(t *testing.T) {
|
||||||
var validators [5]Validator
|
var validators [5]Validator
|
||||||
for i, amt := range amts {
|
for i, amt := range amts {
|
||||||
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
||||||
validators[i].PShares = NewBondedShares(sdk.NewRat(amt))
|
validators[i].PoolShares = NewBondedShares(sdk.NewRat(amt))
|
||||||
validators[i].DelegatorShares = sdk.NewRat(amt)
|
validators[i].DelegatorShares = sdk.NewRat(amt)
|
||||||
}
|
}
|
||||||
validators[0] = keeper.setValidator(ctx, validators[0])
|
validators[0] = keeper.setValidator(ctx, validators[0])
|
||||||
|
@ -578,7 +594,7 @@ func TestGetTendermintUpdatesNotValidatorCliff(t *testing.T) {
|
||||||
var validators [5]Validator
|
var validators [5]Validator
|
||||||
for i, amt := range amts {
|
for i, amt := range amts {
|
||||||
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
validators[i] = NewValidator(addrs[i], pks[i], Description{})
|
||||||
validators[i].PShares = NewBondedShares(sdk.NewRat(amt))
|
validators[i].PoolShares = NewBondedShares(sdk.NewRat(amt))
|
||||||
validators[i].DelegatorShares = sdk.NewRat(amt)
|
validators[i].DelegatorShares = sdk.NewRat(amt)
|
||||||
}
|
}
|
||||||
validators[0] = keeper.setValidator(ctx, validators[0])
|
validators[0] = keeper.setValidator(ctx, validators[0])
|
||||||
|
@ -597,7 +613,7 @@ func TestGetTendermintUpdatesNotValidatorCliff(t *testing.T) {
|
||||||
keeper.clearTendermintUpdates(ctx)
|
keeper.clearTendermintUpdates(ctx)
|
||||||
assert.Equal(t, 0, len(keeper.getTendermintUpdates(ctx)))
|
assert.Equal(t, 0, len(keeper.getTendermintUpdates(ctx)))
|
||||||
|
|
||||||
validators[2].PShares = NewBondedShares(sdk.NewRat(15))
|
validators[2].PoolShares = NewBondedShares(sdk.NewRat(15))
|
||||||
validators[2] = keeper.setValidator(ctx, validators[2])
|
validators[2] = keeper.setValidator(ctx, validators[2])
|
||||||
|
|
||||||
updates = keeper.getTendermintUpdates(ctx)
|
updates = keeper.getTendermintUpdates(ctx)
|
||||||
|
@ -615,7 +631,7 @@ func TestBond(t *testing.T) {
|
||||||
var validators [3]Validator
|
var validators [3]Validator
|
||||||
for i, amt := range amts {
|
for i, amt := range amts {
|
||||||
validators[i] = NewValidator(addrVals[i], pks[i], Description{})
|
validators[i] = NewValidator(addrVals[i], pks[i], Description{})
|
||||||
validators[i].PShares = NewUnbondedShares(sdk.NewRat(amt))
|
validators[i].PoolShares = NewUnbondedShares(sdk.NewRat(amt))
|
||||||
validators[i].DelegatorShares = sdk.NewRat(amt)
|
validators[i].DelegatorShares = sdk.NewRat(amt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package stake
|
package stake
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -16,12 +18,9 @@ type Params struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Params) equal(p2 Params) bool {
|
func (p Params) equal(p2 Params) bool {
|
||||||
return p.InflationRateChange.Equal(p2.InflationRateChange) &&
|
bz1 := cdcEmpty.MustMarshalBinary(&p)
|
||||||
p.InflationMax.Equal(p2.InflationMax) &&
|
bz2 := cdcEmpty.MustMarshalBinary(&p2)
|
||||||
p.InflationMin.Equal(p2.InflationMin) &&
|
return bytes.Equal(bz1, bz2)
|
||||||
p.GoalBonded.Equal(p2.GoalBonded) &&
|
|
||||||
p.MaxValidators == p2.MaxValidators &&
|
|
||||||
p.BondDenom == p2.BondDenom
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func defaultParams() Params {
|
func defaultParams() Params {
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package stake
|
package stake
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -23,17 +25,9 @@ type Pool struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p Pool) equal(p2 Pool) bool {
|
func (p Pool) equal(p2 Pool) bool {
|
||||||
return p.TotalSupply == p2.TotalSupply &&
|
bz1 := cdcEmpty.MustMarshalBinary(&p)
|
||||||
p.BondedShares.Equal(p2.BondedShares) &&
|
bz2 := cdcEmpty.MustMarshalBinary(&p2)
|
||||||
p.UnbondingShares.Equal(p2.UnbondingShares) &&
|
return bytes.Equal(bz1, bz2)
|
||||||
p.UnbondedShares.Equal(p2.UnbondedShares) &&
|
|
||||||
p.BondedTokens == p2.BondedTokens &&
|
|
||||||
p.UnbondingTokens == p2.UnbondingTokens &&
|
|
||||||
p.UnbondedTokens == p2.UnbondedTokens &&
|
|
||||||
p.InflationLastTime == p2.InflationLastTime &&
|
|
||||||
p.Inflation.Equal(p2.Inflation) &&
|
|
||||||
p.DateLastCommissionReset == p2.DateLastCommissionReset &&
|
|
||||||
p.PrevBondedShares.Equal(p2.PrevBondedShares)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// initial pool for testing
|
// initial pool for testing
|
||||||
|
|
|
@ -51,6 +51,15 @@ var (
|
||||||
emptyPubkey crypto.PubKey
|
emptyPubkey crypto.PubKey
|
||||||
)
|
)
|
||||||
|
|
||||||
|
//_______________________________________________________________________________________
|
||||||
|
|
||||||
|
// intended to be used with require/assert: require.True(ValEq(...))
|
||||||
|
func ValEq(t *testing.T, exp, got Validator) (*testing.T, bool, string, Validator, Validator) {
|
||||||
|
return t, exp.equal(got), "expected:\t%v\ngot:\t\t%v", exp, got
|
||||||
|
}
|
||||||
|
|
||||||
|
//_______________________________________________________________________________________
|
||||||
|
|
||||||
func makeTestCodec() *wire.Codec {
|
func makeTestCodec() *wire.Codec {
|
||||||
var cdc = wire.NewCodec()
|
var cdc = wire.NewCodec()
|
||||||
|
|
||||||
|
|
|
@ -33,11 +33,6 @@ func (k Keeper) Tick(ctx sdk.Context) (change []abci.Validator) {
|
||||||
change = k.getTendermintUpdates(ctx)
|
change = k.getTendermintUpdates(ctx)
|
||||||
k.clearTendermintUpdates(ctx)
|
k.clearTendermintUpdates(ctx)
|
||||||
|
|
||||||
// XXX get the total validator of the previous validator set
|
|
||||||
// XXX get the total validator of the current validator set
|
|
||||||
// XXX update pool PrevBondedShares
|
|
||||||
// Calculate the PowerChange term
|
|
||||||
|
|
||||||
return change
|
return change
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package stake
|
package stake
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
|
@ -62,34 +63,42 @@ func TestGetInflation(t *testing.T) {
|
||||||
func TestProcessProvisions(t *testing.T) {
|
func TestProcessProvisions(t *testing.T) {
|
||||||
ctx, _, keeper := createTestInput(t, false, 0)
|
ctx, _, keeper := createTestInput(t, false, 0)
|
||||||
params := defaultParams()
|
params := defaultParams()
|
||||||
|
params.MaxValidators = 2
|
||||||
keeper.setParams(ctx, params)
|
keeper.setParams(ctx, params)
|
||||||
pool := keeper.GetPool(ctx)
|
pool := keeper.GetPool(ctx)
|
||||||
|
|
||||||
// create some validators some bonded, some unbonded
|
|
||||||
validators := make([]Validator, 10)
|
|
||||||
for i := 0; i < 10; i++ {
|
|
||||||
v := Validator{
|
|
||||||
Status: sdk.Unbonded,
|
|
||||||
PubKey: pks[i],
|
|
||||||
Address: addrs[i],
|
|
||||||
PShares: NewUnbondedShares(sdk.NewRat(0)),
|
|
||||||
DelegatorShares: sdk.NewRat(0),
|
|
||||||
}
|
|
||||||
if i < 5 {
|
|
||||||
v.Status = sdk.Bonded
|
|
||||||
v.PShares.Kind = ShareBonded
|
|
||||||
}
|
|
||||||
mintedTokens := int64((i + 1) * 10000000)
|
|
||||||
pool.TotalSupply += mintedTokens
|
|
||||||
v, pool, _ = v.addTokensFromDel(pool, mintedTokens)
|
|
||||||
|
|
||||||
keeper.setValidator(ctx, v)
|
|
||||||
validators[i] = v
|
|
||||||
}
|
|
||||||
keeper.setPool(ctx, pool)
|
|
||||||
var totalSupply int64 = 550000000
|
var totalSupply int64 = 550000000
|
||||||
var bondedShares int64 = 150000000
|
var bondedShares int64 = 150000000
|
||||||
var unbondedShares int64 = 400000000
|
var unbondedShares int64 = 400000000
|
||||||
|
|
||||||
|
// create some validators some bonded, some unbonded
|
||||||
|
var validators [5]Validator
|
||||||
|
validators[0] = NewValidator(addrs[0], pks[0], Description{})
|
||||||
|
validators[0], pool, _ = validators[0].addTokensFromDel(pool, 150000000)
|
||||||
|
keeper.setPool(ctx, pool)
|
||||||
|
assert.Equal(t, bondedShares, pool.BondedTokens)
|
||||||
|
fmt.Printf("debug pool: %v\n", pool)
|
||||||
|
validators[0] = keeper.setValidator(ctx, validators[0])
|
||||||
|
validators[1] = NewValidator(addrs[1], pks[1], Description{})
|
||||||
|
validators[1], pool, _ = validators[1].addTokensFromDel(pool, 100000000)
|
||||||
|
keeper.setPool(ctx, pool)
|
||||||
|
validators[1] = keeper.setValidator(ctx, validators[1])
|
||||||
|
validators[2] = NewValidator(addrs[2], pks[2], Description{})
|
||||||
|
validators[2], pool, _ = validators[2].addTokensFromDel(pool, 100000000)
|
||||||
|
keeper.setPool(ctx, pool)
|
||||||
|
validators[2] = keeper.setValidator(ctx, validators[2])
|
||||||
|
validators[3] = NewValidator(addrs[3], pks[3], Description{})
|
||||||
|
validators[3], pool, _ = validators[3].addTokensFromDel(pool, 100000000)
|
||||||
|
keeper.setPool(ctx, pool)
|
||||||
|
validators[3] = keeper.setValidator(ctx, validators[3])
|
||||||
|
validators[4] = NewValidator(addrs[4], pks[4], Description{})
|
||||||
|
validators[4], pool, _ = validators[4].addTokensFromDel(pool, 100000000)
|
||||||
|
keeper.setPool(ctx, pool)
|
||||||
|
validators[4] = keeper.setValidator(ctx, validators[4])
|
||||||
|
|
||||||
|
validator, _ := keeper.GetValidator(ctx, addrs[0])
|
||||||
|
fmt.Printf("debug validators[0]: %v\n", validator)
|
||||||
|
|
||||||
assert.Equal(t, totalSupply, pool.TotalSupply)
|
assert.Equal(t, totalSupply, pool.TotalSupply)
|
||||||
assert.Equal(t, bondedShares, pool.BondedTokens)
|
assert.Equal(t, bondedShares, pool.BondedTokens)
|
||||||
assert.Equal(t, unbondedShares, pool.UnbondedTokens)
|
assert.Equal(t, unbondedShares, pool.UnbondedTokens)
|
||||||
|
|
|
@ -2,7 +2,6 @@ package stake
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"testing"
|
|
||||||
|
|
||||||
sdk "github.com/cosmos/cosmos-sdk/types"
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
||||||
"github.com/cosmos/cosmos-sdk/wire"
|
"github.com/cosmos/cosmos-sdk/wire"
|
||||||
|
@ -19,15 +18,15 @@ import (
|
||||||
// exchange rate.
|
// exchange rate.
|
||||||
type Validator struct {
|
type Validator struct {
|
||||||
Status sdk.BondStatus `json:"status"` // bonded status
|
Status sdk.BondStatus `json:"status"` // bonded status
|
||||||
Address sdk.Address `json:"address"` // sender of BondTx - UnbondTx returns here
|
Owner sdk.Address `json:"owner"` // sender of BondTx - UnbondTx returns here
|
||||||
PubKey crypto.PubKey `json:"pub_key"` // pubkey of validator
|
PubKey crypto.PubKey `json:"pub_key"` // pubkey of validator
|
||||||
|
|
||||||
PShares PoolShares `json:"pool_shares"` // total shares for tokens held in the pool
|
PoolShares PoolShares `json:"pool_shares"` // total shares for tokens held in the pool
|
||||||
DelegatorShares sdk.Rat `json:"delegator_shares"` // total shares issued to a validator's delegators
|
DelegatorShares sdk.Rat `json:"delegator_shares"` // total shares issued to a validator's delegators
|
||||||
|
|
||||||
Description Description `json:"description"` // description terms for the validator
|
Description Description `json:"description"` // description terms for the validator
|
||||||
BondHeight int64 `json:"validator_bond_height"` // earliest height as a bonded validator
|
BondHeight int64 `json:"bond_height"` // earliest height as a bonded validator
|
||||||
BondIntraTxCounter int16 `json:"validator_bond_counter"` // block-local tx index of validator change
|
BondIntraTxCounter int16 `json:"bond_intra_tx_counter"` // block-local tx index of validator change
|
||||||
ProposerRewardPool sdk.Coins `json:"proposer_reward_pool"` // XXX reward pool collected from being the proposer
|
ProposerRewardPool sdk.Coins `json:"proposer_reward_pool"` // XXX reward pool collected from being the proposer
|
||||||
|
|
||||||
Commission sdk.Rat `json:"commission"` // XXX the commission rate of fees charged to any delegators
|
Commission sdk.Rat `json:"commission"` // XXX the commission rate of fees charged to any delegators
|
||||||
|
@ -43,12 +42,12 @@ type Validator struct {
|
||||||
type Validators []Validator
|
type Validators []Validator
|
||||||
|
|
||||||
// NewValidator - initialize a new validator
|
// NewValidator - initialize a new validator
|
||||||
func NewValidator(address sdk.Address, pubKey crypto.PubKey, description Description) Validator {
|
func NewValidator(owner sdk.Address, pubKey crypto.PubKey, description Description) Validator {
|
||||||
return Validator{
|
return Validator{
|
||||||
Status: sdk.Unbonded,
|
Status: sdk.Unbonded,
|
||||||
Address: address,
|
Owner: owner,
|
||||||
PubKey: pubKey,
|
PubKey: pubKey,
|
||||||
PShares: NewUnbondedShares(sdk.ZeroRat()),
|
PoolShares: NewUnbondedShares(sdk.ZeroRat()),
|
||||||
DelegatorShares: sdk.ZeroRat(),
|
DelegatorShares: sdk.ZeroRat(),
|
||||||
Description: description,
|
Description: description,
|
||||||
BondHeight: int64(0),
|
BondHeight: int64(0),
|
||||||
|
@ -66,8 +65,8 @@ func NewValidator(address sdk.Address, pubKey crypto.PubKey, description Descrip
|
||||||
func (v Validator) equal(c2 Validator) bool {
|
func (v Validator) equal(c2 Validator) bool {
|
||||||
return v.Status == c2.Status &&
|
return v.Status == c2.Status &&
|
||||||
v.PubKey.Equals(c2.PubKey) &&
|
v.PubKey.Equals(c2.PubKey) &&
|
||||||
bytes.Equal(v.Address, c2.Address) &&
|
bytes.Equal(v.Owner, c2.Owner) &&
|
||||||
v.PShares.Equal(c2.PShares) &&
|
v.PoolShares.Equal(c2.PoolShares) &&
|
||||||
v.DelegatorShares.Equal(c2.DelegatorShares) &&
|
v.DelegatorShares.Equal(c2.DelegatorShares) &&
|
||||||
v.Description == c2.Description &&
|
v.Description == c2.Description &&
|
||||||
//v.BondHeight == c2.BondHeight &&
|
//v.BondHeight == c2.BondHeight &&
|
||||||
|
@ -80,11 +79,6 @@ func (v Validator) equal(c2 Validator) bool {
|
||||||
v.PrevBondedShares.Equal(c2.PrevBondedShares)
|
v.PrevBondedShares.Equal(c2.PrevBondedShares)
|
||||||
}
|
}
|
||||||
|
|
||||||
// intended to be used with require/assert: require.True(ValEq(...))
|
|
||||||
func ValEq(t *testing.T, exp, got Validator) (*testing.T, bool, string, Validator, Validator) {
|
|
||||||
return t, exp.equal(got), "expected:\t%v\ngot:\t\t%v", exp, got
|
|
||||||
}
|
|
||||||
|
|
||||||
// Description - description fields for a validator
|
// Description - description fields for a validator
|
||||||
type Description struct {
|
type Description struct {
|
||||||
Moniker string `json:"moniker"`
|
Moniker string `json:"moniker"`
|
||||||
|
@ -102,14 +96,13 @@ func NewDescription(moniker, identity, website, details string) Description {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//XXX updateDescription function
|
//XXX updateDescription function which enforce limit to number of description characters
|
||||||
//XXX enforce limit to number of description characters
|
|
||||||
|
|
||||||
// abci validator from stake validator type
|
// abci validator from stake validator type
|
||||||
func (v Validator) abciValidator(cdc *wire.Codec) abci.Validator {
|
func (v Validator) abciValidator(cdc *wire.Codec) abci.Validator {
|
||||||
return abci.Validator{
|
return abci.Validator{
|
||||||
PubKey: v.PubKey.Bytes(),
|
PubKey: v.PubKey.Bytes(),
|
||||||
Power: v.PShares.Bonded().Evaluate(),
|
Power: v.PoolShares.Bonded().Evaluate(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -126,33 +119,33 @@ func (v Validator) abciValidatorZero(cdc *wire.Codec) abci.Validator {
|
||||||
func (v Validator) UpdateSharesLocation(p Pool) (Validator, Pool) {
|
func (v Validator) UpdateSharesLocation(p Pool) (Validator, Pool) {
|
||||||
var tokens int64
|
var tokens int64
|
||||||
|
|
||||||
switch {
|
switch v.PoolShares.Kind {
|
||||||
case v.PShares.Kind == ShareUnbonded:
|
case ShareUnbonded:
|
||||||
if v.Status == sdk.Unbonded {
|
if v.Status == sdk.Unbonded {
|
||||||
return v, p
|
return v, p
|
||||||
}
|
}
|
||||||
p, tokens = p.removeSharesUnbonded(v.PShares.Amount)
|
p, tokens = p.removeSharesUnbonded(v.PoolShares.Amount)
|
||||||
|
|
||||||
case v.PShares.Kind == ShareUnbonding:
|
case ShareUnbonding:
|
||||||
if v.Status == sdk.Unbonding {
|
if v.Status == sdk.Unbonding {
|
||||||
return v, p
|
return v, p
|
||||||
}
|
}
|
||||||
p, tokens = p.removeSharesUnbonding(v.PShares.Amount)
|
p, tokens = p.removeSharesUnbonding(v.PoolShares.Amount)
|
||||||
|
|
||||||
case v.PShares.Kind == ShareBonded:
|
case ShareBonded:
|
||||||
if v.Status == sdk.Bonded { // return if nothing needs switching
|
if v.Status == sdk.Bonded { // return if nothing needs switching
|
||||||
return v, p
|
return v, p
|
||||||
}
|
}
|
||||||
p, tokens = p.removeSharesBonded(v.PShares.Amount)
|
p, tokens = p.removeSharesBonded(v.PoolShares.Amount)
|
||||||
}
|
}
|
||||||
|
|
||||||
switch v.Status {
|
switch v.Status {
|
||||||
case sdk.Unbonded, sdk.Revoked:
|
case sdk.Unbonded, sdk.Revoked:
|
||||||
p, v.PShares = p.addTokensUnbonded(tokens)
|
p, v.PoolShares = p.addTokensUnbonded(tokens)
|
||||||
case sdk.Unbonding:
|
case sdk.Unbonding:
|
||||||
p, v.PShares = p.addTokensUnbonding(tokens)
|
p, v.PoolShares = p.addTokensUnbonding(tokens)
|
||||||
case sdk.Bonded:
|
case sdk.Bonded:
|
||||||
p, v.PShares = p.addTokensBonded(tokens)
|
p, v.PoolShares = p.addTokensBonded(tokens)
|
||||||
}
|
}
|
||||||
return v, p
|
return v, p
|
||||||
}
|
}
|
||||||
|
@ -163,7 +156,7 @@ func (v Validator) UpdateSharesLocation(p Pool) (Validator, Pool) {
|
||||||
// if not bonded, the power is the amount of bonded shares which the
|
// if not bonded, the power is the amount of bonded shares which the
|
||||||
// the validator would have it was bonded
|
// the validator would have it was bonded
|
||||||
func (v Validator) EquivalentBondedShares(p Pool) (eqBondedShares sdk.Rat) {
|
func (v Validator) EquivalentBondedShares(p Pool) (eqBondedShares sdk.Rat) {
|
||||||
return v.PShares.ToBonded(p).Amount
|
return v.PoolShares.ToBonded(p).Amount
|
||||||
}
|
}
|
||||||
|
|
||||||
//_________________________________________________________________________________________________________
|
//_________________________________________________________________________________________________________
|
||||||
|
@ -185,7 +178,7 @@ func (v Validator) addTokensFromDel(p Pool,
|
||||||
case sdk.Bonded:
|
case sdk.Bonded:
|
||||||
p, poolShares = p.addTokensBonded(amount)
|
p, poolShares = p.addTokensBonded(amount)
|
||||||
}
|
}
|
||||||
v.PShares.Amount = v.PShares.Amount.Add(poolShares.Amount)
|
v.PoolShares.Amount = v.PoolShares.Amount.Add(poolShares.Amount)
|
||||||
equivalentBondedShares = poolShares.ToBonded(p).Amount
|
equivalentBondedShares = poolShares.ToBonded(p).Amount
|
||||||
|
|
||||||
issuedDelegatorShares = equivalentBondedShares.Quo(exRate) // bshr/(bshr/delshr) = delshr
|
issuedDelegatorShares = equivalentBondedShares.Quo(exRate) // bshr/(bshr/delshr) = delshr
|
||||||
|
@ -207,14 +200,14 @@ func (v Validator) removeDelShares(p Pool,
|
||||||
case sdk.Unbonded, sdk.Revoked:
|
case sdk.Unbonded, sdk.Revoked:
|
||||||
unbondedShares := eqBondedSharesToRemove.ToUnbonded(p).Amount
|
unbondedShares := eqBondedSharesToRemove.ToUnbonded(p).Amount
|
||||||
p, createdCoins = p.removeSharesUnbonded(unbondedShares)
|
p, createdCoins = p.removeSharesUnbonded(unbondedShares)
|
||||||
v.PShares.Amount = v.PShares.Amount.Sub(unbondedShares)
|
v.PoolShares.Amount = v.PoolShares.Amount.Sub(unbondedShares)
|
||||||
case sdk.Unbonding:
|
case sdk.Unbonding:
|
||||||
unbondingShares := eqBondedSharesToRemove.ToUnbonding(p).Amount
|
unbondingShares := eqBondedSharesToRemove.ToUnbonding(p).Amount
|
||||||
p, createdCoins = p.removeSharesUnbonding(unbondingShares)
|
p, createdCoins = p.removeSharesUnbonding(unbondingShares)
|
||||||
v.PShares.Amount = v.PShares.Amount.Sub(unbondingShares)
|
v.PoolShares.Amount = v.PoolShares.Amount.Sub(unbondingShares)
|
||||||
case sdk.Bonded:
|
case sdk.Bonded:
|
||||||
p, createdCoins = p.removeSharesBonded(eqBondedSharesToRemove.Amount)
|
p, createdCoins = p.removeSharesBonded(eqBondedSharesToRemove.Amount)
|
||||||
v.PShares.Amount = v.PShares.Amount.Sub(eqBondedSharesToRemove.Amount)
|
v.PoolShares.Amount = v.PoolShares.Amount.Sub(eqBondedSharesToRemove.Amount)
|
||||||
}
|
}
|
||||||
return v, p, createdCoins
|
return v, p, createdCoins
|
||||||
}
|
}
|
||||||
|
@ -225,7 +218,7 @@ func (v Validator) DelegatorShareExRate(p Pool) sdk.Rat {
|
||||||
if v.DelegatorShares.IsZero() {
|
if v.DelegatorShares.IsZero() {
|
||||||
return sdk.OneRat()
|
return sdk.OneRat()
|
||||||
}
|
}
|
||||||
eqBondedShares := v.PShares.ToBonded(p).Amount
|
eqBondedShares := v.PoolShares.ToBonded(p).Amount
|
||||||
return eqBondedShares.Quo(v.DelegatorShares)
|
return eqBondedShares.Quo(v.DelegatorShares)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -236,7 +229,7 @@ var _ sdk.Validator = Validator{}
|
||||||
|
|
||||||
// nolint - for sdk.Validator
|
// nolint - for sdk.Validator
|
||||||
func (v Validator) GetStatus() sdk.BondStatus { return v.Status }
|
func (v Validator) GetStatus() sdk.BondStatus { return v.Status }
|
||||||
func (v Validator) GetAddress() sdk.Address { return v.Address }
|
func (v Validator) GetOwner() sdk.Address { return v.Owner }
|
||||||
func (v Validator) GetPubKey() crypto.PubKey { return v.PubKey }
|
func (v Validator) GetPubKey() crypto.PubKey { return v.PubKey }
|
||||||
func (v Validator) GetPower() sdk.Rat { return v.PShares.Bonded() }
|
func (v Validator) GetPower() sdk.Rat { return v.PoolShares.Bonded() }
|
||||||
func (v Validator) GetBondHeight() int64 { return v.BondHeight }
|
func (v Validator) GetBondHeight() int64 { return v.BondHeight }
|
||||||
|
|
|
@ -25,7 +25,7 @@ func TestAddTokensValidatorBonded(t *testing.T) {
|
||||||
assert.Equal(t, sdk.OneRat(), pool.unbondedShareExRate())
|
assert.Equal(t, sdk.OneRat(), pool.unbondedShareExRate())
|
||||||
|
|
||||||
assert.True(sdk.RatEq(t, sdk.NewRat(10), delShares))
|
assert.True(sdk.RatEq(t, sdk.NewRat(10), delShares))
|
||||||
assert.True(sdk.RatEq(t, sdk.NewRat(10), val.PShares.Bonded()))
|
assert.True(sdk.RatEq(t, sdk.NewRat(10), val.PoolShares.Bonded()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAddTokensValidatorUnbonding(t *testing.T) {
|
func TestAddTokensValidatorUnbonding(t *testing.T) {
|
||||||
|
@ -43,7 +43,7 @@ func TestAddTokensValidatorUnbonding(t *testing.T) {
|
||||||
assert.Equal(t, sdk.OneRat(), pool.unbondedShareExRate())
|
assert.Equal(t, sdk.OneRat(), pool.unbondedShareExRate())
|
||||||
|
|
||||||
assert.True(sdk.RatEq(t, sdk.NewRat(10), delShares))
|
assert.True(sdk.RatEq(t, sdk.NewRat(10), delShares))
|
||||||
assert.True(sdk.RatEq(t, sdk.NewRat(10), val.PShares.Unbonding()))
|
assert.True(sdk.RatEq(t, sdk.NewRat(10), val.PoolShares.Unbonding()))
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAddTokensValidatorUnbonded(t *testing.T) {
|
func TestAddTokensValidatorUnbonded(t *testing.T) {
|
||||||
|
@ -61,7 +61,7 @@ func TestAddTokensValidatorUnbonded(t *testing.T) {
|
||||||
assert.Equal(t, sdk.OneRat(), pool.unbondedShareExRate())
|
assert.Equal(t, sdk.OneRat(), pool.unbondedShareExRate())
|
||||||
|
|
||||||
assert.True(sdk.RatEq(t, sdk.NewRat(10), delShares))
|
assert.True(sdk.RatEq(t, sdk.NewRat(10), delShares))
|
||||||
assert.True(sdk.RatEq(t, sdk.NewRat(10), val.PShares.Unbonded()))
|
assert.True(sdk.RatEq(t, sdk.NewRat(10), val.PoolShares.Unbonded()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO refactor to make simpler like the AddToken tests above
|
// TODO refactor to make simpler like the AddToken tests above
|
||||||
|
@ -73,11 +73,11 @@ func TestRemoveShares(t *testing.T) {
|
||||||
Status: sdk.Bonded,
|
Status: sdk.Bonded,
|
||||||
Address: addrs[0],
|
Address: addrs[0],
|
||||||
PubKey: pks[0],
|
PubKey: pks[0],
|
||||||
PShares: NewBondedShares(sdk.NewRat(9)),
|
PoolShares: NewBondedShares(sdk.NewRat(9)),
|
||||||
DelegatorShares: sdk.NewRat(9),
|
DelegatorShares: sdk.NewRat(9),
|
||||||
}
|
}
|
||||||
poolA.BondedTokens = valA.PShares.Bonded().Evaluate()
|
poolA.BondedTokens = valA.PoolShares.Bonded().Evaluate()
|
||||||
poolA.BondedShares = valA.PShares.Bonded()
|
poolA.BondedShares = valA.PoolShares.Bonded()
|
||||||
assert.Equal(t, valA.DelegatorShareExRate(poolA), sdk.OneRat())
|
assert.Equal(t, valA.DelegatorShareExRate(poolA), sdk.OneRat())
|
||||||
assert.Equal(t, poolA.bondedShareExRate(), sdk.OneRat())
|
assert.Equal(t, poolA.bondedShareExRate(), sdk.OneRat())
|
||||||
assert.Equal(t, poolA.unbondedShareExRate(), sdk.OneRat())
|
assert.Equal(t, poolA.unbondedShareExRate(), sdk.OneRat())
|
||||||
|
@ -86,7 +86,7 @@ func TestRemoveShares(t *testing.T) {
|
||||||
// coins were created
|
// coins were created
|
||||||
assert.Equal(t, coinsB, int64(10))
|
assert.Equal(t, coinsB, int64(10))
|
||||||
// pool shares were removed
|
// pool shares were removed
|
||||||
assert.Equal(t, valB.PShares.Bonded(), valA.PShares.Bonded().Sub(sdk.NewRat(10).Mul(valA.DelegatorShareExRate(poolA))))
|
assert.Equal(t, valB.PoolShares.Bonded(), valA.PoolShares.Bonded().Sub(sdk.NewRat(10).Mul(valA.DelegatorShareExRate(poolA))))
|
||||||
// conservation of tokens
|
// conservation of tokens
|
||||||
assert.Equal(t, poolB.UnbondedTokens+poolB.BondedTokens+coinsB, poolA.UnbondedTokens+poolA.BondedTokens)
|
assert.Equal(t, poolB.UnbondedTokens+poolB.BondedTokens+coinsB, poolA.UnbondedTokens+poolA.BondedTokens)
|
||||||
|
|
||||||
|
@ -97,7 +97,7 @@ func TestRemoveShares(t *testing.T) {
|
||||||
Status: sdk.Bonded,
|
Status: sdk.Bonded,
|
||||||
Address: addrs[0],
|
Address: addrs[0],
|
||||||
PubKey: pks[0],
|
PubKey: pks[0],
|
||||||
PShares: NewBondedShares(poolShares),
|
PoolShares: NewBondedShares(poolShares),
|
||||||
DelegatorShares: delShares,
|
DelegatorShares: delShares,
|
||||||
}
|
}
|
||||||
pool := Pool{
|
pool := Pool{
|
||||||
|
@ -111,7 +111,7 @@ func TestRemoveShares(t *testing.T) {
|
||||||
}
|
}
|
||||||
shares := sdk.NewRat(29)
|
shares := sdk.NewRat(29)
|
||||||
msg := fmt.Sprintf("validator %s (status: %d, poolShares: %v, delShares: %v, DelegatorShareExRate: %v)",
|
msg := fmt.Sprintf("validator %s (status: %d, poolShares: %v, delShares: %v, DelegatorShareExRate: %v)",
|
||||||
val.Address, val.Status, val.PShares.Bonded(), val.DelegatorShares, val.DelegatorShareExRate(pool))
|
val.Address, val.Status, val.PoolShares.Bonded(), val.DelegatorShares, val.DelegatorShareExRate(pool))
|
||||||
msg = fmt.Sprintf("Removed %v shares from %s", shares, msg)
|
msg = fmt.Sprintf("Removed %v shares from %s", shares, msg)
|
||||||
_, newPool, tokens := val.removeDelShares(pool, shares)
|
_, newPool, tokens := val.removeDelShares(pool, shares)
|
||||||
require.Equal(t,
|
require.Equal(t,
|
||||||
|
@ -127,28 +127,28 @@ func TestUpdateSharesLocation(t *testing.T) {
|
||||||
val := NewValidator(addrs[0], pks[0], Description{})
|
val := NewValidator(addrs[0], pks[0], Description{})
|
||||||
val.Status = sdk.Unbonded
|
val.Status = sdk.Unbonded
|
||||||
val, pool, _ = val.addTokensFromDel(pool, 100)
|
val, pool, _ = val.addTokensFromDel(pool, 100)
|
||||||
assert.Equal(t, int64(0), val.PShares.Bonded().Evaluate())
|
assert.Equal(t, int64(0), val.PoolShares.Bonded().Evaluate())
|
||||||
assert.Equal(t, int64(0), val.PShares.Unbonding().Evaluate())
|
assert.Equal(t, int64(0), val.PoolShares.Unbonding().Evaluate())
|
||||||
assert.Equal(t, int64(100), val.PShares.Unbonded().Evaluate())
|
assert.Equal(t, int64(100), val.PoolShares.Unbonded().Evaluate())
|
||||||
assert.Equal(t, int64(0), pool.BondedTokens)
|
assert.Equal(t, int64(0), pool.BondedTokens)
|
||||||
assert.Equal(t, int64(0), pool.UnbondingTokens)
|
assert.Equal(t, int64(0), pool.UnbondingTokens)
|
||||||
assert.Equal(t, int64(100), pool.UnbondedTokens)
|
assert.Equal(t, int64(100), pool.UnbondedTokens)
|
||||||
|
|
||||||
val.Status = sdk.Unbonding
|
val.Status = sdk.Unbonding
|
||||||
val, pool = val.UpdateSharesLocation(pool)
|
val, pool = val.UpdateSharesLocation(pool)
|
||||||
//require.Fail(t, "", "%v", val.PShares.Bonded().IsZero())
|
//require.Fail(t, "", "%v", val.PoolShares.Bonded().IsZero())
|
||||||
assert.Equal(t, int64(0), val.PShares.Bonded().Evaluate())
|
assert.Equal(t, int64(0), val.PoolShares.Bonded().Evaluate())
|
||||||
assert.Equal(t, int64(100), val.PShares.Unbonding().Evaluate())
|
assert.Equal(t, int64(100), val.PoolShares.Unbonding().Evaluate())
|
||||||
assert.Equal(t, int64(0), val.PShares.Unbonded().Evaluate())
|
assert.Equal(t, int64(0), val.PoolShares.Unbonded().Evaluate())
|
||||||
assert.Equal(t, int64(0), pool.BondedTokens)
|
assert.Equal(t, int64(0), pool.BondedTokens)
|
||||||
assert.Equal(t, int64(100), pool.UnbondingTokens)
|
assert.Equal(t, int64(100), pool.UnbondingTokens)
|
||||||
assert.Equal(t, int64(0), pool.UnbondedTokens)
|
assert.Equal(t, int64(0), pool.UnbondedTokens)
|
||||||
|
|
||||||
val.Status = sdk.Bonded
|
val.Status = sdk.Bonded
|
||||||
val, pool = val.UpdateSharesLocation(pool)
|
val, pool = val.UpdateSharesLocation(pool)
|
||||||
assert.Equal(t, int64(100), val.PShares.Bonded().Evaluate())
|
assert.Equal(t, int64(100), val.PoolShares.Bonded().Evaluate())
|
||||||
assert.Equal(t, int64(0), val.PShares.Unbonding().Evaluate())
|
assert.Equal(t, int64(0), val.PoolShares.Unbonding().Evaluate())
|
||||||
assert.Equal(t, int64(0), val.PShares.Unbonded().Evaluate())
|
assert.Equal(t, int64(0), val.PoolShares.Unbonded().Evaluate())
|
||||||
assert.Equal(t, int64(100), pool.BondedTokens)
|
assert.Equal(t, int64(100), pool.BondedTokens)
|
||||||
assert.Equal(t, int64(0), pool.UnbondingTokens)
|
assert.Equal(t, int64(0), pool.UnbondingTokens)
|
||||||
assert.Equal(t, int64(0), pool.UnbondedTokens)
|
assert.Equal(t, int64(0), pool.UnbondedTokens)
|
||||||
|
@ -176,7 +176,7 @@ func randomValidator(r *rand.Rand) Validator {
|
||||||
Status: status,
|
Status: status,
|
||||||
Address: addrs[0],
|
Address: addrs[0],
|
||||||
PubKey: pks[0],
|
PubKey: pks[0],
|
||||||
PShares: pShares,
|
PoolShares: pShares,
|
||||||
DelegatorShares: delShares,
|
DelegatorShares: delShares,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -189,11 +189,11 @@ func randomSetup(r *rand.Rand, numValidators int) (Pool, Validators) {
|
||||||
for i := 0; i < numValidators; i++ {
|
for i := 0; i < numValidators; i++ {
|
||||||
validator := randomValidator(r)
|
validator := randomValidator(r)
|
||||||
if validator.Status == sdk.Bonded {
|
if validator.Status == sdk.Bonded {
|
||||||
pool.BondedShares = pool.BondedShares.Add(validator.PShares.Bonded())
|
pool.BondedShares = pool.BondedShares.Add(validator.PoolShares.Bonded())
|
||||||
pool.BondedTokens += validator.PShares.Bonded().Evaluate()
|
pool.BondedTokens += validator.PoolShares.Bonded().Evaluate()
|
||||||
} else if validator.Status == sdk.Unbonded {
|
} else if validator.Status == sdk.Unbonded {
|
||||||
pool.UnbondedShares = pool.UnbondedShares.Add(validator.PShares.Unbonded())
|
pool.UnbondedShares = pool.UnbondedShares.Add(validator.PoolShares.Unbonded())
|
||||||
pool.UnbondedTokens += validator.PShares.Unbonded().Evaluate()
|
pool.UnbondedTokens += validator.PoolShares.Unbonded().Evaluate()
|
||||||
}
|
}
|
||||||
validators[i] = validator
|
validators[i] = validator
|
||||||
}
|
}
|
||||||
|
@ -210,11 +210,11 @@ func OpBondOrUnbond(r *rand.Rand, p Pool, val Validator) (Pool, Validator, int64
|
||||||
var msg string
|
var msg string
|
||||||
if val.Status == sdk.Bonded {
|
if val.Status == sdk.Bonded {
|
||||||
msg = fmt.Sprintf("sdk.Unbonded previously bonded validator %s (poolShares: %v, delShares: %v, DelegatorShareExRate: %v)",
|
msg = fmt.Sprintf("sdk.Unbonded previously bonded validator %s (poolShares: %v, delShares: %v, DelegatorShareExRate: %v)",
|
||||||
val.Address, val.PShares.Bonded(), val.DelegatorShares, val.DelegatorShareExRate(p))
|
val.Address, val.PoolShares.Bonded(), val.DelegatorShares, val.DelegatorShareExRate(p))
|
||||||
val.Status = sdk.Unbonded
|
val.Status = sdk.Unbonded
|
||||||
} else if val.Status == sdk.Unbonded {
|
} else if val.Status == sdk.Unbonded {
|
||||||
msg = fmt.Sprintf("sdk.Bonded previously unbonded validator %s (poolShares: %v, delShares: %v, DelegatorShareExRate: %v)",
|
msg = fmt.Sprintf("sdk.Bonded previously unbonded validator %s (poolShares: %v, delShares: %v, DelegatorShareExRate: %v)",
|
||||||
val.Address, val.PShares.Bonded(), val.DelegatorShares, val.DelegatorShareExRate(p))
|
val.Address, val.PoolShares.Bonded(), val.DelegatorShares, val.DelegatorShareExRate(p))
|
||||||
val.Status = sdk.Bonded
|
val.Status = sdk.Bonded
|
||||||
}
|
}
|
||||||
val, p = val.UpdateSharesLocation(p)
|
val, p = val.UpdateSharesLocation(p)
|
||||||
|
@ -225,7 +225,7 @@ func OpBondOrUnbond(r *rand.Rand, p Pool, val Validator) (Pool, Validator, int64
|
||||||
func OpAddTokens(r *rand.Rand, p Pool, val Validator) (Pool, Validator, int64, string) {
|
func OpAddTokens(r *rand.Rand, p Pool, val Validator) (Pool, Validator, int64, string) {
|
||||||
tokens := int64(r.Int31n(1000))
|
tokens := int64(r.Int31n(1000))
|
||||||
msg := fmt.Sprintf("validator %s (status: %d, poolShares: %v, delShares: %v, DelegatorShareExRate: %v)",
|
msg := fmt.Sprintf("validator %s (status: %d, poolShares: %v, delShares: %v, DelegatorShareExRate: %v)",
|
||||||
val.Address, val.Status, val.PShares.Bonded(), val.DelegatorShares, val.DelegatorShareExRate(p))
|
val.Address, val.Status, val.PoolShares.Bonded(), val.DelegatorShares, val.DelegatorShareExRate(p))
|
||||||
val, p, _ = val.addTokensFromDel(p, tokens)
|
val, p, _ = val.addTokensFromDel(p, tokens)
|
||||||
msg = fmt.Sprintf("Added %d tokens to %s", tokens, msg)
|
msg = fmt.Sprintf("Added %d tokens to %s", tokens, msg)
|
||||||
return p, val, -1 * tokens, msg // tokens are removed so for accounting must be negative
|
return p, val, -1 * tokens, msg // tokens are removed so for accounting must be negative
|
||||||
|
@ -242,7 +242,7 @@ func OpRemoveShares(r *rand.Rand, p Pool, val Validator) (Pool, Validator, int64
|
||||||
}
|
}
|
||||||
|
|
||||||
msg := fmt.Sprintf("Removed %v shares from validator %s (status: %d, poolShares: %v, delShares: %v, DelegatorShareExRate: %v)",
|
msg := fmt.Sprintf("Removed %v shares from validator %s (status: %d, poolShares: %v, delShares: %v, DelegatorShareExRate: %v)",
|
||||||
shares, val.Address, val.Status, val.PShares, val.DelegatorShares, val.DelegatorShareExRate(p))
|
shares, val.Address, val.Status, val.PoolShares, val.DelegatorShares, val.DelegatorShareExRate(p))
|
||||||
|
|
||||||
val, p, tokens := val.removeDelShares(p, shares)
|
val, p, tokens := val.removeDelShares(p, shares)
|
||||||
return p, val, tokens, msg
|
return p, val, tokens, msg
|
||||||
|
@ -269,7 +269,7 @@ func assertInvariants(t *testing.T, msg string,
|
||||||
require.Equal(t,
|
require.Equal(t,
|
||||||
pOrig.UnbondedTokens+pOrig.BondedTokens,
|
pOrig.UnbondedTokens+pOrig.BondedTokens,
|
||||||
pMod.UnbondedTokens+pMod.BondedTokens+tokens,
|
pMod.UnbondedTokens+pMod.BondedTokens+tokens,
|
||||||
"Tokens not conserved - msg: %v\n, pOrig.PShares.Bonded(): %v, pOrig.PShares.Unbonded(): %v, pMod.PShares.Bonded(): %v, pMod.PShares.Unbonded(): %v, pOrig.UnbondedTokens: %v, pOrig.BondedTokens: %v, pMod.UnbondedTokens: %v, pMod.BondedTokens: %v, tokens: %v\n",
|
"Tokens not conserved - msg: %v\n, pOrig.PoolShares.Bonded(): %v, pOrig.PoolShares.Unbonded(): %v, pMod.PoolShares.Bonded(): %v, pMod.PoolShares.Unbonded(): %v, pOrig.UnbondedTokens: %v, pOrig.BondedTokens: %v, pMod.UnbondedTokens: %v, pMod.BondedTokens: %v, tokens: %v\n",
|
||||||
msg,
|
msg,
|
||||||
pOrig.BondedShares, pOrig.UnbondedShares,
|
pOrig.BondedShares, pOrig.UnbondedShares,
|
||||||
pMod.BondedShares, pMod.UnbondedShares,
|
pMod.BondedShares, pMod.UnbondedShares,
|
||||||
|
@ -307,10 +307,10 @@ func assertInvariants(t *testing.T, msg string,
|
||||||
)
|
)
|
||||||
|
|
||||||
// nonnegative poolShares
|
// nonnegative poolShares
|
||||||
require.False(t, vMod.PShares.Bonded().LT(sdk.ZeroRat()),
|
require.False(t, vMod.PoolShares.Bonded().LT(sdk.ZeroRat()),
|
||||||
"Applying operation \"%s\" resulted in negative validator.PShares.Bonded(): %v (validator.DelegatorShares: %v, validator.DelegatorShareExRate: %v, validator.Address: %s)",
|
"Applying operation \"%s\" resulted in negative validator.PoolShares.Bonded(): %v (validator.DelegatorShares: %v, validator.DelegatorShareExRate: %v, validator.Address: %s)",
|
||||||
msg,
|
msg,
|
||||||
vMod.PShares.Bonded(),
|
vMod.PoolShares.Bonded(),
|
||||||
vMod.DelegatorShares,
|
vMod.DelegatorShares,
|
||||||
vMod.DelegatorShareExRate(pMod),
|
vMod.DelegatorShareExRate(pMod),
|
||||||
vMod.Address,
|
vMod.Address,
|
||||||
|
@ -318,10 +318,10 @@ func assertInvariants(t *testing.T, msg string,
|
||||||
|
|
||||||
// nonnegative delShares
|
// nonnegative delShares
|
||||||
require.False(t, vMod.DelegatorShares.LT(sdk.ZeroRat()),
|
require.False(t, vMod.DelegatorShares.LT(sdk.ZeroRat()),
|
||||||
"Applying operation \"%s\" resulted in negative validator.DelegatorShares: %v (validator.PShares.Bonded(): %v, validator.DelegatorShareExRate: %v, validator.Address: %s)",
|
"Applying operation \"%s\" resulted in negative validator.DelegatorShares: %v (validator.PoolShares.Bonded(): %v, validator.DelegatorShareExRate: %v, validator.Address: %s)",
|
||||||
msg,
|
msg,
|
||||||
vMod.DelegatorShares,
|
vMod.DelegatorShares,
|
||||||
vMod.PShares.Bonded(),
|
vMod.PoolShares.Bonded(),
|
||||||
vMod.DelegatorShareExRate(pMod),
|
vMod.DelegatorShareExRate(pMod),
|
||||||
vMod.Address,
|
vMod.Address,
|
||||||
)
|
)
|
||||||
|
@ -337,7 +337,7 @@ func TestPossibleOverflow(t *testing.T) {
|
||||||
Status: sdk.Bonded,
|
Status: sdk.Bonded,
|
||||||
Address: addrs[0],
|
Address: addrs[0],
|
||||||
PubKey: pks[0],
|
PubKey: pks[0],
|
||||||
PShares: NewBondedShares(poolShares),
|
PoolShares: NewBondedShares(poolShares),
|
||||||
DelegatorShares: delShares,
|
DelegatorShares: delShares,
|
||||||
}
|
}
|
||||||
pool := Pool{
|
pool := Pool{
|
||||||
|
@ -351,7 +351,7 @@ func TestPossibleOverflow(t *testing.T) {
|
||||||
}
|
}
|
||||||
tokens := int64(71)
|
tokens := int64(71)
|
||||||
msg := fmt.Sprintf("validator %s (status: %d, poolShares: %v, delShares: %v, DelegatorShareExRate: %v)",
|
msg := fmt.Sprintf("validator %s (status: %d, poolShares: %v, delShares: %v, DelegatorShareExRate: %v)",
|
||||||
val.Address, val.Status, val.PShares.Bonded(), val.DelegatorShares, val.DelegatorShareExRate(pool))
|
val.Address, val.Status, val.PoolShares.Bonded(), val.DelegatorShares, val.DelegatorShareExRate(pool))
|
||||||
newValidator, _, _ := val.addTokensFromDel(pool, tokens)
|
newValidator, _, _ := val.addTokensFromDel(pool, tokens)
|
||||||
|
|
||||||
msg = fmt.Sprintf("Added %d tokens to %s", tokens, msg)
|
msg = fmt.Sprintf("Added %d tokens to %s", tokens, msg)
|
||||||
|
|
|
@ -20,7 +20,7 @@ func TestViewSlashBond(t *testing.T) {
|
||||||
validators[i] = Validator{
|
validators[i] = Validator{
|
||||||
Address: addrVals[i],
|
Address: addrVals[i],
|
||||||
PubKey: pks[i],
|
PubKey: pks[i],
|
||||||
PShares: NewBondedShares(sdk.NewRat(amt)),
|
PoolShares: NewBondedShares(sdk.NewRat(amt)),
|
||||||
DelegatorShares: sdk.NewRat(amt),
|
DelegatorShares: sdk.NewRat(amt),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,3 +11,5 @@ func RegisterWire(cdc *wire.Codec) {
|
||||||
cdc.RegisterConcrete(MsgDelegate{}, "cosmos-sdk/MsgDelegate", nil)
|
cdc.RegisterConcrete(MsgDelegate{}, "cosmos-sdk/MsgDelegate", nil)
|
||||||
cdc.RegisterConcrete(MsgUnbond{}, "cosmos-sdk/MsgUnbond", nil)
|
cdc.RegisterConcrete(MsgUnbond{}, "cosmos-sdk/MsgUnbond", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var cdcEmpty = wire.NewCodec()
|
||||||
|
|
Loading…
Reference in New Issue