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