github.com/Finschia/finschia-sdk@v0.48.1/docs/uml/puml/unbond_sequence.puml (about) 1 @startuml 2 'https://plantuml.com/sequence-diagram 3 4 title: Undelegate 5 6 msgServer -> keeper : Undelegate(delAddr, valAddr, tokenAmount) 7 8 keeper -> keeper : calculate number of shares the tokenAmount represents 9 10 alt wrong denom 11 msgServer <-- keeper : error 12 end 13 14 group Unbond(delAddr, valAddr, shares) 15 keeper -> keeper: BeforeDelegationSharesModified hook 16 alt no such delegation 17 keeper --> msgServer : error 18 end 19 alt not enough shares 20 keeper --> msgServer : error 21 end 22 alt delegator is the operator of the validator\nand validator is not already jailed\nand unbonding would put self-delegation under min threshold 23 keeper -> keeper : jail the validator, but proceed with unbonding 24 note left : Default min delegation threshold : 1 share 25 end 26 27 database store 28 29 alt complete unbonding, all shares removed 30 keeper -> store : remove delegation object 31 else there are still shares delegated (not a complete undbonding) 32 keeper -> store : update delegation object 33 keeper -> keeper : AfterDelegationModified hook 34 end 35 36 keeper -> store : update validator power index 37 keeper -> store : update validator information (including token amount) 38 39 alt validator status is "unbonded" and it has no more tokens 40 keeper -> store : delete the validator 41 note right : otherwise, do this in EndBlock once validator is unbonded 42 end 43 end 44 45 alt validator is bonded 46 keeper -> bankKeeper : send tokens from bonded pool to not bonded pool 47 end 48 49 msgServer -> msgServer : emit event : EventTypeUnbond(delAddr, valAddr, tokenAmount, completion time) 50 51 @enduml