fix stake app tests
This commit is contained in:
@@ -409,6 +409,12 @@ func TestStakeMsgs(t *testing.T) {
|
||||
require.True(t, found)
|
||||
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)
|
||||
require.True(sdk.RatEq(t, sdk.NewRat(10), bond.Shares))
|
||||
|
||||
// Edit Candidacy
|
||||
|
||||
@@ -429,24 +435,21 @@ func TestStakeMsgs(t *testing.T) {
|
||||
)
|
||||
SignDeliver(t, gapp, delegateMsg, []int64{0}, true, priv2)
|
||||
|
||||
ctxDeliver = gapp.BaseApp.NewContext(false, abci.Header{})
|
||||
res2 = gapp.accountMapper.GetAccount(ctxDeliver, addr2)
|
||||
require.Equal(t, genCoins.Minus(sdk.Coins{bondCoin}), res2.GetCoins())
|
||||
bond, found := gapp.stakeKeeper.GetDelegation(ctxDeliver, addr2, addr1)
|
||||
bond, found = gapp.stakeKeeper.GetDelegation(ctxDeliver, addr2, addr1)
|
||||
require.True(t, found)
|
||||
require.Equal(t, addr2, bond.DelegatorAddr)
|
||||
require.Equal(t, addr1, bond.ValidatorAddr)
|
||||
require.Equal(t, bondCoin, bond.Shares)
|
||||
require.True(sdk.RatEq(t, sdk.NewRat(10), bond.Shares))
|
||||
|
||||
// Unbond
|
||||
|
||||
panic(fmt.Sprintf("debug bond: %v\n", bond))
|
||||
unbondMsg := stake.NewMsgUnbond(
|
||||
addr2, addr1, "MAX",
|
||||
)
|
||||
SignDeliver(t, gapp, unbondMsg, []int64{1}, true, priv2)
|
||||
|
||||
ctxDeliver = gapp.BaseApp.NewContext(false, abci.Header{})
|
||||
res2 = gapp.accountMapper.GetAccount(ctxDeliver, addr2)
|
||||
require.Equal(t, genCoins, res2.GetCoins())
|
||||
_, found = gapp.stakeKeeper.GetDelegation(ctxDeliver, addr2, addr1)
|
||||
|
||||
@@ -435,7 +435,7 @@ unbond(tx TxUnbond):
|
||||
return
|
||||
|
||||
removeShares(candidate Candidate, shares rational.Rat):
|
||||
globalPoolSharesToRemove = delegatorShareExRate(candidate) * shares
|
||||
globalPoolSharesToRemove = DelegatorShareExRate(candidate) * shares
|
||||
|
||||
if candidate.Status == Bonded
|
||||
gs.BondedShares -= globalPoolSharesToRemove
|
||||
@@ -450,7 +450,7 @@ removeShares(candidate Candidate, shares rational.Rat):
|
||||
candidate.IssuedDelegatorShares -= shares
|
||||
return returnedCoins
|
||||
|
||||
delegatorShareExRate(candidate Candidate):
|
||||
DelegatorShareExRate(candidate Candidate):
|
||||
if candidate.IssuedDelegatorShares.IsZero() then return rational.One
|
||||
return candidate.GlobalStakeShares / candidate.IssuedDelegatorShares
|
||||
|
||||
@@ -593,7 +593,7 @@ UpdateValidatorSet():
|
||||
|
||||
updateVotingPower(candidates Candidates):
|
||||
foreach candidate in candidates do
|
||||
candidate.VotingPower = (candidate.IssuedDelegatorShares - candidate.RedelegatingShares) * delegatorShareExRate(candidate)
|
||||
candidate.VotingPower = (candidate.IssuedDelegatorShares - candidate.RedelegatingShares) * DelegatorShareExRate(candidate)
|
||||
|
||||
candidates.Sort()
|
||||
|
||||
|
||||
@@ -203,7 +203,7 @@ unbond(tx TxUnbond):
|
||||
return
|
||||
|
||||
removeShares(candidate Candidate, shares rational.Rat):
|
||||
globalPoolSharesToRemove = delegatorShareExRate(candidate) * shares
|
||||
globalPoolSharesToRemove = DelegatorShareExRate(candidate) * shares
|
||||
|
||||
if candidate.Status == Bonded
|
||||
gs.BondedShares -= globalPoolSharesToRemove
|
||||
@@ -218,7 +218,7 @@ removeShares(candidate Candidate, shares rational.Rat):
|
||||
candidate.IssuedDelegatorShares -= shares
|
||||
return returnedCoins
|
||||
|
||||
delegatorShareExRate(candidate Candidate):
|
||||
DelegatorShareExRate(candidate Candidate):
|
||||
if candidate.IssuedDelegatorShares.IsZero() then return rational.One
|
||||
return candidate.GlobalStakeShares / candidate.IssuedDelegatorShares
|
||||
|
||||
|
||||
@@ -71,7 +71,7 @@ UpdateValidatorSet():
|
||||
|
||||
updateVotingPower(candidates Candidates):
|
||||
foreach candidate in candidates do
|
||||
candidate.VotingPower = (candidate.IssuedDelegatorShares - candidate.RedelegatingShares) * delegatorShareExRate(candidate)
|
||||
candidate.VotingPower = (candidate.IssuedDelegatorShares - candidate.RedelegatingShares) * DelegatorShareExRate(candidate)
|
||||
|
||||
candidates.Sort()
|
||||
|
||||
|
||||
+14
-7
@@ -5,6 +5,7 @@ import (
|
||||
"math/big"
|
||||
"strconv"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
// "that's one big rat!"
|
||||
@@ -80,17 +81,17 @@ func NewRatFromDecimal(decimalStr string) (f Rat, err Error) {
|
||||
}
|
||||
|
||||
//nolint
|
||||
func (r Rat) Num() int64 { return r.Rat.Num().Int64() } // Num - return the numerator
|
||||
func (r Rat) Denom() int64 { return r.Rat.Denom().Int64() } // Denom - return the denominator
|
||||
func (r Rat) IsZero() bool { return r.Num() == 0 } // IsZero - Is the Rat equal to zero
|
||||
func (r Rat) Equal(r2 Rat) bool { return (&(r.Rat)).Cmp(&(r2.Rat)) == 0 } // Equal - rationals are equal
|
||||
func (r Rat) GT(r2 Rat) bool { return (&(r.Rat)).Cmp(&(r2.Rat)) == 1 } // Equal - rationals are equal
|
||||
func (r Rat) LT(r2 Rat) bool { return (&(r.Rat)).Cmp(&(r2.Rat)) == -1 } // Equal - rationals are equal
|
||||
func (r Rat) Num() int64 { return r.Rat.Num().Int64() } // Num - return the numerator
|
||||
func (r Rat) Denom() int64 { return r.Rat.Denom().Int64() } // Denom - return the denominator
|
||||
func (r Rat) IsZero() bool { return r.Num() == 0 } // IsZero - Is the Rat equal to zero
|
||||
func (r Rat) Equal(r2 Rat) bool { return (&(r.Rat)).Cmp(&(r2.Rat)) == 0 }
|
||||
func (r Rat) GT(r2 Rat) bool { return (&(r.Rat)).Cmp(&(r2.Rat)) == 1 } // greater than
|
||||
func (r Rat) LT(r2 Rat) bool { return (&(r.Rat)).Cmp(&(r2.Rat)) == -1 } // less than
|
||||
func (r Rat) Mul(r2 Rat) Rat { return Rat{*new(big.Rat).Mul(&(r.Rat), &(r2.Rat))} } // Mul - multiplication
|
||||
func (r Rat) Quo(r2 Rat) Rat { return Rat{*new(big.Rat).Quo(&(r.Rat), &(r2.Rat))} } // Quo - quotient
|
||||
func (r Rat) Add(r2 Rat) Rat { return Rat{*new(big.Rat).Add(&(r.Rat), &(r2.Rat))} } // Add - addition
|
||||
func (r Rat) Sub(r2 Rat) Rat { return Rat{*new(big.Rat).Sub(&(r.Rat), &(r2.Rat))} } // Sub - subtraction
|
||||
func (r Rat) String() string { return fmt.Sprintf("%v/%v", r.Num(), r.Denom()) } // Sub - subtraction
|
||||
func (r Rat) String() string { return fmt.Sprintf("%v/%v", r.Num(), r.Denom()) }
|
||||
|
||||
var (
|
||||
zero = big.NewInt(0)
|
||||
@@ -170,6 +171,7 @@ func (r *Rat) UnmarshalAmino(text string) (err error) {
|
||||
}
|
||||
|
||||
//___________________________________________________________________________________
|
||||
// helpers
|
||||
|
||||
// test if two rat arrays are the equal
|
||||
func RatsEqual(r1s, r2s []Rat) bool {
|
||||
@@ -184,3 +186,8 @@ func RatsEqual(r1s, r2s []Rat) bool {
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// intended to be used with require/assert: require.True(RatEq(...))
|
||||
func RatEq(t *testing.T, exp, got Rat) (*testing.T, bool, string, Rat, Rat) {
|
||||
return t, exp.Equal(got), "expected:\t%v\ngot:\t%v", exp, got
|
||||
}
|
||||
|
||||
+3
-3
@@ -121,7 +121,7 @@ func (p Pool) removeSharesUnbonded(shares sdk.Rat) (p2 Pool, removedTokens int64
|
||||
func (p Pool) validatorAddTokens(validator Validator,
|
||||
amount int64) (p2 Pool, validator2 Validator, issuedDelegatorShares sdk.Rat) {
|
||||
|
||||
exRate := validator.delegatorShareExRate()
|
||||
exRate := validator.DelegatorShareExRate()
|
||||
|
||||
var receivedGlobalShares sdk.Rat
|
||||
if validator.Status == sdk.Bonded {
|
||||
@@ -141,9 +141,9 @@ func (p Pool) validatorAddTokens(validator Validator,
|
||||
func (p Pool) validatorRemoveShares(validator Validator,
|
||||
shares sdk.Rat) (p2 Pool, validator2 Validator, createdCoins int64) {
|
||||
|
||||
//exRate := validator.delegatorShareExRate() //XXX make sure not used
|
||||
//exRate := validator.DelegatorShareExRate() //XXX make sure not used
|
||||
|
||||
globalPoolSharesToRemove := validator.delegatorShareExRate().Mul(shares)
|
||||
globalPoolSharesToRemove := validator.DelegatorShareExRate().Mul(shares)
|
||||
if validator.Status == sdk.Bonded {
|
||||
p, createdCoins = p.removeSharesBonded(globalPoolSharesToRemove)
|
||||
} else {
|
||||
|
||||
+105
-104
@@ -53,60 +53,61 @@ func TestUnbondedShareExRate(t *testing.T) {
|
||||
require.Equal(t, pool.unbondedShareExRate(), sdk.OneRat())
|
||||
}
|
||||
|
||||
func TestBondedToUnbondedPool(t *testing.T) {
|
||||
ctx, _, keeper := createTestInput(t, false, 0)
|
||||
// TODO convert these commend out tests to test UpdateSharesLocation
|
||||
//func TestBondedToUnbondedPool(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())
|
||||
candA := Validator{
|
||||
Status: sdk.Bonded,
|
||||
Address: addrs[0],
|
||||
PubKey: pks[0],
|
||||
BondedShares: sdk.OneRat(),
|
||||
DelegatorShares: sdk.OneRat(),
|
||||
}
|
||||
poolB, candB := poolA.bondedToUnbondedPool(candA)
|
||||
//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)
|
||||
|
||||
// status unbonded
|
||||
assert.Equal(t, candB.Status, sdk.Unbonded)
|
||||
// same exchange rate, assets unchanged
|
||||
assert.Equal(t, candB.BondedShares, candA.BondedShares)
|
||||
// bonded pool decreased
|
||||
assert.Equal(t, poolB.BondedPool, poolA.BondedPool-candA.BondedShares.Evaluate())
|
||||
// unbonded pool increased
|
||||
assert.Equal(t, poolB.UnbondedPool, poolA.UnbondedPool+candA.BondedShares.Evaluate())
|
||||
// conservation of tokens
|
||||
assert.Equal(t, poolB.UnbondedPool+poolB.BondedPool, poolA.BondedPool+poolA.UnbondedPool)
|
||||
}
|
||||
//// 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)
|
||||
//}
|
||||
|
||||
func TestUnbonbedtoBondedPool(t *testing.T) {
|
||||
ctx, _, keeper := createTestInput(t, false, 0)
|
||||
//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())
|
||||
candA := Validator{
|
||||
Status: sdk.Bonded,
|
||||
Address: addrs[0],
|
||||
PubKey: pks[0],
|
||||
BondedShares: sdk.OneRat(),
|
||||
DelegatorShares: sdk.OneRat(),
|
||||
}
|
||||
candA.Status = sdk.Unbonded
|
||||
poolB, candB := poolA.unbondedToBondedPool(candA)
|
||||
//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, candB.Status, sdk.Bonded)
|
||||
// same exchange rate, assets unchanged
|
||||
assert.Equal(t, candB.BondedShares, candA.BondedShares)
|
||||
// bonded pool increased
|
||||
assert.Equal(t, poolB.BondedPool, poolA.BondedPool+candA.BondedShares.Evaluate())
|
||||
// unbonded pool decreased
|
||||
assert.Equal(t, poolB.UnbondedPool, poolA.UnbondedPool-candA.BondedShares.Evaluate())
|
||||
// conservation of tokens
|
||||
assert.Equal(t, poolB.UnbondedPool+poolB.BondedPool, poolA.BondedPool+poolA.UnbondedPool)
|
||||
}
|
||||
//// 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)
|
||||
//}
|
||||
|
||||
func TestAddTokensBonded(t *testing.T) {
|
||||
ctx, _, keeper := createTestInput(t, false, 0)
|
||||
@@ -176,24 +177,24 @@ func TestValidatorAddTokens(t *testing.T) {
|
||||
ctx, _, keeper := createTestInput(t, false, 0)
|
||||
|
||||
poolA := keeper.GetPool(ctx)
|
||||
candA := Validator{
|
||||
valA := Validator{
|
||||
Status: sdk.Bonded,
|
||||
Address: addrs[0],
|
||||
PubKey: pks[0],
|
||||
BondedShares: sdk.NewRat(9),
|
||||
DelegatorShares: sdk.NewRat(9),
|
||||
}
|
||||
poolA.BondedPool = candA.BondedShares.Evaluate()
|
||||
poolA.BondedShares = candA.BondedShares
|
||||
assert.Equal(t, candA.delegatorShareExRate(), sdk.OneRat())
|
||||
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())
|
||||
poolB, candB, sharesB := poolA.validatorAddTokens(candA, 10)
|
||||
poolB, valB, sharesB := poolA.validatorAddTokens(valA, 10)
|
||||
|
||||
// shares were issued
|
||||
assert.Equal(t, sdk.NewRat(10).Mul(candA.delegatorShareExRate()), sharesB)
|
||||
assert.Equal(t, sdk.NewRat(10).Mul(valA.DelegatorShareExRate()), sharesB)
|
||||
// pool shares were added
|
||||
assert.Equal(t, candB.BondedShares, candA.BondedShares.Add(sdk.NewRat(10)))
|
||||
assert.Equal(t, valB.BondedShares, valA.BondedShares.Add(sdk.NewRat(10)))
|
||||
// conservation of tokens
|
||||
assert.Equal(t, poolB.BondedPool, 10+poolA.BondedPool)
|
||||
}
|
||||
@@ -202,31 +203,31 @@ func TestValidatorRemoveShares(t *testing.T) {
|
||||
ctx, _, keeper := createTestInput(t, false, 0)
|
||||
|
||||
poolA := keeper.GetPool(ctx)
|
||||
candA := Validator{
|
||||
valA := Validator{
|
||||
Status: sdk.Bonded,
|
||||
Address: addrs[0],
|
||||
PubKey: pks[0],
|
||||
BondedShares: sdk.NewRat(9),
|
||||
DelegatorShares: sdk.NewRat(9),
|
||||
}
|
||||
poolA.BondedPool = candA.BondedShares.Evaluate()
|
||||
poolA.BondedShares = candA.BondedShares
|
||||
assert.Equal(t, candA.delegatorShareExRate(), sdk.OneRat())
|
||||
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())
|
||||
poolB, candB, coinsB := poolA.validatorRemoveShares(candA, sdk.NewRat(10))
|
||||
poolB, valB, coinsB := poolA.validatorRemoveShares(valA, sdk.NewRat(10))
|
||||
|
||||
// coins were created
|
||||
assert.Equal(t, coinsB, int64(10))
|
||||
// pool shares were removed
|
||||
assert.Equal(t, candB.BondedShares, candA.BondedShares.Sub(sdk.NewRat(10).Mul(candA.delegatorShareExRate())))
|
||||
assert.Equal(t, valB.BondedShares, valA.BondedShares.Sub(sdk.NewRat(10).Mul(valA.DelegatorShareExRate())))
|
||||
// conservation of tokens
|
||||
assert.Equal(t, poolB.UnbondedPool+poolB.BondedPool+coinsB, poolA.UnbondedPool+poolA.BondedPool)
|
||||
|
||||
// specific case from random tests
|
||||
assets := sdk.NewRat(5102)
|
||||
liabilities := sdk.NewRat(115)
|
||||
cand := Validator{
|
||||
val := Validator{
|
||||
Status: sdk.Bonded,
|
||||
Address: addrs[0],
|
||||
PubKey: pks[0],
|
||||
@@ -243,18 +244,18 @@ func TestValidatorRemoveShares(t *testing.T) {
|
||||
Inflation: sdk.NewRat(7, 100),
|
||||
}
|
||||
shares := sdk.NewRat(29)
|
||||
msg := fmt.Sprintf("validator %s (status: %d, assets: %v, liabilities: %v, delegatorShareExRate: %v)",
|
||||
cand.Address, cand.Status, cand.BondedShares, cand.DelegatorShares, cand.delegatorShareExRate())
|
||||
msg := fmt.Sprintf("validator %s (status: %d, assets: %v, liabilities: %v, DelegatorShareExRate: %v)",
|
||||
val.Address, val.Status, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate())
|
||||
msg = fmt.Sprintf("Removed %v shares from %s", shares, msg)
|
||||
newPool, _, tokens := pool.validatorRemoveShares(cand, shares)
|
||||
newPool, _, tokens := pool.validatorRemoveShares(val, shares)
|
||||
require.Equal(t,
|
||||
tokens+newPool.UnbondedPool+newPool.BondedPool,
|
||||
pool.BondedPool+pool.UnbondedPool,
|
||||
"Tokens were not conserved: %s", msg)
|
||||
}
|
||||
|
||||
/////////////////////////////////////
|
||||
// TODO Make all random tests less obfuscated!
|
||||
//________________________________________________________________________________
|
||||
// TODO refactor this random setup
|
||||
|
||||
// generate a random validator
|
||||
func randomValidator(r *rand.Rand) Validator {
|
||||
@@ -308,46 +309,46 @@ func randomSetup(r *rand.Rand, numValidators int) (Pool, Validators) {
|
||||
type Operation func(r *rand.Rand, p Pool, c Validator) (Pool, Validator, int64, string)
|
||||
|
||||
// operation: bond or unbond a validator depending on current status
|
||||
func OpBondOrUnbond(r *rand.Rand, p Pool, cand Validator) (Pool, Validator, int64, string) {
|
||||
func OpBondOrUnbond(r *rand.Rand, p Pool, val Validator) (Pool, Validator, int64, string) {
|
||||
var msg string
|
||||
if cand.Status == sdk.Bonded {
|
||||
msg = fmt.Sprintf("sdk.Unbonded previously bonded validator %s (assets: %v, liabilities: %v, delegatorShareExRate: %v)",
|
||||
cand.Address, cand.BondedShares, cand.DelegatorShares, cand.delegatorShareExRate())
|
||||
p, cand = p.bondedToUnbondedPool(cand)
|
||||
|
||||
} else if cand.Status == sdk.Unbonded {
|
||||
msg = fmt.Sprintf("sdk.Bonded previously unbonded validator %s (assets: %v, liabilities: %v, delegatorShareExRate: %v)",
|
||||
cand.Address, cand.BondedShares, cand.DelegatorShares, cand.delegatorShareExRate())
|
||||
p, cand = p.unbondedToBondedPool(cand)
|
||||
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.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.Status = sdk.Bonded
|
||||
}
|
||||
return p, cand, 0, msg
|
||||
p, val = p.UpdateSharesLocation(val)
|
||||
return p, val, 0, msg
|
||||
}
|
||||
|
||||
// operation: add a random number of tokens to a validator
|
||||
func OpAddTokens(r *rand.Rand, p Pool, cand Validator) (Pool, Validator, int64, string) {
|
||||
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)",
|
||||
cand.Address, cand.Status, cand.BondedShares, cand.DelegatorShares, cand.delegatorShareExRate())
|
||||
p, cand, _ = p.validatorAddTokens(cand, tokens)
|
||||
msg := fmt.Sprintf("validator %s (status: %d, assets: %v, liabilities: %v, DelegatorShareExRate: %v)",
|
||||
val.Address, val.Status, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate())
|
||||
p, val, _ = p.validatorAddTokens(val, tokens)
|
||||
msg = fmt.Sprintf("Added %d tokens to %s", tokens, msg)
|
||||
return p, cand, -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
|
||||
}
|
||||
|
||||
// operation: remove a random number of shares from a validator
|
||||
func OpRemoveShares(r *rand.Rand, p Pool, cand Validator) (Pool, Validator, int64, string) {
|
||||
func OpRemoveShares(r *rand.Rand, p Pool, val Validator) (Pool, Validator, int64, string) {
|
||||
var shares sdk.Rat
|
||||
for {
|
||||
shares = sdk.NewRat(int64(r.Int31n(1000)))
|
||||
if shares.LT(cand.DelegatorShares) {
|
||||
if shares.LT(val.DelegatorShares) {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
msg := fmt.Sprintf("Removed %v shares from validator %s (status: %d, assets: %v, liabilities: %v, delegatorShareExRate: %v)",
|
||||
shares, cand.Address, cand.Status, cand.BondedShares, cand.DelegatorShares, cand.delegatorShareExRate())
|
||||
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())
|
||||
|
||||
p, cand, tokens := p.validatorRemoveShares(cand, shares)
|
||||
return p, cand, tokens, msg
|
||||
p, val, tokens := p.validatorRemoveShares(val, shares)
|
||||
return p, val, tokens, msg
|
||||
}
|
||||
|
||||
// pick a random staking operation
|
||||
@@ -401,30 +402,30 @@ func assertInvariants(t *testing.T, msg string,
|
||||
for _, cMod := range cMods {
|
||||
|
||||
// nonnegative ex rate
|
||||
require.False(t, cMod.delegatorShareExRate().LT(sdk.ZeroRat()),
|
||||
"Applying operation \"%s\" resulted in negative validator.delegatorShareExRate(): %v (validator.Address: %s)",
|
||||
require.False(t, cMod.DelegatorShareExRate().LT(sdk.ZeroRat()),
|
||||
"Applying operation \"%s\" resulted in negative validator.DelegatorShareExRate(): %v (validator.Address: %s)",
|
||||
msg,
|
||||
cMod.delegatorShareExRate(),
|
||||
cMod.DelegatorShareExRate(),
|
||||
cMod.Address,
|
||||
)
|
||||
|
||||
// nonnegative assets
|
||||
require.False(t, cMod.BondedShares.LT(sdk.ZeroRat()),
|
||||
"Applying operation \"%s\" resulted in negative validator.BondedShares: %v (validator.DelegatorShares: %v, validator.delegatorShareExRate: %v, validator.Address: %s)",
|
||||
"Applying operation \"%s\" resulted in negative validator.BondedShares: %v (validator.DelegatorShares: %v, validator.DelegatorShareExRate: %v, validator.Address: %s)",
|
||||
msg,
|
||||
cMod.BondedShares,
|
||||
cMod.DelegatorShares,
|
||||
cMod.delegatorShareExRate(),
|
||||
cMod.DelegatorShareExRate(),
|
||||
cMod.Address,
|
||||
)
|
||||
|
||||
// nonnegative liabilities
|
||||
require.False(t, cMod.DelegatorShares.LT(sdk.ZeroRat()),
|
||||
"Applying operation \"%s\" resulted in negative validator.DelegatorShares: %v (validator.BondedShares: %v, validator.delegatorShareExRate: %v, validator.Address: %s)",
|
||||
"Applying operation \"%s\" resulted in negative validator.DelegatorShares: %v (validator.BondedShares: %v, validator.DelegatorShareExRate: %v, validator.Address: %s)",
|
||||
msg,
|
||||
cMod.DelegatorShares,
|
||||
cMod.BondedShares,
|
||||
cMod.delegatorShareExRate(),
|
||||
cMod.DelegatorShareExRate(),
|
||||
cMod.Address,
|
||||
)
|
||||
|
||||
@@ -435,7 +436,7 @@ func assertInvariants(t *testing.T, msg string,
|
||||
func TestPossibleOverflow(t *testing.T) {
|
||||
assets := sdk.NewRat(2159)
|
||||
liabilities := sdk.NewRat(391432570689183511).Quo(sdk.NewRat(40113011844664))
|
||||
cand := Validator{
|
||||
val := Validator{
|
||||
Status: sdk.Bonded,
|
||||
Address: addrs[0],
|
||||
PubKey: pks[0],
|
||||
@@ -452,14 +453,14 @@ func TestPossibleOverflow(t *testing.T) {
|
||||
Inflation: sdk.NewRat(7, 100),
|
||||
}
|
||||
tokens := int64(71)
|
||||
msg := fmt.Sprintf("validator %s (status: %d, assets: %v, liabilities: %v, delegatorShareExRate: %v)",
|
||||
cand.Address, cand.Status, cand.BondedShares, cand.DelegatorShares, cand.delegatorShareExRate())
|
||||
_, newValidator, _ := pool.validatorAddTokens(cand, tokens)
|
||||
msg := fmt.Sprintf("validator %s (status: %d, assets: %v, liabilities: %v, DelegatorShareExRate: %v)",
|
||||
val.Address, val.Status, val.BondedShares, val.DelegatorShares, val.DelegatorShareExRate())
|
||||
_, newValidator, _ := pool.validatorAddTokens(val, tokens)
|
||||
|
||||
msg = fmt.Sprintf("Added %d tokens to %s", tokens, msg)
|
||||
require.False(t, newValidator.delegatorShareExRate().LT(sdk.ZeroRat()),
|
||||
"Applying operation \"%s\" resulted in negative delegatorShareExRate(): %v",
|
||||
msg, newValidator.delegatorShareExRate())
|
||||
require.False(t, newValidator.DelegatorShareExRate().LT(sdk.ZeroRat()),
|
||||
"Applying operation \"%s\" resulted in negative DelegatorShareExRate(): %v",
|
||||
msg, newValidator.DelegatorShareExRate())
|
||||
}
|
||||
|
||||
// run random operations in a random order on a random single-validator state, assert invariants hold
|
||||
|
||||
+1
-1
@@ -210,7 +210,7 @@ func NewDescription(moniker, identity, website, details string) Description {
|
||||
}
|
||||
|
||||
// get the exchange rate of global pool shares over delegator shares
|
||||
func (v Validator) delegatorShareExRate() sdk.Rat {
|
||||
func (v Validator) DelegatorShareExRate() sdk.Rat {
|
||||
if v.DelegatorShares.IsZero() {
|
||||
return sdk.OneRat()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user