fixing tests, working on TestUpdateSharesLocation

This commit is contained in:
rigelrozanski 2018-05-12 20:21:02 -04:00
parent 67123a3a46
commit dc3c40fecc
8 changed files with 154 additions and 143 deletions

View File

@ -410,7 +410,6 @@ func TestStakeMsgs(t *testing.T) {
require.Equal(t, addr1, validator.Address)
require.Equal(t, sdk.Bonded, validator.Status)
require.True(sdk.RatEq(t, sdk.NewRat(10), validator.BondedShares))
require.True(sdk.RatEq(t, sdk.NewRat(1), validator.DelegatorShareExRate()))
// check the bond that should have been created as well
bond, found := gapp.stakeKeeper.GetDelegation(ctxDeliver, addr1, addr1)

View File

@ -72,7 +72,7 @@ func TestIncrementsMsgDelegate(t *testing.T) {
validator, found := keeper.GetValidator(ctx, validatorAddr)
require.True(t, found)
assert.Equal(t, bondAmount, validator.DelegatorShares.Evaluate())
assert.Equal(t, bondAmount, validator.BondedShares.Evaluate())
assert.Equal(t, bondAmount, validator.BondedShares.Evaluate(), "validator: %v", validator)
// just send the same msgbond multiple times
msgDelegate := newTestMsgDelegate(delegatorAddr, validatorAddr, bondAmount)

View File

@ -2,6 +2,7 @@ package stake
import (
"bytes"
"fmt"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/wire"
@ -123,12 +124,15 @@ func (k Keeper) setValidator(ctx sdk.Context, validator Validator) {
// update the validator set for this validator
valIsNowBonded := k.updateValidators(ctx, store, validator.Address)
fmt.Printf("debug valIsNowBonded: %v\n", valIsNowBonded)
fmt.Printf("debug validator0: %v\n", validator)
if oldValidator.Status != sdk.Bonded && valIsNowBonded {
validator.Status = sdk.Bonded
validator, pool = validator.UpdateSharesLocation(pool)
k.setPool(ctx, pool)
}
fmt.Printf("debug validator1: %v\n", validator)
return
}

View File

@ -26,6 +26,7 @@ var (
// This function tests setValidator, GetValidator, GetValidatorsBonded, removeValidator
func TestValidatorBasics(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
pool := keeper.GetPool(ctx)
//construct the validators
var validators [3]Validator
@ -33,13 +34,12 @@ func TestValidatorBasics(t *testing.T) {
for i, amt := range amts {
validators[i] = NewValidator(addrVals[i], pks[i], Description{})
validators[i].Status = sdk.Bonded
validators[i].BondedShares = sdk.NewRat(amt)
validators[i].DelegatorShares = sdk.NewRat(amt)
validators[i].addTokens(pool, amt)
}
// check the empty keeper first
_, found := keeper.GetValidator(ctx, addrVals[0])
UnbondedSharesassert.False(t, found)
assert.False(t, found)
resVals := keeper.GetValidatorsBonded(ctx)
assert.Zero(t, len(resVals))
@ -172,8 +172,6 @@ func GetValidatorSortingMixed(t *testing.T) {
params.MaxValidators = 2
keeper.setParams(ctx, params)
pool := keeper.GetPool(ctx)
// initialize some validators into the state
amts := []int64{0, 100, 1, 400, 200}
@ -191,11 +189,21 @@ func GetValidatorSortingMixed(t *testing.T) {
for i := range amts {
keeper.setValidator(ctx, validators[i])
}
assert.Equal(t, sdk.Unbonded, keeper.GetValidator(ctx, addr[0]).Status)
assert.Equal(t, sdk.Unbonded, keeper.GetValidator(ctx, addr[1]).Status)
assert.Equal(t, sdk.Unbonded, keeper.GetValidator(ctx, addr[2]).Status)
assert.Equal(t, sdk.Bonded, keeper.GetValidator(ctx, addr[3]).Status)
assert.Equal(t, sdk.Bonded, keeper.GetValidator(ctx, addr[4]).Status)
val0, found := keeper.GetValidator(ctx, addrs[0])
require.True(t, found)
val1, found := keeper.GetValidator(ctx, addrs[1])
require.True(t, found)
val2, found := keeper.GetValidator(ctx, addrs[2])
require.True(t, found)
val3, found := keeper.GetValidator(ctx, addrs[3])
require.True(t, found)
val4, found := keeper.GetValidator(ctx, addrs[4])
require.True(t, found)
assert.Equal(t, sdk.Unbonded, val0.Status)
assert.Equal(t, sdk.Unbonded, val1.Status)
assert.Equal(t, sdk.Unbonded, val2.Status)
assert.Equal(t, sdk.Bonded, val3.Status)
assert.Equal(t, sdk.Bonded, val4.Status)
// first make sure everything made it in to the gotValidator group
gotValidators := keeper.GetValidatorsBondedByPower(ctx)

View File

@ -13,7 +13,7 @@ func TestBondedRatio(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
pool := keeper.GetPool(ctx)
pool.TotalSupply = 3
pool.BondedPool = 2
pool.BondedTokens = 2
// bonded pool / total supply
require.Equal(t, pool.bondedRatio(), sdk.NewRat(2).Quo(sdk.NewRat(3)))
@ -26,7 +26,7 @@ func TestBondedRatio(t *testing.T) {
func TestBondedShareExRate(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
pool := keeper.GetPool(ctx)
pool.BondedPool = 3
pool.BondedTokens = 3
pool.BondedShares = sdk.NewRat(10)
// bonded pool / bonded shares
@ -40,7 +40,7 @@ func TestBondedShareExRate(t *testing.T) {
func TestUnbondingShareExRate(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
pool := keeper.GetPool(ctx)
pool.UnbondingPool = 3
pool.UnbondingTokens = 3
pool.UnbondingShares = sdk.NewRat(10)
// unbonding pool / unbonding shares
@ -54,7 +54,7 @@ func TestUnbondingShareExRate(t *testing.T) {
func TestUnbondedShareExRate(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
pool := keeper.GetPool(ctx)
pool.UnbondedPool = 3
pool.UnbondedTokens = 3
pool.UnbondedShares = sdk.NewRat(10)
// unbonded pool / unbonded shares
@ -75,10 +75,10 @@ func TestAddTokensBonded(t *testing.T) {
// correct changes to bonded shares and bonded pool
assert.Equal(t, poolB.BondedShares, poolA.BondedShares.Add(sharesB))
assert.Equal(t, poolB.BondedPool, poolA.BondedPool+10)
assert.Equal(t, poolB.BondedTokens, poolA.BondedTokens+10)
// same number of bonded shares / tokens when exchange rate is one
assert.True(t, poolB.BondedShares.Equal(sdk.NewRat(poolB.BondedPool)))
assert.True(t, poolB.BondedShares.Equal(sdk.NewRat(poolB.BondedTokens)))
}
func TestRemoveSharesBonded(t *testing.T) {
@ -91,10 +91,10 @@ func TestRemoveSharesBonded(t *testing.T) {
// correct changes to bonded shares and bonded pool
assert.Equal(t, poolB.BondedShares, poolA.BondedShares.Sub(sdk.NewRat(10)))
assert.Equal(t, poolB.BondedPool, poolA.BondedPool-tokensB)
assert.Equal(t, poolB.BondedTokens, poolA.BondedTokens-tokensB)
// same number of bonded shares / tokens when exchange rate is one
assert.True(t, poolB.BondedShares.Equal(sdk.NewRat(poolB.BondedPool)))
assert.True(t, poolB.BondedShares.Equal(sdk.NewRat(poolB.BondedTokens)))
}
func TestAddTokensUnbonded(t *testing.T) {
@ -107,10 +107,10 @@ func TestAddTokensUnbonded(t *testing.T) {
// correct changes to unbonded shares and unbonded pool
assert.Equal(t, poolB.UnbondedShares, poolA.UnbondedShares.Add(sharesB))
assert.Equal(t, poolB.UnbondedPool, poolA.UnbondedPool+10)
assert.Equal(t, poolB.UnbondedTokens, poolA.UnbondedTokens+10)
// same number of unbonded shares / tokens when exchange rate is one
assert.True(t, poolB.UnbondedShares.Equal(sdk.NewRat(poolB.UnbondedPool)))
assert.True(t, poolB.UnbondedShares.Equal(sdk.NewRat(poolB.UnbondedTokens)))
}
func TestRemoveSharesUnbonded(t *testing.T) {
@ -123,8 +123,8 @@ func TestRemoveSharesUnbonded(t *testing.T) {
// correct changes to unbonded shares and bonded pool
assert.Equal(t, poolB.UnbondedShares, poolA.UnbondedShares.Sub(sdk.NewRat(10)))
assert.Equal(t, poolB.UnbondedPool, poolA.UnbondedPool-tokensB)
assert.Equal(t, poolB.UnbondedTokens, poolA.UnbondedTokens-tokensB)
// same number of unbonded shares / tokens when exchange rate is one
assert.True(t, poolB.UnbondedShares.Equal(sdk.NewRat(poolB.UnbondedPool)))
assert.True(t, poolB.UnbondedShares.Equal(sdk.NewRat(poolB.UnbondedTokens)))
}

View File

@ -15,7 +15,7 @@ func TestGetInflation(t *testing.T) {
hrsPerYrRat := sdk.NewRat(hrsPerYr)
// Governing Mechanism:
// bondedRatio = BondedPool / TotalSupply
// bondedRatio = BondedTokens / TotalSupply
// inflationRateChangePerYear = (1- bondedRatio/ GoalBonded) * MaxInflationRateChange
tests := []struct {
@ -47,7 +47,7 @@ func TestGetInflation(t *testing.T) {
{"test 8", 67, 100, sdk.NewRat(15, 100), sdk.ZeroRat()},
}
for _, tc := range tests {
pool.BondedPool, pool.TotalSupply = tc.setBondedPool, tc.setTotalSupply
pool.BondedTokens, pool.TotalSupply = tc.setBondedPool, tc.setTotalSupply
pool.Inflation = tc.setInflation
keeper.setPool(ctx, pool)
@ -90,8 +90,8 @@ func TestProcessProvisions(t *testing.T) {
var bondedShares int64 = 150000000
var unbondedShares int64 = 400000000
assert.Equal(t, totalSupply, pool.TotalSupply)
assert.Equal(t, bondedShares, pool.BondedPool)
assert.Equal(t, unbondedShares, pool.UnbondedPool)
assert.Equal(t, bondedShares, pool.BondedTokens)
assert.Equal(t, unbondedShares, pool.UnbondedTokens)
// initial bonded ratio ~ 27%
assert.True(t, pool.bondedRatio().Equal(sdk.NewRat(bondedShares, totalSupply)), "%v", pool.bondedRatio())
@ -100,33 +100,33 @@ func TestProcessProvisions(t *testing.T) {
assert.True(t, pool.bondedShareExRate().Equal(sdk.OneRat()), "%v", pool.bondedShareExRate())
initialSupply := pool.TotalSupply
initialUnbonded := pool.TotalSupply - pool.BondedPool
initialUnbonded := pool.TotalSupply - pool.BondedTokens
// process the provisions a year
for hr := 0; hr < 8766; hr++ {
pool := keeper.GetPool(ctx)
expInflation := keeper.nextInflation(ctx).Round(1000000000)
expProvisions := (expInflation.Mul(sdk.NewRat(pool.TotalSupply)).Quo(hrsPerYrRat)).Evaluate()
startBondedPool := pool.BondedPool
startBondedPool := pool.BondedTokens
startTotalSupply := pool.TotalSupply
pool = keeper.processProvisions(ctx)
keeper.setPool(ctx, pool)
//fmt.Printf("hr %v, startBondedPool %v, expProvisions %v, pool.BondedPool %v\n", hr, startBondedPool, expProvisions, pool.BondedPool)
require.Equal(t, startBondedPool+expProvisions, pool.BondedPool, "hr %v", hr)
//fmt.Printf("hr %v, startBondedPool %v, expProvisions %v, pool.BondedTokens %v\n", hr, startBondedPool, expProvisions, pool.BondedTokens)
require.Equal(t, startBondedPool+expProvisions, pool.BondedTokens, "hr %v", hr)
require.Equal(t, startTotalSupply+expProvisions, pool.TotalSupply)
}
pool = keeper.GetPool(ctx)
assert.NotEqual(t, initialSupply, pool.TotalSupply)
assert.Equal(t, initialUnbonded, pool.UnbondedPool)
//panic(fmt.Sprintf("debug total %v, bonded %v, diff %v\n", p.TotalSupply, p.BondedPool, pool.TotalSupply-pool.BondedPool))
assert.Equal(t, initialUnbonded, pool.UnbondedTokens)
//panic(fmt.Sprintf("debug total %v, bonded %v, diff %v\n", p.TotalSupply, p.BondedTokens, pool.TotalSupply-pool.BondedTokens))
// initial bonded ratio ~ from 27% to 40% increase for bonded holders ownership of total supply
assert.True(t, pool.bondedRatio().Equal(sdk.NewRat(211813022, 611813022)), "%v", pool.bondedRatio())
// global supply
assert.Equal(t, int64(611813022), pool.TotalSupply)
assert.Equal(t, int64(211813022), pool.BondedPool)
assert.Equal(t, unbondedShares, pool.UnbondedPool)
assert.Equal(t, int64(211813022), pool.BondedTokens)
assert.Equal(t, unbondedShares, pool.UnbondedTokens)
// test the value of validator shares
assert.True(t, pool.bondedShareExRate().Mul(sdk.NewRat(bondedShares)).Equal(sdk.NewRat(211813022)), "%v", pool.bondedShareExRate())

View File

@ -139,7 +139,6 @@ func (v Validator) abciValidatorZero(cdc *wire.Codec) abci.Validator {
}
}
// XXX write test
// update the location of the shares within a validator if its bond status has changed
func (v Validator) UpdateSharesLocation(p Pool) (Validator, Pool) {
var tokens int64

View File

@ -10,32 +10,58 @@ import (
"github.com/stretchr/testify/require"
)
func TestAddTokens(t *testing.T) {
func TestAddTokensValidatorBonded(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
poolA := keeper.GetPool(ctx)
valA := Validator{
Status: sdk.Bonded,
Address: addrs[0],
PubKey: pks[0],
BondedShares: sdk.NewRat(9),
DelegatorShares: sdk.NewRat(9),
}
poolA.BondedPool = valA.BondedShares.Evaluate()
poolA.BondedShares = valA.BondedShares
assert.Equal(t, valA.DelegatorShareExRate(), sdk.OneRat())
assert.Equal(t, poolA.bondedShareExRate(), sdk.OneRat())
assert.Equal(t, poolA.unbondedShareExRate(), sdk.OneRat())
valB, poolB, sharesB := valA.addTokens(poolA, 10)
pool := keeper.GetPool(ctx)
val := NewValidator(addrs[0], pks[0], Description{})
val.Status = sdk.Bonded
val, pool, delShares := val.addTokens(pool, 10)
// shares were issued
assert.Equal(t, sdk.NewRat(10).Mul(valA.DelegatorShareExRate()), sharesB)
// pool shares were added
assert.Equal(t, valB.BondedShares, valA.BondedShares.Add(sdk.NewRat(10)))
// conservation of tokens
assert.Equal(t, poolB.BondedPool, 10+poolA.BondedPool)
assert.Equal(t, sdk.OneRat(), val.DelegatorShareExRate(pool))
assert.Equal(t, sdk.OneRat(), pool.bondedShareExRate())
assert.Equal(t, sdk.OneRat(), pool.unbondingShareExRate())
assert.Equal(t, sdk.OneRat(), pool.unbondedShareExRate())
assert.True(sdk.RatEq(t, sdk.NewRat(10), delShares))
assert.True(sdk.RatEq(t, sdk.NewRat(10), val.BondedShares))
}
func TestAddTokensValidatorUnbonding(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
pool := keeper.GetPool(ctx)
val := NewValidator(addrs[0], pks[0], Description{})
val.Status = sdk.Unbonding
val, pool, delShares := val.addTokens(pool, 10)
assert.Equal(t, sdk.OneRat(), val.DelegatorShareExRate(pool))
assert.Equal(t, sdk.OneRat(), pool.bondedShareExRate())
assert.Equal(t, sdk.OneRat(), pool.unbondingShareExRate())
assert.Equal(t, sdk.OneRat(), pool.unbondedShareExRate())
assert.True(sdk.RatEq(t, sdk.NewRat(10), delShares))
assert.True(sdk.RatEq(t, sdk.NewRat(10), val.UnbondingShares))
}
func TestAddTokensValidatorUnbonded(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
pool := keeper.GetPool(ctx)
val := NewValidator(addrs[0], pks[0], Description{})
val.Status = sdk.Unbonded
val, pool, delShares := val.addTokens(pool, 10)
assert.Equal(t, sdk.OneRat(), val.DelegatorShareExRate(pool))
assert.Equal(t, sdk.OneRat(), pool.bondedShareExRate())
assert.Equal(t, sdk.OneRat(), pool.unbondingShareExRate())
assert.Equal(t, sdk.OneRat(), pool.unbondedShareExRate())
assert.True(sdk.RatEq(t, sdk.NewRat(10), delShares))
assert.True(sdk.RatEq(t, sdk.NewRat(10), val.UnbondedShares))
}
// TODO refactor to make simpler like the AddToken tests above
func TestRemoveShares(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
@ -47,9 +73,9 @@ func TestRemoveShares(t *testing.T) {
BondedShares: sdk.NewRat(9),
DelegatorShares: sdk.NewRat(9),
}
poolA.BondedPool = valA.BondedShares.Evaluate()
poolA.BondedTokens = valA.BondedShares.Evaluate()
poolA.BondedShares = valA.BondedShares
assert.Equal(t, valA.DelegatorShareExRate(), sdk.OneRat())
assert.Equal(t, valA.DelegatorShareExRate(poolA), sdk.OneRat())
assert.Equal(t, poolA.bondedShareExRate(), sdk.OneRat())
assert.Equal(t, poolA.unbondedShareExRate(), sdk.OneRat())
valB, poolB, coinsB := valA.removeShares(poolA, sdk.NewRat(10))
@ -57,9 +83,9 @@ func TestRemoveShares(t *testing.T) {
// coins were created
assert.Equal(t, coinsB, int64(10))
// pool shares were removed
assert.Equal(t, valB.BondedShares, valA.BondedShares.Sub(sdk.NewRat(10).Mul(valA.DelegatorShareExRate())))
assert.Equal(t, valB.BondedShares, valA.BondedShares.Sub(sdk.NewRat(10).Mul(valA.DelegatorShareExRate(poolA))))
// conservation of tokens
assert.Equal(t, poolB.UnbondedPool+poolB.BondedPool+coinsB, poolA.UnbondedPool+poolA.BondedPool)
assert.Equal(t, poolB.UnbondedTokens+poolB.BondedTokens+coinsB, poolA.UnbondedTokens+poolA.BondedTokens)
// specific case from random tests
assets := sdk.NewRat(5102)
@ -75,79 +101,54 @@ func TestRemoveShares(t *testing.T) {
TotalSupply: 0,
BondedShares: sdk.NewRat(248305),
UnbondedShares: sdk.NewRat(232147),
BondedPool: 248305,
UnbondedPool: 232147,
BondedTokens: 248305,
UnbondedTokens: 232147,
InflationLastTime: 0,
Inflation: sdk.NewRat(7, 100),
}
shares := sdk.NewRat(29)
msg := fmt.Sprintf("validator %s (status: %d, assets: %v, liabilities: %v, DelegatorShareExRate: %v)",
val.Address, val.Status, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate())
val.Address, val.Status, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate(pool))
msg = fmt.Sprintf("Removed %v shares from %s", shares, msg)
_, newPool, tokens := val.removeShares(pool, shares)
require.Equal(t,
tokens+newPool.UnbondedPool+newPool.BondedPool,
pool.BondedPool+pool.UnbondedPool,
tokens+newPool.UnbondedTokens+newPool.BondedTokens,
pool.BondedTokens+pool.UnbondedTokens,
"Tokens were not conserved: %s", msg)
}
// TODO convert these commend out tests to test UpdateSharesLocation
//func TestUpdateSharesLocation(t *testing.T) {
//}
//func TestBondedToUnbondedPool(t *testing.T) {
//ctx, _, keeper := createTestInput(t, false, 0)
func TestUpdateSharesLocation(t *testing.T) {
ctx, _, keeper := createTestInput(t, false, 0)
pool := keeper.GetPool(ctx)
//poolA := keeper.GetPool(ctx)
//assert.Equal(t, poolA.bondedShareExRate(), sdk.OneRat())
//assert.Equal(t, poolA.unbondedShareExRate(), sdk.OneRat())
//valA := Validator{
//Status: sdk.Bonded,
//Address: addrs[0],
//PubKey: pks[0],
//BondedShares: sdk.OneRat(),
//DelegatorShares: sdk.OneRat(),
//}
//poolB, valB := poolA.bondedToUnbondedPool(valA)
val := NewValidator(addrs[0], pks[0], Description{})
val.Status = sdk.Unbonded
val, pool, _ = val.addTokens(pool, 100)
assert.Equal(t, int64(0), val.BondedShares.Evaluate())
assert.Equal(t, int64(0), val.UnbondingShares.Evaluate())
assert.Equal(t, int64(100), val.UnbondedShares.Evaluate())
assert.Equal(t, int64(0), pool.BondedTokens)
assert.Equal(t, int64(0), pool.UnbondingTokens)
assert.Equal(t, int64(100), pool.UnbondedTokens)
//// status unbonded
//assert.Equal(t, valB.Status, sdk.Unbonded)
//// same exchange rate, assets unchanged
//assert.Equal(t, valB.BondedShares, valA.BondedShares)
//// bonded pool decreased
//assert.Equal(t, poolB.BondedPool, poolA.BondedPool-valA.BondedShares.Evaluate())
//// unbonded pool increased
//assert.Equal(t, poolB.UnbondedPool, poolA.UnbondedPool+valA.BondedShares.Evaluate())
//// conservation of tokens
//assert.Equal(t, poolB.UnbondedPool+poolB.BondedPool, poolA.BondedPool+poolA.UnbondedPool)
//}
val.Status = sdk.Unbonding
val, pool = val.UpdateSharesLocation(pool)
assert.Equal(t, int64(0), val.BondedShares.Evaluate())
assert.Equal(t, int64(100), val.UnbondingShares.Evaluate())
assert.Equal(t, int64(0), val.UnbondedShares.Evaluate())
assert.Equal(t, int64(0), pool.BondedTokens)
assert.Equal(t, int64(100), pool.UnbondingTokens)
assert.Equal(t, int64(0), pool.UnbondedTokens)
//func TestUnbonbedtoBondedPool(t *testing.T) {
//ctx, _, keeper := createTestInput(t, false, 0)
//poolA := keeper.GetPool(ctx)
//assert.Equal(t, poolA.bondedShareExRate(), sdk.OneRat())
//assert.Equal(t, poolA.unbondedShareExRate(), sdk.OneRat())
//valA := Validator{
//Status: sdk.Bonded,
//Address: addrs[0],
//PubKey: pks[0],
//BondedShares: sdk.OneRat(),
//DelegatorShares: sdk.OneRat(),
//}
//valA.Status = sdk.Unbonded
//poolB, valB := poolA.unbondedToBondedPool(valA)
//// status bonded
//assert.Equal(t, valB.Status, sdk.Bonded)
//// same exchange rate, assets unchanged
//assert.Equal(t, valB.BondedShares, valA.BondedShares)
//// bonded pool increased
//assert.Equal(t, poolB.BondedPool, poolA.BondedPool+valA.BondedShares.Evaluate())
//// unbonded pool decreased
//assert.Equal(t, poolB.UnbondedPool, poolA.UnbondedPool-valA.BondedShares.Evaluate())
//// conservation of tokens
//assert.Equal(t, poolB.UnbondedPool+poolB.BondedPool, poolA.BondedPool+poolA.UnbondedPool)
//}
val.Status = sdk.Bonded
val, pool = val.UpdateSharesLocation(pool)
assert.Equal(t, int64(100), val.BondedShares.Evaluate())
assert.Equal(t, int64(0), val.UnbondingShares.Evaluate())
assert.Equal(t, int64(0), val.UnbondedShares.Evaluate())
assert.Equal(t, int64(0), pool.BondedTokens)
assert.Equal(t, int64(100), pool.UnbondingTokens)
assert.Equal(t, int64(0), pool.UnbondedTokens)
}
//________________________________________________________________________________
// TODO refactor this random setup
@ -177,8 +178,8 @@ func randomSetup(r *rand.Rand, numValidators int) (Pool, Validators) {
TotalSupply: 0,
BondedShares: sdk.ZeroRat(),
UnbondedShares: sdk.ZeroRat(),
BondedPool: 0,
UnbondedPool: 0,
BondedTokens: 0,
UnbondedTokens: 0,
InflationLastTime: 0,
Inflation: sdk.NewRat(7, 100),
}
@ -188,10 +189,10 @@ func randomSetup(r *rand.Rand, numValidators int) (Pool, Validators) {
validator := randomValidator(r)
if validator.Status == sdk.Bonded {
pool.BondedShares = pool.BondedShares.Add(validator.BondedShares)
pool.BondedPool += validator.BondedShares.Evaluate()
pool.BondedTokens += validator.BondedShares.Evaluate()
} else if validator.Status == sdk.Unbonded {
pool.UnbondedShares = pool.UnbondedShares.Add(validator.BondedShares)
pool.UnbondedPool += validator.BondedShares.Evaluate()
pool.UnbondedTokens += validator.BondedShares.Evaluate()
}
validators[i] = validator
}
@ -208,11 +209,11 @@ func OpBondOrUnbond(r *rand.Rand, p Pool, val Validator) (Pool, Validator, int64
var msg string
if val.Status == sdk.Bonded {
msg = fmt.Sprintf("sdk.Unbonded previously bonded validator %s (assets: %v, liabilities: %v, DelegatorShareExRate: %v)",
val.Address, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate())
val.Address, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate(p))
val.Status = sdk.Unbonded
} else if val.Status == sdk.Unbonded {
msg = fmt.Sprintf("sdk.Bonded previously unbonded validator %s (assets: %v, liabilities: %v, DelegatorShareExRate: %v)",
val.Address, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate())
val.Address, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate(p))
val.Status = sdk.Bonded
}
val, p = val.UpdateSharesLocation(p)
@ -223,7 +224,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) {
tokens := int64(r.Int31n(1000))
msg := fmt.Sprintf("validator %s (status: %d, assets: %v, liabilities: %v, DelegatorShareExRate: %v)",
val.Address, val.Status, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate())
val.Address, val.Status, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate(p))
val, p, _ = val.addTokens(p, tokens)
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
@ -240,7 +241,7 @@ func OpRemoveShares(r *rand.Rand, p Pool, val Validator) (Pool, Validator, int64
}
msg := fmt.Sprintf("Removed %v shares from validator %s (status: %d, assets: %v, liabilities: %v, DelegatorShareExRate: %v)",
shares, val.Address, val.Status, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate())
shares, val.Address, val.Status, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate(p))
val, p, tokens := val.removeShares(p, shares)
return p, val, tokens, msg
@ -265,14 +266,14 @@ func assertInvariants(t *testing.T, msg string,
// total tokens conserved
require.Equal(t,
pOrig.UnbondedPool+pOrig.BondedPool,
pMod.UnbondedPool+pMod.BondedPool+tokens,
"Tokens not conserved - msg: %v\n, pOrig.BondedShares: %v, pOrig.UnbondedShares: %v, pMod.BondedShares: %v, pMod.UnbondedShares: %v, pOrig.UnbondedPool: %v, pOrig.BondedPool: %v, pMod.UnbondedPool: %v, pMod.BondedPool: %v, tokens: %v\n",
pOrig.UnbondedTokens+pOrig.BondedTokens,
pMod.UnbondedTokens+pMod.BondedTokens+tokens,
"Tokens not conserved - msg: %v\n, pOrig.BondedShares: %v, pOrig.UnbondedShares: %v, pMod.BondedShares: %v, pMod.UnbondedShares: %v, pOrig.UnbondedTokens: %v, pOrig.BondedTokens: %v, pMod.UnbondedTokens: %v, pMod.BondedTokens: %v, tokens: %v\n",
msg,
pOrig.BondedShares, pOrig.UnbondedShares,
pMod.BondedShares, pMod.UnbondedShares,
pOrig.UnbondedPool, pOrig.BondedPool,
pMod.UnbondedPool, pMod.BondedPool, tokens)
pOrig.UnbondedTokens, pOrig.BondedTokens,
pMod.UnbondedTokens, pMod.BondedTokens, tokens)
// nonnegative bonded shares
require.False(t, pMod.BondedShares.LT(sdk.ZeroRat()),
@ -297,10 +298,10 @@ func assertInvariants(t *testing.T, msg string,
for _, cMod := range cMods {
// nonnegative ex rate
require.False(t, cMod.DelegatorShareExRate().LT(sdk.ZeroRat()),
require.False(t, cMod.DelegatorShareExRate(pMod).LT(sdk.ZeroRat()),
"Applying operation \"%s\" resulted in negative validator.DelegatorShareExRate(): %v (validator.Address: %s)",
msg,
cMod.DelegatorShareExRate(),
cMod.DelegatorShareExRate(pMod),
cMod.Address,
)
@ -310,7 +311,7 @@ func assertInvariants(t *testing.T, msg string,
msg,
cMod.BondedShares,
cMod.DelegatorShares,
cMod.DelegatorShareExRate(),
cMod.DelegatorShareExRate(pMod),
cMod.Address,
)
@ -320,7 +321,7 @@ func assertInvariants(t *testing.T, msg string,
msg,
cMod.DelegatorShares,
cMod.BondedShares,
cMod.DelegatorShareExRate(),
cMod.DelegatorShareExRate(pMod),
cMod.Address,
)
@ -342,20 +343,20 @@ func TestPossibleOverflow(t *testing.T) {
TotalSupply: 0,
BondedShares: assets,
UnbondedShares: sdk.ZeroRat(),
BondedPool: assets.Evaluate(),
UnbondedPool: 0,
BondedTokens: assets.Evaluate(),
UnbondedTokens: 0,
InflationLastTime: 0,
Inflation: sdk.NewRat(7, 100),
}
tokens := int64(71)
msg := fmt.Sprintf("validator %s (status: %d, assets: %v, liabilities: %v, DelegatorShareExRate: %v)",
val.Address, val.Status, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate())
val.Address, val.Status, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate(pool))
newValidator, _, _ := val.addTokens(pool, tokens)
msg = fmt.Sprintf("Added %d tokens to %s", tokens, msg)
require.False(t, newValidator.DelegatorShareExRate().LT(sdk.ZeroRat()),
require.False(t, newValidator.DelegatorShareExRate(pool).LT(sdk.ZeroRat()),
"Applying operation \"%s\" resulted in negative DelegatorShareExRate(): %v",
msg, newValidator.DelegatorShareExRate())
msg, newValidator.DelegatorShareExRate(pool))
}
// run random operations in a random order on a random single-validator state, assert invariants hold