diff --git a/contracts/adapters/BaseUniswapAdapter.sol b/contracts/adapters/BaseUniswapAdapter.sol index b04bc8a1..63f8dc52 100644 --- a/contracts/adapters/BaseUniswapAdapter.sol +++ b/contracts/adapters/BaseUniswapAdapter.sol @@ -24,6 +24,7 @@ import {IBaseUniswapAdapter} from './interfaces/IBaseUniswapAdapter.sol'; abstract contract BaseUniswapAdapter is FlashLoanReceiverBase, IBaseUniswapAdapter, Ownable { using SafeMath for uint256; using PercentageMath for uint256; + using SafeERC20 for IERC20; // Max slippage percent allowed @@ -346,6 +347,18 @@ abstract contract BaseUniswapAdapter is FlashLoanReceiverBase, IBaseUniswapAdapt // Subtract flash loan fee uint256 finalAmountIn = amountIn.sub(amountIn.mul(FLASHLOAN_PREMIUM_TOTAL).div(10000)); + if (reserveIn == reserveOut) { + uint256 reserveDecimals = _getDecimals(reserveIn); + return + AmountCalc( + finalAmountIn, + finalAmountIn.mul(10**18).div(amountIn), + _calcUsdValue(reserveIn, amountIn, reserveDecimals), + _calcUsdValue(reserveIn, finalAmountIn, reserveDecimals), + [reserveIn] + ); + } + address[] memory simplePath = new address[](2); simplePath[0] = reserveIn; simplePath[1] = reserveOut; @@ -420,6 +433,20 @@ abstract contract BaseUniswapAdapter is FlashLoanReceiverBase, IBaseUniswapAdapt address reserveOut, uint256 amountOut ) internal view returns (AmountCalc memory) { + if (reserveIn == reserveOut) { + // Add flash loan fee + uint256 amountIn = amountOut.add(amountOut.mul(FLASHLOAN_PREMIUM_TOTAL).div(10000)); + uint256 reserveDecimals = _getDecimals(reserveIn); + return + AmountCalc( + amountIn, + amountOut.mul(10**18).div(amountIn), + _calcUsdValue(reserveIn, amountIn, reserveDecimals), + _calcUsdValue(reserveIn, amountOut, reserveDecimals), + [reserveIn] + ); + } + (uint256[] memory amounts, address[] memory path) = _getAmountsInAndPath(reserveIn, reserveOut, amountOut); diff --git a/contracts/adapters/UniswapLiquiditySwapAdapter.sol b/contracts/adapters/UniswapLiquiditySwapAdapter.sol index 44745ad5..daac3547 100644 --- a/contracts/adapters/UniswapLiquiditySwapAdapter.sol +++ b/contracts/adapters/UniswapLiquiditySwapAdapter.sol @@ -187,16 +187,16 @@ contract UniswapLiquiditySwapAdapter is BaseUniswapAdapter { * @param permitSignature List of struct containing the permit signature * @param useEthPath true if the swap needs to occur using ETH in the routing, false otherwise */ - + struct SwapLiquidityLocalVars { - address aToken; - uint256 aTokenInitiatorBalance; - uint256 amountToSwap; - uint256 receivedAmount; - uint256 flashLoanDebt; - uint256 amountToPull; + address aToken; + uint256 aTokenInitiatorBalance; + uint256 amountToSwap; + uint256 receivedAmount; + uint256 flashLoanDebt; + uint256 amountToPull; } - + function _swapLiquidity( address assetFrom, address assetTo, @@ -208,19 +208,22 @@ contract UniswapLiquiditySwapAdapter is BaseUniswapAdapter { PermitSignature memory permitSignature, bool useEthPath ) internal { - SwapLiquidityLocalVars memory vars; - + vars.aToken = _getReserveData(assetFrom).aTokenAddress; vars.aTokenInitiatorBalance = IERC20(vars.aToken).balanceOf(initiator); - vars.amountToSwap = - swapAllBalance && vars.aTokenInitiatorBalance.sub(premium) <= amount - ? vars.aTokenInitiatorBalance.sub(premium) - : amount; + vars.amountToSwap = swapAllBalance && vars.aTokenInitiatorBalance.sub(premium) <= amount + ? vars.aTokenInitiatorBalance.sub(premium) + : amount; - vars.receivedAmount = - _swapExactTokensForTokens(assetFrom, assetTo, vars.amountToSwap, minAmountToReceive, useEthPath); + vars.receivedAmount = _swapExactTokensForTokens( + assetFrom, + assetTo, + vars.amountToSwap, + minAmountToReceive, + useEthPath + ); // Deposit new reserve IERC20(assetTo).safeApprove(address(LENDING_POOL), 0); @@ -277,4 +280,4 @@ contract UniswapLiquiditySwapAdapter is BaseUniswapAdapter { useEthPath ); } -} \ No newline at end of file +} diff --git a/contracts/adapters/UniswapRepayAdapter.sol b/contracts/adapters/UniswapRepayAdapter.sol index c4e7817e..5d06494d 100644 --- a/contracts/adapters/UniswapRepayAdapter.sol +++ b/contracts/adapters/UniswapRepayAdapter.sol @@ -200,7 +200,13 @@ contract UniswapRepayAdapter is BaseUniswapAdapter { ); // Swap collateral asset to the debt asset - _swapTokensForExactTokens(collateralAsset, debtAsset, amounts[0], neededForFlashLoanDebt, useEthPath); + _swapTokensForExactTokens( + collateralAsset, + debtAsset, + amounts[0], + neededForFlashLoanDebt, + useEthPath + ); } else { // Pull aTokens from user _pullAToken( @@ -256,4 +262,4 @@ contract UniswapRepayAdapter is BaseUniswapAdapter { useEthPath ); } -} \ No newline at end of file +}