Get utilization rate function is wrongly implemented due to usage of variables which have different decimals.
function getUtilizationRate() internal view returns (uint256) {
uint256 totalBorrowed = lendingPool.getNormalizedDebt();
uint256 totalDeposits = stabilityPool.getTotalDeposits();
if (totalDeposits == 0) return 0;
return (totalBorrowed * 100) / totalDeposits;
}
And this usage index is in terms of 1e27 as can be seen from the constructor of the lending pool
constructor(
address _reserveAssetAddress,
address _rTokenAddress,
address _debtTokenAddress,
address _raacNFTAddress,
address _priceOracleAddress,
uint256 _initialPrimeRate
) Ownable(msg.sender) {
if (
_reserveAssetAddress == address(0) ||
_rTokenAddress == address(0) ||
_debtTokenAddress == address(0) ||
_raacNFTAddress == address(0) ||
_priceOracleAddress == address(0) ||
_initialPrimeRate == 0
) revert AddressCannotBeZero();
reserveAssetToken = IERC20(_reserveAssetAddress);
raacNFT = IRAACNFT(_raacNFTAddress);
priceOracle = IRAACHousePrices(_priceOracleAddress);
rToken = IRToken(_rTokenAddress);
debtToken = IDebtToken(_debtTokenAddress);
reserve.liquidityIndex = uint128(WadRayMath.RAY);
====>> reserve.usageIndex = uint128(WadRayMath.RAY);
reserve.lastUpdateTimestamp = uint40(block.timestamp);
reserve.reserveRTokenAddress = address(_rTokenAddress);
reserve.reserveAssetAddress = address(_reserveAssetAddress);
reserve.reserveDebtTokenAddress = address(_debtTokenAddress);
rateData.primeRate = uint256(_initialPrimeRate);
rateData.baseRate = rateData.primeRate.percentMul(25_00);
rateData.optimalRate = rateData.primeRate.percentMul(50_00);
rateData.maxRate = rateData.primeRate.percentMul(400_00);
rateData.optimalUtilizationRate = WadRayMath.RAY.percentMul(80_00);
rateData.protocolFeeRate = 0;
liquidationThreshold = BASE_LIQUIDATION_THRESHOLD;
healthFactorLiquidationThreshold = BASE_HEALTH_FACTOR_LIQUIDATION_THRESHOLD;
liquidationGracePeriod = BASE_LIQUIDATION_GRACE_PERIOD;
}
Plus total deposits in stability pools are interms of r token which doesn't have 27 decimals therefore the following function will not return values between 0-100 which it should be
function getUtilizationRate() internal view returns (uint256) {
uint256 totalBorrowed = lendingPool.getNormalizedDebt();
uint256 totalDeposits = stabilityPool.getTotalDeposits();
if (totalDeposits == 0) return 0;
return (totalBorrowed * 100) / totalDeposits;
}