github.com/Finschia/finschia-sdk@v0.48.1/docs/uml/puml/delegation_sequence.puml (about)

     1  @startuml
     2  'https://plantuml.com/sequence-diagram
     3  
     4  title: Delegating (currently undelegated funds delegator)
     5  
     6  participant "msgServer (staking)"
     7  participant  "keeper (staking)" as keeper
     8  participant validator
     9  participant keeper.bankKeeper
    10  participant vestingAccount
    11  participant ctx.EventManager
    12  
    13  database store
    14  
    15  "msgServer (staking)" -> keeper : Delegate(Context, DelegatorAddress, Amount, Validator, tokenSrc := Unbonded)
    16  
    17  alt exchange rate is invalid (tokens in validator is 0)
    18      keeper -->  "msgServer (staking)" : error
    19  end
    20  
    21  alt perform a new delegation
    22      keeper -> keeper : delegation := create delegation object
    23      keeper -> keeper : BeforeDelegationCreated hook
    24      note left: Calls IncrementValidatorPeriod (Used to calculate distribution) in keeper/validator.go
    25  else delegation exists, more tokens being added
    26      keeper -> keeper : BeforeDelegationModified hook
    27      note left: withdraw current delegation rewards (and increment period)
    28  end
    29  
    30  alt delegating from an account (subtractTokens == true)
    31      keeper -> keeper.bankKeeper : DelegateCoinsFromAccountToModule
    32      group DelegateCoinsFromAccountToModule function
    33          keeper.bankKeeper -> keeper.bankKeeper : DelegateCoinsFromAccountToModule
    34          keeper.bankKeeper -> keeper.bankKeeper : DelegateCoins
    35          group DelegateCoins function
    36              keeper.bankKeeper --> keeper.bankKeeper : Check the delegator has enough balances of all tokens delegated
    37              keeper.bankKeeper --> keeper.bankKeeper : Track delegation (register that it exists to keep track of it)
    38              alt validator is currently bonded
    39                  keeper.bankKeeper --> store : Transfer tokens from delegator to BondedTokensPool.
    40              else validator is currently unbonded or unbonding
    41                  keeper.bankKeeper --> store : Transfer tokens from delegator to NotBondedTokensPool.
    42              end
    43              group trackDelegation function
    44                  keeper.bankKeeper -> keeper.bankKeeper : trackDelegation
    45                  alt delegator is a vesting account
    46                      keeper.bankKeeper -> vestingAccount : keep track of this delegation
    47                  end
    48              end
    49          end
    50      end
    51      keeper <-- keeper.bankKeeper : nil (success)
    52  else moving tokens between pools (subtractTokens == false)
    53      alt delegator tokens are not bonded but validator is bonded
    54         keeper -> keeper.bankKeeper : SendCoinsFromModuleToModule(notBondedPool, bondedPool, coins)
    55      else delegator tokens are bonded but validator is not bonded
    56         keeper -> keeper.bankKeeper : SendCoinsFromModuleToModule(bondedPool, notBondedPool, coins)
    57      end
    58      group SendCoins function
    59          keeper.bankKeeper -> keeper.bankKeeper : SendCoins
    60          keeper.bankKeeper -> ctx.EventManager : Emit TransferEvent(to, from, amount)
    61          alt amount of spendable (balance - locked) coins too low
    62              keeper <-- keeper.bankKeeper : error
    63          end
    64          keeper.bankKeeper -> store : subtract balance from sender
    65          keeper.bankKeeper -> store : add balance to recipient
    66      end
    67  end
    68  
    69  keeper -> validator : AddTokensFromDel
    70  validator -> validator : calculate number of shares to issue
    71  note left: If there are no shares (validator being created) then 1 token = 1 share.\nIf there are already shares, then\nadded shares =  (added tokens amount) * (current validator shares) / (current validator tokens)
    72  
    73  validator -> validator : add delegated tokens to validator
    74  keeper <-- validator : validator, addedShares
    75  keeper -> store : update validator state
    76  keeper -> keeper: calculate new validator's power
    77  note left : Number of tokens divided by PowerReduction (default: 1,000,000,000,000,000,000 = 10^18)
    78  alt validator is not jailed
    79      keeper -> store : update validator's power in power index
    80      note left : the power index has entries shaped as 35 || power || address.\nThis makes the validators sorted by power, high to low.
    81  end
    82  
    83  keeper -> keeper : AfterDelegationModified hook
    84  note left: Calls initializeDelegation\nStore the previous period\nCalculate the number of tokens from shares\n(shares the delegator has) * (tokens in delegation object)/(total tokens delegated to the validator)\nStore delegation starting info.
    85  "msgServer (staking)" <-- keeper : newShares (ignored by Delegate function)
    86  
    87  
    88  "msgServer (staking)" -> "msgServer (staking)" : Emit event: Delegation(ValidatorAddress)
    89  "msgServer (staking)" -> "msgServer (staking)" : Emit event: Message(DelegatorAddress)
    90  "msgServer (staking)" -> "msgServer (staking)" : telemetry(Amount, Denom)
    91  
    92  @enduml
    93