Incorrect return value in fetchEpochIds in case of invalid vaults
Description
The function fetchEpochIds is used to get the list of epochIds, validVaults, and vaultType for the vaults that are active.
The function loops through the vault's array, calls the function epochValid for each array, and returns the epochId, vaultType, and a boolean valid that describes if the vault is valid or not. When a vault is invalid --- in other words, valid = false --- the counter i is increased but the validCount is not. If any vault is invalid, there would be a mismatch between the returned arrays.
function fetchEpochIds(
address[] memory vaults
)
public
view
returns (
uint256[] memory epochIds,
address[] memory validVaults,
uint256[] memory vaultType
)
{
uint256 validCount;
epochIds = new uint256[](vaults.length);
validVaults = new address[](vaults.length);
vaultType = new uint256[](vaults.length);
for (uint256 i = 0; i < vaults.length; ) {
IEarthquake vault = IEarthquake(vaults[i]);
bool valid;
(valid, epochIds[i], vaultType[i]) = epochValid(vault);
unchecked {
i++;
}
if (!valid) {
continue;
}
validVaults[validCount] = address(vault);
unchecked {
validCount++;
}
}
}Impact
If the weightStrategy used is 3 (threshold), the function _thresholdWeight would revert in VaultGetter.getRoi as this function would try to call totalSupply on an address(0). The function _thresholdWeight is internally called in deployPosition; therefore, deploying new positions might fail.
Recommendations
Revert the function fetchEpochIds if a vault in the list is invalid.
Remediation
The issue was fixed in commit 8e8d33e↗.