192 lines
46 KiB
XML
192 lines
46 KiB
XML
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentScriptType="application/ecmascript" contentStyleType="text/css" height="1931px" preserveAspectRatio="none" style="width:1929px;height:1931px;" version="1.1" viewBox="0 0 1929 1931" width="1929px" zoomAndPan="magnify"><defs><filter height="300%" id="fcmqo0ou3ae7m" width="300%" x="-1" y="-1"><feGaussianBlur result="blurOut" stdDeviation="2.0"/><feColorMatrix in="blurOut" result="blurOut2" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .4 0"/><feOffset dx="4.0" dy="4.0" in="blurOut2" result="blurOut3"/><feBlend in="SourceGraphic" in2="blurOut3" mode="normal"/></filter></defs><g><text fill="#000000" font-family="sans-serif" font-size="18" lengthAdjust="spacing" textLength="478" x="723.5" y="28.708">Delegating (currently undelegated funds delegator)</text><rect fill="#FFFFFF" filter="url(#fcmqo0ou3ae7m)" height="46.2656" style="stroke:#000000;stroke-width:2.0;" width="711.5" x="29" y="148.3828"/><rect fill="#FFFFFF" filter="url(#fcmqo0ou3ae7m)" height="158.3359" style="stroke:#000000;stroke-width:2.0;" width="842" x="84" y="208.6484"/><rect fill="#FFFFFF" height="56.9375" style="stroke:none;stroke-width:1.0;" width="842" x="84" y="310.0469"/><rect fill="#FFFFFF" filter="url(#fcmqo0ou3ae7m)" height="883.8672" style="stroke:#000000;stroke-width:2.0;" width="1351.5" x="563.5" y="380.9844"/><rect fill="#FFFFFF" filter="url(#fcmqo0ou3ae7m)" height="454.5313" style="stroke:#000000;stroke-width:2.0;" width="863" x="1042" y="434.25"/><rect fill="#FFFFFF" filter="url(#fcmqo0ou3ae7m)" height="339.1328" style="stroke:#000000;stroke-width:2.0;" width="843" x="1052" y="542.6484"/><rect fill="#FFFFFF" filter="url(#fcmqo0ou3ae7m)" height="90.2031" style="stroke:#000000;stroke-width:2.0;" width="813" x="1072" y="651.0469"/><rect fill="#FFFFFF" height="43.9375" style="stroke:none;stroke-width:1.0;" width="813" x="1072" y="697.3125"/><rect fill="#FFFFFF" filter="url(#fcmqo0ou3ae7m)" height="119.5313" style="stroke:#000000;stroke-width:2.0;" width="620" x="1062" y="755.25"/><rect fill="#FFFFFF" filter="url(#fcmqo0ou3ae7m)" height="46.2656" style="stroke:#000000;stroke-width:2.0;" width="600" x="1072" y="821.5156"/><rect fill="#FFFFFF" height="339.9375" style="stroke:none;stroke-width:1.0;" width="1351.5" x="563.5" y="924.9141"/><rect fill="#FFFFFF" filter="url(#fcmqo0ou3ae7m)" height="90.2031" style="stroke:#000000;stroke-width:2.0;" width="672.5" x="583.5" y="946.7188"/><rect fill="#FFFFFF" height="43.9375" style="stroke:none;stroke-width:1.0;" width="672.5" x="583.5" y="992.9844"/><rect fill="#FFFFFF" filter="url(#fcmqo0ou3ae7m)" height="206.9297" style="stroke:#000000;stroke-width:2.0;" width="1311.5" x="573.5" y="1050.9219"/><rect fill="#FFFFFF" filter="url(#fcmqo0ou3ae7m)" height="46.2656" style="stroke:#000000;stroke-width:2.0;" width="672.5" x="583.5" y="1146.3203"/><rect fill="#FFFFFF" filter="url(#fcmqo0ou3ae7m)" height="71.3984" style="stroke:#000000;stroke-width:2.0;" width="1663" x="222" y="1519.9141"/><line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="120" x2="120" y1="102.25" y2="1863.5078"/><line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="661.5" x2="661.5" y1="102.25" y2="1863.5078"/><line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="920.5" x2="920.5" y1="102.25" y2="1863.5078"/><line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="1164" x2="1164" y1="102.25" y2="1863.5078"/><line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="1597" x2="1597" y1="102.25" y2="1863.5078"/><line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="1746" x2="1746" y1="102.25" y2="1863.5078"/><line style="stroke:#A80036;stroke-width:1.0;stroke-dasharray:5.0,5.0;" x1="1853" x2="1853" y1="102.25" y2="1863.5078"/><rect fill="#FEFECE" filter="url(#fcmqo0ou3ae7m)" height="30.2969" style="stroke:#A80036;stroke-width:1.5;" width="158" x="39" y="66.9531"/><text fill="#0
|
||
|
@startuml
|
||
|
'https://plantuml.com/sequence-diagram
|
||
|
|
||
|
title: Delegating (currently undelegated funds delegator)
|
||
|
|
||
|
participant "msgServer (staking)"
|
||
|
participant "keeper (staking)" as keeper
|
||
|
participant validator
|
||
|
participant keeper.bankKeeper
|
||
|
participant vestingAccount
|
||
|
participant ctx.EventManager
|
||
|
|
||
|
database store
|
||
|
|
||
|
"msgServer (staking)" -> keeper : Delegate(Context, DelegatorAddress, Amount, Validator, tokenSrc := Unbonded)
|
||
|
|
||
|
alt exchange rate is invalid (tokens in validator is 0)
|
||
|
keeper - -> "msgServer (staking)" : error
|
||
|
end
|
||
|
|
||
|
alt perform a new delegation
|
||
|
keeper -> keeper : delegation := create delegation object
|
||
|
keeper -> keeper : BeforeDelegationCreated hook
|
||
|
note left: Calls IncrementValidatorPeriod (Used to calculate distribution) in keeper/validator.go
|
||
|
else delegation exists, more tokens being added
|
||
|
keeper -> keeper : BeforeDelegationModified hook
|
||
|
note left: withdraw current delegation rewards (and increment period)
|
||
|
end
|
||
|
|
||
|
alt delegating from an account (subtractTokens == true)
|
||
|
keeper -> keeper.bankKeeper : DelegateCoinsFromAccountToModule
|
||
|
group DelegateCoinsFromAccountToModule function
|
||
|
keeper.bankKeeper -> keeper.bankKeeper : DelegateCoinsFromAccountToModule
|
||
|
keeper.bankKeeper -> keeper.bankKeeper : DelegateCoins
|
||
|
group DelegateCoins function
|
||
|
keeper.bankKeeper - -> keeper.bankKeeper : Check the delegator has enough balances of all tokens delegated
|
||
|
keeper.bankKeeper - -> keeper.bankKeeper : Track delegation (register that it exists to keep track of it)
|
||
|
alt validator is currently bonded
|
||
|
keeper.bankKeeper - -> store : Transfer tokens from delegator to BondedTokensPool.
|
||
|
else validator is currently unbonded or unbonding
|
||
|
keeper.bankKeeper - -> store : Transfer tokens from delegator to NotBondedTokensPool.
|
||
|
end
|
||
|
group trackDelegation function
|
||
|
keeper.bankKeeper -> keeper.bankKeeper : trackDelegation
|
||
|
alt delegator is a vesting account
|
||
|
keeper.bankKeeper -> vestingAccount : keep track of this delegation
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
keeper <- - keeper.bankKeeper : nil (success)
|
||
|
else moving tokens between pools (subtractTokens == false)
|
||
|
alt delegator tokens are not bonded but validator is bonded
|
||
|
keeper -> keeper.bankKeeper : SendCoinsFromModuleToModule(notBondedPool, bondedPool, coins)
|
||
|
else delegator tokens are bonded but validator is not bonded
|
||
|
keeper -> keeper.bankKeeper : SendCoinsFromModuleToModule(bondedPool, notBondedPool, coins)
|
||
|
end
|
||
|
group SendCoins function
|
||
|
keeper.bankKeeper -> keeper.bankKeeper : SendCoins
|
||
|
keeper.bankKeeper -> ctx.EventManager : Emit TransferEvent(to, from, amount)
|
||
|
alt amount of spendable (balance - locked) coins too low
|
||
|
keeper <- - keeper.bankKeeper : error
|
||
|
end
|
||
|
keeper.bankKeeper -> store : subtract balance from sender
|
||
|
keeper.bankKeeper -> store : add balance to recipient
|
||
|
end
|
||
|
end
|
||
|
|
||
|
keeper -> validator : AddTokensFromDel
|
||
|
validator -> validator : calculate number of shares to issue
|
||
|
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)
|
||
|
|
||
|
validator -> validator : add delegated tokens to validator
|
||
|
keeper <- - validator : validator, addedShares
|
||
|
keeper -> store : update validator state
|
||
|
keeper -> keeper: calculate new validator's power
|
||
|
note left : Number of tokens divided by PowerReduction (default: 1,000,000,000,000,000,000 = 10^18)
|
||
|
alt validator is not jailed
|
||
|
keeper -> store : update validator's power in power index
|
||
|
note left : the power index has entries shaped as 35 || power || address.\nThis makes the validators sorted by power, high to low.
|
||
|
end
|
||
|
|
||
|
keeper -> keeper : AfterDelegationModified hook
|
||
|
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.
|
||
|
"msgServer (staking)" <- - keeper : newShares (ignored by Delegate function)
|
||
|
|
||
|
|
||
|
"msgServer (staking)" -> "msgServer (staking)" : Emit event: Delegation(ValidatorAddress)
|
||
|
"msgServer (staking)" -> "msgServer (staking)" : Emit event: Message(DelegatorAddress)
|
||
|
"msgServer (staking)" -> "msgServer (staking)" : telemetry(Amount, Denom)
|
||
|
@enduml
|
||
|
|
||
|
@startuml
|
||
|
|
||
|
title: Delegating (currently undelegated funds delegator)
|
||
|
|
||
|
participant "msgServer (staking)"
|
||
|
participant "keeper (staking)" as keeper
|
||
|
participant validator
|
||
|
participant keeper.bankKeeper
|
||
|
participant vestingAccount
|
||
|
participant ctx.EventManager
|
||
|
|
||
|
database store
|
||
|
|
||
|
"msgServer (staking)" -> keeper : Delegate(Context, DelegatorAddress, Amount, Validator, tokenSrc := Unbonded)
|
||
|
|
||
|
alt exchange rate is invalid (tokens in validator is 0)
|
||
|
keeper - -> "msgServer (staking)" : error
|
||
|
end
|
||
|
|
||
|
alt perform a new delegation
|
||
|
keeper -> keeper : delegation := create delegation object
|
||
|
keeper -> keeper : BeforeDelegationCreated hook
|
||
|
note left: Calls IncrementValidatorPeriod (Used to calculate distribution) in keeper/validator.go
|
||
|
else delegation exists, more tokens being added
|
||
|
keeper -> keeper : BeforeDelegationModified hook
|
||
|
note left: withdraw current delegation rewards (and increment period)
|
||
|
end
|
||
|
|
||
|
alt delegating from an account (subtractTokens == true)
|
||
|
keeper -> keeper.bankKeeper : DelegateCoinsFromAccountToModule
|
||
|
group DelegateCoinsFromAccountToModule function
|
||
|
keeper.bankKeeper -> keeper.bankKeeper : DelegateCoinsFromAccountToModule
|
||
|
keeper.bankKeeper -> keeper.bankKeeper : DelegateCoins
|
||
|
group DelegateCoins function
|
||
|
keeper.bankKeeper - -> keeper.bankKeeper : Check the delegator has enough balances of all tokens delegated
|
||
|
keeper.bankKeeper - -> keeper.bankKeeper : Track delegation (register that it exists to keep track of it)
|
||
|
alt validator is currently bonded
|
||
|
keeper.bankKeeper - -> store : Transfer tokens from delegator to BondedTokensPool.
|
||
|
else validator is currently unbonded or unbonding
|
||
|
keeper.bankKeeper - -> store : Transfer tokens from delegator to NotBondedTokensPool.
|
||
|
end
|
||
|
group trackDelegation function
|
||
|
keeper.bankKeeper -> keeper.bankKeeper : trackDelegation
|
||
|
alt delegator is a vesting account
|
||
|
keeper.bankKeeper -> vestingAccount : keep track of this delegation
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
keeper <- - keeper.bankKeeper : nil (success)
|
||
|
else moving tokens between pools (subtractTokens == false)
|
||
|
alt delegator tokens are not bonded but validator is bonded
|
||
|
keeper -> keeper.bankKeeper : SendCoinsFromModuleToModule(notBondedPool, bondedPool, coins)
|
||
|
else delegator tokens are bonded but validator is not bonded
|
||
|
keeper -> keeper.bankKeeper : SendCoinsFromModuleToModule(bondedPool, notBondedPool, coins)
|
||
|
end
|
||
|
group SendCoins function
|
||
|
keeper.bankKeeper -> keeper.bankKeeper : SendCoins
|
||
|
keeper.bankKeeper -> ctx.EventManager : Emit TransferEvent(to, from, amount)
|
||
|
alt amount of spendable (balance - locked) coins too low
|
||
|
keeper <- - keeper.bankKeeper : error
|
||
|
end
|
||
|
keeper.bankKeeper -> store : subtract balance from sender
|
||
|
keeper.bankKeeper -> store : add balance to recipient
|
||
|
end
|
||
|
end
|
||
|
|
||
|
keeper -> validator : AddTokensFromDel
|
||
|
validator -> validator : calculate number of shares to issue
|
||
|
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)
|
||
|
|
||
|
validator -> validator : add delegated tokens to validator
|
||
|
keeper <- - validator : validator, addedShares
|
||
|
keeper -> store : update validator state
|
||
|
keeper -> keeper: calculate new validator's power
|
||
|
note left : Number of tokens divided by PowerReduction (default: 1,000,000,000,000,000,000 = 10^18)
|
||
|
alt validator is not jailed
|
||
|
keeper -> store : update validator's power in power index
|
||
|
note left : the power index has entries shaped as 35 || power || address.\nThis makes the validators sorted by power, high to low.
|
||
|
end
|
||
|
|
||
|
keeper -> keeper : AfterDelegationModified hook
|
||
|
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.
|
||
|
"msgServer (staking)" <- - keeper : newShares (ignored by Delegate function)
|
||
|
|
||
|
|
||
|
"msgServer (staking)" -> "msgServer (staking)" : Emit event: Delegation(ValidatorAddress)
|
||
|
"msgServer (staking)" -> "msgServer (staking)" : Emit event: Message(DelegatorAddress)
|
||
|
"msgServer (staking)" -> "msgServer (staking)" : telemetry(Amount, Denom)
|
||
|
@enduml
|
||
|
|
||
|
PlantUML version 1.2021.5beta3(Unknown compile time)
|
||
|
(GPL source distribution)
|
||
|
Java Runtime: Java(TM) SE Runtime Environment
|
||
|
JVM: Java HotSpot(TM) 64-Bit Server VM
|
||
|
Default Encoding: UTF-8
|
||
|
Language: en
|
||
|
Country: US
|
||
|
--></g></svg>
|