It is possible to construct a call to LiquidationPool.distributeAssets such that it burns all staked EUROs.
LiquidationPool.distributeAssets function is external and unprotected. With the right choice of arguments, it will distribute non-existing assets to the stakers, burning their staked EUROs in the process. The constraints for the arguments are possible reverts due to failed transfer attempts:
the passed assets must have token.addr == address(0) (line 229)
the passed assets must have either token.symbol == bytes32(0) (line 198) or the amount must exactly match the stakers total purchasing power, so that line 200 does not revert.
one possible construct:
The above version will burn all stakers EUROs and add non-existent rewards for these stakers. Because of token.symbol == bytes32(0) the rewards will not be recognized by the rest of the code, which depend on TokenManager entries, where the native token has symbol == 'ETH'. By matching the amounts exactly, it would also be possible to produce fake rewards with symbol == 'ETH'. In this case, the rewards would not be ignored by the rest of the code, and due the the non-existence of the actual tokens in the contract's balance, it would introduce further problems, such as reverting all claimRewards calls or if any ETH tokens are actually present, transferring them to unauthorized users
Protect LiquidationPool.distributeAssets or ensure the logic will not distribute fake assets.
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.