medium

Incorrect calculation of amount of EURO to burn during liquidation

Contest
Reward

Total

551.93 USDC

Selected
82.20 USDC
58.72 USDC
58.72 USDC
58.72 USDC
58.72 USDC
58.72 USDC
58.72 USDC
58.72 USDC
58.72 USDC
Selected Submission

Incorrect calculation of amount of EURO to burn during liquidation

Severity

High Risk

Relevant GitHub Links

https://github.com/Cyfrin/2023-12-the-standard/blob/main/contracts/LiquidationPool.sol#L220

Vulnerability Details

In order to maintain a peg, we must ensure that when a position is liquidated, we liquidate more than or equal to the amount of stablecoin that is borrowed.

Let us say Alice locks up 12000 EURO worth of collateral into her vault and borrows 10000 EURO, with a minimum collateralisation rate of 120%. For simplicity, we assume a single staker owns the entire LP containing 10000 EURO. Now, assume that Alice's collateral value locked falls to 11000 EURO due to rapid price action (but it is still above 100% collateralisation rate)

During liquidation, the amount of EURO to burn is computed in https://github.com/Cyfrin/2023-12-the-standard/blob/main/contracts/LiquidationPool.sol#L220

uint256 costInEuros = _portion * 10 ** (18 - asset.token.dec) * uint256(assetPriceUsd) / uint256(priceEurUsd) * _hundredPC / _collateralRate;

A high level explanation of this code is:

Asset Value in EURO * 100 / Collateral Rate

So computing the costInEuros we receive

11000 * 100 / 120 = 9166 EURO

Which results in 9166 EURO being burnt which is much lower than the 10000 EURO Alice borrowed. This can cause the EURO to depeg.

The fundamental assumption that is wrong here is that the developers have assumed that liquidation immediately occurs when the asset value falls below 120% collateralisation rate (or in the example above 12000 EURO, which results in the correct EURO to be burnt 12000 * 100 / 120 = 10000 EURO).

Impact

EURO depegging.

Tools Used

Manual Review

Recommendations

To calculate the cost of EUROs to be burned, use the amount of tokens minted for a particular position as opposed to the complex calculation above.