Summary
Vulnerability Details
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);
}
function executeNativeSwapAndFee(ISwapRouter.ExactInputSingleParams memory _params, uint256 _swapFee) private {
(bool sent,) = payable(ISmartVaultManagerV3(manager).protocol()).call{value: _swapFee}("");
require(sent, "err-swap-fee-native");
ISwapRouter(ISmartVaultManagerV3(manager).swapRouter2()).exactInputSingle{value: _params.amountIn}(_params);
}
function executeERC20SwapAndFee(ISwapRouter.ExactInputSingleParams memory _params, uint256 _swapFee) private {
IERC20(_params.tokenIn).safeTransfer(ISmartVaultManagerV3(manager).protocol(), _swapFee);
IERC20(_params.tokenIn).safeApprove(ISmartVaultManagerV3(manager).swapRouter2(), _params.amountIn);
ISwapRouter(ISmartVaultManagerV3(manager).swapRouter2()).exactInputSingle(_params);
IWETH weth = IWETH(ISmartVaultManagerV3(manager).weth());
uint256 wethBalance = weth.balanceOf(address(this));
if (wethBalance > 0) weth.withdraw(wethBalance);
}
User Interaction:
A user initiates a transaction to the swap function, specifying the input token (_inToken), output token (_outToken), and the amount to be swapped (_amount).
Initialization:
The swap function calculates the swap fee (_swapFee) based on the configured swap fee rate and total amount to be swapped.
It determines the addresses of the input and output tokens.
Minimum Amount Calculation:
The function calculates the minimum amount of output tokens (minimumAmountOut) based on the input and output tokens and the amount to be swapped.
ExactInputSingleParams Setup:
The parameters for the ExactInputSingle swap are set up in the params variable.
Execution of executeNativeSwapAndFee:
The executeNativeSwapAndFee function is called, transferring the swap fee to the protocol contract and executing the swap on the specified router.
Gas Considerations:
Gas is consumed during the following operations:
Calculation of swap fee and minimum amount.
Transfer of swap fee to the protocol contract.
Execution of the exactInputSingle swap on the router.
Impact
Tools Used
Manual reveiw
Recommendations