Assessment reports>Origami Finance>Low findings>Rebalance asset/liability slippage
Category: Business Logic

Rebalance asset/liability slippage

Low Severity
Low Impact
Low Likelihood

Description

When a rebalance is performed, there is no guarantee that the asset/liability (A/L) ratio is changed as much as expected, as the A/L checks in the rebalance functions only verify that the A/L remains above the floor in case of _rebalanceDown and below the ceiling in the case of _rebalanceUp. This can be seen in the _validateALRatio function.

function _validateALRatio(Range.Data storage validRange, uint128 ratioBefore, uint128 ratioAfter, AlValidationMode alMode) internal virtual {
	if (alMode == AlValidationMode.LOWER_THAN_BEFORE) {
		// Check that the new A/L is not below the floor
		// In this mode, the A/L may be above the ceiling still, but should be decreasing
		// Note: The A/L may not be strictly decreasing in this mode since the liabilities (in reserve terms) is also
		// fluctuating
		if (ratioAfter < validRange.floor) revert ALTooLow(ratioBefore, ratioAfter, validRange.floor);
	} else {
		// Check that the new A/L is not above the ceiling
		// In this mode, the A/L may be below the floor still, but should be increasing
		// Note: The A/L may not be strictly increasing in this mode since the liabilities (in reserve terms) is also
		// fluctuating
		if (ratioAfter > validRange.ceiling) revert ALTooHigh(ratioBefore, ratioAfter, validRange.ceiling);
	}
}

Impact

The performance of the fund may be impacted as not as much leveraged interest is accumulated and the per-borrower interest rate might be set with the expectation of a certain A/L ratio being reached.

Recommendations

Implement a slippage check for the A/L range that verifies that the A/L has moved in the expected direction and that it is within a margin of the expected A/L.

Remediation

This was remediated in commit d3ed0724 by modifying the rebalance functions to accept a params parameter that contains new members such as minNewAL and maxNewAL which enforce the slippage of the A/L rebalance when calling rebalanceDown or rebalanceUp.

{
    if (alRatioAfter <= alRatioBefore) revert ALTooLow(alRatioBefore, alRatioAfter, alRatioBefore);
    if (alRatioAfter < params.minNewAL) revert ALTooLow(alRatioBefore, alRatioAfter, params.minNewAL);
    if (alRatioAfter > params.maxNewAL) revert ALTooHigh(alRatioBefore, alRatioAfter, params.maxNewAL);
}
Zellic © 2025Back to top ↑