The protocol provide swap feature which will allow smart vault to swap tokens inside protocol, however the function does not check if inToken
and outToken
are same.
Code
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);
ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({
@> tokenIn: inToken,
@> tokenOut: getSwapAddressFor(_outToken),
fee: 3000,
recipient: address(this),
deadline: block.timestamp,
amountIn: _amount - swapFee,
amountOutMinimum: minimumAmountOut,
sqrtPriceLimitX96: 0
});
inToken == ISmartVaultManagerV3(manager).weth() ?
executeNativeSwapAndFee(params, swapFee) :
executeERC20SwapAndFee(params, swapFee);
@@ -212,13 +214,16 @@ contract SmartVaultV3 is ISmartVault {
}
function swap(bytes32 _inToken, bytes32 _outToken, uint256 _amount) external onlyOwner {
+ // @audit : no check for same token swap,
uint256 swapFee = _amount * ISmartVaultManagerV3(manager).swapFeeRate() / ISmartVaultManagerV3(manager).HUNDRED_PC();
address inToken = getSwapAddressFor(_inToken);
+ address outToken = getSwapAddressFor(_outToken);
+ require(inToken != outToken , "can-not swap same token");
uint256 minimumAmountOut = calculateMinimumAmountOut(_inToken, _outToken, _amount);
ISwapRouter.ExactInputSingleParams memory params = ISwapRouter.ExactInputSingleParams({
tokenIn: inToken,
- tokenOut: getSwapAddressFor(_outToken),
- fee: 3000,
+ tokenOut: outToken,
+ fee: 3000,
recipient: address(this),
deadline: block.timestamp,
amountIn: _amount - swapFee,