cleanup handleMsgUnbond and revoke logic
This commit is contained in:
parent
7353eb4d1b
commit
5a46f26e86
|
@ -226,29 +226,22 @@ func handleMsgUnbond(ctx sdk.Context, msg MsgUnbond, k Keeper) sdk.Result {
|
||||||
// Add the coins
|
// Add the coins
|
||||||
pool := k.GetPool(ctx)
|
pool := k.GetPool(ctx)
|
||||||
validator, pool, returnAmount := validator.removeDelShares(pool, delShares)
|
validator, pool, returnAmount := validator.removeDelShares(pool, delShares)
|
||||||
|
k.setPool(ctx, pool)
|
||||||
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)
|
||||||
|
|
||||||
/////////////////////////////////////
|
/////////////////////////////////////
|
||||||
|
|
||||||
// revoke validator if necessary
|
// revoke validator if necessary
|
||||||
if revokeCandidacy {
|
if revokeCandidacy {
|
||||||
|
|
||||||
// change the share types to unbonded if they were not already
|
|
||||||
if validator.Status() == sdk.Bonded {
|
|
||||||
validator, pool = validator.UpdateStatus(pool, sdk.Unbonded)
|
|
||||||
}
|
|
||||||
|
|
||||||
validator.Revoked = true
|
validator.Revoked = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// deduct shares from the validator
|
validator = k.updateValidator(ctx, validator)
|
||||||
|
|
||||||
if validator.DelegatorShares.IsZero() {
|
if validator.DelegatorShares.IsZero() {
|
||||||
k.removeValidator(ctx, validator.Owner)
|
k.removeValidator(ctx, validator.Owner)
|
||||||
} else {
|
|
||||||
k.updateValidator(ctx, validator)
|
|
||||||
}
|
}
|
||||||
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,
|
||||||
|
|
|
@ -202,6 +202,11 @@ func (k Keeper) updateValidator(ctx sdk.Context, validator Validator) Validator
|
||||||
// retreive the old validator record
|
// retreive the old validator record
|
||||||
oldValidator, oldFound := k.GetValidator(ctx, ownerAddr)
|
oldValidator, oldFound := k.GetValidator(ctx, ownerAddr)
|
||||||
|
|
||||||
|
if validator.Revoked && oldValidator.Status() == sdk.Bonded {
|
||||||
|
validator, pool = validator.UpdateStatus(pool, sdk.Unbonded)
|
||||||
|
k.setPool(ctx, pool)
|
||||||
|
}
|
||||||
|
|
||||||
powerIncreasing := false
|
powerIncreasing := false
|
||||||
if oldFound && oldValidator.PoolShares.Bonded().LT(validator.PoolShares.Bonded()) {
|
if oldFound && oldValidator.PoolShares.Bonded().LT(validator.PoolShares.Bonded()) {
|
||||||
powerIncreasing = true
|
powerIncreasing = true
|
||||||
|
@ -227,7 +232,7 @@ func (k Keeper) updateValidator(ctx sdk.Context, validator Validator) Validator
|
||||||
|
|
||||||
// efficiency case:
|
// efficiency case:
|
||||||
// if already bonded and power increasing only need to update tendermint
|
// if already bonded and power increasing only need to update tendermint
|
||||||
if powerIncreasing && oldValidator.Status() == sdk.Bonded {
|
if powerIncreasing && !validator.Revoked && oldValidator.Status() == sdk.Bonded {
|
||||||
bz := k.cdc.MustMarshalBinary(validator.abciValidator(k.cdc))
|
bz := k.cdc.MustMarshalBinary(validator.abciValidator(k.cdc))
|
||||||
store.Set(GetTendermintUpdatesKey(ownerAddr), bz)
|
store.Set(GetTendermintUpdatesKey(ownerAddr), bz)
|
||||||
return validator
|
return validator
|
||||||
|
@ -274,13 +279,13 @@ func (k Keeper) updateBondedValidators(ctx sdk.Context, store sdk.KVStore,
|
||||||
// add the actual validator power sorted store
|
// add the actual validator power sorted store
|
||||||
maxValidators := k.GetParams(ctx).MaxValidators
|
maxValidators := k.GetParams(ctx).MaxValidators
|
||||||
iterator := store.ReverseSubspaceIterator(ValidatorsByPowerKey) // largest to smallest
|
iterator := store.ReverseSubspaceIterator(ValidatorsByPowerKey) // largest to smallest
|
||||||
i := 0
|
bondedValidatorsCount := 0
|
||||||
var validator Validator
|
var validator Validator
|
||||||
for ; ; i++ {
|
for {
|
||||||
if !iterator.Valid() || i > int(maxValidators-1) {
|
if !iterator.Valid() || bondedValidatorsCount > int(maxValidators-1) {
|
||||||
|
|
||||||
// TODO benchmark if we should read the current power and not write if it's the same
|
// TODO benchmark if we should read the current power and not write if it's the same
|
||||||
if i-1 == int(maxValidators-1) {
|
if bondedValidatorsCount == int(maxValidators) { // is cliff validator
|
||||||
k.setCliffValidator(ctx, validator, k.GetPool(ctx))
|
k.setCliffValidator(ctx, validator, k.GetPool(ctx))
|
||||||
}
|
}
|
||||||
iterator.Close()
|
iterator.Close()
|
||||||
|
@ -313,6 +318,12 @@ func (k Keeper) updateBondedValidators(ctx sdk.Context, store sdk.KVStore,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if validator.Revoked && validator.Status() == sdk.Bonded {
|
||||||
|
panic(fmt.Sprintf("revoked validator cannot be bonded, address: %v\n", ownerAddr))
|
||||||
|
} else {
|
||||||
|
bondedValidatorsCount++
|
||||||
|
}
|
||||||
|
|
||||||
iterator.Next()
|
iterator.Next()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,12 +353,12 @@ func (k Keeper) updateBondedValidatorsFull(ctx sdk.Context, store sdk.KVStore) {
|
||||||
// add the actual validator power sorted store
|
// add the actual validator power sorted store
|
||||||
maxValidators := k.GetParams(ctx).MaxValidators
|
maxValidators := k.GetParams(ctx).MaxValidators
|
||||||
iterator = store.ReverseSubspaceIterator(ValidatorsByPowerKey) // largest to smallest
|
iterator = store.ReverseSubspaceIterator(ValidatorsByPowerKey) // largest to smallest
|
||||||
i := 0
|
bondedValidatorsCount := 0
|
||||||
var validator Validator
|
var validator Validator
|
||||||
for ; ; i++ {
|
for {
|
||||||
if !iterator.Valid() || i > int(maxValidators-1) {
|
if !iterator.Valid() || bondedValidatorsCount > int(maxValidators-1) {
|
||||||
|
|
||||||
if i-1 == int(maxValidators-1) {
|
if bondedValidatorsCount == int(maxValidators) { // is cliff validator
|
||||||
k.setCliffValidator(ctx, validator, k.GetPool(ctx))
|
k.setCliffValidator(ctx, validator, k.GetPool(ctx))
|
||||||
}
|
}
|
||||||
iterator.Close()
|
iterator.Close()
|
||||||
|
@ -376,6 +387,12 @@ func (k Keeper) updateBondedValidatorsFull(ctx sdk.Context, store sdk.KVStore) {
|
||||||
validator = k.bondValidator(ctx, store, validator)
|
validator = k.bondValidator(ctx, store, validator)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if validator.Revoked && validator.Status() == sdk.Bonded {
|
||||||
|
panic(fmt.Sprintf("revoked validator cannot be bonded, address: %v\n", ownerAddr))
|
||||||
|
} else {
|
||||||
|
bondedValidatorsCount++
|
||||||
|
}
|
||||||
|
|
||||||
iterator.Next()
|
iterator.Next()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue