State Transitions
This document describes the state transition operations pertaining to:
- Validators
- Delegations
- Slashing
Validators
Non-Bonded to Bonded
When a validator is bonded from any other state the following operations occur:
- set
validator.Status
toBonded
- update the
Pool
object with tokens moved fromNotBondedTokens
toBondedTokens
- delete record the existing record from
ValidatorByPowerIndex
- add an new updated record to the
ValidatorByPowerIndex
- update the
Validator
object for this validator - if it exists, delete any
ValidatorQueue
record for this validator
Bonded to Unbonding
When a validator begins the unbonding process the following operations occur:
- update the
Pool
object with tokens moved fromBondedTokens
toNotBondedTokens
- set
validator.Status
toUnbonding
- delete record the existing record from
ValidatorByPowerIndex
- add an new updated record to the
ValidatorByPowerIndex
- update the
Validator
object for this validator - insert a new record into the
ValidatorQueue
for this validator
Unbonding to Unbonded
A validator moves from unbonding to unbonded when the ValidatorQueue
object
moves from bonded to unbonded
- update the
Validator
object for this validator - set
validator.Status
toUnbonded
Jail/Unjail
when a validator is jailed it is effectively removed from the Tendermint set. this process may be also be reversed. the following operations occur:
- set
Validator.Jailed
and update object - if jailed delete record from
ValidatorByPowerIndex
- if unjailed add record to
ValidatorByPowerIndex
Delegations
Delegate
When a delegation occurs both the validator and the delegtion objects are affected
- determine the delegators shares based on tokens delegated and the validator's exchange rate
- remove tokens from the sending account
- add shares the delegation object or add them to a created validator object
- add new delegator shares and update the
Validator
object - update the
Pool
object appropriately if tokens have moved into a bonded validator - delete record the existing record from
ValidatorByPowerIndex
- add an new updated record to the
ValidatorByPowerIndex
Unbond Delegation
As a part of the Undelegate and Complete Unbonding state transitions Unbond Delegation may be called.
- subtract the unbonded shares from delegator
- update the delegation or remove the delegation if there are no more shares
- if the delegation is the operator of the validator and no more shares exist then trigger a jail validator
- update the validator with removed the delegator shares and associated coins, update the pool for any shifts between bonded and non-bonded tokens.
- remove the validator if it is unbonded and there are no more delegation shares.
Undelegate
When an delegation occurs both the validator and the delegtion objects are affected
- perform an unbond delegation
- if the validator is unbonding or bonded add the tokens to an
UnbondingDelegation
Entry - if the validator is unbonded send the tokens directly to the withdraw account
- if the validator is unbonding or bonded add the tokens to an
Complete Unbonding
For undelegations which do not complete immediately, the following operations occur when the unbonding delegation queue element matures:
- remove the entry from the
UnbondingDelegation
object - withdraw the tokens to the delegator withdraw address
Begin Redelegation
Redelegations affect the delegation, source and destination validators.
- perform an unbond delegation from the source validator
- using the generated tokens perform a Delegate to the destination validator
- record the token amount in an new entry in the relevant
Redelegation
Complete Redelegation
When a redelegations complete the following occurs:
- remove the entry from the
Redelegation
object
TODO TODO TOFU TODO