From 2bd7492e56c564e88e7edb922e27a37ed9c0d553 Mon Sep 17 00:00:00 2001
From: Samyak Jain <34437877+KaymasJain@users.noreply.github.com>
Date: Thu, 10 Jun 2021 03:00:34 +0530
Subject: [PATCH] Gelato connector updated with swap & mint

---
 .../connectors/uniswap_v3_erc20/events.sol    | 15 +++-
 .../connectors/uniswap_v3_erc20/helpers.sol   |  4 ++
 .../connectors/uniswap_v3_erc20/interface.sol | 68 +++++++++++++++++++
 .../connectors/uniswap_v3_erc20/main.sol      | 64 +++++++++++++++++
 4 files changed, 149 insertions(+), 2 deletions(-)

diff --git a/contracts/mainnet/connectors/uniswap_v3_erc20/events.sol b/contracts/mainnet/connectors/uniswap_v3_erc20/events.sol
index 56809dc1..a50c8386 100644
--- a/contracts/mainnet/connectors/uniswap_v3_erc20/events.sol
+++ b/contracts/mainnet/connectors/uniswap_v3_erc20/events.sol
@@ -6,7 +6,7 @@ contract Events {
         address indexed pool,
         uint256 amtA,
         uint256 amtB,
-        uint256 uniAmount,
+        uint256 mintAmount,
         uint256 getId,
         uint256 setId
     );
@@ -15,7 +15,18 @@ contract Events {
         address indexed pool,
         uint256 amountA,
         uint256 amountB,
-        uint256 uniAmount,
+        uint256 burnAmount,
+        uint256 getId,
+        uint256 setId
+    );
+
+    event LogSwapAndDepositLiquidity(
+        address indexed pool,
+        uint256 amtA,
+        uint256 amtB,
+        uint256 mintAmount,
+        bool zeroForOne,
+        uint swapAmount,
         uint256 getId,
         uint256 setId
     );
diff --git a/contracts/mainnet/connectors/uniswap_v3_erc20/helpers.sol b/contracts/mainnet/connectors/uniswap_v3_erc20/helpers.sol
index 5315ccbe..006c91e6 100644
--- a/contracts/mainnet/connectors/uniswap_v3_erc20/helpers.sol
+++ b/contracts/mainnet/connectors/uniswap_v3_erc20/helpers.sol
@@ -4,6 +4,10 @@ pragma experimental ABIEncoderV2;
 import { DSMath } from "../../common/math.sol";
 import { Basic } from "../../common/basic.sol";
 
+import { IGUniRouter } from "./interface.sol";
+
 abstract contract Helpers is DSMath, Basic {
+
+    IGUniRouter public constant gUniRouter = IGUniRouter(0x8CA6fa325bc32f86a12cC4964Edf1f71655007A7);
     
 }
diff --git a/contracts/mainnet/connectors/uniswap_v3_erc20/interface.sol b/contracts/mainnet/connectors/uniswap_v3_erc20/interface.sol
index 72f7d59a..503774fe 100644
--- a/contracts/mainnet/connectors/uniswap_v3_erc20/interface.sol
+++ b/contracts/mainnet/connectors/uniswap_v3_erc20/interface.sol
@@ -41,6 +41,74 @@ interface ERC20WrapperInterface {
 
 }
 
