This commit is contained in:
rigelrozanski 2018-04-03 23:41:08 -04:00
parent b117f082ef
commit 9aef787c5d
3 changed files with 34 additions and 38 deletions

View File

@ -60,7 +60,7 @@ func (p Pool) addTokensBonded(amount int64) (p2 Pool, issuedShares sdk.Rat) {
func (p Pool) removeSharesBonded(shares sdk.Rat) (p2 Pool, removedTokens int64) {
removedTokens = p.bondedShareExRate().Mul(shares).Evaluate() // (tokens/shares) * shares
p.BondedShares = p.BondedShares.Sub(shares)
p.BondedPool -= removedTokens
p.BondedPool = p.BondedPool - removedTokens
return p, removedTokens
}

View File

@ -243,6 +243,7 @@ func BondOrUnbond(r *rand.Rand, p Pool, cand Candidate) (Pool, Candidate, int64,
msg = fmt.Sprintf("Unbonded previously bonded candidate %s (assets: %v, liabilities: %v, delegatorShareExRate: %v)",
cand.Address, cand.Assets, cand.Liabilities, cand.delegatorShareExRate())
p, cand = p.bondedToUnbondedPool(cand)
} else if cand.Status == Unbonded {
msg = fmt.Sprintf("Bonded previously unbonded candidate %s (assets: %v, liabilities: %v, delegatorShareExRate: %v)",
cand.Address, cand.Assets, cand.Liabilities, cand.delegatorShareExRate())
@ -263,14 +264,19 @@ func AddTokens(r *rand.Rand, p Pool, cand Candidate) (Pool, Candidate, int64, st
// operation: remove a random number of shares from a candidate
func RemoveShares(r *rand.Rand, p Pool, cand Candidate) (Pool, Candidate, int64, string) {
shares := sdk.NewRat(int64(r.Int31n(1000)))
if shares.GT(cand.Liabilities) {
shares = cand.Liabilities.Quo(sdk.NewRat(2))
var shares sdk.Rat
for {
shares = sdk.NewRat(int64(r.Int31n(1000)))
if shares.LT(cand.Liabilities) {
break
}
}
msg := fmt.Sprintf("candidate %s (status: %d, assets: %v, liabilities: %v, delegatorShareExRate: %v)",
cand.Address, cand.Status, cand.Assets, cand.Liabilities, cand.delegatorShareExRate())
msg := fmt.Sprintf("Removed %v shares from candidate %s (status: %d, assets: %v, liabilities: %v, delegatorShareExRate: %v)",
shares, cand.Address, cand.Status, cand.Assets, cand.Liabilities, cand.delegatorShareExRate())
p, cand, tokens := p.candidateRemoveShares(cand, shares)
msg = fmt.Sprintf("Removed %d shares from %s", shares.Evaluate(), msg)
return p, cand, tokens, msg
}
@ -302,12 +308,12 @@ func assertInvariants(t *testing.T, msg string,
// nonnegative bonded shares
require.False(t, pMod.BondedShares.LT(sdk.ZeroRat),
"Negative bonded shares - msg: %v\n, pOrig: %v\n, pMod: %v\n, tokens: %v\n",
"Negative bonded shares - msg: %v\npOrig: %#v\npMod: %#v\ntokens: %v\n",
msg, pOrig, pMod, tokens)
// nonnegative unbonded shares
require.False(t, pMod.UnbondedShares.LT(sdk.ZeroRat),
"Negative unbonded shares - msg: %v\n, pOrig: %v\n, pMod: %v\n, tokens: %v\n",
"Negative unbonded shares - msg: %v\npOrig: %#v\npMod: %#v\ntokens: %v\n",
msg, pOrig, pMod, tokens)
// nonnegative bonded ex rate
@ -377,6 +383,7 @@ func TestPossibleOverflow(t *testing.T) {
msg := fmt.Sprintf("candidate %s (status: %d, assets: %v, liabilities: %v, delegatorShareExRate: %v)",
cand.Address, cand.Status, cand.Assets, cand.Liabilities, cand.delegatorShareExRate())
_, newCandidate, _ := pool.candidateAddTokens(cand, tokens)
msg = fmt.Sprintf("Added %d tokens to %s", tokens, msg)
require.False(t, newCandidate.delegatorShareExRate().LT(sdk.ZeroRat),
"Applying operation \"%s\" resulted in negative delegatorShareExRate(): %v",
@ -387,33 +394,30 @@ func TestPossibleOverflow(t *testing.T) {
func TestSingleCandidateIntegrationInvariants(t *testing.T) {
r := rand.New(rand.NewSource(41))
var pool Pool
var candidateMod Candidate
var tokens int64
var candidates Candidates
var msg string
for i := 0; i < 10; i++ {
poolOrig, candidatesOrig := randomSetup(r, 1)
require.Equal(t, 1, len(candidatesOrig))
pool, candidates = randomSetup(r, 1)
initialPool, initialCandidates := pool, candidates
// sanity check
assertInvariants(t, "no operation",
initialPool, initialCandidates,
pool, candidates, 0)
poolOrig, candidatesOrig,
poolOrig, candidatesOrig, 0)
for j := 0; j < 100; j++ {
poolMod, candidateMod, tokens, msg := randomOperation(r)(r, poolOrig, candidatesOrig[0])
pool, candidateMod, tokens, msg = randomOperation(r)(r, pool, candidates[0])
candidates[0] = candidateMod
candidatesMod := make([]Candidate, len(candidatesOrig))
copy(candidatesMod[:], candidatesOrig[:])
require.Equal(t, 1, len(candidatesOrig), "j %v", j)
require.Equal(t, 1, len(candidatesMod), "j %v", j)
candidatesMod[0] = candidateMod
assertInvariants(t, msg,
initialPool, initialCandidates,
pool, candidates, tokens)
initialPool = pool
initialCandidates = candidates
poolOrig, candidatesOrig,
poolMod, candidatesMod, tokens)
poolOrig = poolMod
candidatesOrig = candidatesMod
}
}
}
@ -422,15 +426,8 @@ func TestSingleCandidateIntegrationInvariants(t *testing.T) {
func TestMultiCandidateIntegrationInvariants(t *testing.T) {
r := rand.New(rand.NewSource(42))
var pool Pool
var candidateMod Candidate
var tokens int64
var candidates Candidates
var msg string
for i := 0; i < 10; i++ {
pool, candidates = randomSetup(r, 100)
pool, candidates := randomSetup(r, 100)
initialPool, initialCandidates := pool, candidates
assertInvariants(t, "no operation",
@ -438,9 +435,8 @@ func TestMultiCandidateIntegrationInvariants(t *testing.T) {
pool, candidates, 0)
for j := 0; j < 100; j++ {
index := int(r.Int31n(int32(len(candidates))))
pool, candidateMod, tokens, msg = randomOperation(r)(r, pool, candidates[index])
pool, candidateMod, tokens, msg := randomOperation(r)(r, pool, candidates[index])
candidates[index] = candidateMod
assertInvariants(t, msg,

View File

@ -123,7 +123,7 @@ func (c Candidate) delegatorShareExRate() sdk.Rat {
// Should only be called when the Candidate qualifies as a validator.
func (c Candidate) validator() Validator {
return Validator{
Address: c.Address, // XXX !!!
Address: c.Address,
VotingPower: c.Assets,
}
}