From dc3c40fecc12cede0ff14ded9554dd577ab91038 Mon Sep 17 00:00:00 2001 From: rigelrozanski Date: Sat, 12 May 2018 20:21:02 -0400 Subject: [PATCH] fixing tests, working on TestUpdateSharesLocation --- cmd/gaia/app/app_test.go | 1 - x/stake/handler_test.go | 2 +- x/stake/keeper.go | 4 + x/stake/keeper_test.go | 28 +++-- x/stake/pool_test.go | 24 ++--- x/stake/tick_test.go | 24 ++--- x/stake/validator.go | 1 - x/stake/validator_test.go | 213 +++++++++++++++++++------------------- 8 files changed, 154 insertions(+), 143 deletions(-) diff --git a/cmd/gaia/app/app_test.go b/cmd/gaia/app/app_test.go index 976c5322f..9524f598f 100644 --- a/cmd/gaia/app/app_test.go +++ b/cmd/gaia/app/app_test.go @@ -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) diff --git a/x/stake/handler_test.go b/x/stake/handler_test.go index ff9982743..04a846200 100644 --- a/x/stake/handler_test.go +++ b/x/stake/handler_test.go @@ -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) diff --git a/x/stake/keeper.go b/x/stake/keeper.go index 2bb120f5d..7508b21c3 100644 --- a/x/stake/keeper.go +++ b/x/stake/keeper.go @@ -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 } diff --git a/x/stake/keeper_test.go b/x/stake/keeper_test.go index 526fd2278..60ebec1da 100644 --- a/x/stake/keeper_test.go +++ b/x/stake/keeper_test.go @@ -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) diff --git a/x/stake/pool_test.go b/x/stake/pool_test.go index c031940ee..a749f6337 100644 --- a/x/stake/pool_test.go +++ b/x/stake/pool_test.go @@ -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))) } diff --git a/x/stake/tick_test.go b/x/stake/tick_test.go index bc4abca8b..201325e75 100644 --- a/x/stake/tick_test.go +++ b/x/stake/tick_test.go @@ -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()) diff --git a/x/stake/validator.go b/x/stake/validator.go index 85befb706..a2000a11a 100644 --- a/x/stake/validator.go +++ b/x/stake/validator.go @@ -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 diff --git a/x/stake/validator_test.go b/x/stake/validator_test.go index 3202c31e0..5eaf6c036 100644 --- a/x/stake/validator_test.go +++ b/x/stake/validator_test.go @@ -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