function getNormalizedDebt(ReserveData storage reserve, ReserveRateData storage rateData)
internal
view
returns (uint256)
{
uint256 timeDelta = block.timestamp - uint256(reserve.lastUpdateTimestamp);
if (timeDelta < 1) {
return reserve.usageIndex;
}
return calculateCompoundedInterest(rateData.currentUsageRate, timeDelta).rayMul(reserve.usageIndex);
}
The function should return the total debt in underlying asset units, but instead it's returning scaled values that represent the interest rate index. This causes:
pragma solidity ^0.8.19;
import {Test} from "forge-std/Test.sol";
import {ReserveLibrary} from "../contracts/libraries/pools/ReserveLibrary.sol";
import "../contracts/libraries/math/WadRayMath.sol";
import {console} from "forge-std/console.sol";
contract ReserveLibraryPoc is Test {
using WadRayMath for uint256;
using ReserveLibrary for ReserveLibrary.ReserveData;
using ReserveLibrary for ReserveLibrary.ReserveRateData;
ReserveLibrary.ReserveData reserve;
ReserveLibrary.ReserveRateData rateData;
function setUp() public {
reserve.liquidityIndex = 1.1e27;
reserve.usageIndex = 1.1e27;
reserve.totalUsage = 1000e18;
reserve.lastUpdateTimestamp = uint40(block.timestamp);
rateData.currentUsageRate = 0.08e27;
}
function test_incorrect_normalized_debt() public {
vm.warp(block.timestamp + 365 days);
uint256 normalizedDebt = ReserveLibrary.getNormalizedDebt(reserve, rateData);
vm.warp(block.timestamp);
uint256 zeroTimeDebt = ReserveLibrary.getNormalizedDebt(reserve, rateData);
console.log("Normalized debt with time delta = 0: %s", zeroTimeDebt);
console.log("Usage index: %s", reserve.usageIndex);
assertEq(zeroTimeDebt, reserve.usageIndex, "Should return usage index when time delta = 0");
}
}
function getNormalizedDebt(ReserveData storage reserve, ReserveRateData storage rateData)
internal
view
returns (uint256)
{
uint256 timeDelta = block.timestamp - uint256(reserve.lastUpdateTimestamp);
if (timeDelta < 1) {
- return reserve.usageIndex;
+ return reserve.totalUsage.rayMul(reserve.usageIndex);
}
- return calculateCompoundedInterest(rateData.currentUsageRate, timeDelta).rayMul(reserve.usageIndex);
+ uint256 currentIndex = calculateCompoundedInterest(rateData.currentUsageRate, timeDelta).rayMul(reserve.usageIndex);
+ return reserve.totalUsage.rayMul(currentIndex);
}