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