Omniscia Steadefi Audit
LendingPoolConfig Code Style Findings
LendingPoolConfig Code Style Findings
LPC-01C: Ineffectual Usage of Safe Arithmetics
Type | Severity | Location |
---|---|---|
Language Specific | LendingPoolConfig.sol:L91 |
Description:
The linked mathematical operation is guaranteed to be performed safely by surrounding conditionals evaluated in either require
checks or if-else
constructs.
Example:
87// If utilization above kink2, return a higher interest rate88// (base + rate + excess utilization above kink 2 * jumpMultiplier)89if (utilizationRate > kink2) {90 return baseRate + (kink1 * multiplier / SAFE_MULTIPLIER)91 + ((utilizationRate - kink2) * jumpMultiplier / SAFE_MULTIPLIER);92}
Recommendation:
Given that safe arithmetics are toggled on by default in pragma
versions of 0.8.X
, we advise the linked statement to be wrapped in an unchecked
code block thereby optimizing its execution cost.
Alleviation (7c9b2b09dbe1f75d8c5ad379e658030ecf1be3a0):
The Steadefi team evaluated this optimization and opted to retain the checked arithmetics in place as in order to apply it the legibility of the calculations would significantly decrease. As such, we consider this exhibit acknowledged and we agree with Steadefi's assessment.
LPC-02C: Redundant Pre-Calculation of Rate
Type | Severity | Location |
---|---|---|
Gas Optimization | LendingPoolConfig.sol:L85 |
Description:
The LendingPoolConfig::_calculateInterestRate
function will calculate the default rate
prior to evaluating whether the utilization rate falls within the "kinks" of the system that apply special interest rates and thus re-calculate and yield a different rate.
Example:
72/**73 * Return the interest rate based on the utilization rate74 * @param _debt Total borrowed amount75 * @param _floating Total available liquidity76 * @return rate Current interest rate in 1e1877*/78function _calculateInterestRate(uint256 _debt, uint256 _floating) internal view returns (uint256) {79 if (_debt == 0 && _floating == 0) return 0;80
81 uint256 total = _debt + _floating;82 uint256 utilizationRate = _debt * SAFE_MULTIPLIER / total;83
84 // calculate borrow rate for slope up to kink 185 uint256 rate = baseRate + (utilizationRate * multiplier / SAFE_MULTIPLIER);86
87 // If utilization above kink2, return a higher interest rate88 // (base + rate + excess utilization above kink 2 * jumpMultiplier)89 if (utilizationRate > kink2) {90 return baseRate + (kink1 * multiplier / SAFE_MULTIPLIER)91 + ((utilizationRate - kink2) * jumpMultiplier / SAFE_MULTIPLIER);92 }93
94 // If utilization between kink1 and kink2, rates are flat95 if (kink1 < utilizationRate && utilizationRate < kink2) {96 return baseRate + (kink1 * multiplier / SAFE_MULTIPLIER);97 }98
99 // If utilization below kink1, return rate100 return rate;101}
Recommendation:
We advise the rate
local variable to be omitted and its calculation to be relocated to the return
statement directly, optimizing the function's gas cost.
Alleviation (4325253d6de0ea91c1e9fb9e01d2e7e98f3d83a9):
The calculation was relocated to the return
statement as advised, optimizing all invocations of the LendingPoolConfig::_calculateInterestRate
function.