+
+interface IGUniRouter {
+    function rebalanceAndAddLiquidity(
+        IGUniPool pool,
+        uint256 amount0In,
+        uint256 amount1In,
+        bool zeroForOne,
+        uint256 swapAmount,
+        uint160 swapThreshold,
+        uint256 amount0Min,
+        uint256 amount1Min,
+        address receiver
+    )
+        external
+        returns (
+            uint256 amount0,
+            uint256 amount1,
+            uint256 mintAmount
+        );
+
+    function rebalanceAndAddLiquidityETH(
+        IGUniPool pool,
+        uint256 amount0In,
+        uint256 amount1In,
+        bool zeroForOne,
+        uint256 swapAmount,
+        uint160 swapThreshold,
+        uint256 amount0Min,
+        uint256 amount1Min,
+        address receiver
+    )
+        external
+        payable
+        returns (
+            uint256 amount0,
+            uint256 amount1,
+            uint256 mintAmount
+        );
+
+    function removeLiquidity(
+        IGUniPool pool,
+        uint256 burnAmount,
+        uint256 amount0Min,
+        uint256 amount1Min,
+        address receiver
+    )
+        external
+        returns (
+            uint256 amount0,
+            uint256 amount1,
+            uint128 liquidityBurned
+        );
+
+    function removeLiquidityETH(
+        IGUniPool pool,
+        uint256 burnAmount,
+        uint256 amount0Min,
+        uint256 amount1Min,
+        address payable receiver
+    )
+        external
+        returns (
+            uint256 amount0,
+            uint256 amount1,
+            uint128 liquidityBurned
+        );
+}
+
 interface TokenInterface {
     function approve(address, uint256) external;
     function transfer(address, uint) external;
diff --git a/contracts/mainnet/connectors/uniswap_v3_erc20/main.sol b/contracts/mainnet/connectors/uniswap_v3_erc20/main.sol
index 8ca85a01..df148a5a 100644
--- a/contracts/mainnet/connectors/uniswap_v3_erc20/main.sol
+++ b/contracts/mainnet/connectors/uniswap_v3_erc20/main.sol
@@ -104,6 +104,70 @@ abstract contract UniswapV3Resolver is Events, Helpers {
         _eventParam = abi.encode(pool, amount0, amount1, uint256(liquidityBurned), getId, setId);
     }
 
+    function swapAndDeposit(
+        address pool,
+        uint256 amount0In,
+        uint256 amount1In,
+        bool zeroForOne,
+        uint256 swapAmount,
+        uint160 swapThreshold
+    ) external payable returns (string memory _eventName, bytes memory _eventParam) {
+
+        ERC20WrapperInterface poolContract = ERC20WrapperInterface(pool);
+        IERC20 _token0 = poolContract.token0();
+        IERC20 _token1 = poolContract.token1();
+
+        uint amount0;
+        uint amount1;
+        uint mintAmount;
+
+        if (address(_token0) == wethAddr) {
+            _token1.approve(address(gUniRouter), amount1In);
+            (amount0, amount1, mintAmount) = gUniRouter.rebalanceAndAddLiquidityETH{value: amount0In}(
+                poolContract,
+                amount0In,
+                amount1In,
+                zeroForOne,
+                swapAmount,
+                swapThreshold,
+                0,
+                0,
+                address(this)
+            );
+        } else if (address(_token1) == wethAddr) {
+            _token0.approve(address(gUniRouter), amount0In);
+            (amount0, amount1, mintAmount) = gUniRouter.rebalanceAndAddLiquidityETH{value: amount1In}(
+                poolContract,
+                amount0In,
+                amount1In,
+                zeroForOne,
+                swapAmount,
+                swapThreshold,
+                0,
+                0,
+                address(this)
+            );
+        } else {
+            _token0.approve(address(gUniRouter), amount0In);
+            _token1.approve(address(gUniRouter), amount1In);
+            (amount0, amount1, mintAmount) = gUniRouter.rebalanceAndAddLiquidity(
+                poolContract,
+                amount0In,
+                amount1In,
+                zeroForOne,
+                swapAmount,
+                swapThreshold,
+                0,
+                0,
+                address(this)
+            );
+        }
+
+        _eventName = "LogSwapAndDepositLiquidity(address,uint256,uint256,uint256,bool,uint256,uint256,uint256)";
+        _eventParam = abi.encode(pool, amount0, amount1, mintAmount, zeroForOne, swapAmount, getId, setId);
+
+    }
+
 }
 
 contract ConnectV2UniswapV3ERC20 is UniswapV3Resolver {