Multiple functions in ReserveLibrary lose precision by performing division before multiplication, leading to inaccurate interest, liquidity, and usage index calculations.
The following functions are affected:
ReserveLibrary::updateReserveInterests
ReserveLibrary::calculateLiquidityIndex
ReserveLibrary::calculateLinearInterest
ReserveLibrary::calculateUsageIndex
ReserveLibrary::calculateBorrowRate
ReserveLibrary::calculateLiquidityRate
RToken::calculateDustAmount
RToken::mint
RToken::burn
These functions divide values (e.g., by SECONDS_PER_YEAR or 1e27) before multiplying, causing truncation and precision loss. This is critical for large Ray values (1e27).
calculateLinearInterestcumulatedInterest = 1e27 (1 Ray)
SECONDS_PER_YEAR = 31536000
timeDelta = 1 second
Divide first: 1e27 / 31536000 ≈ 3.17e19
Multiply: 3.17e19 * 1 = 3.17e19 (loses precision)
Multiply first: 1e27 * 1 = 1e27
Then divide: 1e27 / 31536000 ≈ 3.17e19 (more accurate)
calculateBorrowRateexcessUtilization = 1e25 (0.01 Ray)
rateSlope = 1e27 (1 Ray)
maxExcessUtilization = 1e27 (1 Ray)
excessUtilization.rayMul(rateSlope): (1e25 * 1e27) / 1e27 = 1e25
Then rayDiv(maxExcessUtilization): (1e25 * 1e27) / 1e27 = 1e25
Issue: Small values lose precision due to sequential divisions.
calculateLiquidityRate (Cumulative Loss)a = 1e26
b = 1e26
c = 1e26
First rayMul: (1e26 * 1e26) / 1e27 = 1e25
Second rayMul: (1e25 * 1e26) / 1e27 = 1e24 (significant loss)
Multiply first: (1e26 * 1e26 * 1e26) / (1e27 * 1e27)
Simplifies to: 1e26 / 1e27 = 1e-1
Issue: In integer math, this could floor to 0, losing precision.
Inaccurate interest rates (over/undercharged).
Incorrect liquidity and usage indices, destabilizing reserves.
Financial losses for users and the protocol.
Manual Review
Multiply before dividing to preserve precision.
Minimize sequential rayMul/rayDiv operations.
For calculateLinearInterest, multiply cumulatedInterest by timeDelta before dividing by SECONDS_PER_YEAR.
For calculateBorrowRate, rearrange to reduce division impact.
For calculateLiquidityRate, combine multiplications before divisions.
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.