From e197ebeb49de5acc8b2eefc1170c5d3c0a3be317 Mon Sep 17 00:00:00 2001
From: Ibrahim <defimaster8@protonmail.com>
Date: Mon, 15 Nov 2021 18:29:08 +0800
Subject: [PATCH] Universe Finance Connector

---
 .../connectors/universeFinance/events.sol     | 20 +++++++
 .../connectors/universeFinance/helpers.sol    | 31 ++++++++++
 .../connectors/universeFinance/interface.sol  | 17 ++++++
 .../connectors/universeFinance/main.sol       | 58 +++++++++++++++++++
 4 files changed, 126 insertions(+)
 create mode 100644 contracts/mainnet/connectors/universeFinance/events.sol
 create mode 100644 contracts/mainnet/connectors/universeFinance/helpers.sol
 create mode 100644 contracts/mainnet/connectors/universeFinance/interface.sol
 create mode 100644 contracts/mainnet/connectors/universeFinance/main.sol

diff --git a/contracts/mainnet/connectors/universeFinance/events.sol b/contracts/mainnet/connectors/universeFinance/events.sol
new file mode 100644
index 00000000..325ef399
--- /dev/null
+++ b/contracts/mainnet/connectors/universeFinance/events.sol
@@ -0,0 +1,20 @@
+pragma solidity ^0.7.0;
+
+contract Events {
+
+    event LogDeposit(
+        address indexed universeVault,
+        uint256 amountA,
+        uint256 amountB,
+        uint256 share0,
+        uint256 share1
+    );
+
+    event LogWithdraw(
+        address indexed universeVault,
+        uint256 amountA,
+        uint256 amountB,
+        uint256 share0,
+        uint256 share1
+    );
+}
diff --git a/contracts/mainnet/connectors/universeFinance/helpers.sol b/contracts/mainnet/connectors/universeFinance/helpers.sol
new file mode 100644
index 00000000..03330b04
--- /dev/null
+++ b/contracts/mainnet/connectors/universeFinance/helpers.sol
@@ -0,0 +1,31 @@
+pragma solidity ^0.7.6;
+
+import {TokenInterface} from "../../common/interfaces.sol";
+import {DSMath} from "../../common/math.sol";
+import {Basic} from "../../common/basic.sol";
+
+import  "./interface.sol";
+
+abstract contract Helpers is DSMath, Basic {
+
+    // TODO The vault is currently under audit and the address needs to be updated
+    IUniverseAdapter constant universeAdapter = IUniverseAdapter(0x0000000000000000000000000000000000000000);
+
+    function _deposit(
+        address universeVault,
+        uint256 amount0,
+        uint256 amount1
+    ) internal returns(uint256, uint256){
+        return universeAdapter.depositProxy(universeVault, amount0, amount1);
+    }
+
+    function _withdraw(
+        address universeVault,
+        uint256 share0,
+        uint256 share1
+    ) internal returns(uint256, uint256){
+        require(share0 > 0 || share1 > 0, "ZERO");
+        return IUniverseVaultV3(universeVault).withdraw(share0, share1);
+    }
+
+}
diff --git a/contracts/mainnet/connectors/universeFinance/interface.sol b/contracts/mainnet/connectors/universeFinance/interface.sol
new file mode 100644
index 00000000..6cea8e7a
--- /dev/null
+++ b/contracts/mainnet/connectors/universeFinance/interface.sol
@@ -0,0 +1,17 @@
+pragma solidity ^0.7.6;
+pragma abicoder v2;
+
+interface IUniverseAdapter {
+
+    function depositProxy(
+        address universeVault,
+        uint256 amount0,
+        uint256 amount1
+    ) external returns(uint256, uint256);
+
+}
+
+interface IUniverseVaultV3 {
+
+    function withdraw(uint256 share0, uint256 share1) external returns(uint256, uint256);
+}
diff --git a/contracts/mainnet/connectors/universeFinance/main.sol b/contracts/mainnet/connectors/universeFinance/main.sol
new file mode 100644
index 00000000..1a9af47b
--- /dev/null
+++ b/contracts/mainnet/connectors/universeFinance/main.sol
@@ -0,0 +1,58 @@
+pragma solidity ^0.7.6;
+pragma abicoder v2;
+
+import {TokenInterface} from "../../common/interfaces.sol";
+import {Helpers} from "./helpers.sol";
+import {Events} from "./events.sol";
+
+abstract contract UniverseFinanceResolver is Helpers, Events {
+
+    /**
+     * @notice Deposit in Universe Vault by Adapter
+     * @param universeVault Universe Official Vault Address
+     * @param amountA Amount of tokenA
+     * @param amountB Amount of tokenB
+     * @param getIds ID to retrieve amountA and amountB
+     */
+    function deposit(
+        address universeVault,
+        uint256 amountA,
+        uint256 amountB,
+        uint256[] calldata getIds
+    ) external returns (string memory _eventName, bytes memory _eventParam){
+        amountA = getUint(getIds[0], amountA);
+        amountB = getUint(getIds[1], amountB);
+        (uint256 share0, uint256 share1) = _deposit(universeVault, amountA, amountB);
+        // EVENT
+        _eventName = "LogDeposit(address,uint256,uint256,uint256,uint256)";
+        _eventParam = abi.encode(universeVault, amountA, amountB, share0, share1);
+    }
+
+    /**
+     * @notice Withdraw Token0 & Token1 From Universe Vault
+     * @param universeVault Universe Official Vault Address
+     * @param share0 Amount of uToken0.
+     * @param share1 Amount of uToken1.
+     * @param setIds stores the amount of output tokens
+     */
+    function withdraw(
+        address universeVault,
+        uint256 share0,
+        uint256 share1,
+        uint256[] calldata setIds
+    ) external returns (string memory _eventName, bytes memory _eventParam){
+        (uint256 _amtA, uint256 _amtB) = _withdraw(universeVault, share0, share1);
+        setUint(setIds[0], _amtA);
+        setUint(setIds[1], _amtB);
+        // EVENT
+        _eventName = "LogWithdraw(address,uint256,uint256,uint256,uint256)";
+        _eventParam = abi.encode(universeVault, _amtA, _amtB, share0, share1);
+    }
+
+}
+
+contract ConnectV2UniverseFinance is UniverseFinanceResolver {
+
+    string public constant name = "UniverseFinance-v1";
+
+}
\ No newline at end of file