First Flight #21: KittyFi

First Flight #21
Beginner FriendlyDeFiFoundry
100 EXP
View results
Submission Details
Severity: medium
Invalid

KittyVault::getUserVaultMeowllateralInEuros implementation results to precision loss, resulting to lose of some funds when the function is called.

Summary

KittyVault::getUserVaultMeowllateralInEuros implementation user's collateral for this vault in euros. The mulDiv(uint256(collateralToUsdPrice) * EXTRA_DECIMALS, PRECISION) function in the KittyVault::getUserVaultMeowllateralInEuros where division occurs after multiplication causes precision loss.

Vulnerability Details

function getUserVaultMeowllateralInEuros(address _user) external view returns (uint256) {
(, int256 collateralToUsdPrice, , , ) = i_priceFeed.latestRoundData();
(, int256 euroPriceFeedAns, , ,) = i_euroPriceFeed.latestRoundData();
@> uint256 collateralAns = getUserMeowllateral(_user).mulDiv(uint256(collateralToUsdPrice) * EXTRA_DECIMALS, PRECISION);
@> return collateralAns.mulDiv(uint256(euroPriceFeedAns) * EXTRA_DECIMALS, PRECISION);
}

Impact

This results to lose of funds in the protocol when the KittyVault::getUserVaultMeowllateralInEuros function is implemented.

Tools Used

manual review

Recommendations

Avoiding unnecessary multiplication or division that could lead to inaccuracies. The function can be written better below

function getUserVaultMeowllateralInEuros(address _user) external view returns (uint256) {
uint256 userCollateralUsd = getUserMeowllateral(_user);
(, int256 collateralToUsdPrice, , , ) = i_priceFeed.latestRoundData();
(, int256 euroToUsdPrice, , ,) = i_euroPriceFeed.latestRoundData();
// Convert user's collateral from token to USD
uint256 userCollateralInUsd = userCollateralUsd.mulDiv(uint256(collateralToUsdPrice), PRECISION);
// Convert USD to Euros
uint256 userCollateralInEuros = userCollateralInUsd.mulDiv(uint256(euroToUsdPrice), PRECISION);
return userCollateralInEuros;
}
Updates

Lead Judging Commences

shikhar229169 Lead Judge about 1 year ago
Submission Judgement Published
Invalidated
Reason: Non-acceptable severity

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.