Summary
The slippage value can be 0 which can lead to user getting worst price after the swap.
Vulnerability Details
In the calculateMinimumAmountOut()
, the minimumAmountOut
value can be equal to 0
if the user will be fully collateralized even after the swap.
function calculateMinimumAmountOut(bytes32 _inTokenSymbol, bytes32 _outTokenSymbol, uint256 _amount)
private
view
returns (uint256)
{
ISmartVaultManagerV3 _manager = ISmartVaultManagerV3(manager);
uint256 requiredCollateralValue = minted * _manager.collateralRate() / _manager.HUNDRED_PC();
uint256 collateralValueMinusSwapValue =
euroCollateral() - calculator.tokenToEur(getToken(_inTokenSymbol), _amount);
return collateralValueMinusSwapValue >= requiredCollateralValue
? 0
: calculator.eurToToken(getToken(_outTokenSymbol), requiredCollateralValue - collateralValueMinusSwapValue);
}
function swap(bytes32 _inToken, bytes32 _outToken, uint256 _amount) external onlyOwner {
uint256 swapFee =
_amount * ISmartVaultManagerV3(manager).swapFeeRate() / ISmartVaultManagerV3(manager).HUNDRED_PC();
address inToken = getSwapAddressFor(_inToken);
uint256 minimumAmountOut = calculateMinimumAmountOut(_inToken, _outToken, _amount);
...
Impact
Users can get worst price after the swap is executed causing loss of funds for the user. This can happen due to various factors like price deviation, sandwich attacks, etc.
Tools Used
Manual Analysis
Recommendations
User should be able to input minimumAmountOut
for the swap and calculateMinimumAmountOut()
should be modified accordingly.