Core Contracts

Regnum Aurum Acquisition Corp
HardhatReal World AssetsNFT
77,280 USDC
View results
Submission Details
Severity: high
Invalid

StabilityPool miscalculation of flexible decimals feature

Summary

StabilityPool.sol contract allows to set another decimals for tokens (DeCRVUSD and RcrvUSD). But calculateRcrvUSDAmount() calculate it wrongly in case of different decimals between them (let's, 18 and 6)

Vulnerability Details

Function calculateRcrvUSDAmount() looks like this :

function calculateRcrvUSDAmount(uint256 deCRVUSDAmount) public view returns (uint256) {
uint256 scalingFactor = 10**18 + rTokenDecimals - deTokenDecimals);
return (deCRVUSDAmount * getExchangeRate()) / scalingFactor;
}

To illustrate the point let consider following example :
Rtoken decimals = 6;
Dtoken decimals = 18;

Now scalingFactor = 10e6
But this return (deCRVUSDAmount * getExchangeRate()) / scalingFactor; returns 1e30 precision (when it should 18)

Impact

miscalculation of protocol reserves if flexible token decimals feature applied

Tools Used

Manual review

Recommendations

calculate it same way as you do in calculateDeCRVUSDAmount()

Updates

Lead Judging Commences

inallhonesty Lead Judge 7 months ago
Submission Judgement Published
Invalidated
Reason: Non-acceptable severity
Assigned finding tags:

Incorrect scaling factor formula in StabilityPool::calculateRcrvUSDAmount function

Both tokens have 18 decimals. Info

Support

FAQs

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

Give us feedback!