Whitepaper, section 2.9.2, stated that the formula should "If participant TSTStaked < sEURO
then void Participant else CombinedStake = sEUROStaked * 2
." However, not only the participants are not voided, but the stake has not been multiplied by 2 and added into calculation.
In LiquidationPool::distributeAssets()
, it calls LiquidationPool::getStakeTotal()
, then LiquidationPool::stake()
. The function includes any higher tokens without checking if participant sEURO is higher in amount and voiding them. Also, both token's asset wasn't accumulated in the calculation.
To simplify:
Alice deposited 100 sEURO and 100 TST, risking both tokens.
Bob deposited only 100 TST and 1 sEURO.
Bob will only get rewards based on 1sEURO and not the total amount of 100 TST + 1sEURO, not taken into consideration.
Bob will not get the actual rewards like Alice.
The calculation of rewards is not based on TST, governance token but it is chosen based on which token is lesser. So this means that if the user staked sEURO token that is higher than TST, the TST will be chosen as the main token.
The _portion
takes into account how much the Manager asset has multiplied by the _positionStake
of Bob. So the stake amount only chooses the lesser amount staked, which doesn't make any sense.
Risk taken by users are not accounted for leading to the unfair distribution of assets due to flaws in the formula.
Manual Review
Add in the consideration of voiding participants if criteria are not met and combine sEURO as well TST staked.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.