From 8b5038463c9d22a8606a51dc1ec39b7842fa3a39 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Thu, 31 Dec 2020 01:25:20 +0530 Subject: [PATCH 1/6] Updated deposit function logic and added single token deposit function --- contracts/connectors/uniswap.sol | 313 +++++++++++++++++++++---------- 1 file changed, 216 insertions(+), 97 deletions(-) diff --git a/contracts/connectors/uniswap.sol b/contracts/connectors/uniswap.sol index 8c5eacd..01d5865 100644 --- a/contracts/connectors/uniswap.sol +++ b/contracts/connectors/uniswap.sol @@ -5,6 +5,10 @@ import { TokenInterface , MemoryInterface, EventInterface} from "../common/inter import { Stores } from "../common/stores.sol"; import { DSMath } from "../common/math.sol"; +import '@uniswap/lib/contracts/libraries/Babylonian.sol'; +import { SafeMath } from "@openzeppelin/contracts/math/SafeMath.sol"; + + interface IUniswapV2Router02 { function factory() external pure returns (address); function WETH() external pure returns (address); @@ -43,6 +47,7 @@ interface IUniswapV2Router02 { uint deadline ) external returns (uint[] memory amounts); + function getReserves(address factory, address tokenA, address tokenB) external view returns (uint reserveA, uint reserveB); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); @@ -61,7 +66,24 @@ interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); } +interface IUniswapV2Pair { + function balanceOf(address owner) external view returns (uint); + + function approve(address spender, uint value) external returns (bool); + function transfer(address to, uint value) external returns (bool); + function transferFrom(address from, address to, uint value) external returns (bool); + + function factory() external view returns (address); + function token0() external view returns (address); + function token1() external view returns (address); + function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); + function price0CumulativeLast() external view returns (uint); + function price1CumulativeLast() external view returns (uint); +} + contract UniswapHelpers is Stores, DSMath { + using SafeMath for uint256; + /** * @dev Return WETH address */ @@ -144,6 +166,19 @@ contract UniswapHelpers is Stores, DSMath { paths[0] = address(sellAddr); paths[1] = address(buyAddr); } + + + function calculateSwapInAmount(uint256 reserveIn, uint256 userIn) + internal + pure + returns (uint256) + { + return + Babylonian + .sqrt( + reserveIn.mul(userIn.mul(3988000).add(reserveIn.mul(3988009))) + ).sub(reserveIn.mul(1997)) / 1994; + } } contract LiquidityHelpers is UniswapHelpers { @@ -169,33 +204,119 @@ contract LiquidityHelpers is UniswapHelpers { function _addLiquidity( address tokenA, address tokenB, - uint _amt, - uint unitAmt, - uint slippage + uint amountADesired, + uint amountBDesired, + uint amountAMin, + uint amountBMin ) internal returns (uint _amtA, uint _amtB, uint _liquidity) { IUniswapV2Router02 router = IUniswapV2Router02(getUniswapAddr()); (TokenInterface _tokenA, TokenInterface _tokenB) = changeEthAddress(tokenA, tokenB); - _amtA = _amt == uint(-1) ? getTokenBalace(tokenA) : _amt; - _amtB = convert18ToDec(_tokenB.decimals(), wmul(unitAmt, convertTo18(_tokenA.decimals(), _amtA))); + convertEthToWeth(_tokenA, amountADesired); + convertEthToWeth(_tokenB, amountBDesired); + _tokenA.approve(address(router), 0); + _tokenA.approve(address(router), amountADesired); - convertEthToWeth(_tokenA, _amtA); - convertEthToWeth(_tokenB, _amtB); - _tokenA.approve(address(router), _amtA); - _tokenB.approve(address(router), _amtB); + _tokenB.approve(address(router), 0); + _tokenB.approve(address(router), amountBDesired); - uint minAmtA = getMinAmount(_tokenA, _amtA, slippage); - uint minAmtB = getMinAmount(_tokenB, _amtB, slippage); (_amtA, _amtB, _liquidity) = router.addLiquidity( address(_tokenA), address(_tokenB), - _amtA, - _amtB, - minAmtA, - minAmtB, + amountADesired, + amountBDesired, + amountAMin, + amountBMin, address(this), now + 1 ); + + if (_amtA < amountADesired) { + convertWethToEth(_tokenA, _tokenA.balanceOf(address(this))); + } + + if (_amtB < amountBDesired) { + convertWethToEth(_tokenB, _tokenB.balanceOf(address(this))); + } + } + + function _addLiquiditySingle( + address tokenA, + address tokenB, + uint amountA, + uint minUniAmount + ) internal returns (uint _amtA, uint _amtB, uint _liquidity) { + IUniswapV2Router02 router = IUniswapV2Router02(getUniswapAddr()); + (TokenInterface _tokenA, TokenInterface _tokenB) = changeEthAddress(tokenA, tokenB); + + uint256 _amountA; + + if (amountA == uint(-1)) { + _amountA = tokenA == getEthAddr() ? address(this).balance : _tokenA.balanceOf(address(this)); + } + + convertEthToWeth(_tokenA, _amountA); + + + uint256 _amountB; + + (_amountA, _amountB)= _swapSingleToken(router, _tokenA, _tokenB, _amountA); + + _tokenA.approve(address(router), 0); + _tokenA.approve(address(router), _amountA); + + _tokenB.approve(address(router), 0); + _tokenB.approve(address(router), _amountB); + + (_amtA, _amtB, _liquidity) = router.addLiquidity( + address(_tokenA), + address(_tokenB), + _amountA, + _amountB, + 1, // TODO @thrilok209: check this + 1, // TODO @thrilok209: check this + address(this), + now + 1 + ); + + require(_liquidity >= minUniAmount, "too much slippage"); + + if (_amountA > _amtA) { + convertWethToEth(_tokenA, _tokenA.balanceOf(address(this))); + } + + if (_amountB > _amtB) { + convertWethToEth(_tokenB, _tokenB.balanceOf(address(this))); + } + } + + function _swapSingleToken( + IUniswapV2Router02 router, + TokenInterface tokenA, + TokenInterface tokenB, + uint _amountA + ) internal returns(uint256 amountA, uint256 amountB){ + IUniswapV2Factory factory = IUniswapV2Factory(router.factory()); + IUniswapV2Pair lpToken = IUniswapV2Pair(factory.getPair(address(tokenA), address(tokenB))); + require(address(lpToken) != address(0), "No-exchange-address"); + + (uint256 reserveA, uint256 reserveB, ) = lpToken.getReserves(); + uint256 reserveIn = lpToken.token0() == address(tokenA) ? reserveA : reserveB; + uint256 swapAmtA = calculateSwapInAmount(reserveIn, _amountA); + + address[] memory paths = getPaths(address(tokenA), address(tokenB)); + + tokenA.approve(address(router), swapAmtA); + + amountB = router.swapTokensForExactTokens( + 1, // TODO @thrilok209: check this + swapAmtA, + paths, + address(this), + now + 1 + )[0]; + + amountA = sub(_amountA, swapAmtA); } function _removeLiquidity( @@ -253,7 +374,8 @@ contract UniswapLiquidity is LiquidityHelpers { uint amtA, uint amtB, uint uniAmount, - uint getId, + uint getIdA, + uint getIdB, uint setId ); @@ -267,15 +389,75 @@ contract UniswapLiquidity is LiquidityHelpers { uint[] setId ); - function emitDeposit( + + /** + * @dev Deposit Liquidity. + * @param tokenA tokenA address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param tokenB tokenB address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param amountADesired tokenA amount. + * @param amountBDesired unit amount of amtB/amtA with slippage. + * @param amountAMin slippage amount. + * @param amountBMin slippage amount. + * @param getIdA Get token amount at this ID from `InstaMemory` Contract. + * @param getIdB Get tokens amount at this ID from `InstaMemory` Contract. + * @param setId Set token amount at this ID in `InstaMemory` Contract. + */ + function deposit( address tokenA, address tokenB, - uint _amtA, - uint _amtB, - uint _uniAmt, + uint amountADesired, + uint amountBDesired, + uint amountAMin, + uint amountBMin, + uint getIdA, + uint getIdB, + uint setId + ) external payable { + uint _amtADesired = getUint(getIdA, amountADesired); + uint _amtBDesired = getUint(getIdB, amountBDesired); + + (uint _amtA, uint _amtB, uint _uniAmt) = _addLiquidity( + tokenA, + tokenB, + _amtADesired, + _amtBDesired, + amountAMin, + amountBMin + ); + setUint(setId, _uniAmt); + + emit LogDepositLiquidity( + tokenA, + tokenB, + _amtA, + _amtB, + _uniAmt, + getIdA, + getIdB, + setId + ); + + } + + + function singleDeposit( + address tokenA, + address tokenB, + uint amountA, + uint minUniAmount, uint getId, uint setId - ) internal { + ) external payable { + uint _amt = getUint(getId, amountA); + + (uint _amtA, uint _amtB, uint _uniAmt) = _addLiquiditySingle( + tokenA, + tokenB, + _amt, + minUniAmount + ); + setUint(setId, _uniAmt); + emit LogDepositLiquidity( tokenA, tokenB, @@ -283,84 +465,12 @@ contract UniswapLiquidity is LiquidityHelpers { _amtB, _uniAmt, getId, + 0, setId ); - - bytes32 _eventCode = keccak256("LogDepositLiquidity(address,address,uint256,uint256,uint256,uint256,uint256)"); - bytes memory _eventParam = abi.encode( - tokenA, - tokenB, - _amtA, - _amtB, - _uniAmt, - getId, - setId - ); - emitEvent(_eventCode, _eventParam); } - function emitWithdraw( - address tokenA, - address tokenB, - uint _amtA, - uint _amtB, - uint _uniAmt, - uint getId, - uint[] memory setIds - ) internal { - emit LogWithdrawLiquidity( - tokenA, - tokenB, - _amtA, - _amtB, - _uniAmt, - getId, - setIds - ); - bytes32 _eventCode = keccak256("LogWithdrawLiquidity(address,address,uint256,uint256,uint256,uint256,uint256[])"); - bytes memory _eventParam = abi.encode( - tokenA, - tokenB, - _amtA, - _amtB, - _uniAmt, - getId, - setIds - ); - emitEvent(_eventCode, _eventParam); - } - - /** - * @dev Deposit Liquidity. - * @param tokenA tokenA address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) - * @param tokenB tokenB address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) - * @param amtA tokenA amount. - * @param unitAmt unit amount of amtB/amtA with slippage. - * @param slippage slippage amount. - * @param getId Get token amount at this ID from `InstaMemory` Contract. - * @param setId Set token amount at this ID in `InstaMemory` Contract. - */ - function deposit( - address tokenA, - address tokenB, - uint amtA, - uint unitAmt, - uint slippage, - uint getId, - uint setId - ) external payable { - uint _amt = getUint(getId, amtA); - - (uint _amtA, uint _amtB, uint _uniAmt) = _addLiquidity( - tokenA, - tokenB, - _amt, - unitAmt, - slippage - ); - setUint(setId, _uniAmt); - emitDeposit(tokenA, tokenB, _amtA, _amtB, _uniAmt, getId, setId); - } + /** * @dev Withdraw Liquidity. @@ -393,7 +503,16 @@ contract UniswapLiquidity is LiquidityHelpers { setUint(setIds[0], _amtA); setUint(setIds[1], _amtB); - emitWithdraw(tokenA, tokenB, _amtA, _amtB, _uniAmt, getId, setIds); + + emit LogWithdrawLiquidity( + tokenA, + tokenB, + _amtA, + _amtB, + _uniAmt, + getId, + setIds + ); } } @@ -527,5 +646,5 @@ contract UniswapResolver is UniswapLiquidity { contract ConnectUniswapV2 is UniswapResolver { - string public name = "UniswapV2-v1"; + string public name = "UniswapV2-v1.1"; } \ No newline at end of file From 3758af36988ac4d43fcca5745657504c5c88bdc6 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Thu, 31 Dec 2020 01:35:57 +0530 Subject: [PATCH 2/6] Minor changes --- contracts/connectors/uniswap.sol | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/contracts/connectors/uniswap.sol b/contracts/connectors/uniswap.sol index 01d5865..162a3f8 100644 --- a/contracts/connectors/uniswap.sol +++ b/contracts/connectors/uniswap.sol @@ -176,8 +176,10 @@ contract UniswapHelpers is Stores, DSMath { return Babylonian .sqrt( - reserveIn.mul(userIn.mul(3988000).add(reserveIn.mul(3988009))) - ).sub(reserveIn.mul(1997)) / 1994; + reserveIn.mul( + userIn.mul(3988000).add(reserveIn.mul(3988009)) + ) + ).sub(reserveIn.mul(1997)) / 1994; } } @@ -240,7 +242,7 @@ contract LiquidityHelpers is UniswapHelpers { } } - function _addLiquiditySingle( + function _addSingleLiquidity( address tokenA, address tokenB, uint amountA, @@ -450,7 +452,7 @@ contract UniswapLiquidity is LiquidityHelpers { ) external payable { uint _amt = getUint(getId, amountA); - (uint _amtA, uint _amtB, uint _uniAmt) = _addLiquiditySingle( + (uint _amtA, uint _amtB, uint _uniAmt) = _addSingleLiquidity( tokenA, tokenB, _amt, From 24aa86bd90ac61c1056caf4e89b4d8e082bc1d75 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Sat, 2 Jan 2021 03:37:17 +0530 Subject: [PATCH 3/6] fixed bugs in UniswapV2 connector --- contracts/connectors/uniswap.sol | 22 +++++++--------------- 1 file changed, 7 insertions(+), 15 deletions(-) diff --git a/contracts/connectors/uniswap.sol b/contracts/connectors/uniswap.sol index 162a3f8..4dd7714 100644 --- a/contracts/connectors/uniswap.sol +++ b/contracts/connectors/uniswap.sol @@ -47,7 +47,6 @@ interface IUniswapV2Router02 { uint deadline ) external returns (uint[] memory amounts); - function getReserves(address factory, address tokenA, address tokenB) external view returns (uint reserveA, uint reserveB); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); @@ -88,7 +87,8 @@ contract UniswapHelpers is Stores, DSMath { * @dev Return WETH address */ function getAddressWETH() internal pure returns (address) { - return 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; + return 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2; // mainnet + // return 0xd0A1E359811322d97991E03f863a0C30C2cF029C; // kovan } /** @@ -251,7 +251,7 @@ contract LiquidityHelpers is UniswapHelpers { IUniswapV2Router02 router = IUniswapV2Router02(getUniswapAddr()); (TokenInterface _tokenA, TokenInterface _tokenB) = changeEthAddress(tokenA, tokenB); - uint256 _amountA; + uint256 _amountA = amountA; if (amountA == uint(-1)) { _amountA = tokenA == getEthAddr() ? address(this).balance : _tokenA.balanceOf(address(this)); @@ -306,17 +306,17 @@ contract LiquidityHelpers is UniswapHelpers { uint256 reserveIn = lpToken.token0() == address(tokenA) ? reserveA : reserveB; uint256 swapAmtA = calculateSwapInAmount(reserveIn, _amountA); - address[] memory paths = getPaths(address(tokenA), address(tokenB)); + address[] memory paths = getPaths(address(tokenB), address(tokenA)); tokenA.approve(address(router), swapAmtA); - amountB = router.swapTokensForExactTokens( - 1, // TODO @thrilok209: check this + amountB = router.swapExactTokensForTokens( swapAmtA, + 1, // TODO @thrilok209: check this paths, address(this), now + 1 - )[0]; + )[1]; amountA = sub(_amountA, swapAmtA); } @@ -583,10 +583,6 @@ contract UniswapResolver is UniswapLiquidity { setUint(setId, _sellAmt); emit LogBuy(buyAddr, sellAddr, _buyAmt, _sellAmt, getId, setId); - bytes32 _eventCode = keccak256("LogBuy(address,address,uint256,uint256,uint256,uint256)"); - bytes memory _eventParam = abi.encode(buyAddr, sellAddr, _buyAmt, _sellAmt, getId, setId); - (uint _type, uint _id) = connectorID(); - EventInterface(getEventAddr()).emitEvent(_type, _id, _eventCode, _eventParam); } /** @@ -639,10 +635,6 @@ contract UniswapResolver is UniswapLiquidity { setUint(setId, _buyAmt); emit LogSell(buyAddr, sellAddr, _buyAmt, _sellAmt, getId, setId); - bytes32 _eventCode = keccak256("LogSell(address,address,uint256,uint256,uint256,uint256)"); - bytes memory _eventParam = abi.encode(buyAddr, sellAddr, _buyAmt, _sellAmt, getId, setId); - (uint _type, uint _id) = connectorID(); - EventInterface(getEventAddr()).emitEvent(_type, _id, _eventCode, _eventParam); } } From 23c29cfc2e0cea79d0474323236eb5fec96d8e51 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Sun, 3 Jan 2021 03:26:53 +0530 Subject: [PATCH 4/6] Changed minToken amounts to slippage amounts and updated comments --- contracts/connectors/uniswap.sol | 61 +++++++++++++++----------------- 1 file changed, 29 insertions(+), 32 deletions(-) diff --git a/contracts/connectors/uniswap.sol b/contracts/connectors/uniswap.sol index 4dd7714..3efa036 100644 --- a/contracts/connectors/uniswap.sol +++ b/contracts/connectors/uniswap.sol @@ -167,6 +167,13 @@ contract UniswapHelpers is Stores, DSMath { paths[1] = address(buyAddr); } + function changeEthToWeth( + address[] memory tokens + ) internal pure returns(TokenInterface[] memory _tokens) { + _tokens = new TokenInterface[](2); + _tokens[0] = tokens[0] == getEthAddr() ? TokenInterface(getAddressWETH()) : TokenInterface(tokens[0]); + _tokens[1] = tokens[1] == getEthAddr() ? TokenInterface(getAddressWETH()) : TokenInterface(tokens[1]); + } function calculateSwapInAmount(uint256 reserveIn, uint256 userIn) internal @@ -184,32 +191,13 @@ contract UniswapHelpers is Stores, DSMath { } contract LiquidityHelpers is UniswapHelpers { - - function getMinAmount( - TokenInterface token, - uint amt, - uint slippage - ) internal view returns(uint minAmt) { - uint _amt18 = convertTo18(token.decimals(), amt); - minAmt = wmul(_amt18, sub(WAD, slippage)); - minAmt = convert18ToDec(token.decimals(), minAmt); - } - - function changeEthToWeth( - address[] memory tokens - ) internal pure returns(TokenInterface[] memory _tokens) { - _tokens = new TokenInterface[](2); - _tokens[0] = tokens[0] == getEthAddr() ? TokenInterface(getAddressWETH()) : TokenInterface(tokens[0]); - _tokens[1] = tokens[1] == getEthAddr() ? TokenInterface(getAddressWETH()) : TokenInterface(tokens[1]); - } - function _addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, - uint amountAMin, - uint amountBMin + uint slippageA, + uint slippageB ) internal returns (uint _amtA, uint _amtB, uint _liquidity) { IUniswapV2Router02 router = IUniswapV2Router02(getUniswapAddr()); (TokenInterface _tokenA, TokenInterface _tokenB) = changeEthAddress(tokenA, tokenB); @@ -227,8 +215,8 @@ contract LiquidityHelpers is UniswapHelpers { address(_tokenB), amountADesired, amountBDesired, - amountAMin, - amountBMin, + wmul(sub(WAD, slippageA), amountADesired), + wmul(sub(WAD, slippageB), amountBDesired), address(this), now + 1 ); @@ -397,11 +385,11 @@ contract UniswapLiquidity is LiquidityHelpers { * @param tokenA tokenA address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) * @param tokenB tokenB address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) * @param amountADesired tokenA amount. - * @param amountBDesired unit amount of amtB/amtA with slippage. - * @param amountAMin slippage amount. - * @param amountBMin slippage amount. - * @param getIdA Get token amount at this ID from `InstaMemory` Contract. - * @param getIdB Get tokens amount at this ID from `InstaMemory` Contract. + * @param amountBDesired tokenB amount. + * @param slippageA slippage amountA.(For 1%: 1e16, 10%: 1e17) + * @param slippageB slippage amountB.(For 1%: 1e16, 10%: 1e17) + * @param getIdA Get tokenA amount at this ID from `InstaMemory` Contract. + * @param getIdB Get tokenB amount at this ID from `InstaMemory` Contract. * @param setId Set token amount at this ID in `InstaMemory` Contract. */ function deposit( @@ -409,8 +397,8 @@ contract UniswapLiquidity is LiquidityHelpers { address tokenB, uint amountADesired, uint amountBDesired, - uint amountAMin, - uint amountBMin, + uint slippageA, + uint slippageB, uint getIdA, uint getIdB, uint setId @@ -423,8 +411,8 @@ contract UniswapLiquidity is LiquidityHelpers { tokenB, _amtADesired, _amtBDesired, - amountAMin, - amountBMin + slippageA, + slippageB ); setUint(setId, _uniAmt); @@ -442,6 +430,15 @@ contract UniswapLiquidity is LiquidityHelpers { } + /** + * @dev Deposit Liquidity using Single token. + * @param tokenA tokenA address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param tokenB tokenB address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param amountA tokenA amount. + * @param minUniAmount min uni token amount. + * @param getId Get tokenA amount at this ID from `InstaMemory` Contract. + * @param setId Set token amount at this ID in `InstaMemory` Contract. + */ function singleDeposit( address tokenA, address tokenB, From ee79df1047ab19e0655f92f5af9b18a354feb54a Mon Sep 17 00:00:00 2001 From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com> Date: Sun, 3 Jan 2021 14:28:54 +1100 Subject: [PATCH 5/6] slippage update --- contracts/connectors/uniswap.sol | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/contracts/connectors/uniswap.sol b/contracts/connectors/uniswap.sol index 3efa036..821cc75 100644 --- a/contracts/connectors/uniswap.sol +++ b/contracts/connectors/uniswap.sol @@ -196,8 +196,7 @@ contract LiquidityHelpers is UniswapHelpers { address tokenB, uint amountADesired, uint amountBDesired, - uint slippageA, - uint slippageB + uint slippage ) internal returns (uint _amtA, uint _amtB, uint _liquidity) { IUniswapV2Router02 router = IUniswapV2Router02(getUniswapAddr()); (TokenInterface _tokenA, TokenInterface _tokenB) = changeEthAddress(tokenA, tokenB); @@ -215,8 +214,8 @@ contract LiquidityHelpers is UniswapHelpers { address(_tokenB), amountADesired, amountBDesired, - wmul(sub(WAD, slippageA), amountADesired), - wmul(sub(WAD, slippageB), amountBDesired), + wmul(sub(WAD, slippage), amountADesired), + wmul(sub(WAD, slippage), amountBDesired), address(this), now + 1 ); @@ -386,8 +385,7 @@ contract UniswapLiquidity is LiquidityHelpers { * @param tokenB tokenB address.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) * @param amountADesired tokenA amount. * @param amountBDesired tokenB amount. - * @param slippageA slippage amountA.(For 1%: 1e16, 10%: 1e17) - * @param slippageB slippage amountB.(For 1%: 1e16, 10%: 1e17) + * @param slippage slippage for tokenA & tokenB.(For 1%: 1e16, 10%: 1e17) * @param getIdA Get tokenA amount at this ID from `InstaMemory` Contract. * @param getIdB Get tokenB amount at this ID from `InstaMemory` Contract. * @param setId Set token amount at this ID in `InstaMemory` Contract. @@ -397,8 +395,7 @@ contract UniswapLiquidity is LiquidityHelpers { address tokenB, uint amountADesired, uint amountBDesired, - uint slippageA, - uint slippageB, + uint slippage, uint getIdA, uint getIdB, uint setId @@ -411,8 +408,7 @@ contract UniswapLiquidity is LiquidityHelpers { tokenB, _amtADesired, _amtBDesired, - slippageA, - slippageB + slippage ); setUint(setId, _uniAmt); From 6525b3bbc4a380188fbd751824a653fdc7cf7041 Mon Sep 17 00:00:00 2001 From: Thrilok Kumar Date: Wed, 6 Jan 2021 06:17:16 +0530 Subject: [PATCH 6/6] Fixed too deep stack error --- contracts/connectors/uniswap.sol | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/contracts/connectors/uniswap.sol b/contracts/connectors/uniswap.sol index 821cc75..8f675fe 100644 --- a/contracts/connectors/uniswap.sol +++ b/contracts/connectors/uniswap.sol @@ -209,13 +209,16 @@ contract LiquidityHelpers is UniswapHelpers { _tokenB.approve(address(router), 0); _tokenB.approve(address(router), amountBDesired); + uint minAmtA = wmul(sub(WAD, slippage), amountADesired); + uint minAmtB = wmul(sub(WAD, slippage), amountBDesired); + (_amtA, _amtB, _liquidity) = router.addLiquidity( address(_tokenA), address(_tokenB), amountADesired, amountBDesired, - wmul(sub(WAD, slippage), amountADesired), - wmul(sub(WAD, slippage), amountBDesired), + minAmtA, + minAmtB, address(this), now + 1 );